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 
19 namespace llvm {
20 
21 class raw_ostream;
22 
23 /// Utility for building string tables with deduplicated suffixes.
24 class StringTableBuilder {
25 public:
26   enum Kind { ELF, WinCOFF, MachO, RAW, DWARF };
27 
28 private:
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 
38 public:
39   StringTableBuilder(Kind K, unsigned Alignment = 1);
40   ~StringTableBuilder();
41 
42   /// 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);
add(StringRef S)46   size_t add(StringRef S) { return add(CachedHashStringRef(S)); }
47 
48   /// 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   /// 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;
getOffset(StringRef S)59   size_t getOffset(StringRef S) const {
60     return getOffset(CachedHashStringRef(S));
61   }
62 
getSize()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 
69 private:
isFinalized()70   bool isFinalized() const { return Finalized; }
71 };
72 
73 } // end namespace llvm
74 
75 #endif // LLVM_MC_STRINGTABLEBUILDER_H
76