[llvm-commits] [llvm] r93621 - /llvm/trunk/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp

Chris Lattner sabre at nondot.org
Fri Jan 15 18:00:23 PST 2010


Author: lattner
Date: Fri Jan 15 20:00:23 2010
New Revision: 93621

URL: http://llvm.org/viewvc/llvm-project?rev=93621&view=rev
Log:
use symbols instead of strings, eliminating a bunch of getMangledName
calls.  Add FIXMEs about a bunch of nondeterminism in stub output.

Modified:
    llvm/trunk/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp

Modified: llvm/trunk/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp?rev=93621&r1=93620&r2=93621&view=diff

==============================================================================
--- llvm/trunk/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp (original)
+++ llvm/trunk/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp Fri Jan 15 20:00:23 2010
@@ -94,8 +94,8 @@
       }
     };
     
-    StringMap<FnStubInfo> FnStubs;
-    StringMap<std::string> GVStubs, HiddenGVStubs, TOC;
+    DenseMap<const MCSymbol*, FnStubInfo> FnStubs;
+    StringMap<const MCSymbol*> GVStubs, HiddenGVStubs, TOC;
     const PPCSubtarget &Subtarget;
     uint64_t LabelID;
   public:
@@ -236,16 +236,15 @@
           GlobalValue *GV = MO.getGlobal();
           if (GV->isDeclaration() || GV->isWeakForLinker()) {
             // Dynamically-resolved functions need a stub for the function.
-            FnStubInfo &FnInfo = FnStubs[Mang->getMangledName(GV)];
+            FnStubInfo &FnInfo = FnStubs[GetGlobalValueSymbol(GV)];
             FnInfo.Init(GV, this);
             FnInfo.Stub->print(O, MAI);
             return;
           }
         }
         if (MO.getType() == MachineOperand::MO_ExternalSymbol) {
-          SmallString<128> MangledName;
-          Mang->getNameWithPrefix(MangledName, MO.getSymbolName());
-          FnStubInfo &FnInfo = FnStubs[MangledName.str()];
+          FnStubInfo &FnInfo =
+            FnStubs[GetExternalSymbolSymbol(MO.getSymbolName())];
           FnInfo.Init(MO.getSymbolName(), Mang, OutContext);
           FnInfo.Stub->print(O, MAI);
           return;
@@ -339,16 +338,13 @@
       std::string Name = Mang->getMangledName(GV);
 
       // Map symbol -> label of TOC entry.
-      if (TOC.count(Name) == 0) {
-        std::string Label;
-        Label += MAI->getPrivateGlobalPrefix();
-        Label += "C";
-        Label += utostr(LabelID++);
+      if (TOC.count(Name) == 0)
+        TOC[Name] = OutContext.
+          GetOrCreateSymbol(StringRef(MAI->getPrivateGlobalPrefix()) + "C" +
+                            Twine(LabelID++));
 
-        TOC[Name] = Label;
-      }
-
-      O << TOC[Name] << "@toc";
+      TOC[Name]->print(O, MAI);
+      O << "@toc";
     }
 
     void printPredicateOperand(const MachineInstr *MI, unsigned OpNo,
@@ -438,7 +434,9 @@
     Name += MO.getSymbolName();
     
     if (TM.getRelocationModel() != Reloc::Static) {
-      GVStubs[Name] = Name+"$non_lazy_ptr";
+      GVStubs[Name] = 
+        OutContext.GetOrCreateSymbol(StringRef(MAI->getGlobalPrefix())+
+                                     MO.getSymbolName()+"$non_lazy_ptr");
       Name += "$non_lazy_ptr";
     }
     O << Name;
@@ -447,25 +445,27 @@
   case MachineOperand::MO_GlobalAddress: {
     // Computing the address of a global symbol, not calling it.
     GlobalValue *GV = MO.getGlobal();
-    std::string Name;
+    MCSymbol *SymToPrint;
 
     // External or weakly linked global variables need non-lazily-resolved stubs
     if (TM.getRelocationModel() != Reloc::Static &&
         (GV->isDeclaration() || GV->isWeakForLinker())) {
       if (!GV->hasHiddenVisibility()) {
-        Name = Mang->getMangledName(GV, "$non_lazy_ptr", true);
-        GVStubs[Mang->getMangledName(GV)] = Name;
+        SymToPrint = GetPrivateGlobalValueSymbolStub(GV, "$non_lazy_ptr");
+        GVStubs[Mang->getMangledName(GV)] = SymToPrint;
       } else if (GV->isDeclaration() || GV->hasCommonLinkage() ||
                  GV->hasAvailableExternallyLinkage()) {
-        Name = Mang->getMangledName(GV, "$non_lazy_ptr", true);
-        HiddenGVStubs[Mang->getMangledName(GV)] = Name;
+        SymToPrint = GetPrivateGlobalValueSymbolStub(GV, "$non_lazy_ptr");
+        HiddenGVStubs[Mang->getMangledName(GV)] = SymToPrint;
+        GetGlobalValueSymbol(GV)->print(O, MAI);
       } else {
-        Name = Mang->getMangledName(GV);
+        SymToPrint = GetGlobalValueSymbol(GV);
       }
     } else {
-      Name = Mang->getMangledName(GV);
+      SymToPrint = GetGlobalValueSymbol(GV);
     }
-    O << Name;
+    
+    SymToPrint->print(O, MAI);
 
     printOffset(MO.getOffset());
     return;
@@ -827,9 +827,11 @@
     // FIXME 64-bit SVR4: Use MCSection here?
     O << "\t.section\t\".toc\",\"aw\"\n";
 
-    for (StringMap<std::string>::iterator I = TOC.begin(), E = TOC.end();
+    // FIXME: This is nondeterminstic!
+    for (StringMap<const MCSymbol*>::iterator I = TOC.begin(), E = TOC.end();
          I != E; ++I) {
-      O << I->second << ":\n";
+      I->second->print(O, MAI);
+      O << ":\n";
       O << "\t.tc " << I->getKeyData() << "[TC]," << I->getKeyData() << '\n';
     }
   }
@@ -1110,14 +1112,17 @@
                                 MCSectionMachO::S_SYMBOL_STUBS |
                                 MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
                                 32, SectionKind::getText());
-    for (StringMap<FnStubInfo>::iterator I = FnStubs.begin(), E = FnStubs.end();
-         I != E; ++I) {
+    // FIXME: This is emitting in nondeterminstic order!
+    for (DenseMap<const MCSymbol*, FnStubInfo>::iterator I = 
+           FnStubs.begin(), E = FnStubs.end(); I != E; ++I) {
       OutStreamer.SwitchSection(StubSection);
       EmitAlignment(4);
       const FnStubInfo &Info = I->second;
       Info.Stub->print(O, MAI);
       O << ":\n";
-      O << "\t.indirect_symbol " << I->getKeyData() << '\n';
+      O << "\t.indirect_symbol ";
+      I->first->print(O, MAI);
+      O << '\n';
       O << "\tmflr r0\n";
       O << "\tbcl 20,31,";
       Info.AnonSymbol->print(O, MAI);
@@ -1142,7 +1147,9 @@
       OutStreamer.SwitchSection(LSPSection);
       Info.LazyPtr->print(O, MAI);
       O << ":\n";
-      O << "\t.indirect_symbol " << I->getKeyData() << '\n';
+      O << "\t.indirect_symbol ";
+      I->first->print(O, MAI);
+      O << '\n';
       O << (isPPC64 ? "\t.quad" : "\t.long") << " dyld_stub_binding_helper\n";
     }
   } else if (!FnStubs.empty()) {
@@ -1152,14 +1159,17 @@
                                 MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
                                 16, SectionKind::getText());
     
-    for (StringMap<FnStubInfo>::iterator I = FnStubs.begin(), E = FnStubs.end();
-         I != E; ++I) {
+    // FIXME: This is emitting in nondeterminstic order!
+    for (DenseMap<const MCSymbol*, FnStubInfo>::iterator I = FnStubs.begin(),
+         E = FnStubs.end(); I != E; ++I) {
       OutStreamer.SwitchSection(StubSection);
       EmitAlignment(4);
       const FnStubInfo &Info = I->second;
       Info.Stub->print(O, MAI);
       O << ":\n";
-      O << "\t.indirect_symbol " << I->getKeyData() << '\n';
+      O << "\t.indirect_symbol ";
+      I->first->print(O, MAI);
+      O << '\n';
       O << "\tlis r11,ha16(";
       Info.LazyPtr->print(O, MAI);
       O << ")\n";
@@ -1171,7 +1181,9 @@
       OutStreamer.SwitchSection(LSPSection);
       Info.LazyPtr->print(O, MAI);
       O << ":\n";
-      O << "\t.indirect_symbol " << I->getKeyData() << '\n';
+      O << "\t.indirect_symbol ";
+      I->first->print(O, MAI);
+      O << '\n';
       O << (isPPC64 ? "\t.quad" : "\t.long") << " dyld_stub_binding_helper\n";
     }
   }
@@ -1186,7 +1198,7 @@
          E = Personalities.end(); I != E; ++I) {
       if (*I)
         GVStubs[Mang->getMangledName(*I)] =
-          Mang->getMangledName(*I, "$non_lazy_ptr", true);
+          GetPrivateGlobalValueSymbolStub(*I, "$non_lazy_ptr");
     }
   }
 
