[llvm-commits] [llvm] r118601 - /llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp

Jim Grosbach grosbach at apple.com
Tue Nov 9 10:45:04 PST 2010


Author: grosbach
Date: Tue Nov  9 12:45:04 2010
New Revision: 118601

URL: http://llvm.org/viewvc/llvm-project?rev=118601&view=rev
Log:
Further MCize ARM constant pool values. This allows basic PIC references for
object file emission.

Modified:
    llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp

Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=118601&r1=118600&r2=118601&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Tue Nov  9 12:45:04 2010
@@ -227,73 +227,7 @@
 
     /// EmitMachineConstantPoolValue - Print a machine constantpool value to
     /// the .s file.
-    virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) {
-      int Size = TM.getTargetData()->getTypeAllocSize(MCPV->getType());
-
-      ARMConstantPoolValue *ACPV = static_cast<ARMConstantPoolValue*>(MCPV);
-      SmallString<128> Str;
-      raw_svector_ostream OS(Str);
-
-      if (ACPV->isLSDA()) {
-        OS << MAI->getPrivateGlobalPrefix() << "_LSDA_" << getFunctionNumber();
-      } else if (ACPV->isBlockAddress()) {
-        OS << *GetBlockAddressSymbol(ACPV->getBlockAddress());
-      } else if (ACPV->isGlobalValue()) {
-        const GlobalValue *GV = ACPV->getGV();
-        bool isIndirect = Subtarget->isTargetDarwin() &&
-          Subtarget->GVIsIndirectSymbol(GV, TM.getRelocationModel());
-        if (!isIndirect)
-          OS << *Mang->getSymbol(GV);
-        else {
-          // FIXME: Remove this when Darwin transition to @GOT like syntax.
-          MCSymbol *Sym = GetSymbolWithGlobalValueBase(GV, "$non_lazy_ptr");
-          OS << *Sym;
-
-          MachineModuleInfoMachO &MMIMachO =
-            MMI->getObjFileInfo<MachineModuleInfoMachO>();
-          MachineModuleInfoImpl::StubValueTy &StubSym =
-            GV->hasHiddenVisibility() ? MMIMachO.getHiddenGVStubEntry(Sym) :
-                                        MMIMachO.getGVStubEntry(Sym);
-          if (StubSym.getPointer() == 0)
-            StubSym = MachineModuleInfoImpl::
-              StubValueTy(Mang->getSymbol(GV), !GV->hasInternalLinkage());
-        }
-      } else {
-        assert(ACPV->isExtSymbol() && "unrecognized constant pool value");
-        OS << *GetExternalSymbolSymbol(ACPV->getSymbol());
-      }
-
-      // Create an MCSymbol for the reference.
-      MCSymbol *MCSym = OutContext.GetOrCreateSymbol(OS.str());
-      const MCExpr *Expr = MCSymbolRefExpr::Create(MCSym, OutContext);
-
-      // FIXME: Model the whole expression an an MCExpr and we can get rid
-      // of this hasRawTextSupport() clause and just do an EmitValue().
-      if (OutStreamer.hasRawTextSupport()) {
-        if (ACPV->hasModifier()) OS << "(" << ACPV->getModifier() << ")";
-        if (ACPV->getPCAdjustment() != 0) {
-          OS << "-(" << MAI->getPrivateGlobalPrefix() << "PC"
-            << getFunctionNumber() << "_"  << ACPV->getLabelId()
-            << "+" << (unsigned)ACPV->getPCAdjustment();
-          if (ACPV->mustAddCurrentAddress())
-            OS << "-.";
-          OS << ')';
-        }
-        const char *DataDirective = 0;
-        switch (Size) {
-        case 1: DataDirective = MAI->getData8bitsDirective(0); break;
-        case 2: DataDirective = MAI->getData16bitsDirective(0); break;
-        case 4: DataDirective = MAI->getData32bitsDirective(0); break;
-        default: assert(0 && "Unknown CPV size");
-        }
-        Twine Text(DataDirective, OS.str());
-        OutStreamer.EmitRawText(Text);
-      } else {
-        assert(!ACPV->hasModifier() && ACPV->getPCAdjustment() == 0 &&
-               "ARM binary streamer of non-trivial constant pool value!");
-        OutStreamer.EmitValue(Expr, Size);
-      }
-    }
+    virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV);
   };
 } // end of anonymous namespace
 
@@ -669,6 +603,88 @@
   return Label;
 }
 
