• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 namespace llvm {
18 
19 /// \brief Utility for building string tables with deduplicated suffixes.
20 class StringTableBuilder {
21 public:
22   enum Kind { ELF, WinCOFF, MachO, RAW };
23 
24 private:
25   SmallString<256> StringTable;
26   DenseMap<CachedHash<StringRef>, size_t> StringIndexMap;
27   size_t Size = 0;
28   Kind K;
29   unsigned Alignment;
30 
31   void finalizeStringTable(bool Optimize);
32 
33 public:
34   StringTableBuilder(Kind K, unsigned Alignment = 1);
35 
36   /// \brief Add a string to the builder. Returns the position of S in the
37   /// table. The position will be changed if finalize is used.
38   /// Can only be used before the table is finalized.
39   size_t add(StringRef S);
40 
41   /// \brief Analyze the strings and build the final table. No more strings can
42   /// be added after this point.
43   void finalize();
44 
45   /// Finalize the string table without reording it. In this mode, offsets
46   /// returned by add will still be valid.
47   void finalizeInOrder();
48 
49   /// \brief Retrieve the string table data. Can only be used after the table
50   /// is finalized.
data()51   StringRef data() const {
52     assert(isFinalized());
53     return StringTable;
54   }
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(StringRef S) const;
59 
getMap()60   const DenseMap<CachedHash<StringRef>, size_t> &getMap() const {
61     return StringIndexMap;
62   }
63 
getSize()64   size_t getSize() const { return Size; }
65   void clear();
66 
67 private:
isFinalized()68   bool isFinalized() const {
69     return !StringTable.empty();
70   }
71 };
72 
73 } // end llvm namespace
74 
75 #endif
76