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