diff options
-rw-r--r-- | lib/AST/ItaniumMangle.cpp | 13 | ||||
-rw-r--r-- | test/CodeGen/mangle.c | 6 |
2 files changed, 15 insertions, 4 deletions
diff --git a/lib/AST/ItaniumMangle.cpp b/lib/AST/ItaniumMangle.cpp index 7d641e45c1..df6e39b2b3 100644 --- a/lib/AST/ItaniumMangle.cpp +++ b/lib/AST/ItaniumMangle.cpp @@ -23,6 +23,7 @@ #include "clang/AST/ExprCXX.h" #include "clang/Basic/ABI.h" #include "clang/Basic/SourceManager.h" +#include "clang/Basic/TargetInfo.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/ErrorHandling.h" @@ -328,7 +329,17 @@ void CXXNameMangler::mangle(const NamedDecl *D, llvm::StringRef Prefix) { // over all other naming in the .o file. if (const AsmLabelAttr *ALA = D->getAttr<AsmLabelAttr>()) { // If we have an asm name, then we use it as the mangling. - Out << '\01'; // LLVM IR Marker for __asm("foo") + + // Adding the prefix can cause problems when one file has a "foo" and + // another has a "\01foo". That is known to happen on ELF with the + // tricks normally used for producing aliases (PR9177). Fortunately the + // llvm mangler on ELF is a nop, so we can just avoid adding the \01 + // marker. + llvm::StringRef UserLabelPrefix = + getASTContext().Target.getUserLabelPrefix(); + if (!UserLabelPrefix.empty()) + Out << '\01'; // LLVM IR Marker for __asm("foo") + Out << ALA->getLabel(); return; } diff --git a/test/CodeGen/mangle.c b/test/CodeGen/mangle.c index 93d424a85d..3bbd9c8b80 100644 --- a/test/CodeGen/mangle.c +++ b/test/CodeGen/mangle.c @@ -1,6 +1,6 @@ // RUN: %clang_cc1 -triple i386-pc-linux-gnu -emit-llvm -o - %s | FileCheck %s -// CHECK: @"\01foo" +// CHECK: @foo // Make sure we mangle overloadable, even in C system headers. # 1 "somesystemheader.h" 1 3 4 @@ -9,7 +9,7 @@ void __attribute__((__overloadable__)) f0(int a) {} // CHECK: @_Z2f0l void __attribute__((__overloadable__)) f0(long b) {} -// CHECK: @"\01bar" +// CHECK: @bar // These should get merged. void foo() __asm__("bar"); @@ -55,7 +55,7 @@ float foo8 __asm__("foo7") = 42; int func(void); extern int func (void) __asm__ ("FUNC"); -// CHECK: @"\01FUNC" +// CHECK: @FUNC int func(void) { return 42; } |