22 : Pool(
A), Prefix(Prefix),
23 ShouldCreateSymbols(Asm.doesDwarfUseRelocationsAcrossSections()) {}
27 auto I = Pool.try_emplace(Str);
28 auto &Entry =
I.first->second;
31 Entry.Offset = NumBytes;
32 Entry.Symbol = ShouldCreateSymbols ? Asm.createTempSymbol(Prefix) :
nullptr;
34 NumBytes += Str.size() + 1;
41 auto &MapEntry = getEntryImpl(Asm, Str);
47 auto &MapEntry = getEntryImpl(Asm, Str);
48 if (!MapEntry.getValue().isIndexed())
49 MapEntry.getValue().Index = NumIndexedStrings++;
58 Asm.OutStreamer->switchSection(Section);
59 unsigned EntrySize = Asm.getDwarfOffsetByteSize();
65 "Length of String Offsets Set");
66 Asm.emitInt16(Asm.getDwarfVersion());
72 Asm.OutStreamer->emitLabel(StartSym);
76 MCSection *OffsetSection,
bool UseRelativeOffsets) {
81 Asm.OutStreamer->switchSection(StrSection);
89 return A->getValue().Offset <
B->getValue().Offset;
92 for (
const auto &Entry : Entries) {
93 assert(ShouldCreateSymbols ==
static_cast<bool>(Entry->getValue().Symbol) &&
94 "Mismatch between setting and entry");
97 if (ShouldCreateSymbols)
98 Asm.OutStreamer->emitLabel(Entry->getValue().Symbol);
101 Asm.OutStreamer->AddComment(
"string offset=" +
102 Twine(Entry->getValue().Offset));
103 Asm.OutStreamer->emitBytes(
104 StringRef(Entry->getKeyData(), Entry->getKeyLength() + 1));
111 Entries.
resize(NumIndexedStrings);
112 for (
const auto &Entry : Pool) {
113 if (Entry.getValue().isIndexed())
114 Entries[Entry.getValue().Index] = &Entry;
117 Asm.OutStreamer->switchSection(OffsetSection);
118 unsigned size = Asm.getDwarfOffsetByteSize();
119 for (
const auto &Entry : Entries)
120 if (UseRelativeOffsets)
121 Asm.emitDwarfStringOffset(Entry->getValue());
123 Asm.OutStreamer->emitIntValue(Entry->getValue().Offset,
size);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file defines the SmallVector class.
This class is intended to be used as a driving class for all asm writers.
LLVM_ABI_FOR_TEST EntryRef getEntry(AsmPrinter &Asm, StringRef Str)
Get a reference to an entry in the string pool.
LLVM_ABI_FOR_TEST EntryRef getIndexedEntry(AsmPrinter &Asm, StringRef Str)
Same as getEntry, except that you can use EntryRef::getIndex to obtain a unique ID of this entry (e....
DwarfStringPoolEntryRef EntryRef
unsigned getNumIndexedStrings() const
LLVM_ABI_FOR_TEST void emitStringOffsetsTableHeader(AsmPrinter &Asm, MCSection *OffsetSection, MCSymbol *StartSym)
LLVM_ABI_FOR_TEST DwarfStringPool(BumpPtrAllocator &A, AsmPrinter &Asm, StringRef Prefix)
LLVM_ABI_FOR_TEST void emit(AsmPrinter &Asm, MCSection *StrSection, MCSection *OffsetSection=nullptr, bool UseRelativeOffsets=false)
Instances of this class represent a uniqued identifier for a section in the current translation unit.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringMapEntry - This is used to represent one value that is inserted into a StringMap.
StringRef - Represent a constant reference to a string, i.e.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
This is an optimization pass for GlobalISel generic memory operations.
void sort(IteratorTy Start, IteratorTy End)
BumpPtrAllocatorImpl BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
static constexpr unsigned NotIndexed