[llvm-commits] [llvm] r75610 - in /llvm/trunk: include/llvm/Support/Mangler.h lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp lib/VMCore/Mangler.cpp test/CodeGen/X86/loop-hoist.ll

Chris Lattner sabre at nondot.org
Mon Jul 13 23:04:36 PDT 2009


Author: lattner
Date: Tue Jul 14 01:04:35 2009
New Revision: 75610

URL: http://llvm.org/viewvc/llvm-project?rev=75610&view=rev
Log:
Change the X86 asmprinter to use the mangler to apply suffixes like "$non_lazy_ptr"
to symbols instead of doing it with "printSuffixedName".  This gets us to the point
where there is a real separation between computing a symbol name and printing it,
something I need for MC printer stuff.

This patch also fixes a corner case bug where unnamed private globals wouldn't get
the private label prefix.

Next up, rename all uses of getValueName -> getMangledName for better greppability,
and then tackle the ppc/arm backends to eliminate "printSuffixedName".


Modified:
    llvm/trunk/include/llvm/Support/Mangler.h
    llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
    llvm/trunk/lib/VMCore/Mangler.cpp
    llvm/trunk/test/CodeGen/X86/loop-hoist.ll

Modified: llvm/trunk/include/llvm/Support/Mangler.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Mangler.h?rev=75610&r1=75609&r2=75610&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Support/Mangler.h (original)
+++ llvm/trunk/include/llvm/Support/Mangler.h Tue Jul 14 01:04:35 2009
@@ -82,10 +82,17 @@
     return (AcceptableChars[X/32] & (1 << (X&31))) != 0;
   }
 
-  /// getValueName - Returns the mangled name of V, an LLVM Value,
-  /// in the current module.
+  /// getMangledName - Returns the mangled name of V, an LLVM Value,
+  /// in the current module.  If 'Suffix' is specified, the name ends with the
+  /// specified suffix.  If 'ForcePrivate' is specified, the label is specified
+  /// to have a private label prefix.
   ///
-  std::string getValueName(const GlobalValue *V, const char *Suffix = "");
+  std::string getMangledName(const GlobalValue *V, const char *Suffix = "",
+                             bool ForcePrivate = false);
+  
+  std::string getValueName(const GlobalValue *V, const char *Suffix = "") {
+    return getMangledName(V, Suffix);
+  }
 
   /// makeNameProper - We don't want identifier names with ., space, or
   /// - in them, so we mangle these characters into the strings "d_",

Modified: llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp?rev=75610&r1=75609&r2=75610&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp (original)
+++ llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp Tue Jul 14 01:04:35 2009
@@ -233,7 +233,7 @@
   EmitConstantPool(MF.getConstantPool());
 
   if (F->hasDLLExportLinkage())
-    DLLExportedFns.insert(Mang->getValueName(F));
+    DLLExportedFns.insert(Mang->getMangledName(F));
 
   // Print the 'header' of function
   emitFunctionHeader(MF);
@@ -304,62 +304,58 @@
     break;
   case MachineOperand::MO_GlobalAddress: {
     const GlobalValue *GV = MO.getGlobal();
-    std::string Name = Mang->getValueName(GV);
-    decorateName(Name, GV);
     
-    bool needCloseParen = false;
-    if (Name[0] == '$') {
-      // The name begins with a dollar-sign. In order to avoid having it look
-      // like an integer immediate to the assembler, enclose it in parens.
-      O << '(';
-      needCloseParen = true;
-    }
+    const char *Suffix = "";
+    
+    if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB)
+      Suffix = "$stub";
+    else if (MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY ||
+             MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY_PIC_BASE ||
+             MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY ||
+             MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE)
+      Suffix = "$non_lazy_ptr";
+    
+    std::string Name = Mang->getMangledName(GV, Suffix, Suffix[0] != '\0');
+    decorateName(Name, GV);
     
     // Handle dllimport linkage.
-    if (MO.getTargetFlags() == X86II::MO_DLLIMPORT) {
-      O << "__imp_" << Name;
-    } else if (MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY ||
-               MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY_PIC_BASE) {
+    if (MO.getTargetFlags() == X86II::MO_DLLIMPORT)
+      Name = "__imp_" + Name;
+    
+    if (MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY ||
+        MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY_PIC_BASE)
       GVStubs.insert(Name);
-      printSuffixedName(Name, "$non_lazy_ptr");
-    } else if (MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY ||
-               MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE){
+    else if (MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY ||
+             MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE)
       HiddenGVStubs.insert(Name);
-      printSuffixedName(Name, "$non_lazy_ptr");
-    } else if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) {
+    else if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB)
       FnStubs.insert(Name);
