169d0cf06SDavid Blaikie //===-- llvm/CodeGen/AddressPool.cpp - Dwarf Debug Framework ---*- C++ -*--===//
269d0cf06SDavid Blaikie //
369d0cf06SDavid Blaikie //                     The LLVM Compiler Infrastructure
469d0cf06SDavid Blaikie //
569d0cf06SDavid Blaikie // This file is distributed under the University of Illinois Open Source
669d0cf06SDavid Blaikie // License. See LICENSE.TXT for details.
769d0cf06SDavid Blaikie //
869d0cf06SDavid Blaikie //===----------------------------------------------------------------------===//
9e226b08eSDavid Blaikie 
10e226b08eSDavid Blaikie #include "AddressPool.h"
11e226b08eSDavid Blaikie #include "llvm/CodeGen/AsmPrinter.h"
12e226b08eSDavid Blaikie #include "llvm/MC/MCStreamer.h"
13e226b08eSDavid Blaikie #include "llvm/Target/TargetLoweringObjectFile.h"
14e226b08eSDavid Blaikie 
15e226b08eSDavid Blaikie using namespace llvm;
16e226b08eSDavid Blaikie 
17e226b08eSDavid Blaikie class MCExpr;
18e226b08eSDavid Blaikie 
19e226b08eSDavid Blaikie unsigned AddressPool::getIndex(const MCSymbol *Sym, bool TLS) {
20e12b49a6SDavid Blaikie   HasBeenUsed = true;
21e226b08eSDavid Blaikie   auto IterBool =
22e226b08eSDavid Blaikie       Pool.insert(std::make_pair(Sym, AddressPoolEntry(Pool.size(), TLS)));
23e226b08eSDavid Blaikie   return IterBool.first->second.Number;
24e226b08eSDavid Blaikie }
25e226b08eSDavid Blaikie 
26e226b08eSDavid Blaikie // Emit addresses into the section given.
27e226b08eSDavid Blaikie void AddressPool::emit(AsmPrinter &Asm, const MCSection *AddrSection) {
28e226b08eSDavid Blaikie   if (Pool.empty())
29e226b08eSDavid Blaikie     return;
30e226b08eSDavid Blaikie 
31e226b08eSDavid Blaikie   // Start the dwarf addr section.
32*9ff69c8fSLang Hames   Asm.OutStreamer->SwitchSection(AddrSection);
33e226b08eSDavid Blaikie 
34e226b08eSDavid Blaikie   // Order the address pool entries by ID
35e226b08eSDavid Blaikie   SmallVector<const MCExpr *, 64> Entries(Pool.size());
36e226b08eSDavid Blaikie 
37e226b08eSDavid Blaikie   for (const auto &I : Pool)
38e226b08eSDavid Blaikie     Entries[I.second.Number] =
39e226b08eSDavid Blaikie         I.second.TLS
40e226b08eSDavid Blaikie             ? Asm.getObjFileLowering().getDebugThreadLocalSymbol(I.first)
41e226b08eSDavid Blaikie             : MCSymbolRefExpr::Create(I.first, Asm.OutContext);
42e226b08eSDavid Blaikie 
43e226b08eSDavid Blaikie   for (const MCExpr *Entry : Entries)
44*9ff69c8fSLang Hames     Asm.OutStreamer->EmitValue(Entry, Asm.getDataLayout().getPointerSize());
45e226b08eSDavid Blaikie }
46