From 5df08d8f55f47aafc671c358d971dbcc10dfdeef Mon Sep 17 00:00:00 2001 From: Jim Grosbach Date: Tue, 9 Nov 2010 18:45:04 +0000 Subject: [PATCH] Further MCize ARM constant pool values. This allows basic PIC references for object file emission. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118601 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/ARMAsmPrinter.cpp | 150 +++++++++++++++++-------------- 1 file changed, 83 insertions(+), 67 deletions(-) diff --git a/lib/Target/ARM/ARMAsmPrinter.cpp b/lib/Target/ARM/ARMAsmPrinter.cpp index 3908b1eeeb4..5672bff7e94 100644 --- a/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/ARMAsmPrinter.cpp @@ -227,73 +227,7 @@ namespace { /// 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(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(); - 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 @@ static MCSymbol *getPICLabel(const char *Prefix, unsigned FunctionNumber, return Label; } +void ARMAsmPrinter:: +EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) { + int Size = TM.getTargetData()->getTypeAllocSize(MCPV->getType()); + + ARMConstantPoolValue *ACPV = static_cast(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(); + 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;