summaryrefslogtreecommitdiffstats
path: root/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp')
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp41
1 files changed, 33 insertions, 8 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp b/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp
index 3d26cf69b94..4771d213741 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp
@@ -159,6 +159,23 @@ void AppleAcceleratorTable::Header::dump(ScopedPrinter &W) const {
W.printNumber("HeaderData length", HeaderDataLength);
}
+Optional<uint64_t> AppleAcceleratorTable::HeaderData::extractOffset(
+ Optional<DWARFFormValue> Value) const {
+ if (!Value)
+ return None;
+
+ switch (Value->getForm()) {
+ case dwarf::DW_FORM_ref1:
+ case dwarf::DW_FORM_ref2:
+ case dwarf::DW_FORM_ref4:
+ case dwarf::DW_FORM_ref8:
+ case dwarf::DW_FORM_ref_udata:
+ return Value->getRawUValue() + DIEOffsetBase;
+ default:
+ return Value->getAsSectionOffset();
+ }
+}
+
bool AppleAcceleratorTable::dumpName(ScopedPrinter &W,
SmallVectorImpl<DWARFFormValue> &AtomForms,
uint32_t *DataOffset) const {
@@ -276,16 +293,12 @@ AppleAcceleratorTable::Entry::lookup(HeaderData::AtomType Atom) const {
return None;
}
-Optional<uint64_t> AppleAcceleratorTable::Entry::getDIEOffset() const {
- if (Optional<DWARFFormValue> Off = lookup(dwarf::DW_ATOM_die_offset))
- return Off->getAsSectionOffset();
- return None;
+Optional<uint64_t> AppleAcceleratorTable::Entry::getDIESectionOffset() const {
+ return HdrData->extractOffset(lookup(dwarf::DW_ATOM_die_offset));
}
Optional<uint64_t> AppleAcceleratorTable::Entry::getCUOffset() const {
- if (Optional<DWARFFormValue> Off = lookup(dwarf::DW_ATOM_cu_offset))
- return Off->getAsSectionOffset();
- return None;
+ return HdrData->extractOffset(lookup(dwarf::DW_ATOM_cu_offset));
}
Optional<dwarf::Tag> AppleAcceleratorTable::Entry::getTag() const {
@@ -537,7 +550,7 @@ DWARFDebugNames::Entry::lookup(dwarf::Index Index) const {
return None;
}
-Optional<uint64_t> DWARFDebugNames::Entry::getDIEOffset() const {
+Optional<uint64_t> DWARFDebugNames::Entry::getDIEUnitOffset() const {
if (Optional<DWARFFormValue> Off = lookup(dwarf::DW_IDX_die_offset))
return Off->getAsSectionOffset();
return None;
@@ -546,6 +559,10 @@ Optional<uint64_t> DWARFDebugNames::Entry::getDIEOffset() const {
Optional<uint64_t> DWARFDebugNames::Entry::getCUIndex() const {
if (Optional<DWARFFormValue> Off = lookup(dwarf::DW_IDX_compile_unit))
return Off->getAsUnsignedConstant();
+ // In a per-CU index, the entries without a DW_IDX_compile_unit attribute
+ // implicitly refer to the single CU.
+ if (NameIdx->getCUCount() == 1)
+ return 0;
return None;
}
@@ -556,6 +573,14 @@ Optional<uint64_t> DWARFDebugNames::Entry::getCUOffset() const {
return NameIdx->getCUOffset(*Index);
}
+Optional<uint64_t> DWARFDebugNames::Entry::getDIESectionOffset() const {
+ Optional<uint64_t> CUOff = getCUOffset();
+ Optional<uint64_t> DIEOff = getDIEUnitOffset();
+ if (CUOff && DIEOff)
+ return *CUOff + *DIEOff;
+ return None;
+}
+
void DWARFDebugNames::Entry::dump(ScopedPrinter &W) const {
W.printHex("Abbrev", Abbr->Code);
W.startLine() << "Tag: " << formatTag(Abbr->Tag) << "\n";
OpenPOWER on IntegriCloud