diff --git a/llvm/include/llvm/DebugInfo/DIContext.h b/llvm/include/llvm/DebugInfo/DIContext.h index 8f96b42ec8f4..516491864e5b 100644 --- a/llvm/include/llvm/DebugInfo/DIContext.h +++ b/llvm/include/llvm/DebugInfo/DIContext.h @@ -139,7 +139,7 @@ struct DIDumpOptions { uint64_t DumpType = DIDT_All; bool DumpEH = false; bool SummarizeTypes = false; - bool Brief = false; + bool Verbose = false; }; class DIContext { @@ -156,7 +156,8 @@ public: virtual void dump(raw_ostream &OS, DIDumpOptions DumpOpts) = 0; - virtual bool verify(raw_ostream &OS, uint64_t DumpType = DIDT_All) { + virtual bool verify(raw_ostream &OS, uint64_t DumpType = DIDT_All, + DIDumpOptions DumpOpts = {}) { // No verifier? Just say things went well. return true; } diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h index 3e3d514cb57f..bda804f69d90 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h @@ -123,7 +123,8 @@ public: void dump(raw_ostream &OS, DIDumpOptions DumpOpts) override; - bool verify(raw_ostream &OS, uint64_t DumpType = DIDT_All) override; + bool verify(raw_ostream &OS, uint64_t DumpType = DIDT_All, + DIDumpOptions DumpOpts = {}) override; using cu_iterator_range = DWARFUnitSection::iterator_range; using tu_iterator_range = DWARFUnitSection::iterator_range; diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFTypeUnit.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFTypeUnit.h index 4a5793ecb8fa..a7842454f435 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFTypeUnit.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFTypeUnit.h @@ -42,7 +42,7 @@ public: return DWARFUnit::getHeaderSize() + 12; } - void dump(raw_ostream &OS, bool Brief = false); + void dump(raw_ostream &OS, DIDumpOptions DumpOpts = {}); static const DWARFSectionKind Section = DW_SECT_TYPES; protected: diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h index 70fdaa22cf29..8dc7905ff928 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h @@ -10,6 +10,8 @@ #ifndef LLVM_DEBUGINFO_DWARF_DWARFVERIFIER_H #define LLVM_DEBUGINFO_DWARF_DWARFVERIFIER_H +#include "llvm/DebugInfo/DIContext.h" + #include #include #include @@ -30,6 +32,7 @@ struct DWARFSection; class DWARFVerifier { raw_ostream &OS; DWARFContext &DCtx; + DIDumpOptions DumpOpts; /// A map that tracks all references (converted absolute references) so we /// can verify each reference points to a valid DIE and not an offset that /// lies between to valid DIEs. @@ -155,8 +158,8 @@ class DWARFVerifier { DataExtractor *StrData, const char *SectionName); public: - DWARFVerifier(raw_ostream &S, DWARFContext &D) - : OS(S), DCtx(D) {} + DWARFVerifier(raw_ostream &S, DWARFContext &D, DIDumpOptions DumpOpts = {}) + : OS(S), DCtx(D), DumpOpts(std::move(DumpOpts)) {} /// Verify the information in any of the following sections, if available: /// .debug_abbrev, debug_abbrev.dwo /// diff --git a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp index b1d8f139544f..e9b3c0c132e5 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp @@ -202,7 +202,6 @@ static void dumpStringOffsetsSection(raw_ostream &OS, StringRef SectionName, void DWARFContext::dump(raw_ostream &OS, DIDumpOptions DumpOpts) { uint64_t DumpType = DumpOpts.DumpType; bool DumpEH = DumpOpts.DumpEH; - bool SummarizeTypes = DumpOpts.SummarizeTypes; if (DumpType & DIDT_DebugAbbrev) { OS << ".debug_abbrev contents:\n"; @@ -232,7 +231,7 @@ void DWARFContext::dump(raw_ostream &OS, DIDumpOptions DumpOpts) { OS << "\n.debug_types contents:\n"; for (const auto &TUS : type_unit_sections()) for (const auto &TU : TUS) - TU->dump(OS, SummarizeTypes); + TU->dump(OS, DumpOpts); } if ((DumpType & DIDT_DebugTypesDwo) && @@ -240,7 +239,7 @@ void DWARFContext::dump(raw_ostream &OS, DIDumpOptions DumpOpts) { OS << "\n.debug_types.dwo contents:\n"; for (const auto &DWOTUS : dwo_type_unit_sections()) for (const auto &DWOTU : DWOTUS) - DWOTU->dump(OS, SummarizeTypes); + DWOTU->dump(OS, DumpOpts); } if (DumpType & DIDT_DebugLoc) { @@ -434,9 +433,10 @@ DWARFDie DWARFContext::getDIEForOffset(uint32_t Offset) { return DWARFDie(); } -bool DWARFContext::verify(raw_ostream &OS, uint64_t DumpType) { +bool DWARFContext::verify(raw_ostream &OS, uint64_t DumpType, + DIDumpOptions DumpOpts) { bool Success = true; - DWARFVerifier verifier(OS, *this); + DWARFVerifier verifier(OS, *this, DumpOpts); Success &= verifier.handleDebugAbbrev(); if (DumpType & DIDT_DebugInfo) @@ -594,7 +594,7 @@ DWARFContext::getLineTableForUnit(DWARFUnit *U) { // Make sure the offset is good before we try to parse. if (stmtOffset >= U->getLineSection().Data.size()) - return nullptr; + return nullptr; // We have to parse it first. DWARFDataExtractor lineData(*DObj, U->getLineSection(), isLittleEndian(), diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp index 261a5cabffee..1af9c8001bb9 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp @@ -59,7 +59,7 @@ static void dumpRanges(const DWARFObject &Obj, raw_ostream &OS, unsigned AddressSize, unsigned Indent, const DIDumpOptions &DumpOpts) { ArrayRef SectionNames; - if (!DumpOpts.Brief) + if (DumpOpts.Verbose) SectionNames = Obj.getSectionNames(); for (size_t I = 0; I < Ranges.size(); ++I) { @@ -83,7 +83,8 @@ static void dumpRanges(const DWARFObject &Obj, raw_ostream &OS, } static void dumpLocation(raw_ostream &OS, DWARFFormValue &FormValue, - DWARFUnit *U, unsigned Indent) { + DWARFUnit *U, unsigned Indent, + DIDumpOptions DumpOpts) { DWARFContext &Ctx = U->getContext(); const DWARFObject &Obj = Ctx.getDWARFObj(); const MCRegisterInfo *MRI = Ctx.getRegisterInfo(); @@ -97,7 +98,7 @@ static void dumpLocation(raw_ostream &OS, DWARFFormValue &FormValue, return; } - FormValue.dump(OS); + FormValue.dump(OS, DumpOpts); if (FormValue.isFormClass(DWARFFormValue::FC_SectionOffset)) { const DWARFSection &LocSection = Obj.getLocSection(); const DWARFSection &LocDWOSection = Obj.getLocDWOSection(); @@ -138,7 +139,7 @@ static void dumpAttribute(raw_ostream &OS, const DWARFDie &Die, else WithColor(OS, syntax::Attribute).get() << format("DW_AT_Unknown_%x", Attr); - if (!DumpOpts.Brief) { + if (DumpOpts.Verbose) { auto formString = FormEncodingString(Form); if (!formString.empty()) OS << " [" << formString << ']'; @@ -173,7 +174,7 @@ static void dumpAttribute(raw_ostream &OS, const DWARFDie &Die, OS << *formValue.getAsUnsignedConstant(); else if (Attr == DW_AT_location || Attr == DW_AT_frame_base || Attr == DW_AT_data_member_location) - dumpLocation(OS, formValue, U, sizeof(BaseIndent) + Indent + 4); + dumpLocation(OS, formValue, U, sizeof(BaseIndent) + Indent + 4, DumpOpts); else formValue.dump(OS, DumpOpts); @@ -388,7 +389,7 @@ void DWARFDie::dump(raw_ostream &OS, unsigned RecurseDepth, unsigned Indent, WithColor(OS, syntax::Tag).get().indent(Indent) << format("DW_TAG_Unknown_%x", getTag()); - if (!DumpOpts.Brief) + if (DumpOpts.Verbose) OS << format(" [%u] %c", abbrCode, AbbrevDecl->hasChildren() ? '*' : ' '); OS << '\n'; diff --git a/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp b/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp index 8753746e1e8e..d63e84ef4e7d 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp @@ -481,7 +481,7 @@ void DWARFFormValue::dump(raw_ostream &OS, DIDumpOptions DumpOpts) const { OS << Value.uval; break; case DW_FORM_strp: - if (!DumpOpts.Brief) + if (DumpOpts.Verbose) OS << format(" .debug_str[0x%8.8x] = ", (uint32_t)UValue); dumpString(OS); break; @@ -541,7 +541,7 @@ void DWARFFormValue::dump(raw_ostream &OS, DIDumpOptions DumpOpts) const { break; } - if (CURelativeOffset && !DumpOpts.Brief) { + if (CURelativeOffset && DumpOpts.Verbose) { OS << " => {"; WithColor(OS, syntax::Address).get() << format("0x%8.8" PRIx64, UValue + (U ? U->getOffset() : 0)); diff --git a/llvm/lib/DebugInfo/DWARF/DWARFTypeUnit.cpp b/llvm/lib/DebugInfo/DWARF/DWARFTypeUnit.cpp index fd1684d33a16..67cc0505e181 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFTypeUnit.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFTypeUnit.cpp @@ -31,11 +31,11 @@ bool DWARFTypeUnit::extractImpl(DataExtractor debug_info, return TypeOffset < getLength() + SizeOfLength; } -void DWARFTypeUnit::dump(raw_ostream &OS, bool SummarizeTypes) { +void DWARFTypeUnit::dump(raw_ostream &OS, DIDumpOptions DumpOpts) { DWARFDie TD = getDIEForOffset(TypeOffset + getOffset()); const char *Name = TD.getName(DINameKind::ShortName); - if (SummarizeTypes) { + if (DumpOpts.SummarizeTypes) { OS << "name = '" << Name << "'" << " type_signature = " << format("0x%016" PRIx64, TypeHash) << " length = " << format("0x%08x", getLength()) << '\n'; @@ -55,7 +55,7 @@ void DWARFTypeUnit::dump(raw_ostream &OS, bool SummarizeTypes) { << " (next unit at " << format("0x%08x", getNextUnitOffset()) << ")\n"; if (DWARFDie TU = getUnitDIE(false)) - TU.dump(OS, -1U); + TU.dump(OS, -1U, 0, DumpOpts); else OS << "\n\n"; } diff --git a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp index 438764a88700..87b7be1eb84d 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp @@ -236,13 +236,13 @@ unsigned DWARFVerifier::verifyDebugInfoAttribute(const DWARFDie &Die, ++NumErrors; OS << "error: DW_AT_ranges offset is beyond .debug_ranges " "bounds:\n"; - Die.dump(OS, 0); + Die.dump(OS, 0, 0, DumpOpts); OS << "\n"; } } else { ++NumErrors; OS << "error: DIE has invalid DW_AT_ranges encoding:\n"; - Die.dump(OS, 0); + Die.dump(OS, 0, 0, DumpOpts); OS << "\n"; } break; @@ -254,13 +254,13 @@ unsigned DWARFVerifier::verifyDebugInfoAttribute(const DWARFDie &Die, OS << "error: DW_AT_stmt_list offset is beyond .debug_line " "bounds: " << format("0x%08" PRIx64, *SectionOffset) << "\n"; - Die.dump(OS, 0); + Die.dump(OS, 0, 0, DumpOpts); OS << "\n"; } } else { ++NumErrors; OS << "error: DIE has invalid DW_AT_stmt_list encoding:\n"; - Die.dump(OS, 0); + Die.dump(OS, 0, 0, DumpOpts); OS << "\n"; } break; @@ -295,7 +295,7 @@ unsigned DWARFVerifier::verifyDebugInfoForm(const DWARFDie &Die, << format("0x%08" PRIx64, CUOffset) << " is invalid (must be less than CU size of " << format("0x%08" PRIx32, CUSize) << "):\n"; - Die.dump(OS, 0); + Die.dump(OS, 0, 0, DumpOpts); OS << "\n"; } else { // Valid reference, but we will verify it points to an actual @@ -315,7 +315,7 @@ unsigned DWARFVerifier::verifyDebugInfoForm(const DWARFDie &Die, ++NumErrors; OS << "error: DW_FORM_ref_addr offset beyond .debug_info " "bounds:\n"; - Die.dump(OS, 0); + Die.dump(OS, 0, 0, DumpOpts); OS << "\n"; } else { // Valid reference, but we will verify it points to an actual @@ -331,7 +331,7 @@ unsigned DWARFVerifier::verifyDebugInfoForm(const DWARFDie &Die, if (SecOffset && *SecOffset >= DObj.getStringSection().size()) { ++NumErrors; OS << "error: DW_FORM_strp offset beyond .debug_str bounds:\n"; - Die.dump(OS, 0); + Die.dump(OS, 0, 0, DumpOpts); OS << "\n"; } break; @@ -356,7 +356,7 @@ unsigned DWARFVerifier::verifyDebugInfoReferences() { << ". Offset is in between DIEs:\n"; for (auto Offset : Pair.second) { auto ReferencingDie = DCtx.getDIEForOffset(Offset); - ReferencingDie.dump(OS, 0); + ReferencingDie.dump(OS, 0, 0, DumpOpts); OS << "\n"; } OS << "\n"; @@ -381,7 +381,7 @@ void DWARFVerifier::verifyDebugLineStmtOffsets() { ++NumDebugLineErrors; OS << "error: .debug_line[" << format("0x%08" PRIx32, LineTableOffset) << "] was not able to be parsed for CU:\n"; - Die.dump(OS, 0); + Die.dump(OS, 0, 0, DumpOpts); OS << '\n'; continue; } @@ -399,8 +399,8 @@ void DWARFVerifier::verifyDebugLineStmtOffsets() { << format("0x%08" PRIx32, Iter->second.getOffset()) << " and " << format("0x%08" PRIx32, Die.getOffset()) << ", have the same DW_AT_stmt_list section offset:\n"; - Iter->second.dump(OS, 0); - Die.dump(OS, 0); + Iter->second.dump(OS, 0, 0, DumpOpts); + Die.dump(OS, 0, 0, DumpOpts); OS << '\n'; // Already verified this line table before, no need to do it again. continue; diff --git a/llvm/test/tools/llvm-dwarfdump/X86/verify_debug_info.s b/llvm/test/tools/llvm-dwarfdump/X86/verify_debug_info.s index 426a5fad51a3..c3b9668a0cd3 100644 --- a/llvm/test/tools/llvm-dwarfdump/X86/verify_debug_info.s +++ b/llvm/test/tools/llvm-dwarfdump/X86/verify_debug_info.s @@ -1,5 +1,5 @@ # RUN: llvm-mc %s -filetype obj -triple x86_64-apple-darwin -o - \ -# RUN: | not llvm-dwarfdump -verify - \ +# RUN: | not llvm-dwarfdump -v -verify - \ # RUN: | FileCheck %s # CHECK: error: DIE has invalid DW_AT_stmt_list encoding:{{[[:space:]]}} @@ -11,7 +11,7 @@ # CHECK-NEXT: DW_AT_comp_dir [DW_FORM_strp] ( .debug_str[0x0000003f] = "/Users/sgravani/Development/tests") # CHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) # CHECK-NEXT: DW_AT_high_pc [DW_FORM_data4] (0x00000016){{[[:space:]]}} -# CHECK-NEXT: Units[2] - start offset: 0x00000068 +# CHECK-NEXT: Units[2] - start offset: 0x00000068 # CHECK-NEXT: Error: The length for this unit is too large for the .debug_info provided. # CHECK-NEXT: Error: The unit type encoding is not valid. @@ -175,7 +175,7 @@ Lcu_begin1: .byte 1 ## DWARF Unit Type .byte 4 ## Address Size (in bytes) .long 0 ## Abbrev offset - .byte 0 + .byte 0 Ltu_begin0: .long 26 ## Length of Unit -- Error: The length for this unit is too large for the .debug_info provided. .short 5 ## DWARF version number @@ -184,7 +184,7 @@ Ltu_begin0: .long 0 .quad 0 .long 0 - .byte 0 + .byte 0 .subsections_via_symbols .section __DWARF,__debug_line,regular,debug diff --git a/llvm/tools/dsymutil/DwarfLinker.cpp b/llvm/tools/dsymutil/DwarfLinker.cpp index 7d2eba486427..b91b80ea08e9 100644 --- a/llvm/tools/dsymutil/DwarfLinker.cpp +++ b/llvm/tools/dsymutil/DwarfLinker.cpp @@ -1743,8 +1743,11 @@ void DwarfLinker::reportWarning(const Twine &Warning, if (!Options.Verbose || !DIE) return; + DIDumpOptions DumpOpts; + DumpOpts.Verbose = Options.Verbose; + errs() << " in DIE:\n"; - DIE->dump(errs(), 0 /* RecurseDepth */, 6 /* Indent */); + DIE->dump(errs(), 0 /* RecurseDepth */, 6 /* Indent */, DumpOpts); } bool DwarfLinker::createStreamer(const Triple &TheTriple, @@ -2107,8 +2110,11 @@ unsigned DwarfLinker::shouldKeepVariableDIE(RelocationManager &RelocMgr, (Flags & TF_InFunctionScope)) return Flags; - if (Options.Verbose) - DIE.dump(outs(), 0, 8 /* Indent */); + if (Options.Verbose) { + DIDumpOptions DumpOpts; + DumpOpts.Verbose = Options.Verbose; + DIE.dump(outs(), 0, 8 /* Indent */, DumpOpts); + } return Flags | TF_Keep; } @@ -2139,8 +2145,11 @@ unsigned DwarfLinker::shouldKeepSubprogramDIE( !RelocMgr.hasValidRelocation(LowPcOffset, LowPcEndOffset, MyInfo)) return Flags; - if (Options.Verbose) - DIE.dump(outs(), 0, 8 /* Indent */); + if (Options.Verbose) { + DIDumpOptions DumpOpts; + DumpOpts.Verbose = Options.Verbose; + DIE.dump(outs(), 0, 8 /* Indent */, DumpOpts); + } Flags |= TF_Keep; @@ -3476,7 +3485,9 @@ bool DwarfLinker::link(const DebugMap &Map) { auto CUDie = CU->getUnitDIE(false); if (Options.Verbose) { outs() << "Input compilation unit:"; - CUDie.dump(outs(), 0); + DIDumpOptions DumpOpts; + DumpOpts.Verbose = Options.Verbose; + CUDie.dump(outs(), 0, 0, DumpOpts); } if (!registerModuleReference(CUDie, *CU, ModuleMap)) { diff --git a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp index 9fded20eeb59..39d207b8d587 100644 --- a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp +++ b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp @@ -82,6 +82,14 @@ static void error(StringRef Filename, std::error_code EC) { exit(1); } +static DIDumpOptions GetDumpOpts() { + DIDumpOptions DumpOpts; + DumpOpts.DumpType = DumpType; + DumpOpts.SummarizeTypes = SummarizeTypes; + DumpOpts.Verbose = Verbose; + return DumpOpts; +} + static void DumpObjectFile(ObjectFile &Obj, Twine Filename) { std::unique_ptr DICtx = DWARFContext::create(Obj); logAllUnhandledErrors(DICtx->loadRegisterInfo(Obj), errs(), @@ -92,11 +100,7 @@ static void DumpObjectFile(ObjectFile &Obj, Twine Filename) { // Dump the complete DWARF structure. - DIDumpOptions DumpOpts; - DumpOpts.DumpType = DumpType; - DumpOpts.SummarizeTypes = SummarizeTypes; - DumpOpts.Brief = !Verbose; - DICtx->dump(outs(), DumpOpts); + DICtx->dump(outs(), GetDumpOpts()); } static void DumpInput(StringRef Filename) { @@ -129,7 +133,7 @@ static bool VerifyObjectFile(ObjectFile &Obj, Twine Filename) { raw_ostream &stream = Quiet ? nulls() : outs(); stream << "Verifying " << Filename.str() << ":\tfile format " << Obj.getFileFormatName() << "\n"; - bool Result = DICtx->verify(stream, DumpType); + bool Result = DICtx->verify(stream, DumpType, GetDumpOpts()); if (Result) stream << "No errors.\n"; else