1dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//===-- StringTableBuilder.h - String table building utility ------*- C++ -*-=//
2dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//
3dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//                     The LLVM Compiler Infrastructure
4dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//
5dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// This file is distributed under the University of Illinois Open Source
6dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// License. See LICENSE.TXT for details.
7dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//
8dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//===----------------------------------------------------------------------===//
9dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_MC_STRINGTABLEBUILDER_H
1137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_MC_STRINGTABLEBUILDER_H
12dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
13dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/ADT/SmallString.h"
14cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar#include "llvm/ADT/DenseMap.h"
15dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include <cassert>
16dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
17dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace llvm {
18dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
19dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// \brief Utility for building string tables with deduplicated suffixes.
20dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass StringTableBuilder {
21cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarpublic:
22cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  enum Kind { ELF, WinCOFF, MachO, RAW };
23cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
24cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarprivate:
25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SmallString<256> StringTable;
26cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  DenseMap<StringRef, size_t> StringIndexMap;
27cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  size_t Size = 0;
28cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  Kind K;
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinespublic:
31cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  StringTableBuilder(Kind K);
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
33cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  /// \brief Add a string to the builder. Returns the position of S in the
34cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  /// table. The position will be changed if finalize is used.
35cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  /// Can only be used before the table is finalized.
36cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  size_t add(StringRef S);
3737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \brief Analyze the strings and build the final table. No more strings can
39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// be added after this point.
40cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  void finalize();
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \brief Retrieve the string table data. Can only be used after the table
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// is finalized.
44cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  StringRef data() const {
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    assert(isFinalized());
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return StringTable;
47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \brief Get the offest of a string in the string table. Can only be used
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// after the table is finalized.
51cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  size_t getOffset(StringRef S) const;
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
53cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  const DenseMap<StringRef, size_t> &getMap() const { return StringIndexMap; }
54cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  size_t getSize() const { return Size; }
5537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void clear();
5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesprivate:
58cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  bool isFinalized() const {
59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return !StringTable.empty();
60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines};
62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} // end llvm namespace
64dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#endif
66