-      printSuffixedName(Name, "$stub");
-    } else {
-      O << Name;
-    }
     
-    if (needCloseParen)
-      O << ')';
+    // If the name begins with a dollar-sign, enclose it in parens.  We do this
+    // to avoid having it look like an integer immediate to the assembler.
+    if (Name[0] == '$') 
+      O << '(' << Name << ')';
+    else
+      O << Name;
     
     printOffset(MO.getOffset());
     break;
   }
   case MachineOperand::MO_ExternalSymbol: {
-    bool needCloseParen = false;
     std::string Name(TAI->getGlobalPrefix());
     Name += MO.getSymbolName();
-    
-    if (Name[0] == '$') {
-      // The name begins with a dollar-sign. In order to avoid having it look
-      // like an integer immediate to the assembler, enclose it in parens.
-      O << '(';
-      needCloseParen = true;
-    }
-    
+
     if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) {
+      Name += "$stub";
       FnStubs.insert(Name);
-      printSuffixedName(Name, "$stub");
-    } else {
-      O << Name;
     }
     
-    if (needCloseParen)
-      O << ')';
+    // If the name begins with a dollar-sign, enclose it in parens.  We do this
+    // to avoid having it look like an integer immediate to the assembler.
+    if (Name[0] == '$') 
+      O << '(' << Name << ')';
+    else
+      O << Name;
     break;
   }
   }
@@ -787,7 +783,7 @@
     return;
   }
 
-  std::string name = Mang->getValueName(GVar);
+  std::string name = Mang->getMangledName(GVar);
   Constant *C = GVar->getInitializer();
   if (isa<MDNode>(C) || isa<MDString>(C))
     return;
@@ -903,6 +899,20 @@
   EmitGlobalConstant(C);
 }
 
+/// PrintWithoutDarwinSuffix - Print a name that has a suffix appended to it
+/// without the suffix.  This is used for darwin stub emission, where we have to
+/// be careful to remove the suffix even if the name is quoted.
+static void PrintWithoutDarwinSuffix(const char *Name, unsigned NameLen,
+                                     unsigned SuffixLen, raw_ostream &O) {
+  assert(NameLen > SuffixLen && "Invalid empty name or bogus suffix");
+  if (Name[NameLen-1] != '"') {
+    O.write(Name, NameLen-SuffixLen);  // foo$stub -> foo
+  } else {
+    O.write(Name, NameLen-SuffixLen-1);  // "foo$stub" -> "foo
+    O << '"';                            //            -> "
+  }
+}
+
 bool X86ATTAsmPrinter::doFinalization(Module &M) {
   // Print out module-level global variables here.
   for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
@@ -910,7 +920,7 @@
     printModuleLevelGV(I);
 
     if (I->hasDLLExportLinkage())
-      DLLExportedGVs.insert(Mang->getValueName(I));
+      DLLExportedGVs.insert(Mang->getMangledName(I));
   }
 
   if (Subtarget->isTargetDarwin()) {
@@ -921,11 +931,10 @@
     if (TAI->doesSupportExceptionHandling() && MMI && !Subtarget->is64Bit()) {
       const std::vector<Function*> &Personalities = MMI->getPersonalities();
       for (unsigned i = 0, e = Personalities.size(); i != e; ++i) {
-        if (Personalities[i] == 0)
-          continue;
-        std::string Name = Mang->getValueName(Personalities[i]);
-        decorateName(Name, Personalities[i]);
-        GVStubs.insert(Name);
+        if (Personalities[i])
+          GVStubs.insert(Mang->getMangledName(Personalities[i],
+                                              "$non_lazy_ptr",
+                                              true /*private label*/));
       }
     }
 
@@ -936,10 +945,13 @@
         SwitchToDataSection("\t.section __IMPORT,__jump_table,symbol_stubs,"
                             "self_modifying_code+pure_instructions,5", 0);
         const char *Name = I->getKeyData();
-        printSuffixedName(Name, "$stub");
-        O << ":\n"
-             "\t.indirect_symbol " << Name << "\n"
-             "\thlt ; hlt ; hlt ; hlt ; hlt\n";
+        O << Name << ":\n";
+        O << "\t.indirect_symbol ";
+        
+        // Print the name without the $stub.
+        PrintWithoutDarwinSuffix(Name, I->getKeyLength(), strlen("$stub"), O);
+        O << '\n';
+        O << "\thlt ; hlt ; hlt ; hlt ; hlt\n";
       }
       O << '\n';
     }
