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/StringMap.h"
15#include <cassert>
16
17namespace llvm {
18
19/// \brief Utility for building string tables with deduplicated suffixes.
20class StringTableBuilder {
21  SmallString<256> StringTable;
22  StringMap<size_t> StringIndexMap;
23
24public:
25  /// \brief Add a string to the builder. Returns a StringRef to the internal
26  /// copy of s. Can only be used before the table is finalized.
27  StringRef add(StringRef s) {
28    assert(!isFinalized());
29    return StringIndexMap.insert(std::make_pair(s, 0)).first->first();
30  }
31
32  enum Kind {
33    ELF,
34    WinCOFF,
35    MachO
36  };
37
38  /// \brief Analyze the strings and build the final table. No more strings can
39  /// be added after this point.
40  void finalize(Kind kind);
41
42  /// \brief Retrieve the string table data. Can only be used after the table
43  /// is finalized.
44  StringRef data() {
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) {
52    assert(isFinalized());
53    assert(StringIndexMap.count(s) && "String is not in table!");
54    return StringIndexMap[s];
55  }
56
57  void clear();
58
59private:
60  bool isFinalized() {
61    return !StringTable.empty();
62  }
63};
64
65} // end llvm namespace
66
67#endif
68