46 addUnitsImpl(
C,
D, Section,
C.getDebugAbbrev(), &
D.getRangesSection(),
47 &
D.getLocSection(),
D.getStrSection(),
48 D.getStrOffsetsSection(), &
D.getAddrSection(),
49 D.getLineSection(),
D.isLittleEndian(),
false,
false,
58 addUnitsImpl(
C,
D, DWOSection,
C.getDebugAbbrevDWO(), &
D.getRangesDWOSection(),
59 &
D.getLocDWOSection(),
D.getStrDWOSection(),
60 D.getStrOffsetsDWOSection(), &
D.getAddrSection(),
61 D.getLineDWOSection(),
C.isLittleEndian(),
true, Lazy,
65void DWARFUnitVector::addUnitsImpl(
74 Parser = [=, &Context, &Obj, &Section, &SOS,
78 -> std::unique_ptr<DWARFUnit> {
79 const DWARFSection &InfoSection = CurSection ? *CurSection : Section;
84 if (
Error ExtractErr =
86 Context.getWarningHandler()(std::move(ExtractErr));
89 if (!IndexEntry && IsDWO) {
93 if (Header.isTypeUnit())
94 IndexEntry =
Index.getFromHash(Header.getTypeHash());
95 else if (
auto DWOId = Header.getDWOId())
96 IndexEntry =
Index.getFromHash(*DWOId);
99 IndexEntry =
Index.getFromOffset(Header.getOffset());
102 if (
Error ApplicationErr = Header.applyIndexEntry(IndexEntry)) {
103 Context.getWarningHandler()(std::move(ApplicationErr));
107 std::unique_ptr<DWARFUnit>
U;
108 if (Header.isTypeUnit())
109 U = std::make_unique<DWARFTypeUnit>(
Context, InfoSection, Header, DA,
110 RS, LocSection, SS, SOS, AOS, LS,
113 U = std::make_unique<DWARFCompileUnit>(
Context, InfoSection, Header,
114 DA, RS, LocSection, SS, SOS,
115 AOS, LS, LE, IsDWO, *
this);
129 if (
I != this->
end() &&
130 (&(*I)->getInfoSection() != &Section || (*I)->getOffset() ==
Offset)) {
134 auto U = Parser(
Offset, SectionKind, &Section,
nullptr);
138 Offset =
U->getNextUnitOffset();
139 I = std::next(this->
insert(
I, std::move(U)));
145 [](
const std::unique_ptr<DWARFUnit> &LHS,
146 const std::unique_ptr<DWARFUnit> &RHS) {
147 return LHS->getOffset() < RHS->getOffset();
149 return this->
insert(
I, std::move(Unit))->get();
156 [](
uint64_t LHS,
const std::unique_ptr<DWARFUnit> &RHS) {
157 return LHS < RHS->getNextUnitOffset();
166 const auto *CUOff = E.getContribution(DW_SECT_INFO);
174 std::upper_bound(
begin(),
end, CUOff->getOffset(),
175 [](
uint64_t LHS,
const std::unique_ptr<DWARFUnit> &RHS) {
176 return LHS < RHS->getNextUnitOffset();
184 auto U = Parser(
Offset, DW_SECT_INFO,
nullptr, &E);
188 auto *NewCU = U.get();
200 : Context(DC), InfoSection(Section), Header(Header), Abbrev(DA),
201 RangeSection(RS), LineSection(LS), StringSection(SS),
202 StringOffsetSection(SOS), AddrOffsetSection(AOS), IsLittleEndian(LE),
203 IsDWO(IsDWO), UnitVector(UnitVector) {
214std::optional<object::SectionedAddress>
216 if (!AddrOffsetSectionBase) {
217 auto R = Context.info_section_units();
223 return (*R.begin())->getAddrOffsetSectionItem(
Index);
239 if (!StringOffsetsTableContribution)
241 "DW_FORM_strx used without a valid string offsets table",
245 if (StringOffsetSection.Data.size() <
Offset + ItemSize)
247 ", which is too large",
251 return DA.getRelocatedValue(ItemSize, &
Offset);
258 Offset = *offset_ptr;
260 IndexEntry =
nullptr;
261 std::tie(Length, FormParams.Format) =
263 FormParams.Version = debug_info.
getU16(offset_ptr, &Err);
264 if (FormParams.Version >= 5) {
265 UnitType = debug_info.
getU8(offset_ptr, &Err);
266 FormParams.AddrSize = debug_info.
getU8(offset_ptr, &Err);
268 FormParams.getDwarfOffsetByteSize(), offset_ptr,
nullptr, &Err);
271 FormParams.getDwarfOffsetByteSize(), offset_ptr,
nullptr, &Err);
272 FormParams.AddrSize = debug_info.
getU8(offset_ptr, &Err);
276 UnitType = DW_UT_type;
278 UnitType = DW_UT_compile;
281 TypeHash = debug_info.
getU64(offset_ptr, &Err);
283 offset_ptr, FormParams.getDwarfOffsetByteSize(), &Err);
284 }
else if (UnitType == DW_UT_split_compile || UnitType == DW_UT_skeleton)
285 DWOId = debug_info.
getU64(offset_ptr, &Err);
291 "DWARF unit at 0x%8.8" PRIx64
" cannot be parsed:", Offset),
295 assert(*offset_ptr - Offset <= 255 &&
"unexpected header size");
296 Size =
uint8_t(*offset_ptr - Offset);
301 "DWARF unit from offset 0x%8.8" PRIx64
" incl. "
302 "to offset 0x%8.8" PRIx64
" excl. "
303 "extends past section size 0x%8.8zx",
304 Offset, NextCUOffset, debug_info.
size());
309 "DWARF unit at offset 0x%8.8" PRIx64
" "
310 "has unsupported version %" PRIu16
", supported are 2-%u",
317 "DWARF type unit at offset "
319 "has its relocated type_offset 0x%8.8" PRIx64
" "
320 "pointing inside the header",
321 Offset, Offset + TypeOffset);
326 "DWARF type unit from offset 0x%8.8" PRIx64
" incl. "
327 "to offset 0x%8.8" PRIx64
" excl. has its "
328 "relocated type_offset 0x%8.8" PRIx64
" pointing past the unit end",
329 Offset, NextCUOffset, Offset + TypeOffset);
333 "DWARF unit at offset 0x%8.8" PRIx64, Offset))
347 "DWARF package unit at offset 0x%8.8" PRIx64
348 " has a non-zero abbreviation offset",
351 auto *UnitContrib = IndexEntry->getContribution();
354 "DWARF package unit at offset 0x%8.8" PRIx64
355 " has no contribution index",
359 if (UnitContrib->getLength() != IndexLength)
361 "DWARF package unit at offset 0x%8.8" PRIx64
362 " has an inconsistent index (expected: %" PRIu64
363 ", actual: %" PRIu64
")",
364 Offset, UnitContrib->getLength(), IndexLength);
366 auto *AbbrEntry = IndexEntry->getContribution(DW_SECT_ABBREV);
369 "DWARF package unit at offset 0x%8.8" PRIx64
370 " missing abbreviation column",
373 AbbrOffset = AbbrEntry->getOffset();
380 assert(!DieArray.empty());
383 uint64_t ActualRangeListOffset = RangeSectionBase + RangeListOffset;
384 return RangeList.
extract(RangesData, &ActualRangeListOffset);
390 RangeSectionBase = 0;
392 AddrOffsetSectionBase = std::nullopt;
405void DWARFUnit::extractDIEsToVector(
406 bool AppendCUDie,
bool AppendNonCUDies,
407 std::vector<DWARFDebugInfoEntry> &Dies)
const {
408 if (!AppendCUDie && !AppendNonCUDies)
419 std::vector<uint32_t> Parents;
420 std::vector<uint32_t> PrevSiblings;
424 ((AppendCUDie && Dies.empty()) || (!AppendCUDie && Dies.size() == 1)) &&
425 "Dies array is not empty");
428 Parents.push_back(UINT32_MAX);
430 Parents.push_back(0);
431 PrevSiblings.push_back(0);
435 assert(Parents.size() > 0 &&
"Empty parents stack");
436 assert((Parents.back() == UINT32_MAX || Parents.back() <= Dies.size()) &&
437 "Wrong parent index");
440 if (!
DIE.extractFast(*
this, &DIEOffset, DebugInfoData, NextCUOffset,
445 if (PrevSiblings.back() > 0) {
446 assert(PrevSiblings.back() < Dies.size() &&
447 "Previous sibling index is out of Dies boundaries");
448 Dies[PrevSiblings.back()].setSiblingIdx(Dies.size());
455 if (!AppendNonCUDies)
463 PrevSiblings.back() = Dies.size();
469 if (
const DWARFAbbreviationDeclaration *AbbrDecl =
471 if (AbbrDecl->hasChildren()) {
472 if (AppendCUDie || !IsCUDie) {
473 assert(Dies.size() > 0 &&
"Dies does not contain any die");
474 Parents.push_back(Dies.size() - 1);
475 PrevSiblings.push_back(0);
483 PrevSiblings.pop_back();
493void DWARFUnit::extractDIEsIfNeeded(
bool CUDieOnly) {
495 Context.getRecoverableErrorHandler()(std::move(e));
499 if ((CUDieOnly && !DieArray.empty()) || DieArray.size() > 1)
502 bool HasCUDie = !DieArray.empty();
503 extractDIEsToVector(!HasCUDie, !CUDieOnly, DieArray);
505 if (DieArray.empty())
512 DWARFDie UnitDie(
this, &DieArray[0]);
513 if (std::optional<uint64_t> DWOId =
515 Header.setDWOId(*DWOId);
517 assert(AddrOffsetSectionBase == std::nullopt);
518 assert(RangeSectionBase == 0);
519 assert(LocSectionBase == 0);
521 if (!AddrOffsetSectionBase)
522 AddrOffsetSectionBase =
538 auto StringOffsetOrError =
541 if (!StringOffsetOrError)
543 "invalid reference to or invalid content in "
544 ".debug_str_offsets[.dwo]: " +
545 toString(StringOffsetOrError.takeError()));
547 StringOffsetsTableContribution = *StringOffsetOrError;
555 uint64_t ContributionBaseOffset = 0;
556 if (
auto *IndexEntry = Header.getIndexEntry())
557 if (
auto *Contrib = IndexEntry->getContribution(DW_SECT_RNGLISTS))
558 ContributionBaseOffset = Contrib->getOffset();
560 &Context.getDWARFObj().getRnglistsDWOSection(),
561 ContributionBaseOffset +
567 Header.getFormat())));
574 ? Context.getDWARFObj().getLoclistsDWOSection().Data
575 : Context.getDWARFObj().getLocDWOSection().Data;
576 if (
auto *IndexEntry = Header.getIndexEntry())
577 if (
const auto *
C = IndexEntry->getContribution(
579 Data =
Data.substr(
C->getOffset(),
C->getLength());
583 std::make_unique<DWARFDebugLoclists>(DWARFData, Header.getVersion());
586 LocTable = std::make_unique<DWARFDebugLoclists>(
588 Context.getDWARFObj().getLoclistsSection(),
593 Context.getDWARFObj(), Context.getDWARFObj().getLocSection(),
602bool DWARFUnit::parseDWO(
StringRef DWOAlternativeLocation) {
625 auto DWOContext = Context.getDWOContext(AbsolutePath);
628 if (DWOAlternativeLocation.
empty())
633 DWOContext = Context.getDWOContext(DWOAlternativeLocation);
638 DWARFCompileUnit *DWOCU = DWOContext->getDWOCompileUnitForHash(*DWOId);
641 DWO = std::shared_ptr<DWARFCompileUnit>(std::move(DWOContext), DWOCU);
642 DWO->setSkeletonUnit(
this);
644 if (AddrOffsetSectionBase)
645 DWO->setAddrOffsetSection(AddrOffsetSection, *AddrOffsetSectionBase);
648 DWO->setRangesSection(RangeSection, DWORangesBase.value_or(0));
654void DWARFUnit::clearDIEs(
bool KeepCUDie) {
660 DieArray = (KeepCUDie && !DieArray.empty())
661 ? std::vector<DWARFDebugInfoEntry>({DieArray[0]})
662 : std::vector<DWARFDebugInfoEntry>();
674 IsLittleEndian, Header.getAddressByteSize());
676 auto RangeListOrError = RnglistTable.
findList(RangesData,
Offset);
677 if (RangeListOrError)
678 return RangeListOrError.get().getAbsoluteRanges(
getBaseAddress(), *
this);
679 return RangeListOrError.takeError();
688 "invalid range list table index %d (possibly "
689 "missing the entire range list table)",
700 if (!CUDIERangesOrError)
702 "decoding address ranges: %s",
703 toString(CUDIERangesOrError.takeError()).c_str());
704 return *CUDIERangesOrError;
718 Result.push_back(std::move(*L));
720 InterpretationError =
721 joinErrors(L.takeError(), std::move(InterpretationError));
722 return !InterpretationError;
725 if (ParseError || InterpretationError)
726 return joinErrors(std::move(ParseError), std::move(InterpretationError));
734 if (DIERangesOrError) {
735 for (
const auto &R : DIERangesOrError.get()) {
737 if (R.LowPC == R.HighPC)
739 auto B = AddrDieMap.upper_bound(R.LowPC);
740 if (
B != AddrDieMap.begin() && R.LowPC < (--
B)->second.first) {
743 if (R.HighPC <
B->second.first)
744 AddrDieMap[R.HighPC] =
B->second;
745 if (R.LowPC >
B->first)
746 AddrDieMap[
B->first].first = R.LowPC;
748 AddrDieMap[R.LowPC] = std::make_pair(R.HighPC, Die);
763 extractDIEsIfNeeded(
false);
764 if (AddrDieMap.empty())
766 auto R = AddrDieMap.upper_bound(
Address);
767 if (R == AddrDieMap.begin())
771 if (
Address >= R->second.first)
773 return R->second.second;
778 if (
isType(Child.getTag()))
783 if (Die.
getTag() != DW_TAG_variable)
800 auto It = Expr.
begin();
801 if (It == Expr.
end())
811 if (It->getCode() == dwarf::DW_OP_addr) {
812 LocationAddr = It->getRawOperand(0);
813 }
else if (It->getCode() == dwarf::DW_OP_addrx) {
814 uint64_t DebugAddrOffset = It->getRawOperand(0);
816 LocationAddr = Pointer->Address;
823 if (++It != Expr.
end()) {
824 if (It->getCode() != dwarf::DW_OP_plus_uconst)
827 LocationAddr += It->getRawOperand(0);
830 if (++It != Expr.
end())
851 extractDIEsIfNeeded(
false);
855 auto RootLookup = RootsParsedForVariables.insert(RootDie.getOffset());
856 if (RootLookup.second)
859 auto R = VariableDieMap.upper_bound(
Address);
860 if (R == VariableDieMap.begin())
865 if (
Address >= R->second.first)
867 return R->second.second;
881 while (SubroutineDIE) {
886 if (SubroutineDIE.
getTag() == DW_TAG_inlined_subroutine)
888 SubroutineDIE = SubroutineDIE.
getParent();
894 if (Kind == DW_SECT_INFO)
895 return Context.getCUIndex();
897 return Context.getTUIndex();
911 assert(Die >= DieArray.data() && Die < DieArray.data() + DieArray.size());
913 if (std::optional<uint32_t> ParentIdx = Die->
getParentIdx()) {
914 assert(*ParentIdx < DieArray.size() &&
915 "ParentIdx is out of DieArray boundaries");
933 assert(Die >= DieArray.data() && Die < DieArray.data() + DieArray.size());
935 if (std::optional<uint32_t> SiblingIdx = Die->
getSiblingIdx()) {
936 assert(*SiblingIdx < DieArray.size() &&
937 "SiblingIdx is out of DieArray boundaries");
938 return &DieArray[*SiblingIdx];
955 assert(Die >= DieArray.data() && Die < DieArray.data() + DieArray.size());
957 std::optional<uint32_t> ParentIdx = Die->
getParentIdx();
962 assert(*ParentIdx < DieArray.size() &&
963 "ParentIdx is out of DieArray boundaries");
967 if (PrevDieIdx == *ParentIdx)
971 while (DieArray[PrevDieIdx].getParentIdx() != *ParentIdx) {
972 PrevDieIdx = *DieArray[PrevDieIdx].getParentIdx();
974 assert(PrevDieIdx < DieArray.size() &&
975 "PrevDieIdx is out of DieArray boundaries");
976 assert(PrevDieIdx >= *ParentIdx &&
977 "PrevDieIdx is not a child of parent of Die");
980 return &DieArray[PrevDieIdx];
994 assert(Die >= DieArray.data() && Die < DieArray.data() + DieArray.size());
1003 if (
I >= DieArray.size())
1005 return &DieArray[
I];
1019 assert(Die >= DieArray.data() && Die < DieArray.data() + DieArray.size());
1024 if (std::optional<uint32_t> SiblingIdx = Die->
getSiblingIdx()) {
1025 assert(*SiblingIdx < DieArray.size() &&
1026 "SiblingIdx is out of DieArray boundaries");
1027 assert(DieArray[*SiblingIdx - 1].
getTag() == dwarf::DW_TAG_null &&
1028 "Bad end of children marker");
1029 return &DieArray[*SiblingIdx - 1];
1041 if (
getDIEIndex(Die) == 0 && DieArray.size() > 1 &&
1042 DieArray.back().getTag() == dwarf::DW_TAG_null) {
1047 return &DieArray.back();
1057 if (!AbbrevsOrError) {
1062 Abbrevs = *AbbrevsOrError;
1072 std::optional<DWARFFormValue> PC =
1073 UnitDie.
find({DW_AT_low_pc, DW_AT_entry_pc});
1086 if (ValidationSize >=
Size)
1087 if (DA.isValidOffsetForDataOfSize((
uint32_t)
Base, ValidationSize))
1096 if (!DA.isValidOffsetForDataOfSize(
Offset, 16))
1104 (void)DA.getU16(&
Offset);
1114 if (!DA.isValidOffsetForDataOfSize(
Offset, 8))
1122 (void)DA.getU16(&
Offset);
1140 return DescOrError.takeError();
1141 Desc = *DescOrError;
1149 return DescOrError.takeError();
1150 Desc = *DescOrError;
1154 return Desc.validateContributionSize(DA);
1162 return std::nullopt;
1166 return DescOrError.takeError();
1167 return *DescOrError;
1174 auto IndexEntry = Header.getIndexEntry();
1176 IndexEntry ? IndexEntry->getContribution(DW_SECT_STR_OFFSETS) :
nullptr;
1180 if (DA.getData().data() ==
nullptr)
1181 return std::nullopt;
1186 return DescOrError.takeError();
1187 return *DescOrError;
1195 Header.getFormat());
1196 else if (!IndexEntry && !StringOffsetSection.Data.empty())
1198 4, Header.getFormat());
1200 return std::nullopt;
1201 auto DescOrError =
Desc.validateContributionSize(DA);
1203 return DescOrError.takeError();
1204 return *DescOrError;
1208 DataExtractor RangesData(RangeSection->Data, IsLittleEndian,
1214 return *Off + RangeSectionBase;
1215 return std::nullopt;
1221 return *Off + LocSectionBase;
1222 return std::nullopt;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static Expected< StrOffsetsContributionDescriptor > parseDWARF64StringOffsetsTableHeader(DWARFDataExtractor &DA, uint64_t Offset)
static Expected< StrOffsetsContributionDescriptor > parseDWARF32StringOffsetsTableHeader(DWARFDataExtractor &DA, uint64_t Offset)
static Expected< StrOffsetsContributionDescriptor > parseDWARFStringOffsetsTableHeader(DWARFDataExtractor &DA, llvm::dwarf::DwarfFormat Format, uint64_t Offset)
This file contains constants used for implementing Dwarf debug support.
This file defines the SmallString class.
A structured debug information entry.
DWARFContext This data structure is the top level entity that deals with dwarf debug information pars...
static bool isSupportedVersion(unsigned version)
static Error checkAddressSizeSupported(unsigned AddressSize, std::error_code EC, char const *Fmt, const Ts &...Vals)
static unsigned getMaxSupportedVersion()
DWARFDebugInfoEntry - A DIE with only the minimum required data.
std::optional< uint32_t > getSiblingIdx() const
Returns index of the sibling die.
std::optional< uint32_t > getParentIdx() const
Returns index of the parent die.
const DWARFAbbreviationDeclaration * getAbbreviationDeclarationPtr() const
LLVM_ABI Error extract(const DWARFDataExtractor &data, uint64_t *offset_ptr)
LLVM_ABI DWARFAddressRangesVector getAbsoluteRanges(std::optional< object::SectionedAddress > BaseAddr) const
getAbsoluteRanges - Returns absolute address ranges defined by this range list.
Utility class that carries the DWARF compile/type unit and the debug info entry in an object.
LLVM_ABI Expected< DWARFAddressRangesVector > getAddressRanges() const
Get the address ranges for this DIE.
LLVM_ABI DWARFDie getAttributeValueAsReferencedDie(dwarf::Attribute Attr) const
Extract the specified attribute from this DIE as the referenced DIE.
LLVM_ABI DWARFDie getParent() const
Get the parent of this DIE object.
LLVM_ABI std::optional< DWARFFormValue > find(dwarf::Attribute Attr) const
Extract the specified attribute from this DIE.
LLVM_ABI DWARFDie getSibling() const
Get the sibling of this DIE object.
LLVM_ABI bool isSubroutineDIE() const
Returns true if DIE represents a subprogram or an inlined subroutine.
LLVM_ABI bool isSubprogramDIE() const
Returns true if DIE represents a subprogram (not inlined).
LLVM_ABI std::optional< uint64_t > getTypeSize(uint64_t PointerSize)
Gets the type size (in bytes) for this DIE.
LLVM_ABI DWARFDie getFirstChild() const
Get the first child of this DIE object.
dwarf::Tag getTag() const
LLVM_ABI Expected< DWARFLocationExpressionsVector > getLocations(dwarf::Attribute Attr) const
LLVM_ABI std::optional< uint64_t > getRangesBaseAttribute() const
Extract the range base attribute from this DIE as absolute section offset.
Expected< DWARFListType > findList(DWARFDataExtractor Data, uint64_t Offset) const
Look up a list based on a given offset.
LLVM_ABI Error visitAbsoluteLocationList(uint64_t Offset, std::optional< object::SectionedAddress > BaseAddr, std::function< std::optional< object::SectionedAddress >(uint32_t)> LookupAddr, function_ref< bool(Expected< DWARFLocationExpression >)> Callback) const
Describe a collection of units.
LLVM_ABI DWARFUnit * addUnit(std::unique_ptr< DWARFUnit > Unit)
Add an existing DWARFUnit to this UnitVector.
unsigned getNumInfoUnits() const
Returns number of units from all .debug_info[.dwo] sections.
LLVM_ABI void addUnitsForSection(DWARFContext &C, const DWARFSection &Section, DWARFSectionKind SectionKind)
Read units from a .debug_info or .debug_types section.
LLVM_ABI DWARFUnit * getUnitForOffset(uint64_t Offset) const
LLVM_ABI void addUnitsForDWOSection(DWARFContext &C, const DWARFSection &DWOSection, DWARFSectionKind SectionKind, bool Lazy=false)
Read units from a .debug_info.dwo or .debug_types.dwo section.
LLVM_ABI DWARFUnit * getUnitForIndexEntry(const DWARFUnitIndex::Entry &E)
const DWARFDebugInfoEntry * getDebugInfoEntry(unsigned Index) const
Return DWARFDebugInfoEntry for the specified index Index.
const DWARFDebugInfoEntry * getSiblingEntry(const DWARFDebugInfoEntry *Die) const
std::optional< uint64_t > getDWOId()
uint32_t getHeaderSize() const
Size in bytes of the parsed unit header.
DWARFDie getPreviousSibling(const DWARFDebugInfoEntry *Die)
Expected< std::optional< StrOffsetsContributionDescriptor > > determineStringOffsetsTableContributionDWO(DWARFDataExtractor &DA)
Find the unit's contribution to the string offsets table and determine its length and form.
const DWARFLocationTable & getLocationTable()
const DWARFDebugInfoEntry * getParentEntry(const DWARFDebugInfoEntry *Die) const
DWARFDie getFirstChild(const DWARFDebugInfoEntry *Die)
DWARFDataExtractor getDebugInfoExtractor() const
DWARFDie getSibling(const DWARFDebugInfoEntry *Die)
std::optional< uint64_t > getRnglistOffset(uint32_t Index)
Return a rangelist's offset based on an index.
Error tryExtractDIEsIfNeeded(bool CUDieOnly)
DWARFDie getUnitDIE(bool ExtractUnitDIEOnly=true)
uint8_t getAddressByteSize() const
DWARFDie getVariableForAddress(uint64_t Address)
Returns variable DIE for the address provided.
void setRangesSection(const DWARFSection *RS, uint64_t Base)
uint8_t getDwarfStringOffsetsByteSize() const
const DWARFAbbreviationDeclarationSet * getAbbreviations() const
DWARFDie getParent(const DWARFDebugInfoEntry *Die)
std::optional< uint64_t > getLoclistOffset(uint32_t Index)
const char * getCompilationDir()
uint64_t getStringOffsetsBase() const
dwarf::DwarfFormat getFormat() const
DWARFUnit(DWARFContext &Context, const DWARFSection &Section, const DWARFUnitHeader &Header, const DWARFDebugAbbrev *DA, const DWARFSection *RS, const DWARFSection *LocSection, StringRef SS, const DWARFSection &SOS, const DWARFSection *AOS, const DWARFSection &LS, bool LE, bool IsDWO, const DWARFUnitVector &UnitVector)
Expected< std::optional< StrOffsetsContributionDescriptor > > determineStringOffsetsTableContribution(DWARFDataExtractor &DA)
Find the unit's contribution to the string offsets table and determine its length and form.
uint64_t getAbbreviationsOffset() const
uint16_t getVersion() const
void getInlinedChainForAddress(uint64_t Address, SmallVectorImpl< DWARFDie > &InlinedChain)
getInlinedChainForAddress - fetches inlined chain for a given address.
Error extractRangeList(uint64_t RangeListOffset, DWARFDebugRangeList &RangeList) const
Extract the range list referenced by this compile unit from the .debug_ranges section.
Expected< uint64_t > getStringOffsetSectionItem(uint32_t Index) const
uint32_t getDIEIndex(const DWARFDebugInfoEntry *Die) const
Return the index of a Die entry inside the unit's DIE vector.
Expected< DWARFLocationExpressionsVector > findLoclistFromOffset(uint64_t Offset)
Expected< DWARFAddressRangesVector > findRnglistFromOffset(uint64_t Offset)
Return a vector of address ranges resulting from a (possibly encoded) range list starting at a given ...
bool isLittleEndian() const
const DWARFDebugInfoEntry * getPreviousSiblingEntry(const DWARFDebugInfoEntry *Die) const
const DWARFDebugInfoEntry * getLastChildEntry(const DWARFDebugInfoEntry *Die) const
void updateVariableDieMap(DWARFDie Die)
Recursively update address to variable Die map.
DWARFDie getSubroutineForAddress(uint64_t Address)
Returns subprogram DIE with address range encompassing the provided address.
const DWARFDebugInfoEntry * getFirstChildEntry(const DWARFDebugInfoEntry *Die) const
Expected< DWARFAddressRangesVector > findRnglistFromIndex(uint32_t Index)
Return a vector of address ranges retrieved from an encoded range list whose offset is found via a ta...
uint64_t getNextUnitOffset() const
std::optional< object::SectionedAddress > getBaseAddress()
Expected< DWARFAddressRangesVector > collectAddressRanges()
std::optional< object::SectionedAddress > getAddrOffsetSectionItem(uint32_t Index) const
uint64_t getOffset() const
DWARFDie getLastChild(const DWARFDebugInfoEntry *Die)
void updateAddressDieMap(DWARFDie Die)
Recursively update address to Die map.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
SectionKind - This is a simple POD value that classifies the properties of a section.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
iterator insert(iterator I, std::unique_ptr< DWARFUnit > &&Elt)
void push_back(const T &Elt)
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM_ABI unsigned getTag(StringRef TagString)
@ C
The default llvm calling convention, compatible with C.
Calculates the starting offsets for various sections within the .debug_names section.
std::optional< const char * > toString(const std::optional< DWARFFormValue > &V)
Take an optional DWARFFormValue and try to extract a string value from it.
std::optional< object::SectionedAddress > toSectionedAddress(const std::optional< DWARFFormValue > &V)
DwarfFormat
Constants that define the DWARF format as 32 or 64 bit.
std::optional< uint64_t > toSectionOffset(const std::optional< DWARFFormValue > &V)
Take an optional DWARFFormValue and try to extract an section offset.
std::optional< uint64_t > toUnsigned(const std::optional< DWARFFormValue > &V)
Take an optional DWARFFormValue and try to extract an unsigned constant.
@ DW_LENGTH_lo_reserved
Special values for an initial length field.
@ DW_LENGTH_DWARF64
Indicator of 64-bit DWARF format.
LLVM_ABI bool is_relative(const Twine &path, Style style=Style::native)
Is path relative?
LLVM_ABI void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
This is an optimization pass for GlobalISel generic memory operations.
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI const DWARFUnitIndex & getDWARFUnitIndex(DWARFContext &Context, DWARFSectionKind Kind)
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
auto upper_bound(R &&Range, T &&Value)
Provide wrappers to std::upper_bound which take ranges instead of having to pass begin/end explicitly...
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
DWARFSectionKind
The enum of section identifiers to be used in internal interfaces.
Error joinErrors(Error E1, Error E2)
Concatenate errors.
static uint64_t getDebugInfoSize(DWARFContext &Dwarf)
Compute the total size of the debug info.
bool hasSingleElement(ContainerTy &&C)
Returns true if the given container only contains a single element.
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
void consumeError(Error Err)
Consume a Error without doing anything.
std::vector< DWARFLocationExpression > DWARFLocationExpressionsVector
Represents a set of absolute location expressions.
Represents a single DWARF expression, whose value is location-dependent.
Represents base address of the CU.
LLVM_ABI Expected< StrOffsetsContributionDescriptor > validateContributionSize(DWARFDataExtractor &DA)
Determine whether a contribution to the string offsets table is consistent with the relevant section ...
uint64_t Size
The contribution size not including the header.
uint8_t getDwarfOffsetByteSize() const