Change the internal interface to makeNameProper to take a bool that
authorChris Lattner <sabre@nondot.org>
Tue, 14 Jul 2009 04:50:12 +0000 (04:50 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 14 Jul 2009 04:50:12 +0000 (04:50 +0000)
indicates whether the label is private or not, instead of taking
prefix stuff.  One effect of this is that symbols will be generated
with *just* the private prefix, instead of both the private prefix
*and* the user-label-prefix, but this doesn't matter as long as it
is consistent.  For example we'll now get "Lfoo" instead of "L_foo".
These are just assembler temporary labels anyway, so they never even
make it into the .o file.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75607 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/Mangler.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/CodeGen/AsmPrinter/DwarfDebug.cpp
lib/VMCore/Mangler.cpp
test/CodeGen/PowerPC/private.ll
test/CodeGen/X86/private-2.ll

index 27d137ace5a2273149bc11e2fd810a7cb1ac2492..0dc26edc2df78c57220b35d59a61cbf49b5c671a 100644 (file)
@@ -94,8 +94,8 @@ public:
   /// does this for you, so there's no point calling it on the result
   /// from getValueName.
   ///
-  std::string makeNameProper(const std::string &x, const char *Prefix = 0,
-                             const char *PrivatePrefix = 0);
+  std::string makeNameProper(const std::string &x,
+                             bool hasPrivateLinkage = false);
 };
 
 } // End llvm namespace
index c1cb97ccf721a9c784c16cd408ff07397c5bccc9..867b00370c1177e542ff86d79fa38dc86576e81c 100644 (file)
@@ -271,8 +271,8 @@ AsmPrinter::getCurrentFunctionEHName(const MachineFunction *MF,
   Name = MF->getFunction()->getName();
   if (Name.empty())
     Name = Mang->getValueName(MF->getFunction());
-  Name = Mang->makeNameProper(TAI->getEHGlobalPrefix() +
-                              Name + ".eh", TAI->getGlobalPrefix());
+  
+  Name = Mang->makeNameProper(TAI->getEHGlobalPrefix() + Name + ".eh");
   return Name;
 }
 
index 6097447a611c90669eac2c0b2d2cc4b6da50f756..0e3b306aab0a44e0f26cfdeb7ecd0522b0010409 100644 (file)
@@ -86,8 +86,8 @@ public:
   /// specified debug variable.
   DIE *&getDieMapSlotFor(GlobalVariable *GV) { return GVToDieMap[GV]; }
 
-  /// getDIEEntrySlotFor - Returns the debug information entry proxy slot for the
-  /// specified debug variable.
+  /// getDIEEntrySlotFor - Returns the debug information entry proxy slot for
+  /// the specified debug variable.
   DIEEntry *&getDIEEntrySlotFor(GlobalVariable *GV) {
     return GVToDIEEntryMap[GV];
   }
