53 E.second.Values.erase(
54 std::unique(E.second.Values.begin(), E.second.Values.end()),
55 E.second.Values.end());
68 Buckets[Bucket].push_back(&E.second);
69 E.second.Sym = Asm->createTempSymbol(Prefix);
76 return LHS->HashValue <
RHS->HashValue;
83class AccelTableWriter {
91 const bool SkipIdenticalHashes;
93 void emitHashes()
const;
101 bool SkipIdenticalHashes)
102 : Asm(Asm), Contents(Contents), SkipIdenticalHashes(SkipIdenticalHashes) {
106class AppleAccelTableWriter :
public AccelTableWriter {
119 static const uint32_t MagicHash = 0x48415348;
122 : BucketCount(BucketCount), HashCount(UniqueHashCount),
123 HeaderDataLength(DataLength) {}
142 : DieOffsetBase(
Offset), Atoms(AtomList.
begin(), AtomList.
end()) {}
152 HeaderData HeaderData;
155 void emitBuckets()
const;
156 void emitData()
const;
161 : AccelTableWriter(
Asm, Contents,
true),
162 Header(Contents.getBucketCount(), Contents.getUniqueHashCount(),
163 8 + (Atoms.
size() * 4)),
164 HeaderData(Atoms), SecBegin(SecBegin) {}
178class Dwarf5AccelTableWriter :
public AccelTableWriter {
188 uint32_t AugmentationStringSize =
sizeof(AugmentationString);
189 char AugmentationString[8] = {
'L',
'L',
'V',
'M',
'0',
'7',
'0',
'0'};
194 : CompUnitCount(CompUnitCount), LocalTypeUnitCount(LocalTypeUnitCount),
195 ForeignTypeUnitCount(ForeignTypeUnitCount), BucketCount(BucketCount),
196 NameCount(NameCount) {}
198 void emit(Dwarf5AccelTableWriter &Ctx);
214 MCSymbol *ContributionEnd =
nullptr;
215 MCSymbol *AbbrevStart =
Asm->createTempSymbol(
"names_abbrev_start");
216 MCSymbol *AbbrevEnd =
Asm->createTempSymbol(
"names_abbrev_end");
217 MCSymbol *EntryPool =
Asm->createTempSymbol(
"names_entries");
219 bool IsSplitDwarf =
false;
223 void populateAbbrevsMap();
225 void emitCUList()
const;
226 void emitTUList()
const;
227 void emitBuckets()
const;
228 void emitStringOffsets()
const;
229 void emitAbbrevs()
const;
237 Dwarf5AccelTableWriter(
239 ArrayRef<std::variant<MCSymbol *, uint64_t>> CompUnits,
240 ArrayRef<std::variant<MCSymbol *, uint64_t>> TypeUnits,
245 ~Dwarf5AccelTableWriter() {
247 Abbrev->~DebugNamesAbbrev();
253void AccelTableWriter::emitHashes()
const {
254 uint64_t PrevHash = std::numeric_limits<uint64_t>::max();
255 unsigned BucketIdx = 0;
256 for (
const auto &Bucket : Contents.
getBuckets()) {
257 for (
const auto &Hash : Bucket) {
258 uint32_t HashValue = Hash->HashValue;
259 if (SkipIdenticalHashes && PrevHash == HashValue)
261 Asm->OutStreamer->AddComment(
"Hash in Bucket " +
Twine(BucketIdx));
262 Asm->emitInt32(HashValue);
263 PrevHash = HashValue;
269void AccelTableWriter::emitOffsets(
const MCSymbol *
Base)
const {
271 uint64_t PrevHash = std::numeric_limits<uint64_t>::max();
272 for (
size_t i = 0, e = Buckets.size(); i < e; ++i) {
273 for (
auto *Hash : Buckets[i]) {
274 uint32_t HashValue = Hash->HashValue;
275 if (SkipIdenticalHashes && PrevHash == HashValue)
277 PrevHash = HashValue;
278 Asm->OutStreamer->AddComment(
"Offset in Bucket " +
Twine(i));
279 Asm->emitLabelDifference(Hash->Sym,
Base,
Asm->getDwarfOffsetByteSize());
284void AppleAccelTableWriter::Header::emit(
AsmPrinter *Asm)
const {
285 Asm->OutStreamer->AddComment(
"Header Magic");
286 Asm->emitInt32(Magic);
287 Asm->OutStreamer->AddComment(
"Header Version");
288 Asm->emitInt16(Version);
289 Asm->OutStreamer->AddComment(
"Header Hash Function");
290 Asm->emitInt16(HashFunction);
291 Asm->OutStreamer->AddComment(
"Header Bucket Count");
292 Asm->emitInt32(BucketCount);
293 Asm->OutStreamer->AddComment(
"Header Hash Count");
294 Asm->emitInt32(HashCount);
295 Asm->OutStreamer->AddComment(
"Header Data Length");
296 Asm->emitInt32(HeaderDataLength);
299void AppleAccelTableWriter::HeaderData::emit(
AsmPrinter *Asm)
const {
300 Asm->OutStreamer->AddComment(
"HeaderData Die Offset Base");
301 Asm->emitInt32(DieOffsetBase);
302 Asm->OutStreamer->AddComment(
"HeaderData Atom Count");
305 for (
const Atom &
A : Atoms) {
307 Asm->emitInt16(
A.Type);
309 Asm->emitInt16(
A.Form);
313void AppleAccelTableWriter::emitBuckets()
const {
316 for (
size_t i = 0, e = Buckets.size(); i < e; ++i) {
317 Asm->OutStreamer->AddComment(
"Bucket " +
Twine(i));
318 if (!Buckets[i].empty())
319 Asm->emitInt32(index);
321 Asm->emitInt32(std::numeric_limits<uint32_t>::max());
324 uint64_t PrevHash = std::numeric_limits<uint64_t>::max();
325 for (
auto *HD : Buckets[i]) {
327 if (PrevHash != HashValue)
329 PrevHash = HashValue;
334void AppleAccelTableWriter::emitData()
const {
337 uint64_t PrevHash = std::numeric_limits<uint64_t>::max();
338 for (
const auto &Hash : Bucket) {
341 if (PrevHash != std::numeric_limits<uint64_t>::max() &&
342 PrevHash != Hash->HashValue)
345 Asm->OutStreamer->emitLabel(Hash->Sym);
346 Asm->OutStreamer->AddComment(Hash->Name.getString());
347 Asm->emitDwarfStringOffset(Hash->Name);
348 Asm->OutStreamer->AddComment(
"Num DIEs");
349 Asm->emitInt32(Hash->Values.size());
352 PrevHash = Hash->HashValue;
360void AppleAccelTableWriter::emit()
const {
362 HeaderData.emit(Asm);
365 emitOffsets(SecBegin);
372 : OffsetVal(&Die), DieTag(Die.
getTag()), AbbrevNumber(0), IsTU(IsTU),
375void Dwarf5AccelTableWriter::Header::emit(Dwarf5AccelTableWriter &Ctx) {
376 assert(CompUnitCount > 0 &&
"Index must have at least one CU.");
379 Ctx.ContributionEnd =
380 Asm->emitDwarfUnitLength(
"names",
"Header: unit length");
381 Asm->OutStreamer->AddComment(
"Header: version");
382 Asm->emitInt16(Version);
383 Asm->OutStreamer->AddComment(
"Header: padding");
384 Asm->emitInt16(Padding);
385 Asm->OutStreamer->AddComment(
"Header: compilation unit count");
386 Asm->emitInt32(CompUnitCount);
387 Asm->OutStreamer->AddComment(
"Header: local type unit count");
388 Asm->emitInt32(LocalTypeUnitCount);
389 Asm->OutStreamer->AddComment(
"Header: foreign type unit count");
390 Asm->emitInt32(ForeignTypeUnitCount);
391 Asm->OutStreamer->AddComment(
"Header: bucket count");
392 Asm->emitInt32(BucketCount);
393 Asm->OutStreamer->AddComment(
"Header: name count");
394 Asm->emitInt32(NameCount);
395 Asm->OutStreamer->AddComment(
"Header: abbreviation table size");
396 Asm->emitLabelDifference(Ctx.AbbrevEnd, Ctx.AbbrevStart,
sizeof(
uint32_t));
397 Asm->OutStreamer->AddComment(
"Header: augmentation string size");
398 assert(AugmentationStringSize % 4 == 0);
399 Asm->emitInt32(AugmentationStringSize);
400 Asm->OutStreamer->AddComment(
"Header: augmentation string");
401 Asm->OutStreamer->emitBytes({AugmentationString, AugmentationStringSize});
404std::optional<uint64_t>
407 Parent && !Parent->
findAttribute(dwarf::Attribute::DW_AT_declaration))
408 return Parent->getOffset();
412static std::optional<dwarf::Form>
414 std::optional<OffsetAndUnitID> ParentOffset) {
419 if (IndexedOffsets.
contains(*ParentOffset))
420 return dwarf::Form::DW_FORM_ref4;
422 return dwarf::Form::DW_FORM_flag_present;
428 ID.AddInteger(Enc.Index);
429 ID.AddInteger(Enc.Form);
433void Dwarf5AccelTableWriter::populateAbbrevsMap() {
435 for (
auto *Hash : Bucket) {
437 std::optional<DWARF5AccelTable::UnitIndexAndEncoding> EntryRet =
438 getIndexForEntry(*
Value);
440 IndexedOffsets,
Value->getParentDieOffsetAndUnitID());
443 Abbrev.addAttribute(EntryRet->Encoding);
444 Abbrev.addAttribute({dwarf::DW_IDX_die_offset, dwarf::DW_FORM_ref4});
446 Abbrev.addAttribute({dwarf::DW_IDX_parent, *MaybeParentForm});
452 Value->setAbbrevNumber(Existing->getNumber());
457 AbbreviationsVector.
push_back(NewAbbrev);
459 AbbreviationsSet.
InsertNode(NewAbbrev, InsertPos);
466void Dwarf5AccelTableWriter::emitCUList()
const {
468 Asm->OutStreamer->AddComment(
"Compilation unit " +
Twine(
CU.index()));
469 if (std::holds_alternative<MCSymbol *>(
CU.value()))
470 Asm->emitDwarfSymbolReference(std::get<MCSymbol *>(
CU.value()));
472 Asm->emitDwarfLengthOrOffset(std::get<uint64_t>(
CU.value()));
476void Dwarf5AccelTableWriter::emitTUList()
const {
477 for (
const auto &TU :
enumerate(TypeUnits)) {
478 Asm->OutStreamer->AddComment(
"Type unit " +
Twine(TU.index()));
479 if (std::holds_alternative<MCSymbol *>(TU.value()))
480 Asm->emitDwarfSymbolReference(std::get<MCSymbol *>(TU.value()));
481 else if (IsSplitDwarf)
482 Asm->emitInt64(std::get<uint64_t>(TU.value()));
484 Asm->emitDwarfLengthOrOffset(std::get<uint64_t>(TU.value()));
488void Dwarf5AccelTableWriter::emitBuckets()
const {
491 Asm->OutStreamer->AddComment(
"Bucket " +
Twine(Bucket.index()));
492 Asm->emitInt32(Bucket.value().empty() ? 0 :
Index);
493 Index += Bucket.value().size();
497void Dwarf5AccelTableWriter::emitStringOffsets()
const {
499 for (
auto *Hash : Bucket.value()) {
501 Asm->OutStreamer->AddComment(
"String in Bucket " +
Twine(Bucket.index()) +
502 ": " +
String.getString());
508void Dwarf5AccelTableWriter::emitAbbrevs()
const {
509 Asm->OutStreamer->emitLabel(AbbrevStart);
511 Asm->OutStreamer->AddComment(
"Abbrev code");
512 Asm->emitULEB128(Abbrev->getNumber());
514 Asm->emitULEB128(Abbrev->getDieTag());
516 Abbrev->getAttributes()) {
518 Asm->emitULEB128(AttrEnc.Form,
521 Asm->emitULEB128(0,
"End of abbrev");
522 Asm->emitULEB128(0,
"End of abbrev");
524 Asm->emitULEB128(0,
"End of abbrev list");
525 Asm->OutStreamer->emitLabel(AbbrevEnd);
528void Dwarf5AccelTableWriter::emitEntry(
532 unsigned AbbrevIndex = Entry.getAbbrevNumber() - 1;
533 assert(AbbrevIndex < AbbreviationsVector.size() &&
534 "Entry abbrev index is outside of abbreviations vector range.");
536 std::optional<DWARF5AccelTable::UnitIndexAndEncoding> EntryRet =
537 getIndexForEntry(Entry);
538 std::optional<OffsetAndUnitID> MaybeParentOffset =
539 Entry.getParentDieOffsetAndUnitID();
541 DIEOffsetToAccelEntryLabel.
find(Entry.getDieOffsetAndUnitID());
542 assert(EntrySymbolIt != DIEOffsetToAccelEntryLabel.
end());
543 MCSymbol *EntrySymbol = EntrySymbolIt->getSecond();
548 if (EmittedAccelEntrySymbols.
insert(EntrySymbol).second)
549 Asm->OutStreamer->emitLabel(EntrySymbol);
551 Asm->emitULEB128(Entry.getAbbrevNumber(),
"Abbreviation code");
556 switch (AttrEnc.Index) {
557 case dwarf::DW_IDX_compile_unit:
558 case dwarf::DW_IDX_type_unit: {
560 ID.emitValue(Asm, AttrEnc.Form);
563 case dwarf::DW_IDX_die_offset:
564 assert(AttrEnc.Form == dwarf::DW_FORM_ref4);
565 Asm->emitInt32(Entry.getDieOffset());
567 case dwarf::DW_IDX_parent: {
568 if (AttrEnc.Form == dwarf::Form::DW_FORM_flag_present)
570 auto ParentSymbolIt = DIEOffsetToAccelEntryLabel.
find(*MaybeParentOffset);
571 assert(ParentSymbolIt != DIEOffsetToAccelEntryLabel.
end());
572 Asm->emitLabelDifference(ParentSymbolIt->getSecond(), EntryPool, 4);
581void Dwarf5AccelTableWriter::emitData() {
585 DIEOffsetToAccelEntryLabel.
insert({
Offset,
Asm->createTempSymbol(
"")});
587 Asm->OutStreamer->emitLabel(EntryPool);
590 for (
auto *Hash : Bucket) {
592 Asm->OutStreamer->emitLabel(Hash->Sym);
594 emitEntry(*
Value, DIEOffsetToAccelEntryLabel, EmittedAccelEntrySymbols);
595 Asm->OutStreamer->AddComment(
"End of list: " + Hash->Name.getString());
601Dwarf5AccelTableWriter::Dwarf5AccelTableWriter(
603 ArrayRef<std::variant<MCSymbol *, uint64_t>> CompUnits,
604 ArrayRef<std::variant<MCSymbol *, uint64_t>> TypeUnits,
609 : AccelTableWriter(
Asm, Contents,
false),
610 Header(CompUnits.
size(), IsSplitDwarf ? 0 : TypeUnits.
size(),
611 IsSplitDwarf ? TypeUnits.
size() : 0, Contents.getBucketCount(),
612 Contents.getUniqueNameCount()),
613 CompUnits(CompUnits), TypeUnits(TypeUnits),
614 getIndexForEntry(
std::
move(getIndexForEntry)),
615 IsSplitDwarf(IsSplitDwarf) {
618 for (
auto *Hash : Bucket)
620 IndexedOffsets.insert(
Value->getDieOffsetAndUnitID());
622 populateAbbrevsMap();
625void Dwarf5AccelTableWriter::emit() {
632 emitOffsets(EntryPool);
635 Asm->OutStreamer->emitValueToAlignment(
Align(4), 0);
636 Asm->OutStreamer->emitLabel(ContributionEnd);
643 AppleAccelTableWriter(Asm, Contents, Atoms, SecBegin).emit();
648 ArrayRef<std::unique_ptr<DwarfCompileUnit>> CUs) {
650 std::vector<std::variant<MCSymbol *, uint64_t>> CompUnits;
651 std::vector<std::variant<MCSymbol *, uint64_t>> TypeUnits;
657 switch (
CU.value()->getCUNode()->getNameTableKind()) {
664 CUIndex[
CU.index()] = CUCount++;
665 assert(
CU.index() ==
CU.value()->getUniqueID());
671 for (
const auto &TU : TUSymbols) {
672 TUIndex[TU.UniqueID] = TUCount++;
674 TypeUnits.push_back(std::get<uint64_t>(TU.LabelOrSignature));
676 TypeUnits.push_back(std::get<MCSymbol *>(TU.LabelOrSignature));
679 if (CompUnits.empty())
682 Asm->OutStreamer->switchSection(
683 Asm->getObjFileLowering().getDwarfDebugNamesSection());
690 Dwarf5AccelTableWriter(
691 Asm, Contents, CompUnits, TypeUnits,
693 -> std::optional<DWARF5AccelTable::UnitIndexAndEncoding> {
695 return {{TUIndex[Entry.getUnitID()],
696 {dwarf::DW_IDX_type_unit, TUIndexForm}}};
697 if (CUIndex.
size() > 1)
698 return {{CUIndex[Entry.getUnitID()],
699 {dwarf::DW_IDX_compile_unit, CUIndexForm}}};
707 TUSymbolsOrHashes.
push_back({U.getLabelBegin(), U.getUniqueID()});
711 TUSymbolsOrHashes.
push_back({U.getTypeSignature(), U.getUniqueID()});
716 ArrayRef<std::variant<MCSymbol *, uint64_t>> CUs,
720 std::vector<std::variant<MCSymbol *, uint64_t>> TypeUnits;
722 Dwarf5AccelTableWriter(Asm, Contents, CUs, TypeUnits, getIndexForEntry,
false)
728 "The section offset exceeds the limit.");
734 "The section offset exceeds the limit.");
758void AppleAccelTableWriter::Header::print(
raw_ostream &
OS)
const {
759 OS <<
"Magic: " <<
format(
"0x%x", Magic) <<
"\n"
760 <<
"Version: " << Version <<
"\n"
761 <<
"Hash Function: " << HashFunction <<
"\n"
762 <<
"Bucket Count: " << BucketCount <<
"\n"
763 <<
"Header Data Length: " << HeaderDataLength <<
"\n";
771void AppleAccelTableWriter::HeaderData::print(
raw_ostream &
OS)
const {
772 OS <<
"DIE Offset Base: " << DieOffsetBase <<
"\n";
773 for (
auto Atom : Atoms)
779 HeaderData.print(
OS);
785 OS <<
"Name: " <<
Name.getString() <<
"\n";
786 OS <<
" Hash Value: " <<
format(
"0x%x", HashValue) <<
"\n";
793 for (
auto *
Value : Values)
800 for (
const auto &[
Name,
Data] : Entries) {
801 OS <<
"Name: " <<
Name <<
"\n";
802 for (
auto *V :
Data.Values)
806 OS <<
"Buckets and Hashes: \n";
807 for (
const auto &Bucket : Buckets)
808 for (
const auto &Hash : Bucket)
812 for (
const auto &E : Entries)
817 OS <<
" Offset: " << getDieOffset() <<
"\n";
822 OS <<
" Offset: " << Die.getOffset() <<
"\n";
826 OS <<
" Offset: " << Die.getOffset() <<
"\n";
831 OS <<
" Static Offset: " <<
Offset <<
"\n";
835 OS <<
" Static Offset: " <<
Offset <<
"\n";
836 OS <<
" QualifiedNameHash: " <<
format(
"%x\n", QualifiedNameHash) <<
"\n";
838 OS <<
" ObjCClassIsImplementation: "
839 << (ObjCClassIsImplementation ?
"true" :
"false");
static std::optional< dwarf::Form > getFormForIdxParent(const DenseSet< OffsetAndUnitID > &IndexedOffsets, std::optional< OffsetAndUnitID > ParentOffset)
This file contains support for writing accelerator tables.
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This file defines the DenseSet and SmallDenseSet classes.
This file contains constants used for implementing Dwarf debug support.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
A base class holding non-template-dependant functionality of the AccelTable class.
std::vector< HashData * > HashList
void computeBucketCount()
void finalize(AsmPrinter *Asm, StringRef Prefix)
void print(raw_ostream &OS) const
ArrayRef< HashList > getBuckets() const
Interface which the different types of accelerator table data have to conform.
A base class for different implementations of Data classes for Apple Accelerator Tables.
void emit(AsmPrinter *Asm) const override
void print(raw_ostream &OS) const override
static constexpr Atom Atoms[]
static constexpr Atom Atoms[]
void emit(AsmPrinter *Asm) const override
void print(raw_ostream &OS) const override
uint32_t QualifiedNameHash
void emit(AsmPrinter *Asm) const override
void print(raw_ostream &OS) const override
bool ObjCClassIsImplementation
static constexpr Atom Atoms[]
void print(raw_ostream &OS) const override
void emit(AsmPrinter *Asm) const override
static constexpr Atom Atoms[]
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
This class is intended to be used as a driving class for all asm writers.
Allocate memory in an ever growing pool, as if by bump-pointer.
static dwarf::Form BestForm(bool IsSigned, uint64_t Int)
Choose the best form for integer.
A structured debug information entry.
DIEValue findAttribute(dwarf::Attribute Attribute) const
Find a value in the DIE with the attribute given.
uint64_t getDebugSectionOffset() const
Get the absolute offset within the .debug_info or .debug_types section for this DIE.
dwarf::Tag getTag() const
The Data class implementation for DWARF v5 accelerator table.
void print(raw_ostream &OS) const override
static std::optional< uint64_t > getDefiningParentDieOffset(const DIE &Die)
If Die has a non-null parent and the parent is not a declaration, return its offset.
DWARF5AccelTableData(const DIE &Die, const uint32_t UnitID, const bool IsTU=false)
void addTypeUnitSignature(DwarfTypeUnit &U)
Add a type unit Signature.
const TUVectorTy & getTypeUnitsSymbols()
Returns type units that were constructed.
void addTypeUnitSymbol(DwarfTypeUnit &U)
Add a type unit start symbol.
void setNumber(uint32_t AbbrevNumber)
Set abbreviation tag index.
const SmallVector< AttributeEncoding, 1 > & getAttributes() const
Returns attributes for an abbreviation.
void Profile(FoldingSetNodeID &ID) const
Used to gather unique data for the abbreviation folding set.
uint32_t getNumber() const
Get abbreviation tag index.
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Implements a dense probed hash-table based set.
Collects and handles dwarf debug information.
bool useSplitDwarf() const
Returns whether or not to change the current debug info for the split dwarf proposal support.
DwarfStringPoolEntryRef: Dwarf string pool entry reference.
MCSymbol * getLabelBegin() const
Get the the symbol for start of the section for this unit.
void InsertNode(T *N, void *InsertPos)
InsertNode - Insert the specified node into the folding set, knowing that it is not already in the fo...
T * FindNodeOrInsertPos(const FoldingSetNodeID &ID, void *&InsertPos)
FindNodeOrInsertPos - Look up the node specified by ID.
FoldingSetNodeID - This class is used to gather all the unique data bits of a node.
FoldingSet - This template class is used to instantiate a specialized implementation of the folding s...
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
void print(raw_ostream &OS, const MCAsmInfo *MAI) const
print - Print the value to the stream OS.
void reserve(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
void print(raw_ostream &O, bool IsForDebug=false) const
Implement operator<< on Value.
std::pair< iterator, bool > insert(const ValueT &V)
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
An efficient, type-erasing, non-owning reference to a callable.
This class implements an extremely fast bulk output stream that can only output to a stream.
StringRef FormEncodingString(unsigned Encoding)
StringRef IndexString(unsigned Idx)
StringRef AtomTypeString(unsigned Atom)
StringRef TagString(unsigned Tag)
unsigned getTag(StringRef TagString)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
std::pair< uint32_t, uint32_t > getDebugNamesBucketAndHashCount(MutableArrayRef< uint32_t > Hashes)
@ DW_FLAG_type_implementation
const_iterator begin(StringRef path, Style style=Style::native)
Get begin iterator over path.
const_iterator end(StringRef path)
Get end iterator over path.
This is an optimization pass for GlobalISel generic memory operations.
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
void stable_sort(R &&Range)
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are are tuples (A,...
void emitAppleAccelTableImpl(AsmPrinter *Asm, AccelTableBase &Contents, StringRef Prefix, const MCSymbol *SecBegin, ArrayRef< AppleAccelTableData::Atom > Atoms)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
void emitDWARF5AccelTable(AsmPrinter *Asm, DWARF5AccelTable &Contents, const DwarfDebug &DD, ArrayRef< std::unique_ptr< DwarfCompileUnit > > CUs)
Implement std::hash so that hash_code can be used in STL containers.
Represents a group of entries with identical name (and hence, hash value).
void print(raw_ostream &OS) const
This struct is a compact representation of a valid (non-zero power of two) alignment.
An Atom defines the form of the data in an Apple accelerator table.
void print(raw_ostream &OS) const
Helper class to identify an entry in DWARF5AccelTable based on their DIE offset and UnitID.