From 6957ab5b7b98f7c372313eec6c81601bfa6b5860 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Tue, 15 Aug 2017 12:32:54 +0000 Subject: [llvm-dwarfdump] - Print section name and index when dumping .debug_info ranges Teaches llvm-dwarfdump to print section index and name of range when it dumps .debug_info. Differential revision: https://reviews.llvm.org/D36313 llvm-svn: 310915 --- llvm/lib/DebugInfo/DWARF/DWARFDie.cpp | 52 +++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 12 deletions(-) (limited to 'llvm/lib/DebugInfo/DWARF/DWARFDie.cpp') diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp index 111f0bbd444..6b557b9e265 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp @@ -18,6 +18,7 @@ #include "llvm/DebugInfo/DWARF/DWARFDebugRangeList.h" #include "llvm/DebugInfo/DWARF/DWARFFormValue.h" #include "llvm/DebugInfo/DWARF/DWARFUnit.h" +#include "llvm/Object/ObjectFile.h" #include "llvm/Support/DataExtractor.h" #include "llvm/Support/Format.h" #include "llvm/Support/MathExtras.h" @@ -31,6 +32,7 @@ using namespace llvm; using namespace dwarf; +using namespace object; using namespace syntax; static void dumpApplePropertyAttribute(raw_ostream &OS, uint64_t Val) { @@ -51,17 +53,42 @@ static void dumpApplePropertyAttribute(raw_ostream &OS, uint64_t Val) { OS << ")"; } -static void dumpRanges(raw_ostream &OS, const DWARFAddressRangesVector& Ranges, - unsigned AddressSize, unsigned Indent) { - if (Ranges.empty()) - return; - - for (const auto &Range: Ranges) { +static void dumpRanges(const DWARFObject &Obj, raw_ostream &OS, + const DWARFAddressRangesVector &Ranges, + unsigned AddressSize, unsigned Indent, + const DIDumpOptions &DumpOpts) { + StringMap SectionAmountMap; + std::vector SectionNames; + if (Obj.getFile() && !DumpOpts.Brief) { + for (const SectionRef &Section : Obj.getFile()->sections()) { + StringRef Name; + if (Section.getName(Name)) + Name = ""; + + ++SectionAmountMap[Name]; + SectionNames.push_back(Name); + } + } + + for (size_t I = 0; I < Ranges.size(); ++I) { + const DWARFAddressRange &R = Ranges[I]; + OS << '\n'; OS.indent(Indent); - OS << format("[0x%0*" PRIx64 " - 0x%0*" PRIx64 ")", - AddressSize*2, Range.LowPC, - AddressSize*2, Range.HighPC); + OS << format("[0x%0*" PRIx64 " - 0x%0*" PRIx64 ")", AddressSize * 2, + R.LowPC, AddressSize * 2, R.HighPC); + + if (SectionNames.empty() || R.SectionIndex == -1ULL) + continue; + + StringRef Name = R.SectionIndex < SectionNames.size() + ? SectionNames[R.SectionIndex] + : ""; + OS << format(" \"%s\"", Name.str().c_str()); + + // Print section index if there is more than one section with this name. + if (SectionAmountMap[Name] > 1) + OS << format(" [%u]", R.SectionIndex); } } @@ -126,10 +153,11 @@ static void dumpAttribute(raw_ostream &OS, const DWARFDie &Die, if (Optional OptVal = formValue.getAsUnsignedConstant()) dumpApplePropertyAttribute(OS, *OptVal); } else if (Attr == DW_AT_ranges) { - dumpRanges(OS, Die.getAddressRanges(), U->getAddressByteSize(), - sizeof(BaseIndent)+Indent+4); + const DWARFObject &Obj = Die.getDwarfUnit()->getContext().getDWARFObj(); + dumpRanges(Obj, OS, Die.getAddressRanges(), U->getAddressByteSize(), + sizeof(BaseIndent) + Indent + 4, DumpOpts); } - + OS << ")\n"; } -- cgit v1.2.3