1 //===- StringTableBuilder.h - String table building utility -----*- C++ -*-===//
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
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"
22 /// Utility for building string tables with deduplicated suffixes.
23 class StringTableBuilder
{
25 enum Kind
{ ELF
, WinCOFF
, MachO
, RAW
, DWARF
, XCOFF
};
28 DenseMap
<CachedHashStringRef
, size_t> StringIndexMap
;
32 bool Finalized
= false;
34 void finalizeStringTable(bool Optimize
);
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.
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
; }
65 void write(raw_ostream
&OS
) const;
66 void write(uint8_t *Buf
) const;
69 bool isFinalized() const { return Finalized
; }
72 } // end namespace llvm
74 #endif // LLVM_MC_STRINGTABLEBUILDER_H