[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