diff options
| author | Jim Grosbach <grosbach@apple.com> | 2010-11-10 03:26:07 +0000 |
|---|---|---|
| committer | Jim Grosbach <grosbach@apple.com> | 2010-11-10 03:26:07 +0000 |
| commit | f23b2d9d8d257994e4b819f64b5963db0d452822 (patch) | |
| tree | f995872827f6eba860003c9668014b67d86a6662 /llvm/lib/Target/ARM | |
| parent | a8987a294da6dec68d33a5a84b1063fb909c39d9 (diff) | |
| download | bcm5719-llvm-f23b2d9d8d257994e4b819f64b5963db0d452822.tar.gz bcm5719-llvm-f23b2d9d8d257994e4b819f64b5963db0d452822.zip | |
Update ARMConstantPoolValue to not use a modifier string. Use an explicit
VariantKind marker to indicate the additional information necessary. Update
MC to handle the new Kinds. rdar://8647623
llvm-svn: 118671
Diffstat (limited to 'llvm/lib/Target/ARM')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMAsmPrinter.cpp | 85 |
1 files changed, 38 insertions, 47 deletions
diff --git a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp index ed7dd8c0de9..174346b084c 100644 --- a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp @@ -603,6 +603,20 @@ static MCSymbol *getPICLabel(const char *Prefix, unsigned FunctionNumber, return Label; } +static MCSymbolRefExpr::VariantKind +getModifierVariantKind(ARMCP::ARMCPModifier Modifier) { + switch (Modifier) { + default: llvm_unreachable("Unknown modifier!"); + case ARMCP::no_modifier: return MCSymbolRefExpr::VK_None; + case ARMCP::TLSGD: return MCSymbolRefExpr::VK_ARM_TLSGD; + case ARMCP::TPOFF: return MCSymbolRefExpr::VK_ARM_TPOFF; + case ARMCP::GOTTPOFF: return MCSymbolRefExpr::VK_ARM_GOTTPOFF; + case ARMCP::GOT: return MCSymbolRefExpr::VK_ARM_GOT; + case ARMCP::GOTOFF: return MCSymbolRefExpr::VK_ARM_GOTOFF; + } + return MCSymbolRefExpr::VK_None; +} + void ARMAsmPrinter:: EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) { int Size = TM.getTargetData()->getTypeAllocSize(MCPV->getType()); @@ -642,55 +656,32 @@ EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) { // 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->getModifierText() << ")"; - 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() && - "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); - if (ACPV->mustAddCurrentAddress()) { - // We want "(<expr> - .)", but MC doesn't have a concept of the '.' - // label, so just emit a local label end reference that instead. - MCSymbol *DotSym = OutContext.CreateTempSymbol(); - OutStreamer.EmitLabel(DotSym); - const MCExpr *DotExpr = MCSymbolRefExpr::Create(DotSym, OutContext); - Expr = MCBinaryExpr::CreateSub(Expr, DotExpr, OutContext); - } - Expr = MCBinaryExpr::CreateSub(Expr, PCRelExpr, OutContext); + const MCExpr *Expr = + MCSymbolRefExpr::Create(MCSym, getModifierVariantKind(ACPV->getModifier()), + OutContext); + + 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); + if (ACPV->mustAddCurrentAddress()) { + // We want "(<expr> - .)", but MC doesn't have a concept of the '.' + // label, so just emit a local label end reference that instead. + MCSymbol *DotSym = OutContext.CreateTempSymbol(); + OutStreamer.EmitLabel(DotSym); + const MCExpr *DotExpr = MCSymbolRefExpr::Create(DotSym, OutContext); + PCRelExpr = MCBinaryExpr::CreateSub(PCRelExpr, DotExpr, OutContext); } - OutStreamer.EmitValue(Expr, Size); + Expr = MCBinaryExpr::CreateSub(Expr, PCRelExpr, OutContext); } + OutStreamer.EmitValue(Expr, Size); } void ARMAsmPrinter::EmitJumpTable(const MachineInstr *MI) { |

