]> granicus.if.org Git - clang/commitdiff
Add a hack to avoid adding '\01' to asm names when possible. It would be
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 15 Feb 2011 22:23:51 +0000 (22:23 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 15 Feb 2011 22:23:51 +0000 (22:23 +0000)
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

lib/AST/ItaniumMangle.cpp
test/CodeGen/mangle.c

index 7d641e45c1f269417b286359b50d0bf72b8abd4a..df6e39b2b3a0cbf9965345819ab853de19c83b80 100644 (file)
@@ -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;
   }
index 93d424a85dad371a8ba463eb4e0632283879d64d..3bbd9c8b807ea3557204c007631e34e2170370f6 100644 (file)
@@ -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;
 }