diff options
author | Paul Robinson <paul.robinson@sony.com> | 2018-01-25 22:02:36 +0000 |
---|---|---|
committer | Paul Robinson <paul.robinson@sony.com> | 2018-01-25 22:02:36 +0000 |
commit | b6aa01ca9928e4413d3a832685b05a69f9f76c50 (patch) | |
tree | b86522b4377ca8dc7f3375430cfbcf1928da85e8 /llvm/lib | |
parent | 8410c3746548f63c8471a34c696543fb51e22afb (diff) | |
download | bcm5719-llvm-b6aa01ca9928e4413d3a832685b05a69f9f76c50.tar.gz bcm5719-llvm-b6aa01ca9928e4413d3a832685b05a69f9f76c50.zip |
[DWARFv5] Support DW_FORM_line_strp in llvm-dwarfdump.
This form is like DW_FORM_strp, but points to .debug_line_str instead
of .debug_str as the string section. It's intended to be used from
the line-table header, and allows string-pooling of directory and
filenames across compilation units.
Differential Revision: https://reviews.llvm.org/D42553
llvm-svn: 323476
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFContext.cpp | 13 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp | 19 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp | 8 |
4 files changed, 33 insertions, 13 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp index 76be5d7e6e7..aa55294ff4c 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp @@ -459,6 +459,16 @@ void DWARFContext::dump( strDWOOffset = offset; } } + if (shouldDump(Explicit, ".debug_line_str", DIDT_ID_DebugLineStr, + DObj->getLineStringSection())) { + DataExtractor strData(DObj->getLineStringSection(), isLittleEndian(), 0); + uint32_t offset = 0; + uint32_t strOffset = 0; + while (const char *s = strData.getCStr(&offset)) { + OS << format("0x%8.8x: \"%s\"\n", strOffset, s); + strOffset = offset; + } + } if (shouldDump(Explicit, ".debug_ranges", DIDT_ID_DebugRanges, DObj->getRangeSection().Data)) { @@ -1193,6 +1203,7 @@ class DWARFObjInMemory final : public DWARFObject { StringRef CUIndexSection; StringRef GdbIndexSection; StringRef TUIndexSection; + StringRef LineStringSection; SmallVector<SmallString<32>, 4> UncompressedSections; @@ -1215,6 +1226,7 @@ class DWARFObjInMemory final : public DWARFObject { .Case("debug_cu_index", &CUIndexSection) .Case("debug_tu_index", &TUIndexSection) .Case("gdb_index", &GdbIndexSection) + .Case("debug_line_str", &LineStringSection) // Any more debug info sections go here. .Default(nullptr); } @@ -1433,6 +1445,7 @@ public: const DWARFSection &getStringOffsetSection() const override { return StringOffsetSection; } + StringRef getLineStringSection() const override { return LineStringSection; } // Sections for DWARF5 split dwarf proposal. const DWARFSection &getInfoDWOSection() const override { diff --git a/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp b/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp index 769ac37aa0b..d0fe05d1838 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp @@ -264,6 +264,7 @@ bool DWARFFormValue::isFormClass(DWARFFormValue::FormClass FC) const { case DW_FORM_strx2: case DW_FORM_strx3: case DW_FORM_strx4: + case DW_FORM_line_strp: return (FC == FC_String); case DW_FORM_implicit_const: return (FC == FC_Constant); @@ -582,6 +583,11 @@ Optional<const char *> DWARFFormValue::getAsCString() const { if (Form == DW_FORM_GNU_strp_alt || U == nullptr) return None; uint32_t Offset = Value.uval; + if (Form == DW_FORM_line_strp) { + if (const char *Str = U->getLineStringExtractor().getCStr(&Offset)) + return Str; + return None; + } if (Form == DW_FORM_GNU_str_index || Form == DW_FORM_strx || Form == DW_FORM_strx1 || Form == DW_FORM_strx2 || Form == DW_FORM_strx3 || Form == DW_FORM_strx4) { diff --git a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp index df55d7debf9..7ed818b2ca3 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp @@ -34,8 +34,8 @@ void DWARFUnitSectionBase::parse(DWARFContext &C, const DWARFSection &Section) { const DWARFObject &D = C.getDWARFObj(); parseImpl(C, Section, C.getDebugAbbrev(), &D.getRangeSection(), D.getStringSection(), D.getStringOffsetSection(), - &D.getAddrSection(), D.getLineSection(), D.isLittleEndian(), false, - false); + &D.getAddrSection(), D.getLineSection(), D.getLineStringSection(), + D.isLittleEndian(), false, false); } void DWARFUnitSectionBase::parseDWO(DWARFContext &C, @@ -43,20 +43,21 @@ void DWARFUnitSectionBase::parseDWO(DWARFContext &C, const DWARFObject &D = C.getDWARFObj(); parseImpl(C, DWOSection, C.getDebugAbbrevDWO(), &D.getRangeDWOSection(), D.getStringDWOSection(), D.getStringOffsetDWOSection(), - &D.getAddrSection(), D.getLineDWOSection(), C.isLittleEndian(), - true, Lazy); + &D.getAddrSection(), D.getLineDWOSection(), StringRef(), + C.isLittleEndian(), true, Lazy); } DWARFUnit::DWARFUnit(DWARFContext &DC, const DWARFSection &Section, const DWARFDebugAbbrev *DA, const DWARFSection *RS, StringRef SS, const DWARFSection &SOS, - const DWARFSection *AOS, const DWARFSection &LS, bool LE, - bool IsDWO, const DWARFUnitSectionBase &UnitSection, + const DWARFSection *AOS, const DWARFSection &LS, + StringRef LSS, bool LE, bool IsDWO, + const DWARFUnitSectionBase &UnitSection, const DWARFUnitIndex::Entry *IndexEntry) : Context(DC), InfoSection(Section), Abbrev(DA), RangeSection(RS), - LineSection(LS), StringSection(SS), StringOffsetSection(SOS), - AddrOffsetSection(AOS), isLittleEndian(LE), isDWO(IsDWO), - UnitSection(UnitSection), IndexEntry(IndexEntry) { + LineSection(LS), LineStringSection(LSS), StringSection(SS), + StringOffsetSection(SOS), AddrOffsetSection(AOS), isLittleEndian(LE), + isDWO(IsDWO), UnitSection(UnitSection), IndexEntry(IndexEntry) { clear(); } diff --git a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp index da3226ed0a2..c4723461a16 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp @@ -282,8 +282,8 @@ bool DWARFVerifier::handleDebugInfo() { DCtx, DObj.getInfoSection(), DCtx.getDebugAbbrev(), &DObj.getRangeSection(), DObj.getStringSection(), DObj.getStringOffsetSection(), &DObj.getAppleObjCSection(), - DObj.getLineSection(), DCtx.isLittleEndian(), false, TUSection, - nullptr)); + DObj.getLineSection(), DObj.getLineStringSection(), + DCtx.isLittleEndian(), false, TUSection, nullptr)); break; } case dwarf::DW_UT_skeleton: @@ -297,8 +297,8 @@ bool DWARFVerifier::handleDebugInfo() { DCtx, DObj.getInfoSection(), DCtx.getDebugAbbrev(), &DObj.getRangeSection(), DObj.getStringSection(), DObj.getStringOffsetSection(), &DObj.getAppleObjCSection(), - DObj.getLineSection(), DCtx.isLittleEndian(), false, CUSection, - nullptr)); + DObj.getLineSection(), DObj.getLineStringSection(), + DCtx.isLittleEndian(), false, CUSection, nullptr)); break; } default: { llvm_unreachable("Invalid UnitType."); } |