1 //===-- StringTableBuilder.h - String table building utility ------*- 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_MC_STRINGTABLEBUILDER_H 11 #define LLVM_MC_STRINGTABLEBUILDER_H 12 13 #include "llvm/ADT/SmallString.h" 14 #include "llvm/ADT/DenseMap.h" 15 #include <cassert> 16 17 namespace llvm { 18 19 /// \brief Utility for building string tables with deduplicated suffixes. 20 class StringTableBuilder { 21 public: 22 enum Kind { ELF, WinCOFF, MachO, RAW }; 23 24 private: 25 SmallString<256> StringTable; 26 DenseMap<StringRef, size_t> StringIndexMap; 27 size_t Size = 0; 28 Kind K; 29 30 public: 31 StringTableBuilder(Kind K); 32 33 /// \brief Add a string to the builder. Returns the position of S in the 34 /// table. The position will be changed if finalize is used. 35 /// Can only be used before the table is finalized. 36 size_t add(StringRef S); 37 38 /// \brief Analyze the strings and build the final table. No more strings can 39 /// be added after this point. 40 void finalize(); 41 42 /// \brief Retrieve the string table data. Can only be used after the table 43 /// is finalized. data()44 StringRef data() const { 45 assert(isFinalized()); 46 return StringTable; 47 } 48 49 /// \brief Get the offest of a string in the string table. Can only be used 50 /// after the table is finalized. 51 size_t getOffset(StringRef S) const; 52 getMap()53 const DenseMap<StringRef, size_t> &getMap() const { return StringIndexMap; } getSize()54 size_t getSize() const { return Size; } 55 void clear(); 56 57 private: isFinalized()58 bool isFinalized() const { 59 return !StringTable.empty(); 60 } 61 }; 62 63 } // end llvm namespace 64 65 #endif 66