#include "llvm/CodeGen/AccelTable.h"
#include "DwarfCompileUnit.h"
#include "DwarfUnit.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/Twine.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/CodeGen/AsmPrinter.h"
#include "llvm/CodeGen/DIE.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetLoweringObjectFile.h"
#include <algorithm>
#include <cstddef>
#include <cstdint>
#include <limits>
#include <vector>
usingnamespacellvm;
void AccelTableBase::computeBucketCount() { … }
void AccelTableBase::finalize(AsmPrinter *Asm, StringRef Prefix) { … }
namespace {
class AccelTableWriter { … };
class AppleAccelTableWriter : public AccelTableWriter { … };
class Dwarf5AccelTableWriter : public AccelTableWriter { … };
}
void AccelTableWriter::emitHashes() const { … }
void AccelTableWriter::emitOffsets(const MCSymbol *Base) const { … }
void AppleAccelTableWriter::Header::emit(AsmPrinter *Asm) const { … }
void AppleAccelTableWriter::HeaderData::emit(AsmPrinter *Asm) const { … }
void AppleAccelTableWriter::emitBuckets() const { … }
void AppleAccelTableWriter::emitData() const { … }
void AppleAccelTableWriter::emit() const { … }
DWARF5AccelTableData::DWARF5AccelTableData(const DIE &Die,
const uint32_t UnitID,
const bool IsTU)
: … { … }
void Dwarf5AccelTableWriter::Header::emit(Dwarf5AccelTableWriter &Ctx) { … }
std::optional<uint64_t>
DWARF5AccelTableData::getDefiningParentDieOffset(const DIE &Die) { … }
static std::optional<dwarf::Form>
getFormForIdxParent(const DenseSet<OffsetAndUnitID> &IndexedOffsets,
std::optional<OffsetAndUnitID> ParentOffset) { … }
void DebugNamesAbbrev::Profile(FoldingSetNodeID &ID) const { … }
void Dwarf5AccelTableWriter::populateAbbrevsMap() { … }
void Dwarf5AccelTableWriter::emitCUList() const { … }
void Dwarf5AccelTableWriter::emitTUList() const { … }
void Dwarf5AccelTableWriter::emitBuckets() const { … }
void Dwarf5AccelTableWriter::emitStringOffsets() const { … }
void Dwarf5AccelTableWriter::emitAbbrevs() const { … }
void Dwarf5AccelTableWriter::emitEntry(
const DWARF5AccelTableData &Entry,
const DenseMap<OffsetAndUnitID, MCSymbol *> &DIEOffsetToAccelEntryLabel,
DenseSet<MCSymbol *> &EmittedAccelEntrySymbols) { … }
void Dwarf5AccelTableWriter::emitData() { … }
Dwarf5AccelTableWriter::Dwarf5AccelTableWriter(
AsmPrinter *Asm, const AccelTableBase &Contents,
ArrayRef<std::variant<MCSymbol *, uint64_t>> CompUnits,
ArrayRef<std::variant<MCSymbol *, uint64_t>> TypeUnits,
llvm::function_ref<std::optional<DWARF5AccelTable::UnitIndexAndEncoding>(
const DWARF5AccelTableData &)>
getIndexForEntry,
bool IsSplitDwarf)
: … { … }
void Dwarf5AccelTableWriter::emit() { … }
void llvm::emitAppleAccelTableImpl(AsmPrinter *Asm, AccelTableBase &Contents,
StringRef Prefix, const MCSymbol *SecBegin,
ArrayRef<AppleAccelTableData::Atom> Atoms) { … }
void llvm::emitDWARF5AccelTable(
AsmPrinter *Asm, DWARF5AccelTable &Contents, const DwarfDebug &DD,
ArrayRef<std::unique_ptr<DwarfCompileUnit>> CUs) { … }
void DWARF5AccelTable::addTypeUnitSymbol(DwarfTypeUnit &U) { … }
void DWARF5AccelTable::addTypeUnitSignature(DwarfTypeUnit &U) { … }
void llvm::emitDWARF5AccelTable(
AsmPrinter *Asm, DWARF5AccelTable &Contents,
ArrayRef<std::variant<MCSymbol *, uint64_t>> CUs,
llvm::function_ref<std::optional<DWARF5AccelTable::UnitIndexAndEncoding>(
const DWARF5AccelTableData &)>
getIndexForEntry) { … }
void AppleAccelTableOffsetData::emit(AsmPrinter *Asm) const { … }
void AppleAccelTableTypeData::emit(AsmPrinter *Asm) const { … }
void AppleAccelTableStaticOffsetData::emit(AsmPrinter *Asm) const { … }
void AppleAccelTableStaticTypeData::emit(AsmPrinter *Asm) const { … }
constexpr AppleAccelTableData::Atom AppleAccelTableTypeData::Atoms[];
constexpr AppleAccelTableData::Atom AppleAccelTableOffsetData::Atoms[];
constexpr AppleAccelTableData::Atom AppleAccelTableStaticOffsetData::Atoms[];
constexpr AppleAccelTableData::Atom AppleAccelTableStaticTypeData::Atoms[];
#ifndef NDEBUG
void AppleAccelTableWriter::Header::print(raw_ostream &OS) const {
OS << "Magic: " << format("0x%x", Magic) << "\n"
<< "Version: " << Version << "\n"
<< "Hash Function: " << HashFunction << "\n"
<< "Bucket Count: " << BucketCount << "\n"
<< "Header Data Length: " << HeaderDataLength << "\n";
}
void AppleAccelTableData::Atom::print(raw_ostream &OS) const {
OS << "Type: " << dwarf::AtomTypeString(Type) << "\n"
<< "Form: " << dwarf::FormEncodingString(Form) << "\n";
}
void AppleAccelTableWriter::HeaderData::print(raw_ostream &OS) const {
OS << "DIE Offset Base: " << DieOffsetBase << "\n";
for (auto Atom : Atoms)
Atom.print(OS);
}
void AppleAccelTableWriter::print(raw_ostream &OS) const {
Header.print(OS);
HeaderData.print(OS);
Contents.print(OS);
SecBegin->print(OS, nullptr);
}
void AccelTableBase::HashData::print(raw_ostream &OS) const {
OS << "Name: " << Name.getString() << "\n";
OS << " Hash Value: " << format("0x%x", HashValue) << "\n";
OS << " Symbol: ";
if (Sym)
OS << *Sym;
else
OS << "<none>";
OS << "\n";
for (auto *Value : Values)
Value->print(OS);
}
void AccelTableBase::print(raw_ostream &OS) const {
OS << "Entries: \n";
for (const auto &[Name, Data] : Entries) {
OS << "Name: " << Name << "\n";
for (auto *V : Data.Values)
V->print(OS);
}
OS << "Buckets and Hashes: \n";
for (const auto &Bucket : Buckets)
for (const auto &Hash : Bucket)
Hash->print(OS);
OS << "Data: \n";
for (const auto &E : Entries)
E.second.print(OS);
}
void DWARF5AccelTableData::print(raw_ostream &OS) const {
OS << " Offset: " << getDieOffset() << "\n";
OS << " Tag: " << dwarf::TagString(getDieTag()) << "\n";
}
void AppleAccelTableOffsetData::print(raw_ostream &OS) const {
OS << " Offset: " << Die.getOffset() << "\n";
}
void AppleAccelTableTypeData::print(raw_ostream &OS) const {
OS << " Offset: " << Die.getOffset() << "\n";
OS << " Tag: " << dwarf::TagString(Die.getTag()) << "\n";
}
void AppleAccelTableStaticOffsetData::print(raw_ostream &OS) const {
OS << " Static Offset: " << Offset << "\n";
}
void AppleAccelTableStaticTypeData::print(raw_ostream &OS) const {
OS << " Static Offset: " << Offset << "\n";
OS << " QualifiedNameHash: " << format("%x\n", QualifiedNameHash) << "\n";
OS << " Tag: " << dwarf::TagString(Tag) << "\n";
OS << " ObjCClassIsImplementation: "
<< (ObjCClassIsImplementation ? "true" : "false");
OS << "\n";
}
#endif