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