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());
101 if (IndexEntry && !Header.applyIndexEntry(IndexEntry))
103 std::unique_ptr<DWARFUnit>
U;
104 if (Header.isTypeUnit())
105 U = std::make_unique<DWARFTypeUnit>(Context, InfoSection, Header, DA,
106 RS, LocSection, SS, SOS, AOS, LS,
109 U = std::make_unique<DWARFCompileUnit>(Context, InfoSection, Header,
110 DA, RS, LocSection, SS, SOS,
111 AOS, LS, LE, IsDWO, *
this);
125 if (
I != this->
end() &&
126 (&(*I)->getInfoSection() != &Section || (*I)->getOffset() ==
Offset)) {
134 Offset =
U->getNextUnitOffset();
135 I = std::next(this->
insert(
I, std::move(U)));
141 [](
const std::unique_ptr<DWARFUnit> &
LHS,
142 const std::unique_ptr<DWARFUnit> &
RHS) {
143 return LHS->getOffset() <
RHS->getOffset();
145 return this->
insert(
I, std::move(Unit))->get();
153 return LHS <
RHS->getNextUnitOffset();
170 std::upper_bound(
begin(),
end, CUOff->getOffset(),
172 return LHS < RHS->getNextUnitOffset();
180 auto U = Parser(
Offset, DW_SECT_INFO,
nullptr, &E);
184 auto *NewCU = U.get();
196 :
Context(DC), InfoSection(Section), Header(Header), Abbrev(DA),
197 RangeSection(RS), LineSection(LS), StringSection(SS),
198 StringOffsetSection(SOS), AddrOffsetSection(AOS), IsLittleEndian(LE),
199 IsDWO(IsDWO), UnitVector(UnitVector) {
210std::optional<object::SectionedAddress>
212 if (!AddrOffsetSectionBase) {
213 auto R =
Context.info_section_units();
219 return (*R.begin())->getAddrOffsetSectionItem(
Index);
235 if (!StringOffsetsTableContribution)
236 return make_error<StringError>(
237 "DW_FORM_strx used without a valid string offsets table",
242 return make_error<StringError>(
"DW_FORM_strx uses index " +
Twine(
Index) +
243 ", which is too large",
247 return DA.getRelocatedValue(ItemSize, &
Offset);
254 Offset = *offset_ptr;
256 IndexEntry =
nullptr;
277 TypeHash = debug_info.
getU64(offset_ptr, &Err);
281 DWOId = debug_info.
getU64(offset_ptr, &Err);
287 "DWARF unit at 0x%8.8" PRIx64
" cannot be parsed:", Offset),
291 assert(*offset_ptr - Offset <= 255 &&
"unexpected header size");
292 Size = uint8_t(*offset_ptr - Offset);
297 "DWARF unit from offset 0x%8.8" PRIx64
" incl. "
298 "to offset 0x%8.8" PRIx64
" excl. "
299 "extends past section size 0x%8.8zx",
300 Offset, NextCUOffset, debug_info.
size());
305 "DWARF unit at offset 0x%8.8" PRIx64
" "
306 "has unsupported version %" PRIu16
", supported are 2-%u",
313 "DWARF type unit at offset "
315 "has its relocated type_offset 0x%8.8" PRIx64
" "
316 "pointing inside the header",
317 Offset, Offset + TypeOffset);
322 "DWARF type unit from offset 0x%8.8" PRIx64
" incl. "
323 "to offset 0x%8.8" PRIx64
" excl. has its "
324 "relocated type_offset 0x%8.8" PRIx64
" pointing past the unit end",
325 Offset, NextCUOffset, Offset + TypeOffset);
329 "DWARF unit at offset 0x%8.8" PRIx64, Offset))
350 AbbrOffset = AbbrEntry->getOffset();
357 assert(!DieArray.empty());
360 uint64_t ActualRangeListOffset = RangeSectionBase + RangeListOffset;
361 return RangeList.
extract(RangesData, &ActualRangeListOffset);
367 RangeSectionBase = 0;
369 AddrOffsetSectionBase = std::nullopt;
382void DWARFUnit::extractDIEsToVector(
383 bool AppendCUDie,
bool AppendNonCUDies,
384 std::vector<DWARFDebugInfoEntry> &Dies)
const {
385 if (!AppendCUDie && !AppendNonCUDies)
396 std::vector<uint32_t> Parents;
397 std::vector<uint32_t> PrevSiblings;
401 ((AppendCUDie && Dies.empty()) || (!AppendCUDie && Dies.size() == 1)) &&
402 "Dies array is not empty");
405 Parents.push_back(UINT32_MAX);
407 Parents.push_back(0);
408 PrevSiblings.push_back(0);
412 assert(Parents.size() > 0 &&
"Empty parents stack");
413 assert((Parents.back() == UINT32_MAX || Parents.back() <= Dies.size()) &&
414 "Wrong parent index");
417 if (!
DIE.extractFast(*
this, &DIEOffset, DebugInfoData, NextCUOffset,
422 if (PrevSiblings.back() > 0) {
423 assert(PrevSiblings.back() < Dies.size() &&
424 "Previous sibling index is out of Dies boundaries");
425 Dies[PrevSiblings.back()].setSiblingIdx(Dies.size());
432 if (!AppendNonCUDies)
437 Dies.reserve(Dies.size() + getDebugInfoSize() / 14);
440 PrevSiblings.back() = Dies.size();
447 DIE.getAbbreviationDeclarationPtr()) {
448 if (AbbrDecl->hasChildren()) {
449 if (AppendCUDie || !IsCUDie) {
450 assert(Dies.size() > 0 &&
"Dies does not contain any die");
451 Parents.push_back(Dies.size() - 1);
452 PrevSiblings.push_back(0);
460 PrevSiblings.pop_back();
470void DWARFUnit::extractDIEsIfNeeded(
bool CUDieOnly) {
472 Context.getRecoverableErrorHandler()(std::move(e));
476 if ((CUDieOnly && !DieArray.empty()) ||
480 bool HasCUDie = !DieArray.empty();
481 extractDIEsToVector(!HasCUDie, !CUDieOnly, DieArray);
483 if (DieArray.empty())
490 DWARFDie UnitDie(
this, &DieArray[0]);
491 if (std::optional<uint64_t> DWOId =
493 Header.setDWOId(*DWOId);
495 assert(AddrOffsetSectionBase == std::nullopt);
496 assert(RangeSectionBase == 0);
497 assert(LocSectionBase == 0);
499 if (!AddrOffsetSectionBase)
500 AddrOffsetSectionBase =
516 auto StringOffsetOrError =
519 if (!StringOffsetOrError)
521 "invalid reference to or invalid content in "
522 ".debug_str_offsets[.dwo]: " +
523 toString(StringOffsetOrError.takeError()));
525 StringOffsetsTableContribution = *StringOffsetOrError;
533 uint64_t ContributionBaseOffset = 0;
534 if (
auto *IndexEntry = Header.getIndexEntry())
535 if (
auto *Contrib = IndexEntry->getContribution(DW_SECT_RNGLISTS))
536 ContributionBaseOffset = Contrib->getOffset();
538 &
Context.getDWARFObj().getRnglistsDWOSection(),
539 ContributionBaseOffset +
545 Header.getFormat())));
552 ?
Context.getDWARFObj().getLoclistsDWOSection().Data
553 :
Context.getDWARFObj().getLocDWOSection().Data;
554 if (
auto *IndexEntry = Header.getIndexEntry())
555 if (
const auto *
C = IndexEntry->getContribution(
557 Data =
Data.substr(
C->getOffset(),
C->getLength());
561 std::make_unique<DWARFDebugLoclists>(DWARFData, Header.getVersion());
564 LocTable = std::make_unique<DWARFDebugLoclists>(
566 Context.getDWARFObj().getLoclistsSection(),
580bool DWARFUnit::parseDWO(
StringRef DWOAlternativeLocation) {
603 auto DWOContext =
Context.getDWOContext(AbsolutePath);
606 if (DWOAlternativeLocation.
empty())
611 DWOContext =
Context.getDWOContext(DWOAlternativeLocation);
619 DWO = std::shared_ptr<DWARFCompileUnit>(std::move(DWOContext), DWOCU);
620 DWO->setSkeletonUnit(
this);
622 if (AddrOffsetSectionBase)
623 DWO->setAddrOffsetSection(AddrOffsetSection, *AddrOffsetSectionBase);
626 DWO->setRangesSection(RangeSection, DWORangesBase.value_or(0));
632void DWARFUnit::clearDIEs(
bool KeepCUDie) {
638 DieArray = (KeepCUDie && !DieArray.empty())
639 ? std::vector<DWARFDebugInfoEntry>({DieArray[0]})
640 : std::vector<DWARFDebugInfoEntry>();
652 IsLittleEndian, Header.getAddressByteSize());
654 auto RangeListOrError = RnglistTable.
findList(RangesData,
Offset);
655 if (RangeListOrError)
656 return RangeListOrError.get().getAbsoluteRanges(
getBaseAddress(), *
this);
657 return RangeListOrError.takeError();
666 "invalid range list table index %d (possibly "
667 "missing the entire range list table)",
678 if (!CUDIERangesOrError)
680 "decoding address ranges: %s",
681 toString(CUDIERangesOrError.takeError()).c_str());
682 return *CUDIERangesOrError;
696 Result.push_back(std::move(*L));
698 InterpretationError =
699 joinErrors(L.takeError(), std::move(InterpretationError));
700 return !InterpretationError;
703 if (ParseError || InterpretationError)
704 return joinErrors(std::move(ParseError), std::move(InterpretationError));
712 if (DIERangesOrError) {
713 for (
const auto &R : DIERangesOrError.get()) {
715 if (R.LowPC == R.HighPC)
717 auto B = AddrDieMap.upper_bound(R.LowPC);
718 if (
B != AddrDieMap.begin() && R.LowPC < (--
B)->second.first) {
721 if (R.HighPC <
B->second.first)
722 AddrDieMap[R.HighPC] =
B->second;
723 if (R.LowPC >
B->first)
724 AddrDieMap[
B->first].first = R.LowPC;
726 AddrDieMap[R.LowPC] = std::make_pair(R.HighPC, Die);
741 extractDIEsIfNeeded(
false);
742 if (AddrDieMap.empty())
744 auto R = AddrDieMap.upper_bound(
Address);
745 if (R == AddrDieMap.begin())
749 if (
Address >= R->second.first)
751 return R->second.second;
756 if (
isType(Child.getTag()))
761 if (Die.
getTag() != DW_TAG_variable)
778 auto It = Expr.
begin();
779 if (It == Expr.
end())
789 if (It->getCode() == dwarf::DW_OP_addr) {
790 LocationAddr = It->getRawOperand(0);
791 }
else if (It->getCode() == dwarf::DW_OP_addrx) {
792 uint64_t DebugAddrOffset = It->getRawOperand(0);
794 LocationAddr = Pointer->Address;
801 if (++It != Expr.
end()) {
802 if (It->getCode() != dwarf::DW_OP_plus_uconst)
805 LocationAddr += It->getRawOperand(0);
808 if (++It != Expr.
end())
829 extractDIEsIfNeeded(
false);
833 auto RootLookup = RootsParsedForVariables.
insert(RootDie.getOffset());
834 if (RootLookup.second)
837 auto R = VariableDieMap.upper_bound(
Address);
838 if (R == VariableDieMap.begin())
843 if (
Address >= R->second.first)
845 return R->second.second;
859 while (SubroutineDIE) {
864 if (SubroutineDIE.
getTag() == DW_TAG_inlined_subroutine)
866 SubroutineDIE = SubroutineDIE.
getParent();
872 if (Kind == DW_SECT_INFO)
889 assert(Die >= DieArray.data() && Die < DieArray.data() + DieArray.size());
891 if (std::optional<uint32_t> ParentIdx = Die->
getParentIdx()) {
892 assert(*ParentIdx < DieArray.size() &&
893 "ParentIdx is out of DieArray boundaries");
911 assert(Die >= DieArray.data() && Die < DieArray.data() + DieArray.size());
913 if (std::optional<uint32_t> SiblingIdx = Die->
getSiblingIdx()) {
914 assert(*SiblingIdx < DieArray.size() &&
915 "SiblingIdx is out of DieArray boundaries");
916 return &DieArray[*SiblingIdx];
933 assert(Die >= DieArray.data() && Die < DieArray.data() + DieArray.size());
935 std::optional<uint32_t> ParentIdx = Die->
getParentIdx();
940 assert(*ParentIdx < DieArray.size() &&
941 "ParentIdx is out of DieArray boundaries");
945 if (PrevDieIdx == *ParentIdx)
949 while (DieArray[PrevDieIdx].getParentIdx() != *ParentIdx) {
950 PrevDieIdx = *DieArray[PrevDieIdx].getParentIdx();
952 assert(PrevDieIdx < DieArray.size() &&
953 "PrevDieIdx is out of DieArray boundaries");
954 assert(PrevDieIdx >= *ParentIdx &&
955 "PrevDieIdx is not a child of parent of Die");
958 return &DieArray[PrevDieIdx];
972 assert(Die >= DieArray.data() && Die < DieArray.data() + DieArray.size());
981 if (
I >= DieArray.size())
997 assert(Die >= DieArray.data() && Die < DieArray.data() + DieArray.size());
1002 if (std::optional<uint32_t> SiblingIdx = Die->
getSiblingIdx()) {
1003 assert(*SiblingIdx < DieArray.size() &&
1004 "SiblingIdx is out of DieArray boundaries");
1005 assert(DieArray[*SiblingIdx - 1].
getTag() == dwarf::DW_TAG_null &&
1006 "Bad end of children marker");
1007 return &DieArray[*SiblingIdx - 1];
1019 if (
getDIEIndex(Die) == 0 && DieArray.size() > 1 &&
1020 DieArray.back().getTag() == dwarf::DW_TAG_null) {
1025 return &DieArray.back();
1035 if (!AbbrevsOrError) {
1040 Abbrevs = *AbbrevsOrError;
1050 std::optional<DWARFFormValue> PC =
1051 UnitDie.
find({DW_AT_low_pc, DW_AT_entry_pc});
1064 if (ValidationSize >=
Size)
1065 if (DA.isValidOffsetForDataOfSize((
uint32_t)
Base, ValidationSize))
1074 if (!DA.isValidOffsetForDataOfSize(
Offset, 16))
1081 uint8_t Version = DA.getU16(&
Offset);
1082 (void)DA.getU16(&
Offset);
1092 if (!DA.isValidOffsetForDataOfSize(
Offset, 8))
1099 uint8_t Version = DA.getU16(&
Offset);
1100 (void)DA.getU16(&
Offset);
1118 return DescOrError.takeError();
1119 Desc = *DescOrError;
1127 return DescOrError.takeError();
1128 Desc = *DescOrError;
1132 return Desc.validateContributionSize(DA);
1140 return std::nullopt;
1144 return DescOrError.takeError();
1145 return *DescOrError;
1152 auto IndexEntry = Header.getIndexEntry();
1154 IndexEntry ? IndexEntry->getContribution(DW_SECT_STR_OFFSETS) :
nullptr;
1158 if (DA.getData().data() ==
nullptr)
1159 return std::nullopt;
1164 return DescOrError.takeError();
1165 return *DescOrError;
1173 Header.getFormat());
1174 else if (!IndexEntry && !StringOffsetSection.
Data.
empty())
1176 4, Header.getFormat());
1178 return std::nullopt;
1179 auto DescOrError =
Desc.validateContributionSize(DA);
1181 return DescOrError.takeError();
1182 return *DescOrError;
1192 return *Off + RangeSectionBase;
1193 return std::nullopt;
1199 return *Off + LocSectionBase;
1200 return std::nullopt;
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
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.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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()
Expected< const DWARFAbbreviationDeclarationSet * > getAbbreviationDeclarationSet(uint64_t CUAbbrOffset) const
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.
Error extract(const DWARFDataExtractor &data, uint64_t *offset_ptr)
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.
Expected< DWARFAddressRangesVector > getAddressRanges() const
Get the address ranges for this DIE.
DWARFDie getAttributeValueAsReferencedDie(dwarf::Attribute Attr) const
Extract the specified attribute from this DIE as the referenced DIE.
DWARFDie getParent() const
Get the parent of this DIE object.
std::optional< DWARFFormValue > find(dwarf::Attribute Attr) const
Extract the specified attribute from this DIE.
DWARFDie getSibling() const
Get the sibling of this DIE object.
bool isSubroutineDIE() const
Returns true if DIE represents a subprogram or an inlined subroutine.
bool isSubprogramDIE() const
Returns true if DIE represents a subprogram (not inlined).
std::optional< uint64_t > getTypeSize(uint64_t PointerSize)
Gets the type size (in bytes) for this DIE.
DWARFDie getFirstChild() const
Get the first child of this DIE object.
dwarf::Tag getTag() const
Expected< DWARFLocationExpressionsVector > getLocations(dwarf::Attribute Attr) const
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.
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
const SectionContribution * getContribution(DWARFSectionKind Sec) const
Describe a collection of units.
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.
void addUnitsForSection(DWARFContext &C, const DWARFSection &Section, DWARFSectionKind SectionKind)
Read units from a .debug_info or .debug_types section.
DWARFUnit * getUnitForOffset(uint64_t Offset) const
void addUnitsForDWOSection(DWARFContext &C, const DWARFSection &DWOSection, DWARFSectionKind SectionKind, bool Lazy=false)
Read units from a .debug_info.dwo or .debug_types.dwo section.
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, T &&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.
constexpr size_t size() const
size - Get the string size.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
std::pair< iterator, bool > insert(const ValueT &V)
unsigned getTag(StringRef TagString)
@ C
The default llvm calling convention, compatible with C.
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)
UnitType
Constants for unit types in DWARF v5.
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.
bool is_relative(const Twine &path, Style style=Style::native)
Is path relative?
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.
const DWARFUnitIndex & getDWARFUnitIndex(DWARFContext &Context, DWARFSectionKind Kind)
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.
std::vector< DWARFLocationExpression > DWARFLocationExpressionsVector
Represents a set of absolute location expressions.
Error joinErrors(Error E1, Error E2)
Concatenate errors.
bool hasSingleElement(ContainerTy &&C)
Returns true if the given container only contains a single element.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
void consumeError(Error Err)
Consume a Error without doing anything.
Description of the encoding of one expression Op.
Represents a single DWARF expression, whose value is location-dependent.
Represents base address of the CU.
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