1 //===- llvm/CodeGen/AddressPool.h - 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 #ifndef LLVM_LIB_CODEGEN_ASMPRINTER_ADDRESSPOOL_H 11 #define LLVM_LIB_CODEGEN_ASMPRINTER_ADDRESSPOOL_H 12 13 #include "llvm/ADT/DenseMap.h" 14 15 namespace llvm { 16 17 class AsmPrinter; 18 class MCSection; 19 class MCSymbol; 20 21 // Collection of addresses for this unit and assorted labels. 22 // A Symbol->unsigned mapping of addresses used by indirect 23 // references. 24 class AddressPool { 25 struct AddressPoolEntry { 26 unsigned Number; 27 bool TLS; 28 AddressPoolEntryAddressPoolEntry29 AddressPoolEntry(unsigned Number, bool TLS) : Number(Number), TLS(TLS) {} 30 }; 31 DenseMap<const MCSymbol *, AddressPoolEntry> Pool; 32 33 /// Record whether the AddressPool has been queried for an address index since 34 /// the last "resetUsedFlag" call. Used to implement type unit fallback - a 35 /// type that references addresses cannot be placed in a type unit when using 36 /// fission. 37 bool HasBeenUsed = false; 38 39 public: 40 AddressPool() = default; 41 42 /// Returns the index into the address pool with the given 43 /// label/symbol. 44 unsigned getIndex(const MCSymbol *Sym, bool TLS = false); 45 46 void emit(AsmPrinter &Asm, MCSection *AddrSection); 47 isEmpty()48 bool isEmpty() { return Pool.empty(); } 49 hasBeenUsed()50 bool hasBeenUsed() const { return HasBeenUsed; } 51 resetUsedFlag()52 void resetUsedFlag() { HasBeenUsed = false; } 53 54 private: 55 void emitHeader(AsmPrinter &Asm, MCSection *Section); 56 }; 57 58 } // end namespace llvm 59 60 #endif // LLVM_LIB_CODEGEN_ASMPRINTER_ADDRESSPOOL_H 61