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