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 17namespace llvm { 18 19/// \brief Utility for building string tables with deduplicated suffixes. 20class StringTableBuilder { 21public: 22 enum Kind { ELF, WinCOFF, MachO, RAW }; 23 24private: 25 SmallString<256> StringTable; 26 DenseMap<StringRef, size_t> StringIndexMap; 27 size_t Size = 0; 28 Kind K; 29 30public: 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. 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 53 const DenseMap<StringRef, size_t> &getMap() const { return StringIndexMap; } 54 size_t getSize() const { return Size; } 55 void clear(); 56 57private: 58 bool isFinalized() const { 59 return !StringTable.empty(); 60 } 61}; 62 63} // end llvm namespace 64 65#endif 66