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