From: Rafael Espindola Date: Tue, 15 Feb 2011 22:23:51 +0000 (+0000) Subject: Add a hack to avoid adding '\01' to asm names when possible. It would be X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4e274e955451632e6ba287bb03fb7a7840c3505e;p=clang Add a hack to avoid adding '\01' to asm names when possible. It would be better for clang to always compute the right name, but for now this hack fixes PR9177 and lets us build firefox with LTO :-) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125607 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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()) { // 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; }