+void ARMAsmPrinter::
+EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) {
+  int Size = TM.getTargetData()->getTypeAllocSize(MCPV->getType());
+
+  ARMConstantPoolValue *ACPV = static_cast<ARMConstantPoolValue*>(MCPV);
+  SmallString<128> Str;
+  raw_svector_ostream OS(Str);
+
+  if (ACPV->isLSDA()) {
+    OS << MAI->getPrivateGlobalPrefix() << "_LSDA_" << getFunctionNumber();
+  } else if (ACPV->isBlockAddress()) {
+    OS << *GetBlockAddressSymbol(ACPV->getBlockAddress());
+  } else if (ACPV->isGlobalValue()) {
+    const GlobalValue *GV = ACPV->getGV();
+    bool isIndirect = Subtarget->isTargetDarwin() &&
+      Subtarget->GVIsIndirectSymbol(GV, TM.getRelocationModel());
+    if (!isIndirect)
+      OS << *Mang->getSymbol(GV);
+    else {
+      // FIXME: Remove this when Darwin transition to @GOT like syntax.
+      MCSymbol *Sym = GetSymbolWithGlobalValueBase(GV, "$non_lazy_ptr");
+      OS << *Sym;
+
+      MachineModuleInfoMachO &MMIMachO =
+        MMI->getObjFileInfo<MachineModuleInfoMachO>();
+      MachineModuleInfoImpl::StubValueTy &StubSym =
+        GV->hasHiddenVisibility() ? MMIMachO.getHiddenGVStubEntry(Sym) :
+        MMIMachO.getGVStubEntry(Sym);
+      if (StubSym.getPointer() == 0)
+        StubSym = MachineModuleInfoImpl::
+          StubValueTy(Mang->getSymbol(GV), !GV->hasInternalLinkage());
+    }
+  } else {
+    assert(ACPV->isExtSymbol() && "unrecognized constant pool value");
+    OS << *GetExternalSymbolSymbol(ACPV->getSymbol());
+  }
+
+  // Create an MCSymbol for the reference.
+  MCSymbol *MCSym = OutContext.GetOrCreateSymbol(OS.str());
+  const MCExpr *Expr = MCSymbolRefExpr::Create(MCSym, OutContext);
+
+  // FIXME: Model the whole expression an an MCExpr and we can get rid
+  // of this hasRawTextSupport() clause and just do an EmitValue().
+  if (OutStreamer.hasRawTextSupport()) {
+    if (ACPV->hasModifier()) OS << "(" << ACPV->getModifier() << ")";
+    if (ACPV->getPCAdjustment() != 0) {
+      OS << "-(" << MAI->getPrivateGlobalPrefix() << "PC"
+        << getFunctionNumber() << "_"  << ACPV->getLabelId()
+        << "+" << (unsigned)ACPV->getPCAdjustment();
+      if (ACPV->mustAddCurrentAddress())
+        OS << "-.";
+      OS << ')';
+    }
+    const char *DataDirective = 0;
+    switch (Size) {
+    case 1: DataDirective = MAI->getData8bitsDirective(0); break;
+    case 2: DataDirective = MAI->getData16bitsDirective(0); break;
+    case 4: DataDirective = MAI->getData32bitsDirective(0); break;
+    default: assert(0 && "Unknown CPV size");
+    }
+    Twine Text(DataDirective, OS.str());
+    OutStreamer.EmitRawText(Text);
+  } else {
+    assert(!ACPV->hasModifier() && !ACPV->mustAddCurrentAddress() &&
+           "ARM binary streamer of non-trivial constant pool value!");
+    if (ACPV->getPCAdjustment()) {
+      MCSymbol *PCLabel = getPICLabel(MAI->getPrivateGlobalPrefix(),
+                                      getFunctionNumber(),
+                                      ACPV->getLabelId(),
+                                      OutContext);
+      const MCExpr *PCRelExpr = MCSymbolRefExpr::Create(PCLabel, OutContext);
+      PCRelExpr =
+        MCBinaryExpr::CreateAdd(PCRelExpr,
+                                MCConstantExpr::Create(ACPV->getPCAdjustment(),
+                                                       OutContext),
+                                OutContext);
+      Expr = MCBinaryExpr::CreateSub(Expr, PCRelExpr, OutContext);
+    }
+    OutStreamer.EmitValue(Expr, Size);
+  }
+}
+
 void ARMAsmPrinter::EmitJumpTable(const MachineInstr *MI) {
   unsigned Opcode = MI->getOpcode();
   int OpNum = 1;





More information about the llvm-commits mailing list