diff options
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp')
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp | 163 |
1 files changed, 1 insertions, 162 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp index 570165b81c9..76c52ab6cf1 100644 --- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -142,8 +142,6 @@ public: bool doFinalization(Module &M) override; void EmitStartOfAsmFile(Module &M) override; - - void EmitFunctionStubs(const MachineModuleInfoMachO::SymbolListTy &Stubs); }; } // end of anonymous namespace @@ -1341,161 +1339,6 @@ void PPCDarwinAsmPrinter::EmitStartOfAsmFile(Module &M) { OutStreamer->SwitchSection(getObjFileLowering().getTextSection()); } -static MCSymbol *GetLazyPtr(MCSymbol *Sym, MCContext &Ctx) { - // Remove $stub suffix, add $lazy_ptr. - StringRef NoStub = Sym->getName().substr(0, Sym->getName().size()-5); - return Ctx.getOrCreateSymbol(NoStub + "$lazy_ptr"); -} - -static MCSymbol *GetAnonSym(MCSymbol *Sym, MCContext &Ctx) { - // Add $tmp suffix to $stub, yielding $stub$tmp. - return Ctx.getOrCreateSymbol(Sym->getName() + "$tmp"); -} - -void PPCDarwinAsmPrinter:: -EmitFunctionStubs(const MachineModuleInfoMachO::SymbolListTy &Stubs) { - bool isPPC64 = getDataLayout().getPointerSizeInBits() == 64; - - // Construct a local MCSubtargetInfo and shadow EmitToStreamer here. - // This is because the MachineFunction won't exist (but have not yet been - // freed) and since we're at the global level we can use the default - // constructed subtarget. - std::unique_ptr<MCSubtargetInfo> STI(TM.getTarget().createMCSubtargetInfo( - TM.getTargetTriple().str(), TM.getTargetCPU(), - TM.getTargetFeatureString())); - auto EmitToStreamer = [&STI] (MCStreamer &S, const MCInst &Inst) { - S.EmitInstruction(Inst, *STI); - }; - - const TargetLoweringObjectFileMachO &TLOFMacho = - static_cast<const TargetLoweringObjectFileMachO &>(getObjFileLowering()); - - // .lazy_symbol_pointer - MCSection *LSPSection = TLOFMacho.getLazySymbolPointerSection(); - - // Output stubs for dynamically-linked functions - if (TM.getRelocationModel() == Reloc::PIC_) { - MCSection *StubSection = OutContext.getMachOSection( - "__TEXT", "__picsymbolstub1", - MachO::S_SYMBOL_STUBS | MachO::S_ATTR_PURE_INSTRUCTIONS, 32, - SectionKind::getText()); - for (unsigned i = 0, e = Stubs.size(); i != e; ++i) { - OutStreamer->SwitchSection(StubSection); - EmitAlignment(4); - - MCSymbol *Stub = Stubs[i].first; - MCSymbol *RawSym = Stubs[i].second.getPointer(); - MCSymbol *LazyPtr = GetLazyPtr(Stub, OutContext); - MCSymbol *AnonSymbol = GetAnonSym(Stub, OutContext); - - OutStreamer->EmitLabel(Stub); - OutStreamer->EmitSymbolAttribute(RawSym, MCSA_IndirectSymbol); - - const MCExpr *Anon = MCSymbolRefExpr::create(AnonSymbol, OutContext); - const MCExpr *LazyPtrExpr = MCSymbolRefExpr::create(LazyPtr, OutContext); - const MCExpr *Sub = - MCBinaryExpr::createSub(LazyPtrExpr, Anon, OutContext); - - // mflr r0 - EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR).addReg(PPC::R0)); - // bcl 20, 31, AnonSymbol - EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BCLalways).addExpr(Anon)); - OutStreamer->EmitLabel(AnonSymbol); - // mflr r11 - EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR).addReg(PPC::R11)); - // addis r11, r11, ha16(LazyPtr - AnonSymbol) - const MCExpr *SubHa16 = PPCMCExpr::createHa(Sub, true, OutContext); - EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS) - .addReg(PPC::R11) - .addReg(PPC::R11) - .addExpr(SubHa16)); - // mtlr r0 - EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTLR).addReg(PPC::R0)); - - // ldu r12, lo16(LazyPtr - AnonSymbol)(r11) - // lwzu r12, lo16(LazyPtr - AnonSymbol)(r11) - const MCExpr *SubLo16 = PPCMCExpr::createLo(Sub, true, OutContext); - EmitToStreamer(*OutStreamer, MCInstBuilder(isPPC64 ? PPC::LDU : PPC::LWZU) - .addReg(PPC::R12) - .addExpr(SubLo16).addExpr(SubLo16) - .addReg(PPC::R11)); - // mtctr r12 - EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTCTR).addReg(PPC::R12)); - // bctr - EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BCTR)); - - OutStreamer->SwitchSection(LSPSection); - OutStreamer->EmitLabel(LazyPtr); - OutStreamer->EmitSymbolAttribute(RawSym, MCSA_IndirectSymbol); - - MCSymbol *DyldStubBindingHelper = - OutContext.getOrCreateSymbol(StringRef("dyld_stub_binding_helper")); - if (isPPC64) { - // .quad dyld_stub_binding_helper - OutStreamer->EmitSymbolValue(DyldStubBindingHelper, 8); - } else { - // .long dyld_stub_binding_helper - OutStreamer->EmitSymbolValue(DyldStubBindingHelper, 4); - } - } - OutStreamer->AddBlankLine(); - return; - } - - MCSection *StubSection = OutContext.getMachOSection( - "__TEXT", "__symbol_stub1", - MachO::S_SYMBOL_STUBS | MachO::S_ATTR_PURE_INSTRUCTIONS, 16, - SectionKind::getText()); - for (unsigned i = 0, e = Stubs.size(); i != e; ++i) { - MCSymbol *Stub = Stubs[i].first; - MCSymbol *RawSym = Stubs[i].second.getPointer(); - MCSymbol *LazyPtr = GetLazyPtr(Stub, OutContext); - const MCExpr *LazyPtrExpr = MCSymbolRefExpr::create(LazyPtr, OutContext); - - OutStreamer->SwitchSection(StubSection); - EmitAlignment(4); - OutStreamer->EmitLabel(Stub); - OutStreamer->EmitSymbolAttribute(RawSym, MCSA_IndirectSymbol); - - // lis r11, ha16(LazyPtr) - const MCExpr *LazyPtrHa16 = - PPCMCExpr::createHa(LazyPtrExpr, true, OutContext); - EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LIS) - .addReg(PPC::R11) - .addExpr(LazyPtrHa16)); - - // ldu r12, lo16(LazyPtr)(r11) - // lwzu r12, lo16(LazyPtr)(r11) - const MCExpr *LazyPtrLo16 = - PPCMCExpr::createLo(LazyPtrExpr, true, OutContext); - EmitToStreamer(*OutStreamer, MCInstBuilder(isPPC64 ? PPC::LDU : PPC::LWZU) - .addReg(PPC::R12) - .addExpr(LazyPtrLo16).addExpr(LazyPtrLo16) - .addReg(PPC::R11)); - - // mtctr r12 - EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTCTR).addReg(PPC::R12)); - // bctr - EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BCTR)); - - OutStreamer->SwitchSection(LSPSection); - OutStreamer->EmitLabel(LazyPtr); - OutStreamer->EmitSymbolAttribute(RawSym, MCSA_IndirectSymbol); - - MCSymbol *DyldStubBindingHelper = - OutContext.getOrCreateSymbol(StringRef("dyld_stub_binding_helper")); - if (isPPC64) { - // .quad dyld_stub_binding_helper - OutStreamer->EmitSymbolValue(DyldStubBindingHelper, 8); - } else { - // .long dyld_stub_binding_helper - OutStreamer->EmitSymbolValue(DyldStubBindingHelper, 4); - } - } - - OutStreamer->AddBlankLine(); -} - bool PPCDarwinAsmPrinter::doFinalization(Module &M) { bool isPPC64 = getDataLayout().getPointerSizeInBits() == 64; @@ -1505,10 +1348,6 @@ bool PPCDarwinAsmPrinter::doFinalization(Module &M) { MachineModuleInfoMachO &MMIMacho = MMI->getObjFileInfo<MachineModuleInfoMachO>(); - MachineModuleInfoMachO::SymbolListTy Stubs = MMIMacho.GetFnStubList(); - if (!Stubs.empty()) - EmitFunctionStubs(Stubs); - if (MAI->doesSupportExceptionHandling() && MMI) { // Add the (possibly multiple) personalities to the set of global values. // Only referenced functions get into the Personalities list. @@ -1525,7 +1364,7 @@ bool PPCDarwinAsmPrinter::doFinalization(Module &M) { } // Output stubs for dynamically-linked functions. - Stubs = MMIMacho.GetGVStubList(); + MachineModuleInfoMachO::SymbolListTy Stubs = MMIMacho.GetGVStubList(); // Output macho stubs for external and common global variables. if (!Stubs.empty()) { |