1*e226b08eSDavid Blaikie 2*e226b08eSDavid Blaikie #include "AddressPool.h" 3*e226b08eSDavid Blaikie #include "llvm/CodeGen/AsmPrinter.h" 4*e226b08eSDavid Blaikie #include "llvm/MC/MCStreamer.h" 5*e226b08eSDavid Blaikie #include "llvm/Target/TargetLoweringObjectFile.h" 6*e226b08eSDavid Blaikie 7*e226b08eSDavid Blaikie using namespace llvm; 8*e226b08eSDavid Blaikie 9*e226b08eSDavid Blaikie class MCExpr; 10*e226b08eSDavid Blaikie 11*e226b08eSDavid Blaikie unsigned AddressPool::getIndex(const MCSymbol *Sym, bool TLS) { 12*e226b08eSDavid Blaikie auto IterBool = 13*e226b08eSDavid Blaikie Pool.insert(std::make_pair(Sym, AddressPoolEntry(Pool.size(), TLS))); 14*e226b08eSDavid Blaikie return IterBool.first->second.Number; 15*e226b08eSDavid Blaikie } 16*e226b08eSDavid Blaikie 17*e226b08eSDavid Blaikie // Emit addresses into the section given. 18*e226b08eSDavid Blaikie void AddressPool::emit(AsmPrinter &Asm, const MCSection *AddrSection) { 19*e226b08eSDavid Blaikie if (Pool.empty()) 20*e226b08eSDavid Blaikie return; 21*e226b08eSDavid Blaikie 22*e226b08eSDavid Blaikie // Start the dwarf addr section. 23*e226b08eSDavid Blaikie Asm.OutStreamer.SwitchSection(AddrSection); 24*e226b08eSDavid Blaikie 25*e226b08eSDavid Blaikie // Order the address pool entries by ID 26*e226b08eSDavid Blaikie SmallVector<const MCExpr *, 64> Entries(Pool.size()); 27*e226b08eSDavid Blaikie 28*e226b08eSDavid Blaikie for (const auto &I : Pool) 29*e226b08eSDavid Blaikie Entries[I.second.Number] = 30*e226b08eSDavid Blaikie I.second.TLS 31*e226b08eSDavid Blaikie ? Asm.getObjFileLowering().getDebugThreadLocalSymbol(I.first) 32*e226b08eSDavid Blaikie : MCSymbolRefExpr::Create(I.first, Asm.OutContext); 33*e226b08eSDavid Blaikie 34*e226b08eSDavid Blaikie for (const MCExpr *Entry : Entries) 35*e226b08eSDavid Blaikie Asm.OutStreamer.EmitValue(Entry, Asm.getDataLayout().getPointerSize()); 36*e226b08eSDavid Blaikie } 37