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