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/StringMap.h" 15#include <cassert> 16 17namespace llvm { 18 19/// \brief Utility for building string tables with deduplicated suffixes. 20class StringTableBuilder { 21 SmallString<256> StringTable; 22 StringMap<size_t> StringIndexMap; 23 24public: 25 /// \brief Add a string to the builder. Returns a StringRef to the internal 26 /// copy of s. Can only be used before the table is finalized. 27 StringRef add(StringRef s) { 28 assert(!isFinalized()); 29 return StringIndexMap.insert(std::make_pair(s, 0)).first->first(); 30 } 31 32 enum Kind { 33 ELF, 34 WinCOFF, 35 MachO 36 }; 37 38 /// \brief Analyze the strings and build the final table. No more strings can 39 /// be added after this point. 40 void finalize(Kind kind); 41 42 /// \brief Retrieve the string table data. Can only be used after the table 43 /// is finalized. 44 StringRef data() { 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) { 52 assert(isFinalized()); 53 assert(StringIndexMap.count(s) && "String is not in table!"); 54 return StringIndexMap[s]; 55 } 56 57 void clear(); 58 59private: 60 bool isFinalized() { 61 return !StringTable.empty(); 62 } 63}; 64 65} // end llvm namespace 66 67#endif 68