Lines Matching +full:hash +full:- +full:accelerator

1 //===- llvm/CodeGen/AsmPrinter/AccelTable.cpp - Accelerator Tables --------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file contains support for writing accelerator tables.
11 //===----------------------------------------------------------------------===//
40 UniqueHashCount = llvm::unique(Uniques) - Uniques.begin(); in computeBucketCount()
45 // Create the individual hash data outputs. in finalize()
66 E.second.Sym = Asm->createTempSymbol(Prefix); in finalize()
69 // Sort the contents of the buckets by hash value so that hash collisions end in finalize()
73 return LHS->HashValue < RHS->HashValue; in finalize()
78 /// Base class for writing out Accelerator tables. It holds the common
79 /// functionality for the two Accelerator table types.
85 /// Controls whether to emit duplicate hash and offset table entries for names
106 /// The fixed header of an Apple Accelerator Table.
115 /// 'HASH' magic value to detect endianness.
129 /// The HeaderData describes the structure of an Apple accelerator table
171 /// Class responsible for emitting a DWARF v5 Accelerator Table. The only
212 MCSymbol *AbbrevStart = Asm->createTempSymbol("names_abbrev_start");
213 MCSymbol *AbbrevEnd = Asm->createTempSymbol("names_abbrev_end");
214 MCSymbol *EntryPool = Asm->createTempSymbol("names_entries");
244 Abbrev->~DebugNamesAbbrev(); in ~Dwarf5AccelTableWriter()
254 for (const auto &Hash : Bucket) { in emitHashes() local
255 uint32_t HashValue = Hash->HashValue; in emitHashes()
258 Asm->OutStreamer->AddComment("Hash in Bucket " + Twine(BucketIdx)); in emitHashes()
259 Asm->emitInt32(HashValue); in emitHashes()
270 for (auto *Hash : Buckets[i]) { in emitOffsets() local
271 uint32_t HashValue = Hash->HashValue; in emitOffsets()
275 Asm->OutStreamer->AddComment("Offset in Bucket " + Twine(i)); in emitOffsets()
276 Asm->emitLabelDifference(Hash->Sym, Base, Asm->getDwarfOffsetByteSize()); in emitOffsets()
282 Asm->OutStreamer->AddComment("Header Magic"); in emit()
283 Asm->emitInt32(Magic); in emit()
284 Asm->OutStreamer->AddComment("Header Version"); in emit()
285 Asm->emitInt16(Version); in emit()
286 Asm->OutStreamer->AddComment("Header Hash Function"); in emit()
287 Asm->emitInt16(HashFunction); in emit()
288 Asm->OutStreamer->AddComment("Header Bucket Count"); in emit()
289 Asm->emitInt32(BucketCount); in emit()
290 Asm->OutStreamer->AddComment("Header Hash Count"); in emit()
291 Asm->emitInt32(HashCount); in emit()
292 Asm->OutStreamer->AddComment("Header Data Length"); in emit()
293 Asm->emitInt32(HeaderDataLength); in emit()
297 Asm->OutStreamer->AddComment("HeaderData Die Offset Base"); in emit()
298 Asm->emitInt32(DieOffsetBase); in emit()
299 Asm->OutStreamer->AddComment("HeaderData Atom Count"); in emit()
300 Asm->emitInt32(Atoms.size()); in emit()
303 Asm->OutStreamer->AddComment(dwarf::AtomTypeString(A.Type)); in emit()
304 Asm->emitInt16(A.Type); in emit()
305 Asm->OutStreamer->AddComment(dwarf::FormEncodingString(A.Form)); in emit()
306 Asm->emitInt16(A.Form); in emit()
314 Asm->OutStreamer->AddComment("Bucket " + Twine(i)); in emitBuckets()
316 Asm->emitInt32(index); in emitBuckets()
318 Asm->emitInt32(std::numeric_limits<uint32_t>::max()); in emitBuckets()
320 // the index multiple times in case of hash collisions. in emitBuckets()
323 uint32_t HashValue = HD->HashValue; in emitBuckets()
335 for (const auto &Hash : Bucket) { in emitData() local
336 // Terminate the previous entry if there is no hash collision with the in emitData()
339 PrevHash != Hash->HashValue) in emitData()
340 Asm->emitInt32(0); in emitData()
342 Asm->OutStreamer->emitLabel(Hash->Sym); in emitData()
343 Asm->OutStreamer->AddComment(Hash->Name.getString()); in emitData()
344 Asm->emitDwarfStringOffset(Hash->Name); in emitData()
345 Asm->OutStreamer->AddComment("Num DIEs"); in emitData()
346 Asm->emitInt32(Hash->Values.size()); in emitData()
347 for (const auto *V : Hash->getValues<const AppleAccelTableData *>()) in emitData()
348 V->emit(Asm); in emitData()
349 PrevHash = Hash->HashValue; in emitData()
353 Asm->emitInt32(0); in emitData()
377 Asm->emitDwarfUnitLength("names", "Header: unit length"); in emit()
378 Asm->OutStreamer->AddComment("Header: version"); in emit()
379 Asm->emitInt16(Version); in emit()
380 Asm->OutStreamer->AddComment("Header: padding"); in emit()
381 Asm->emitInt16(Padding); in emit()
382 Asm->OutStreamer->AddComment("Header: compilation unit count"); in emit()
383 Asm->emitInt32(CompUnitCount); in emit()
384 Asm->OutStreamer->AddComment("Header: local type unit count"); in emit()
385 Asm->emitInt32(LocalTypeUnitCount); in emit()
386 Asm->OutStreamer->AddComment("Header: foreign type unit count"); in emit()
387 Asm->emitInt32(ForeignTypeUnitCount); in emit()
388 Asm->OutStreamer->AddComment("Header: bucket count"); in emit()
389 Asm->emitInt32(BucketCount); in emit()
390 Asm->OutStreamer->AddComment("Header: name count"); in emit()
391 Asm->emitInt32(NameCount); in emit()
392 Asm->OutStreamer->AddComment("Header: abbreviation table size"); in emit()
393 Asm->emitLabelDifference(Ctx.AbbrevEnd, Ctx.AbbrevStart, sizeof(uint32_t)); in emit()
394 Asm->OutStreamer->AddComment("Header: augmentation string size"); in emit()
396 Asm->emitInt32(AugmentationStringSize); in emit()
397 Asm->OutStreamer->AddComment("Header: augmentation string"); in emit()
398 Asm->OutStreamer->emitBytes({AugmentationString, AugmentationStringSize}); in emit()
404 Parent && !Parent->findAttribute(dwarf::Attribute::DW_AT_declaration)) in getDefiningParentDieOffset()
405 return Parent->getOffset(); in getDefiningParentDieOffset()
432 for (auto *Hash : Bucket) { in populateAbbrevsMap() local
433 for (auto *Value : Hash->getValues<DWARF5AccelTableData *>()) { in populateAbbrevsMap()
437 IndexedOffsets, Value->getParentDieOffsetAndUnitID()); in populateAbbrevsMap()
438 DebugNamesAbbrev Abbrev(Value->getDieTag()); in populateAbbrevsMap()
440 Abbrev.addAttribute(EntryRet->Encoding); in populateAbbrevsMap()
449 Value->setAbbrevNumber(Existing->getNumber()); in populateAbbrevsMap()
455 NewAbbrev->setNumber(AbbreviationsVector.size()); in populateAbbrevsMap()
457 Value->setAbbrevNumber(NewAbbrev->getNumber()); in populateAbbrevsMap()
465 Asm->OutStreamer->AddComment("Compilation unit " + Twine(CU.index())); in emitCUList()
467 Asm->emitDwarfSymbolReference(std::get<MCSymbol *>(CU.value())); in emitCUList()
469 Asm->emitDwarfLengthOrOffset(std::get<uint64_t>(CU.value())); in emitCUList()
475 Asm->OutStreamer->AddComment("Type unit " + Twine(TU.index())); in emitTUList()
477 Asm->emitDwarfSymbolReference(std::get<MCSymbol *>(TU.value())); in emitTUList()
479 Asm->emitInt64(std::get<uint64_t>(TU.value())); in emitTUList()
481 Asm->emitDwarfLengthOrOffset(std::get<uint64_t>(TU.value())); in emitTUList()
488 Asm->OutStreamer->AddComment("Bucket " + Twine(Bucket.index())); in emitBuckets()
489 Asm->emitInt32(Bucket.value().empty() ? 0 : Index); in emitBuckets()
496 for (auto *Hash : Bucket.value()) { in emitStringOffsets() local
497 DwarfStringPoolEntryRef String = Hash->Name; in emitStringOffsets()
498 Asm->OutStreamer->AddComment("String in Bucket " + Twine(Bucket.index()) + in emitStringOffsets()
500 Asm->emitDwarfStringOffset(String); in emitStringOffsets()
506 Asm->OutStreamer->emitLabel(AbbrevStart); in emitAbbrevs()
508 Asm->OutStreamer->AddComment("Abbrev code"); in emitAbbrevs()
509 Asm->emitULEB128(Abbrev->getNumber()); in emitAbbrevs()
510 Asm->OutStreamer->AddComment(dwarf::TagString(Abbrev->getDieTag())); in emitAbbrevs()
511 Asm->emitULEB128(Abbrev->getDieTag()); in emitAbbrevs()
513 Abbrev->getAttributes()) { in emitAbbrevs()
514 Asm->emitULEB128(AttrEnc.Index, dwarf::IndexString(AttrEnc.Index).data()); in emitAbbrevs()
515 Asm->emitULEB128(AttrEnc.Form, in emitAbbrevs()
518 Asm->emitULEB128(0, "End of abbrev"); in emitAbbrevs()
519 Asm->emitULEB128(0, "End of abbrev"); in emitAbbrevs()
521 Asm->emitULEB128(0, "End of abbrev list"); in emitAbbrevs()
522 Asm->OutStreamer->emitLabel(AbbrevEnd); in emitAbbrevs()
529 unsigned AbbrevIndex = Entry.getAbbrevNumber() - 1; in emitEntry()
540 MCSymbol *EntrySymbol = EntrySymbolIt->getSecond(); in emitEntry()
543 // Note: a DIE may have multiple accelerator Entries; this check avoids in emitEntry()
546 Asm->OutStreamer->emitLabel(EntrySymbol); in emitEntry()
548 Asm->emitULEB128(Entry.getAbbrevNumber(), "Abbreviation code"); in emitEntry()
551 Abbrev->getAttributes()) { in emitEntry()
552 Asm->OutStreamer->AddComment(dwarf::IndexString(AttrEnc.Index)); in emitEntry()
556 DIEInteger ID(EntryRet->Index); in emitEntry()
562 Asm->emitInt32(Entry.getDieOffset()); in emitEntry()
569 Asm->emitLabelDifference(ParentSymbolIt->getSecond(), EntryPool, 4); in emitEntry()
582 DIEOffsetToAccelEntryLabel.insert({Offset, Asm->createTempSymbol("")}); in emitData()
584 Asm->OutStreamer->emitLabel(EntryPool); in emitData()
587 for (auto *Hash : Bucket) { in emitData() local
589 Asm->OutStreamer->emitLabel(Hash->Sym); in emitData()
590 for (const auto *Value : Hash->getValues<DWARF5AccelTableData *>()) in emitData()
592 Asm->OutStreamer->AddComment("End of list: " + Hash->Name.getString()); in emitData()
593 Asm->emitInt8(0); in emitData()
615 for (auto *Hash : Bucket) in Dwarf5AccelTableWriter() local
616 for (auto *Value : Hash->getValues<DWARF5AccelTableData *>()) in Dwarf5AccelTableWriter()
617 IndexedOffsets.insert(Value->getDieOffsetAndUnitID()); in Dwarf5AccelTableWriter()
632 Asm->OutStreamer->emitValueToAlignment(Align(4), 0); in emit()
633 Asm->OutStreamer->emitLabel(ContributionEnd); in emit()
654 switch (CU.value()->getCUNode()->getNameTableKind()) { in emitDWARF5AccelTable()
662 assert(CU.index() == CU.value()->getUniqueID()); in emitDWARF5AccelTable()
664 DD.useSplitDwarf() ? CU.value()->getSkeleton() : CU.value().get(); in emitDWARF5AccelTable()
665 CompUnits.push_back(MainCU->getLabelBegin()); in emitDWARF5AccelTable()
679 Asm->OutStreamer->switchSection( in emitDWARF5AccelTable()
680 Asm->getObjFileLowering().getDwarfDebugNamesSection()); in emitDWARF5AccelTable()
684 DIEInteger::BestForm(/*IsSigned*/ false, CompUnits.size() - 1); in emitDWARF5AccelTable()
686 DIEInteger::BestForm(/*IsSigned*/ false, TypeUnits.size() - 1); in emitDWARF5AccelTable()
690 -> std::optional<DWARF5AccelTable::UnitIndexAndEncoding> { in emitDWARF5AccelTable()
726 Asm->emitInt32(Die.getDebugSectionOffset()); in emit()
732 Asm->emitInt32(Die.getDebugSectionOffset()); in emit()
733 Asm->emitInt16(Die.getTag()); in emit()
734 Asm->emitInt8(0); in emit()
738 Asm->emitInt32(Offset); in emit()
742 Asm->emitInt32(Offset); in emit()
743 Asm->emitInt16(Tag); in emit()
744 Asm->emitInt8(ObjCClassIsImplementation ? dwarf::DW_FLAG_type_implementation in emit()
746 Asm->emitInt32(QualifiedNameHash); in emit()
758 << "Hash Function: " << HashFunction << "\n" in print()
778 SecBegin->print(OS, nullptr); in print()
783 OS << " Hash Value: " << format("0x%x", HashValue) << "\n"; in print()
791 Value->print(OS); in print()
800 V->print(OS); in print()
805 for (const auto &Hash : Bucket) in print() local
806 Hash->print(OS); in print()