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/CachedHashString.h" 14#include "llvm/ADT/DenseMap.h" 15#include "llvm/ADT/StringRef.h" 16#include <cstddef> 17#include <cstdint> 18 19namespace llvm { 20 21class raw_ostream; 22 23/// \brief Utility for building string tables with deduplicated suffixes. 24class StringTableBuilder { 25public: 26 enum Kind { ELF, WinCOFF, MachO, RAW }; 27 28private: 29 DenseMap<CachedHashStringRef, size_t> StringIndexMap; 30 size_t Size = 0; 31 Kind K; 32 unsigned Alignment; 33 bool Finalized = false; 34 35 void finalizeStringTable(bool Optimize); 36 void initSize(); 37 38public: 39 StringTableBuilder(Kind K, unsigned Alignment = 1); 40 ~StringTableBuilder(); 41 42 /// \brief Add a string to the builder. Returns the position of S in the 43 /// table. The position will be changed if finalize is used. 44 /// Can only be used before the table is finalized. 45 size_t add(CachedHashStringRef S); 46 size_t add(StringRef S) { return add(CachedHashStringRef(S)); } 47 48 /// \brief Analyze the strings and build the final table. No more strings can 49 /// be added after this point. 50 void finalize(); 51 52 /// Finalize the string table without reording it. In this mode, offsets 53 /// returned by add will still be valid. 54 void finalizeInOrder(); 55 56 /// \brief Get the offest of a string in the string table. Can only be used 57 /// after the table is finalized. 58 size_t getOffset(CachedHashStringRef S) const; 59 size_t getOffset(StringRef S) const { 60 return getOffset(CachedHashStringRef(S)); 61 } 62 63 size_t getSize() const { return Size; } 64 void clear(); 65 66 void write(raw_ostream &OS) const; 67 void write(uint8_t *Buf) const; 68 69private: 70 bool isFinalized() const { return Finalized; } 71}; 72 73} // end namespace llvm 74 75#endif // LLVM_MC_STRINGTABLEBUILDER_H 76