1 //===-- NonRelocatableStringpool.h - A simple stringpool -----------------===// 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 #ifndef LLVM_TOOLS_DSYMUTIL_NONRELOCATABLESTRINGPOOL_H 10 #define LLVM_TOOLS_DSYMUTIL_NONRELOCATABLESTRINGPOOL_H 11 12 namespace llvm { 13 namespace dsymutil { 14 15 /// \brief A string table that doesn't need relocations. 16 /// 17 /// We are doing a final link, no need for a string table that 18 /// has relocation entries for every reference to it. This class 19 /// provides this ablitity by just associating offsets with 20 /// strings. 21 class NonRelocatableStringpool { 22 public: 23 /// \brief Entries are stored into the StringMap and simply linked 24 /// together through the second element of this pair in order to 25 /// keep track of insertion order. 26 typedef StringMap<std::pair<uint32_t, StringMapEntryBase *>, BumpPtrAllocator> 27 MapTy; 28 NonRelocatableStringpool()29 NonRelocatableStringpool() 30 : CurrentEndOffset(0), Sentinel(0), Last(&Sentinel) { 31 // Legacy dsymutil puts an empty string at the start of the line 32 // table. 33 getStringOffset(""); 34 } 35 36 /// \brief Get the offset of string \p S in the string table. This 37 /// can insert a new element or return the offset of a preexisitng 38 /// one. 39 uint32_t getStringOffset(StringRef S); 40 41 /// \brief Get permanent storage for \p S (but do not necessarily 42 /// emit \p S in the output section). 43 /// \returns The StringRef that points to permanent storage to use 44 /// in place of \p S. 45 StringRef internString(StringRef S); 46 47 // \brief Return the first entry of the string table. getFirstEntry()48 const MapTy::MapEntryTy *getFirstEntry() const { 49 return getNextEntry(&Sentinel); 50 } 51 52 // \brief Get the entry following \p E in the string table or null 53 // if \p E was the last entry. getNextEntry(const MapTy::MapEntryTy * E)54 const MapTy::MapEntryTy *getNextEntry(const MapTy::MapEntryTy *E) const { 55 return static_cast<const MapTy::MapEntryTy *>(E->getValue().second); 56 } 57 getSize()58 uint64_t getSize() { return CurrentEndOffset; } 59 60 private: 61 MapTy Strings; 62 uint32_t CurrentEndOffset; 63 MapTy::MapEntryTy Sentinel, *Last; 64 }; 65 } 66 } 67 68 #endif 69