diff options
author | John McCall <rjmccall@apple.com> | 2011-03-22 06:34:45 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2011-03-22 06:34:45 +0000 |
commit | 74990f45b0bc57fca81f908efb13d2b6c6350f03 (patch) | |
tree | 50a10cf5ec55dd718a51b008505c34dce1aa3433 | |
parent | 5fff46b65389f7e7eb576e47c7bc3ca67326a206 (diff) |
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.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@128072 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AST/ItaniumMangle.cpp | 10 | ||||
-rw-r--r-- | test/CodeGenCXX/mangle.cpp | 16 |
2 files changed, 21 insertions, 5 deletions
diff --git a/lib/AST/ItaniumMangle.cpp b/lib/AST/ItaniumMangle.cpp index bceed08137..bb274a96f1 100644 --- a/lib/AST/ItaniumMangle.cpp +++ b/lib/AST/ItaniumMangle.cpp @@ -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'; diff --git a/test/CodeGenCXX/mangle.cpp b/test/CodeGenCXX/mangle.cpp index ec496fe1f7..36bf7a8b05 100644 --- a/test/CodeGenCXX/mangle.cpp +++ b/test/CodeGenCXX/mangle.cpp @@ -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(); + } +} |