index a01f0f1540e0282f99a20d74ba00d3503b42f372..cec41dfd40071d8a4e1572f9c6fd6e690ad579cd 100644 (file)
@@ -31,13 +31,16 @@ static std::string MangleLetter(unsigned char C) {
 /// makeNameProper - We don't want identifier names non-C-identifier characters
 /// in them, so mangle them as appropriate.
 ///
-std::string Mangler::makeNameProper(const std::string &X, const char *Prefix,
-                                    const char *PrivatePrefix) {
-  if (X.empty()) return X;  // Empty names are uniqued by the caller.
+std::string Mangler::makeNameProper(const std::string &X,
+                                    bool hasPrivateLinkage) {
+  assert(!X.empty() && "Cannot mangle empty strings");
   
   // If PreserveAsmNames is set, names with asm identifiers are not modified. 
   if (PreserveAsmNames && X[0] == 1)
     return X;
+
+  // Figure out the prefix to use.
+  const char *ThePrefix = hasPrivateLinkage ? PrivatePrefix : Prefix;
   
   if (!UseQuotes) {
     std::string Result;
@@ -61,12 +64,8 @@ std::string Mangler::makeNameProper(const std::string &X, const char *Prefix,
         Result += *I;
     }
 
-    if (NeedPrefix) {
-      if (Prefix)
-        Result = Prefix + Result;
-      if (PrivatePrefix)
-        Result = PrivatePrefix + Result;
-    }
+    if (NeedPrefix)
+      Result = ThePrefix + Result;
     return Result;
   }
 
@@ -94,17 +93,12 @@ std::string Mangler::makeNameProper(const std::string &X, const char *Prefix,
     
   // In the common case, we don't need quotes.  Handle this quickly.
   if (!NeedQuotes) {
-    if (NeedPrefix) {
-      if (Prefix)
-        Result = Prefix + X;
-      else
-        Result = X;
-      if (PrivatePrefix)
-        Result = PrivatePrefix + Result;
-      return Result;
-    } else
-      return X.substr(1);
+    if (!NeedPrefix)
+      return X.substr(1);   // Strip off the \001.
+    return ThePrefix + X;
   }
+  
+  Result = X.substr(0, I-X.begin());
     
   // Otherwise, construct the string the expensive way.
   for (std::string::const_iterator E = X.end(); I != E; ++I) {
@@ -116,14 +110,8 @@ std::string Mangler::makeNameProper(const std::string &X, const char *Prefix,
       Result += *I;
   }
 
-  if (NeedPrefix) {
-    if (Prefix)
-      Result = Prefix + X;
-    else
-      Result = X;
-    if (PrivatePrefix)
-      Result = PrivatePrefix + Result;
-  }
+  if (NeedPrefix)
+    Result = ThePrefix + Result;
   Result = '"' + Result + '"';
   return Result;
 }
@@ -132,11 +120,8 @@ std::string Mangler::getValueName(const GlobalValue *GV, const char *Suffix) {
   assert((!isa<Function>(GV) || !cast<Function>(GV)->isIntrinsic()) &&
          "Intrinsic functions cannot be mangled by Mangler");
   
-  if (GV->hasName()) {
-    if (GV->hasPrivateLinkage())
-      return makeNameProper(GV->getName() + Suffix, Prefix, PrivatePrefix);
-    return makeNameProper(GV->getName() + Suffix, Prefix);
-  }
+  if (GV->hasName())
+    return makeNameProper(GV->getName() + Suffix, GV->hasPrivateLinkage());
   
   // Get the ID for the global, assigning a new one if we haven't got one
   // already.
index 0f0d13492a08835a58861b93f27f0b04e51e3157..a36adf58a8c549b61adfbec5d44c24500512c5a6 100644 (file)
@@ -6,20 +6,20 @@
 ; RUN: grep .Lbaz: %t
 ; RUN: grep lis.*\.Lbaz %t
 ; RUN: llvm-as < %s | llc -mtriple=powerpc-apple-darwin > %t
-; RUN: grep L_foo: %t
-; RUN: grep bl.*\L_foo %t
-; RUN: grep L_baz: %t
-; RUN: grep lis.*\L_baz %t
+; RUN: grep Lfoo: %t
+; RUN: grep bl.*\Lfoo %t
+; RUN: grep Lbaz: %t
+; RUN: grep lis.*\Lbaz %t
 
-declare void @foo()
+declare void @foo() nounwind
 
-define private void @foo() {
+define private void @foo() nounwind {
         ret void
 }
 
 @baz = private global i32 4;
 
-define i32 @bar() {
+define i32 @bar() nounwind {
         call void @foo()
        %1 = load i32* @baz, align 4
         ret i32 %1
index 7478128567730ceaa19fa29702f6b392c0cbe704..689fe34bab12b6f59fee3cb0006bc878fbdf58d4 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llvm-as < %s | llc -mtriple=x86_64-apple-darwin10 | grep L__ZZ20
+; RUN: llvm-as < %s | llc -mtriple=x86_64-apple-darwin10 | grep L_ZZ20
 ; Quote should be outside of private prefix.
 ; rdar://6855766x