mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-01 01:31:26 +00:00
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:
parent
857e535520
commit
290b32b90f
@ -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';
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user