[Alignment][NFC] Support compile time constants
[llvm-core.git] / include / llvm / MC / StringTableBuilder.h
blobc8d4c3bbc262b7cda5d4b411d13d981acea2820c
1 //===- StringTableBuilder.h - String table building utility -----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_MC_STRINGTABLEBUILDER_H
10 #define LLVM_MC_STRINGTABLEBUILDER_H
12 #include "llvm/ADT/CachedHashString.h"
13 #include "llvm/ADT/DenseMap.h"
14 #include "llvm/ADT/StringRef.h"
15 #include <cstddef>
16 #include <cstdint>
18 namespace llvm {
20 class raw_ostream;
22 /// Utility for building string tables with deduplicated suffixes.
23 class StringTableBuilder {
24 public:
25 enum Kind { ELF, WinCOFF, MachO, RAW, DWARF, XCOFF };
27 private:
28 DenseMap<CachedHashStringRef, size_t> StringIndexMap;
29 size_t Size = 0;
30 Kind K;
31 unsigned Alignment;
32 bool Finalized = false;
34 void finalizeStringTable(bool Optimize);
35 void initSize();
37 public:
38 StringTableBuilder(Kind K, unsigned Alignment = 1);
39 ~StringTableBuilder();
41 /// Add a string to the builder. Returns the position of S in the
42 /// table. The position will be changed if finalize is used.
43 /// Can only be used before the table is finalized.
44 size_t add(CachedHashStringRef S);
45 size_t add(StringRef S) { return add(CachedHashStringRef(S)); }
47 /// Analyze the strings and build the final table. No more strings can
48 /// be added after this point.
49 void finalize();
51 /// Finalize the string table without reording it. In this mode, offsets
52 /// returned by add will still be valid.
53 void finalizeInOrder();
55 /// Get the offest of a string in the string table. Can only be used
56 /// after the table is finalized.
57 size_t getOffset(CachedHashStringRef S) const;
58 size_t getOffset(StringRef S) const {
59 return getOffset(CachedHashStringRef(S));
62 size_t getSize() const { return Size; }
63 void clear();
65 void write(raw_ostream &OS) const;
66 void write(uint8_t *Buf) const;
68 private:
69 bool isFinalized() const { return Finalized; }
72 } // end namespace llvm
74 #endif // LLVM_MC_STRINGTABLEBUILDER_H