@@ -1196,9 +1208,11 @@
     OutStreamer.SwitchSection(TLOFMacho.getNonLazySymbolPointerSection());
     EmitAlignment(isPPC64 ? 3 : 2);
     
-    for (StringMap<std::string>::iterator I = GVStubs.begin(),
+    // FIXME: This is nondeterminstic.
+    for (StringMap<const MCSymbol *>::iterator I = GVStubs.begin(),
          E = GVStubs.end(); I != E; ++I) {
-      O << I->second << ":\n";
+      I->second->print(O, MAI);
+      O << ":\n";
       O << "\t.indirect_symbol " << I->getKeyData() << '\n';
       O << (isPPC64 ? "\t.quad\t0\n" : "\t.long\t0\n");
     }
@@ -1207,9 +1221,11 @@
   if (!HiddenGVStubs.empty()) {
     OutStreamer.SwitchSection(getObjFileLowering().getDataSection());
     EmitAlignment(isPPC64 ? 3 : 2);
-    for (StringMap<std::string>::iterator I = HiddenGVStubs.begin(),
+    // FIXME: This is nondeterminstic.
+    for (StringMap<const MCSymbol *>::iterator I = HiddenGVStubs.begin(),
          E = HiddenGVStubs.end(); I != E; ++I) {
-      O << I->second << ":\n";
+      I->second->print(O, MAI);
+      O << ":\n";
       O << (isPPC64 ? "\t.quad\t" : "\t.long\t") << I->getKeyData() << '\n';
     }
   }





More information about the llvm-commits mailing list