AddressPool.h revision 341825
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 15namespace llvm { 16 17class AsmPrinter; 18class MCSection; 19class MCSymbol; 20 21// Collection of addresses for this unit and assorted labels. 22// A Symbol->unsigned mapping of addresses used by indirect 23// references. 24class AddressPool { 25 struct AddressPoolEntry { 26 unsigned Number; 27 bool TLS; 28 29 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 39public: 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 48 bool isEmpty() { return Pool.empty(); } 49 50 bool hasBeenUsed() const { return HasBeenUsed; } 51 52 void resetUsedFlag() { HasBeenUsed = false; } 53 54private: 55 void emitHeader(AsmPrinter &Asm, MCSection *Section); 56}; 57 58} // end namespace llvm 59 60#endif // LLVM_LIB_CODEGEN_ASMPRINTER_ADDRESSPOOL_H 61