File-scope static functions need to be mangled with 'L' so that

they don't collide with file-scope extern functions from the same
translation unit.  This is basically a matter of applying the same
logic to FunctionDecls as we were previously applying to VarDecls.

llvm-svn: 128072
This commit is contained in:
John McCall 2011-03-22 06:34:45 +00:00
parent 857e535520
commit 290b32b90f
2 changed files with 21 additions and 5 deletions

View File

@ -695,10 +695,12 @@ void CXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND,
case DeclarationName::Identifier: {
if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) {
// We must avoid conflicts between internally- and externally-
// linked variable declaration names in the same TU.
// This naming convention is the same as that followed by GCC, though it
// shouldn't actually matter.
if (ND && isa<VarDecl>(ND) && ND->getLinkage() == InternalLinkage &&
// linked variable and function declaration names in the same TU:
// void test() { extern void foo(); }
// static void foo();
// This naming convention is the same as that followed by GCC,
// though it shouldn't actually matter.
if (ND && ND->getLinkage() == InternalLinkage &&
ND->getDeclContext()->isFileContext())
Out << 'L';

View File

@ -373,7 +373,7 @@ namespace test1 {
template void f(X<int>);
}
// CHECK: define internal void @_Z27functionWithInternalLinkagev()
// CHECK: define internal void @_ZL27functionWithInternalLinkagev()
static void functionWithInternalLinkage() { }
void g() { functionWithInternalLinkage(); }
@ -647,3 +647,17 @@ namespace test23 {
void f(vpca5 volatile (&)[10]) {}
// CHECK: define void @_ZN6test231fERA10_A5_VKPv(
}
namespace test24 {
void test0() {
extern int foo();
// CHECK: call i32 @_ZN6test243fooEv()
foo();
}
static char foo() {}
void test1() {
// CHECK: call signext i8 @_ZN6test24L3fooEv()
foo();
}
}