@@ -951,8 +963,10 @@
       for (StringSet<>::iterator I = GVStubs.begin(), E = GVStubs.end();
            I != E; ++I) {
         const char *Name = I->getKeyData();
-        printSuffixedName(Name, "$non_lazy_ptr");
-        O << ":\n\t.indirect_symbol " << Name << "\n\t.long\t0\n";
+        O << Name << ":\n\t.indirect_symbol ";
+        PrintWithoutDarwinSuffix(Name, I->getKeyLength(),
+                                 strlen("$non_lazy_ptr"), O);
+        O << "\n\t.long\t0\n";
       }
     }
 
@@ -962,8 +976,10 @@
       for (StringSet<>::iterator I = HiddenGVStubs.begin(),
            E = HiddenGVStubs.end(); I != E; ++I) {
         const char *Name = I->getKeyData();
-        printSuffixedName(Name, "$non_lazy_ptr");
-        O << ":\n" << TAI->getData32bitsDirective() << Name << '\n';
+        O << Name << ":\n" << TAI->getData32bitsDirective();
+        PrintWithoutDarwinSuffix(Name, I->getKeyLength(),
+                                 strlen("$non_lazy_ptr"), O);
+        O << '\n';
       }
     }
 

Modified: llvm/trunk/lib/VMCore/Mangler.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Mangler.cpp?rev=75610&r1=75609&r2=75610&view=diff

==============================================================================
--- llvm/trunk/lib/VMCore/Mangler.cpp (original)
+++ llvm/trunk/lib/VMCore/Mangler.cpp Tue Jul 14 01:04:35 2009
@@ -116,12 +116,19 @@
   return Result;
 }
 
-std::string Mangler::getValueName(const GlobalValue *GV, const char *Suffix) {
+/// getMangledName - Returns the mangled name of V, an LLVM Value,
+/// in the current module.  If 'Suffix' is specified, the name ends with the
+/// specified suffix.  If 'ForcePrivate' is specified, the label is specified
+/// to have a private label prefix.
+///
+std::string Mangler::getMangledName(const GlobalValue *GV, const char *Suffix,
+                                    bool ForcePrivate) {
   assert((!isa<Function>(GV) || !cast<Function>(GV)->isIntrinsic()) &&
          "Intrinsic functions cannot be mangled by Mangler");
   
   if (GV->hasName())
-    return makeNameProper(GV->getName() + Suffix, GV->hasPrivateLinkage());
+    return makeNameProper(GV->getName() + Suffix,
+                          GV->hasPrivateLinkage() | ForcePrivate);
   
   // Get the ID for the global, assigning a new one if we haven't got one
   // already.
@@ -129,7 +136,8 @@
   if (ID == 0) ID = NextAnonGlobalID++;
   
   // Must mangle the global into a unique ID.
-  return "__unnamed_" + utostr(ID) + Suffix;
+  return makeNameProper("__unnamed_" + utostr(ID) + Suffix,
+                        GV->hasPrivateLinkage() | ForcePrivate);
 }
 
 Mangler::Mangler(Module &M, const char *prefix, const char *privatePrefix)

Modified: llvm/trunk/test/CodeGen/X86/loop-hoist.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/loop-hoist.ll?rev=75610&r1=75609&r2=75610&view=diff

==============================================================================
--- llvm/trunk/test/CodeGen/X86/loop-hoist.ll (original)
+++ llvm/trunk/test/CodeGen/X86/loop-hoist.ll Tue Jul 14 01:04:35 2009
@@ -1,10 +1,10 @@
 ; RUN: llvm-as < %s | \
 ; RUN:   llc -relocation-model=dynamic-no-pic -mtriple=i686-apple-darwin8.7.2 |\
-; RUN:   grep L_Arr.non_lazy_ptr
+; RUN:   grep LArr.non_lazy_ptr
 ; RUN: llvm-as < %s | \
 ; RUN:   llc -disable-post-RA-scheduler=true \
 ; RUN:       -relocation-model=dynamic-no-pic -mtriple=i686-apple-darwin8.7.2 |\
-; RUN:   %prcontext L_Arr.non_lazy_ptr 1 | grep {4(%esp)}
+; RUN:   %prcontext LArr.non_lazy_ptr 1 | grep {4(%esp)}
 
 @Arr = external global [0 x i32]		; <[0 x i32]*> [#uses=1]
 





More information about the llvm-commits mailing list