1 //===- llvm/CodeGen/DwarfStringPoolEntry.h - String pool entry --*- 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_CODEGEN_DWARFSTRINGPOOLENTRY_H 11 #define LLVM_CODEGEN_DWARFSTRINGPOOLENTRY_H 12 13 #include "llvm/ADT/PointerIntPair.h" 14 #include "llvm/ADT/StringMap.h" 15 16 namespace llvm { 17 18 class MCSymbol; 19 20 /// Data for a string pool entry. 21 struct DwarfStringPoolEntry { 22 static constexpr unsigned NotIndexed = -1; 23 24 MCSymbol *Symbol; 25 unsigned Offset; 26 unsigned Index; 27 isIndexedDwarfStringPoolEntry28 bool isIndexed() const { return Index != NotIndexed; } 29 }; 30 31 /// String pool entry reference. 32 class DwarfStringPoolEntryRef { 33 PointerIntPair<const StringMapEntry<DwarfStringPoolEntry> *, 1, bool> 34 MapEntryAndIndexed; 35 getMapEntry()36 const StringMapEntry<DwarfStringPoolEntry> *getMapEntry() const { 37 return MapEntryAndIndexed.getPointer(); 38 } 39 40 public: 41 DwarfStringPoolEntryRef() = default; DwarfStringPoolEntryRef(const StringMapEntry<DwarfStringPoolEntry> & Entry,bool Indexed)42 DwarfStringPoolEntryRef(const StringMapEntry<DwarfStringPoolEntry> &Entry, 43 bool Indexed) 44 : MapEntryAndIndexed(&Entry, Indexed) {} 45 46 explicit operator bool() const { return getMapEntry(); } getSymbol()47 MCSymbol *getSymbol() const { 48 assert(getMapEntry()->second.Symbol && "No symbol available!"); 49 return getMapEntry()->second.Symbol; 50 } getOffset()51 unsigned getOffset() const { return getMapEntry()->second.Offset; } isIndexed()52 bool isIndexed() const { return MapEntryAndIndexed.getInt(); } getIndex()53 unsigned getIndex() const { 54 assert(isIndexed()); 55 assert(getMapEntry()->getValue().isIndexed()); 56 return getMapEntry()->second.Index; 57 } getString()58 StringRef getString() const { return getMapEntry()->first(); } 59 /// Return the entire string pool entry for convenience. getEntry()60 DwarfStringPoolEntry getEntry() const { return getMapEntry()->getValue(); } 61 62 bool operator==(const DwarfStringPoolEntryRef &X) const { 63 return getMapEntry() == X.getMapEntry(); 64 } 65 bool operator!=(const DwarfStringPoolEntryRef &X) const { 66 return getMapEntry() != X.getMapEntry(); 67 } 68 }; 69 70 } // end namespace llvm 71 72 #endif 73