From 494372f27efed07ee7236839e0e70d38a8dfbb00 Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Wed, 13 Sep 2017 22:09:01 +0000 Subject: [PATCH] llvm-dwarfdump: automatically dump both regular and .dwo variant of sections Since users typically don't really care about the .dwo / non.dwo distinction, this patch makes it so dwarfdump --debug- dumps .debug_info and (if available) also .debug_info.dwo. This simplifies the command line interface (I've removed all dwo-specific dump options) and makes the tool friendlier to use. Differential Revision: https://reviews.llvm.org/D37771 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@313207 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/BinaryFormat/Dwarf.def | 9 +- include/llvm/DebugInfo/DIContext.h | 12 +- include/llvm/DebugInfo/DWARF/DWARFContext.h | 2 +- .../llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h | 1 + .../llvm/DebugInfo/DWARF/DWARFDebugFrame.h | 3 + include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h | 2 +- .../llvm/DebugInfo/DWARF/DWARFDebugMacro.h | 3 + include/llvm/DebugInfo/DWARF/DWARFUnitIndex.h | 1 + lib/DebugInfo/DWARF/DWARFContext.cpp | 165 ++++++++++-------- test/DebugInfo/Inputs/gmlt.ll | 8 +- test/DebugInfo/X86/fission-inline.ll | 1 + test/DebugInfo/X86/fission-no-inlining.ll | 2 + test/DebugInfo/X86/fission-ranges.ll | 2 +- test/DebugInfo/X86/generate-odr-hash.ll | 6 +- test/DebugInfo/X86/gnu-public-names-gmlt.ll | 12 +- .../X86/split-dwarf-cross-unit-reference.ll | 5 +- .../X86/split-dwarf-multiple-cu-hash.ll | 2 + test/DebugInfo/X86/split-dwarf-omit-empty.ll | 2 + test/DebugInfo/dwarfdump-dump-flags.test | 3 +- test/DebugInfo/dwarfdump-dwp.test | 1 + .../ARM/dwarf-asm-multiple-sections-dwarf-2.s | 5 +- test/MC/ARM/dwarf-asm-no-code.s | 12 +- test/MC/ARM/dwarf-asm-nonstandard-section.s | 5 +- test/MC/ARM/dwarf-asm-single-section.s | 5 +- .../tools/dsymutil/X86/basic-linking-x86.test | 3 +- test/tools/llvm-dwp/X86/empty.test | 6 +- test/tools/llvm-dwp/X86/simple.test | 3 +- tools/llvm-dwarfdump/llvm-dwarfdump.cpp | 5 +- 28 files changed, 146 insertions(+), 140 deletions(-) diff --git a/include/llvm/BinaryFormat/Dwarf.def b/include/llvm/BinaryFormat/Dwarf.def index 88dec74f9c2..fdbad6d02d2 100644 --- a/include/llvm/BinaryFormat/Dwarf.def +++ b/include/llvm/BinaryFormat/Dwarf.def @@ -823,21 +823,16 @@ HANDLE_DW_UT(0x04, skeleton) HANDLE_DW_UT(0x05, split_compile) HANDLE_DW_UT(0x06, split_type) -// DWARF section types. (enum name, ELF name, cmdline name) +// DWARF section types. (enum name, ELF name, ELF DWO name, cmdline name) // Note that these IDs don't mean anything. // TODO: Add Mach-O and COFF names. // Official DWARF sections. HANDLE_DWARF_SECTION(DebugAbbrev, ".debug_abbrev", "debug-abbrev") -HANDLE_DWARF_SECTION(DebugAbbrevDwo, ".debug_abbrev.dwo", "debug-abbrev-dwo") HANDLE_DWARF_SECTION(DebugAranges, ".debug_aranges", "debug-aranges") HANDLE_DWARF_SECTION(DebugInfo, ".debug_info", "debug-info") -HANDLE_DWARF_SECTION(DebugInfoDwo, ".debug_info.dwo", "debug-info-dwo") HANDLE_DWARF_SECTION(DebugTypes, ".debug_types", "debug-types") -HANDLE_DWARF_SECTION(DebugTypesDwo, ".debug_types.dwo", "debug-types-dwo") HANDLE_DWARF_SECTION(DebugLine, ".debug_line", "debug-line") -HANDLE_DWARF_SECTION(DebugLineDwo, ".debug_line.dwo", "debug-line-dwo") HANDLE_DWARF_SECTION(DebugLoc, ".debug_loc", "debug-loc") -HANDLE_DWARF_SECTION(DebugLocDwo, ".debug_loc.dwo", "debug-loc-dwo") HANDLE_DWARF_SECTION(DebugFrames, ".debug_frames", "debug-frames") HANDLE_DWARF_SECTION(DebugMacro, ".debug_macro", "debug-macro") HANDLE_DWARF_SECTION(DebugRanges, ".debug_ranges", "debug-ranges") @@ -847,8 +842,6 @@ HANDLE_DWARF_SECTION(DebugGnuPubnames, ".debug_gnu_pubnames", "debug-gnu-pubname HANDLE_DWARF_SECTION(DebugGnuPubtypes, ".debug_gnu_pubtypes", "debug-gnu-pubtypes") HANDLE_DWARF_SECTION(DebugStr, ".debug_str", "debug-str") HANDLE_DWARF_SECTION(DebugStrOffsets, ".debug_str_offsets", "debug-str-offsets") -HANDLE_DWARF_SECTION(DebugStrDwo, ".debug_str.dwo", "debug-str-dwo") -HANDLE_DWARF_SECTION(DebugStrOffsetsDwo, ".debug_str_offsets.dwo", "debug-str-offsets-dwo") HANDLE_DWARF_SECTION(DebugCUIndex, ".debug_cu_index", "debug-cu-index") HANDLE_DWARF_SECTION(DebugTUIndex, ".debug_tu_index", "debug-tu-index") // Vendor extensions. diff --git a/include/llvm/DebugInfo/DIContext.h b/include/llvm/DebugInfo/DIContext.h index 2d62d8c4cb8..7a016cec0c2 100644 --- a/include/llvm/DebugInfo/DIContext.h +++ b/include/llvm/DebugInfo/DIContext.h @@ -122,14 +122,14 @@ enum DIDumpTypeCounter { DIDT_ID_UUID, DIDT_ID_Count }; -static_assert(DIDT_ID_Count <= 64, "section types overflow storage"); +static_assert(DIDT_ID_Count <= 32, "section types overflow storage"); /// Selects which debug sections get dumped. -enum DIDumpType : uint64_t { +enum DIDumpType : unsigned { DIDT_Null, - DIDT_All = ~0ULL, + DIDT_All = ~0U, #define HANDLE_DWARF_SECTION(ENUM_NAME, ELF_NAME, CMDLINE_NAME) \ - DIDT_##ENUM_NAME = 1 << (DIDT_ID_##ENUM_NAME - 1), + DIDT_##ENUM_NAME = 1U << (DIDT_ID_##ENUM_NAME - 1), #include "llvm/BinaryFormat/Dwarf.def" #undef HANDLE_DWARF_SECTION DIDT_UUID = 1 << (DIDT_ID_UUID - 1), @@ -138,7 +138,7 @@ enum DIDumpType : uint64_t { /// Container for dump options that control which debug information will be /// dumped. struct DIDumpOptions { - uint64_t DumpType = DIDT_All; + unsigned DumpType = DIDT_All; bool DumpEH = false; bool SummarizeTypes = false; bool Verbose = false; @@ -158,7 +158,7 @@ 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, unsigned DumpType = DIDT_All, DIDumpOptions DumpOpts = {}) { // No verifier? Just say things went well. return true; diff --git a/include/llvm/DebugInfo/DWARF/DWARFContext.h b/include/llvm/DebugInfo/DWARF/DWARFContext.h index bda804f69d9..a89d883ee0b 100644 --- a/include/llvm/DebugInfo/DWARF/DWARFContext.h +++ b/include/llvm/DebugInfo/DWARF/DWARFContext.h @@ -123,7 +123,7 @@ public: void dump(raw_ostream &OS, DIDumpOptions DumpOpts) override; - bool verify(raw_ostream &OS, uint64_t DumpType = DIDT_All, + bool verify(raw_ostream &OS, unsigned DumpType = DIDT_All, DIDumpOptions DumpOpts = {}) override; using cu_iterator_range = DWARFUnitSection::iterator_range; diff --git a/include/llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h b/include/llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h index 65571598d74..963f285c109 100644 --- a/include/llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h +++ b/include/llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h @@ -67,6 +67,7 @@ public: void dump(raw_ostream &OS) const; void extract(DataExtractor Data); + bool empty() const { return begin() == end(); } DWARFAbbreviationDeclarationSetMap::const_iterator begin() const { return AbbrDeclSets.begin(); diff --git a/include/llvm/DebugInfo/DWARF/DWARFDebugFrame.h b/include/llvm/DebugInfo/DWARF/DWARFDebugFrame.h index e0a779bb818..f61b4e41229 100644 --- a/include/llvm/DebugInfo/DWARF/DWARFDebugFrame.h +++ b/include/llvm/DebugInfo/DWARF/DWARFDebugFrame.h @@ -36,6 +36,9 @@ public: /// data is assumed to be pointing to the beginning of the section. void parse(DataExtractor Data); + /// Return whether the section has any entries. + bool empty() const { return Entries.empty(); } + private: std::vector> Entries; }; diff --git a/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h b/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h index a26a310c24b..892627bd527 100644 --- a/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h +++ b/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h @@ -63,7 +63,7 @@ public: /// Parse the debug_loc section accessible via the 'data' parameter using the /// address size also given in 'data' to interpret the address ranges. void parse(const DWARFDataExtractor &data); - + Optional parseOneLocationList(DWARFDataExtractor Data, uint32_t *Offset); }; diff --git a/include/llvm/DebugInfo/DWARF/DWARFDebugMacro.h b/include/llvm/DebugInfo/DWARF/DWARFDebugMacro.h index 135c50761e3..bfe2fc3ac02 100644 --- a/include/llvm/DebugInfo/DWARF/DWARFDebugMacro.h +++ b/include/llvm/DebugInfo/DWARF/DWARFDebugMacro.h @@ -53,6 +53,9 @@ public: /// Parse the debug_macinfo section accessible via the 'data' parameter. void parse(DataExtractor data); + + /// Return whether the section has any entries. + bool empty() const { return Macros.empty(); } }; } // end namespace llvm diff --git a/include/llvm/DebugInfo/DWARF/DWARFUnitIndex.h b/include/llvm/DebugInfo/DWARF/DWARFUnitIndex.h index 8a5e9af84fa..49ed4bb222f 100644 --- a/include/llvm/DebugInfo/DWARF/DWARFUnitIndex.h +++ b/include/llvm/DebugInfo/DWARF/DWARFUnitIndex.h @@ -87,6 +87,7 @@ public: bool parse(DataExtractor IndexData); void dump(raw_ostream &OS) const; + const Entry *getFromOffset(uint32_t Offset) const; const Entry *getFromHash(uint64_t Offset) const; diff --git a/lib/DebugInfo/DWARF/DWARFContext.cpp b/lib/DebugInfo/DWARF/DWARFContext.cpp index 02c91d2464c..6dac25996d2 100644 --- a/lib/DebugInfo/DWARF/DWARFContext.cpp +++ b/lib/DebugInfo/DWARF/DWARFContext.cpp @@ -41,6 +41,7 @@ #include "llvm/Support/Error.h" #include "llvm/Support/Format.h" #include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/Path.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Support/raw_ostream.h" #include @@ -224,6 +225,10 @@ void DWARFContext::dump(raw_ostream &OS, DIDumpOptions DumpOpts) { uint64_t DumpType = DumpOpts.DumpType; bool DumpEH = DumpOpts.DumpEH; + StringRef Extension = sys::path::extension(DObj->getFileName()); + bool IsDWO = (Extension == ".dwo") || (Extension == ".dwp"); + + // Print UUID header. const auto *ObjFile = DObj->getFile(); if (!(DumpType & DIDT_UUID) || DumpType == DIDT_All) outs() << ObjFile->getFileName() << ":\tfile format " @@ -231,72 +236,82 @@ void DWARFContext::dump(raw_ostream &OS, DIDumpOptions DumpOpts) { if (DumpType & DIDT_UUID) dumpUUID(OS, *ObjFile); - if (DumpType & DIDT_DebugAbbrev) { - OS << ".debug_abbrev contents:\n"; + // Print a header for each explicitly-requested section. + // Otherwise just print one for non-empty sections. + bool Explicit = DumpType != DIDT_All && !IsDWO; + auto shouldDump = [&](unsigned DIDT_Section, StringRef Section) { + return (DumpType & DIDT_Section) && (Explicit || !Section.empty()); + }; + // Only print empty .dwo section headers when dumping a .dwo file. + bool ExplicitDWO = Explicit && IsDWO; + auto shouldDumpDWO = [&](unsigned DIDT_Section, StringRef Section) { + return (DumpType & DIDT_Section) && (ExplicitDWO || !Section.empty()); + }; + + // Dump individual sections. + if (shouldDump(DIDT_DebugAbbrev, DObj->getAbbrevSection())) { + OS << "\n.debug_abbrev contents:\n"; getDebugAbbrev()->dump(OS); } + if (shouldDumpDWO(DIDT_DebugAbbrev, DObj->getAbbrevDWOSection())) { + OS << "\n.debug_abbrev.dwo contents:\n"; + getDebugAbbrevDWO()->dump(OS); + } - if (DumpType & DIDT_DebugAbbrevDwo) - if (const DWARFDebugAbbrev *D = getDebugAbbrevDWO()) { - OS << "\n.debug_abbrev.dwo contents:\n"; - D->dump(OS); - } - - if (DumpType & DIDT_DebugInfo) { + if (shouldDump(DIDT_DebugInfo, DObj->getInfoSection().Data)) { OS << "\n.debug_info contents:\n"; for (const auto &CU : compile_units()) CU->dump(OS, DumpOpts); } - - if ((DumpType & DIDT_DebugInfoDwo) && - getNumDWOCompileUnits()) { + if (shouldDumpDWO(DIDT_DebugInfo, DObj->getInfoDWOSection().Data)) { OS << "\n.debug_info.dwo contents:\n"; for (const auto &DWOCU : dwo_compile_units()) DWOCU->dump(OS, DumpOpts); } - if ((DumpType & DIDT_DebugTypes) && getNumTypeUnits()) { - OS << "\n.debug_types contents:\n"; - for (const auto &TUS : type_unit_sections()) - for (const auto &TU : TUS) - TU->dump(OS, DumpOpts); + if ((DumpType & DIDT_DebugTypes)) { + if (Explicit || getNumTypeUnits()) { + OS << "\n.debug_types contents:\n"; + for (const auto &TUS : type_unit_sections()) + for (const auto &TU : TUS) + TU->dump(OS, DumpOpts); + } + if (ExplicitDWO || getNumDWOTypeUnits()) { + OS << "\n.debug_types.dwo contents:\n"; + for (const auto &DWOTUS : dwo_type_unit_sections()) + for (const auto &DWOTU : DWOTUS) + DWOTU->dump(OS, DumpOpts); + } } - if ((DumpType & DIDT_DebugTypesDwo) && - getNumDWOTypeUnits()) { - OS << "\n.debug_types.dwo contents:\n"; - for (const auto &DWOTUS : dwo_type_unit_sections()) - for (const auto &DWOTU : DWOTUS) - DWOTU->dump(OS, DumpOpts); - } - - if (DumpType & DIDT_DebugLoc) { + if (shouldDump(DIDT_DebugLoc, DObj->getLocSection().Data)) { OS << "\n.debug_loc contents:\n"; getDebugLoc()->dump(OS, getRegisterInfo()); } - - if (DumpType & DIDT_DebugLocDwo) { + if (shouldDumpDWO(DIDT_DebugLoc, DObj->getLocDWOSection().Data)) { OS << "\n.debug_loc.dwo contents:\n"; getDebugLocDWO()->dump(OS, getRegisterInfo()); } - if (DumpType & DIDT_DebugFrames) { + if (shouldDump(DIDT_DebugFrames, DObj->getDebugFrameSection())) { OS << "\n.debug_frame contents:\n"; getDebugFrame()->dump(OS); - if (DumpEH) { - OS << "\n.eh_frame contents:\n"; - getEHFrame()->dump(OS); - } + } + if (DumpEH && !getEHFrame()->empty()) { + OS << "\n.eh_frame contents:\n"; + getEHFrame()->dump(OS); } if (DumpType & DIDT_DebugMacro) { - OS << "\n.debug_macinfo contents:\n"; - getDebugMacro()->dump(OS); + if (Explicit || !getDebugMacro()->empty()) { + OS << "\n.debug_macinfo contents:\n"; + getDebugMacro()->dump(OS); + } } - uint32_t offset = 0; - if (DumpType & DIDT_DebugAranges) { + if (shouldDump(DIDT_DebugAranges, DObj->getARangeSection())) { OS << "\n.debug_aranges contents:\n"; + uint32_t offset = 0; DataExtractor arangesData(DObj->getARangeSection(), isLittleEndian(), 0); DWARFDebugArangeSet set; while (set.extract(arangesData, &offset)) @@ -304,7 +319,7 @@ void DWARFContext::dump(raw_ostream &OS, DIDumpOptions DumpOpts) { } uint8_t savedAddressByteSize = 0; - if (DumpType & DIDT_DebugLine) { + if (shouldDump(DIDT_DebugLine, DObj->getLineSection().Data)) { OS << "\n.debug_line contents:\n"; for (const auto &CU : compile_units()) { savedAddressByteSize = CU->getAddressByteSize(); @@ -322,17 +337,12 @@ void DWARFContext::dump(raw_ostream &OS, DIDumpOptions DumpOpts) { } } - if (DumpType & DIDT_DebugCUIndex) { - OS << "\n.debug_cu_index contents:\n"; - getCUIndex().dump(OS); + // FIXME: This seems sketchy. + for (const auto &CU : compile_units()) { + savedAddressByteSize = CU->getAddressByteSize(); + break; } - - if (DumpType & DIDT_DebugTUIndex) { - OS << "\n.debug_tu_index contents:\n"; - getTUIndex().dump(OS); - } - - if (DumpType & DIDT_DebugLineDwo) { + if (shouldDumpDWO(DIDT_DebugLine, DObj->getLineDWOSection().Data)) { OS << "\n.debug_line.dwo contents:\n"; unsigned stmtOffset = 0; DWARFDataExtractor lineData(*DObj, DObj->getLineDWOSection(), @@ -344,22 +354,30 @@ void DWARFContext::dump(raw_ostream &OS, DIDumpOptions DumpOpts) { } } - if (DumpType & DIDT_DebugStr) { + if (shouldDump(DIDT_DebugCUIndex, DObj->getCUIndexSection())) { + OS << "\n.debug_cu_index contents:\n"; + getCUIndex().dump(OS); + } + + if (shouldDump(DIDT_DebugTUIndex, DObj->getTUIndexSection())) { + OS << "\n.debug_tu_index contents:\n"; + getTUIndex().dump(OS); + } + + if (shouldDump(DIDT_DebugStr, DObj->getStringSection())) { OS << "\n.debug_str contents:\n"; DataExtractor strData(DObj->getStringSection(), isLittleEndian(), 0); - offset = 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 ((DumpType & DIDT_DebugStrDwo) && - !DObj->getStringDWOSection().empty()) { + if (shouldDumpDWO(DIDT_DebugStr, DObj->getStringDWOSection())) { OS << "\n.debug_str.dwo contents:\n"; DataExtractor strDWOData(DObj->getStringDWOSection(), isLittleEndian(), 0); - offset = 0; + uint32_t offset = 0; uint32_t strDWOOffset = 0; while (const char *s = strDWOData.getCStr(&offset)) { OS << format("0x%8.8x: \"%s\"\n", strDWOOffset, s); @@ -367,69 +385,68 @@ void DWARFContext::dump(raw_ostream &OS, DIDumpOptions DumpOpts) { } } - if (DumpType & DIDT_DebugRanges) { + if (shouldDump(DIDT_DebugRanges, DObj->getRangeSection().Data)) { OS << "\n.debug_ranges contents:\n"; // In fact, different compile units may have different address byte - // sizes, but for simplicity we just use the address byte size of the last - // compile unit (there is no easy and fast way to associate address range - // list and the compile unit it describes). + // sizes, but for simplicity we just use the address byte size of the + // last compile unit (there is no easy and fast way to associate address + // range list and the compile unit it describes). + // FIXME: savedAddressByteSize seems sketchy. DWARFDataExtractor rangesData(*DObj, DObj->getRangeSection(), isLittleEndian(), savedAddressByteSize); - offset = 0; + uint32_t offset = 0; DWARFDebugRangeList rangeList; while (rangeList.extract(rangesData, &offset)) rangeList.dump(OS); } - if (DumpType & DIDT_DebugPubnames) + if (shouldDump(DIDT_DebugPubnames, DObj->getPubNamesSection())) DWARFDebugPubTable(DObj->getPubNamesSection(), isLittleEndian(), false) .dump("debug_pubnames", OS); - if (DumpType & DIDT_DebugPubtypes) + if (shouldDump(DIDT_DebugPubtypes, DObj->getPubTypesSection())) DWARFDebugPubTable(DObj->getPubTypesSection(), isLittleEndian(), false) .dump("debug_pubtypes", OS); - if (DumpType & DIDT_DebugGnuPubnames) + if (shouldDump(DIDT_DebugGnuPubnames, DObj->getGnuPubNamesSection())) DWARFDebugPubTable(DObj->getGnuPubNamesSection(), isLittleEndian(), true /* GnuStyle */) .dump("debug_gnu_pubnames", OS); - if (DumpType & DIDT_DebugGnuPubtypes) + if (shouldDump(DIDT_DebugGnuPubtypes, DObj->getGnuPubTypesSection())) DWARFDebugPubTable(DObj->getGnuPubTypesSection(), isLittleEndian(), true /* GnuStyle */) .dump("debug_gnu_pubtypes", OS); - if (DumpType & DIDT_DebugStrOffsets) + if (shouldDump(DIDT_DebugStrOffsets, DObj->getStringOffsetSection().Data)) dumpStringOffsetsSection( OS, "debug_str_offsets", *DObj, DObj->getStringOffsetSection(), DObj->getStringSection(), isLittleEndian(), getMaxVersion()); - - if (DumpType & DIDT_DebugStrOffsetsDwo) { + if (shouldDumpDWO(DIDT_DebugStrOffsets, + DObj->getStringOffsetDWOSection().Data)) dumpStringOffsetsSection( OS, "debug_str_offsets.dwo", *DObj, DObj->getStringOffsetDWOSection(), DObj->getStringDWOSection(), isLittleEndian(), getMaxVersion()); - } - if ((DumpType & DIDT_GdbIndex) && - !DObj->getGdbIndexSection().empty()) { + if (shouldDump(DIDT_GdbIndex, DObj->getGdbIndexSection())) { OS << "\n.gnu_index contents:\n"; getGdbIndex().dump(OS); } - if (DumpType & DIDT_AppleNames) + if (shouldDump(DIDT_AppleNames, DObj->getAppleNamesSection().Data)) dumpAccelSection(OS, "apple_names", *DObj, DObj->getAppleNamesSection(), DObj->getStringSection(), isLittleEndian()); - if (DumpType & DIDT_AppleTypes) + if (shouldDump(DIDT_AppleTypes, DObj->getAppleTypesSection().Data)) dumpAccelSection(OS, "apple_types", *DObj, DObj->getAppleTypesSection(), DObj->getStringSection(), isLittleEndian()); - if (DumpType & DIDT_AppleNamespaces) + if (shouldDump(DIDT_AppleNamespaces, DObj->getAppleNamespacesSection().Data)) dumpAccelSection(OS, "apple_namespaces", *DObj, DObj->getAppleNamespacesSection(), DObj->getStringSection(), isLittleEndian()); - if (DumpType & DIDT_AppleObjC) + if (shouldDump(DIDT_AppleObjC, DObj->getAppleObjCSection().Data)) dumpAccelSection(OS, "apple_objc", *DObj, DObj->getAppleObjCSection(), DObj->getStringSection(), isLittleEndian()); } @@ -461,7 +478,7 @@ DWARFDie DWARFContext::getDIEForOffset(uint32_t Offset) { return DWARFDie(); } -bool DWARFContext::verify(raw_ostream &OS, uint64_t DumpType, +bool DWARFContext::verify(raw_ostream &OS, unsigned DumpType, DIDumpOptions DumpOpts) { bool Success = true; DWARFVerifier verifier(OS, *this, DumpOpts); diff --git a/test/DebugInfo/Inputs/gmlt.ll b/test/DebugInfo/Inputs/gmlt.ll index 116cd75b811..da2a8b80321 100644 --- a/test/DebugInfo/Inputs/gmlt.ll +++ b/test/DebugInfo/Inputs/gmlt.ll @@ -87,12 +87,8 @@ ; Check that we don't emit any pubnames or pubtypes under -gmlt -; CHECK: .debug_pubnames contents: -; CHECK-NOT: Offset - -; CHECK: .debug_pubtypes contents: -; CHECK-NOT: Offset - +; CHECK-NOT: .debug_pubnames contents: +; CHECK-NOT: .debug_pubtypes contents: ; CHECK: .apple{{.*}} contents: ; Function Attrs: nounwind uwtable diff --git a/test/DebugInfo/X86/fission-inline.ll b/test/DebugInfo/X86/fission-inline.ll index 8bded7b53ce..614363a6517 100644 --- a/test/DebugInfo/X86/fission-inline.ll +++ b/test/DebugInfo/X86/fission-inline.ll @@ -71,6 +71,7 @@ ; CHECK: DW_AT_call_file ; CHECK-NEXT: DW_AT_call_line {{.*}} (18) ; CHECK-NOT: DW_ +; CHECK: .debug_info.dwo contents: ; RELOCS-NOT: RELOCATION RECORDS FOR [.rela.debug_ranges] diff --git a/test/DebugInfo/X86/fission-no-inlining.ll b/test/DebugInfo/X86/fission-no-inlining.ll index a9ed56ac0f1..2faf94539e9 100644 --- a/test/DebugInfo/X86/fission-no-inlining.ll +++ b/test/DebugInfo/X86/fission-no-inlining.ll @@ -1,6 +1,8 @@ ; RUN: llc -split-dwarf-file=foo.dwo -O0 < %s -mtriple=x86_64-unknown-linux-gnu -filetype=obj | llvm-dwarfdump -debug-info - | FileCheck %s +; CHECK: .debug_info contents: ; CHECK-NOT: DW_TAG_subprogram +; CHECK: contents: ; IR generated from the following source: ; void f1(); diff --git a/test/DebugInfo/X86/fission-ranges.ll b/test/DebugInfo/X86/fission-ranges.ll index 9bd834377b6..4bfe0ddffbf 100644 --- a/test/DebugInfo/X86/fission-ranges.ll +++ b/test/DebugInfo/X86/fission-ranges.ll @@ -17,7 +17,7 @@ ; CHECK: DW_AT_location [DW_FORM_sec_offset] ([[B:0x[0-9a-z]*]] ; CHECK: DW_AT_location [DW_FORM_sec_offset] ([[D:0x[0-9a-z]*]] ; CHECK: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000 -; CHECK: .debug_loc contents: +; CHECK-NOT: .debug_loc contents: ; CHECK-NOT: Beginning address offset ; CHECK: .debug_loc.dwo contents: diff --git a/test/DebugInfo/X86/generate-odr-hash.ll b/test/DebugInfo/X86/generate-odr-hash.ll index 144b5f65eea..c687c9e5afa 100644 --- a/test/DebugInfo/X86/generate-odr-hash.ll +++ b/test/DebugInfo/X86/generate-odr-hash.ll @@ -74,8 +74,7 @@ ; CHECK-NEXT: DW_AT_signature {{.*}} (0xfd756cee88f8a118) ; SINGLE-LABEL: .debug_types contents: -; FISSION-NOT: .debug_types contents: -; FISSION-LABEL: .debug_types.dwo contents: +; FISSION: .debug_types.dwo contents: ; Check that we generate a hash for bar and the value. ; CHECK-NOT: type_signature @@ -127,7 +126,8 @@ ; CHECK: file_names{{.*}} bar.cpp ; CHECK-NOT: file_names[ -; CHECK-LABEL: .debug_line.dwo contents: +; FISSION: .debug_line.dwo contents: +; CHECK-NOT: .debug_line.dwo contents: ; FISSION: Line table prologue ; FISSION: opcode_base: 1 ; FISSION-NOT: standard_opcode_lengths diff --git a/test/DebugInfo/X86/gnu-public-names-gmlt.ll b/test/DebugInfo/X86/gnu-public-names-gmlt.ll index c4207afec81..a928a183984 100644 --- a/test/DebugInfo/X86/gnu-public-names-gmlt.ll +++ b/test/DebugInfo/X86/gnu-public-names-gmlt.ll @@ -24,14 +24,10 @@ ; GPUB-NEXT: length = 0x0000000e version = 0x0002 unit_offset = 0x00000000 ; GPUB-NEXT: Name -; NONE: .debug_pubnames contents: -; NONE: {{^$}} -; NONE: .debug_pubtypes contents: -; NONE: {{^$}} -; NONE: .debug_gnu_pubnames contents: -; NONE: {{^$}} -; NONE: .debug_gnu_pubtypes contents: -; NONE: {{^$}} +; NONE-NOT: .debug_pubnames contents: +; NONE-NOT: .debug_pubtypes contents: +; NONE-NOT: .debug_gnu_pubnames contents: +; NONE-NOT: .debug_gnu_pubtypes contents: ; Function Attrs: noinline uwtable diff --git a/test/DebugInfo/X86/split-dwarf-cross-unit-reference.ll b/test/DebugInfo/X86/split-dwarf-cross-unit-reference.ll index 3bfbfc907ce..da7e08c4270 100644 --- a/test/DebugInfo/X86/split-dwarf-cross-unit-reference.ll +++ b/test/DebugInfo/X86/split-dwarf-cross-unit-reference.ll @@ -1,11 +1,11 @@ ; RUN: llc -mtriple=x86_64-linux -split-dwarf-cross-cu-references -split-dwarf-file=foo.dwo -filetype=obj -o %t < %s ; RUN: llvm-objdump -r %t | FileCheck %s -; RUN: llvm-dwarfdump -v -debug-info-dwo %t | FileCheck --check-prefix=ALL --check-prefix=INFO --check-prefix=DWO --check-prefix=CROSS %s +; RUN: llvm-dwarfdump -v -debug-info %t | FileCheck --check-prefix=ALL --check-prefix=INFO --check-prefix=DWO --check-prefix=CROSS %s ; RUN: llvm-dwarfdump -v -debug-info %t | FileCheck --check-prefix=ALL --check-prefix=INFO %s ; RUN: llc -mtriple=x86_64-linux -split-dwarf-file=foo.dwo -filetype=obj -o %t < %s ; RUN: llvm-objdump -r %t | FileCheck %s -; RUN: llvm-dwarfdump -v -debug-info-dwo %t | FileCheck --check-prefix=ALL --check-prefix=DWO --check-prefix=NOCROSS %s +; RUN: llvm-dwarfdump -v -debug-info %t | FileCheck --check-prefix=ALL --check-prefix=DWO --check-prefix=NOCROSS %s ; RUN: llvm-dwarfdump -v -debug-info %t | FileCheck --check-prefix=ALL --check-prefix=INFO %s ; Testing cross-CU references for types, subprograms, and variables @@ -42,6 +42,7 @@ ; * debug_info.dwo contains duplicate types, abstract subprograms and abstract ; variables otherwise to avoid the need for cross-cu references +; DWO: .debug_info.dwo contents: ; CHECK-NOT: .rel{{a?}}.debug_info.dwo ; CHECK: RELOCATION RECORDS FOR [.rel{{a?}}.debug_info]: ; CHECK-NOT: RELOCATION RECORDS diff --git a/test/DebugInfo/X86/split-dwarf-multiple-cu-hash.ll b/test/DebugInfo/X86/split-dwarf-multiple-cu-hash.ll index 688ef8376c8..e4d8a296315 100644 --- a/test/DebugInfo/X86/split-dwarf-multiple-cu-hash.ll +++ b/test/DebugInfo/X86/split-dwarf-multiple-cu-hash.ll @@ -3,8 +3,10 @@ ; RUN: %llc_dwarf -split-dwarf-file=bar.dwo %s -filetype=obj -o %t/b.o ; RUN: llvm-dwarfdump -debug-info %t/a.o %t/b.o | FileCheck %s +; CHECK: .debug_info contents: ; CHECK: dwo_id {{.*}}([[HASH:.*]]) ; CHECK-NOT: dwo_id {{.*}}([[HASH]]) +; CHECK: .debug_info.dwo contents: target triple = "x86_64-pc-linux" diff --git a/test/DebugInfo/X86/split-dwarf-omit-empty.ll b/test/DebugInfo/X86/split-dwarf-omit-empty.ll index 4e8debb20a8..1ce6d1c6ba3 100644 --- a/test/DebugInfo/X86/split-dwarf-omit-empty.ll +++ b/test/DebugInfo/X86/split-dwarf-omit-empty.ll @@ -15,8 +15,10 @@ ; will be emitted. This emulates something more like the available_externally ; import performed by ThinLTO. +; CHECK: .debug_info contents: ; CHECK: Compile Unit ; CHECK-NOT: Compile Unit +; CHECK: .debug_info.dwo contents: target triple = "x86_64-pc-linux" diff --git a/test/DebugInfo/dwarfdump-dump-flags.test b/test/DebugInfo/dwarfdump-dump-flags.test index 513650abe3b..f83ebd00bd3 100644 --- a/test/DebugInfo/dwarfdump-dump-flags.test +++ b/test/DebugInfo/dwarfdump-dump-flags.test @@ -6,10 +6,11 @@ ; RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test.macho-i386.o --debug-ranges | FileCheck %s -check-prefix DUMP_RANGES ; DUMP_ALL: .debug_info -; DUMP_ALL: .debug_ranges +; DUMP_ALL: .debug_str ; DUMP_INFO: .debug_info ; DUMP_INFO-NOT: .debug_ranges +; DUMP_INFO-NOT: .debug_str ; DUMP_RANGES-NOT: .debug_info ; DUMP_RANGES: .debug_ranges diff --git a/test/DebugInfo/dwarfdump-dwp.test b/test/DebugInfo/dwarfdump-dwp.test index 2bdcdb9ea62..7d945eccf64 100644 --- a/test/DebugInfo/dwarfdump-dwp.test +++ b/test/DebugInfo/dwarfdump-dwp.test @@ -9,6 +9,7 @@ RUN: llvm-dwarfdump -v %p/Inputs/dwarfdump-dwp.x86_64.o | FileCheck %s ; bar b() { ; } +; CHECK-NOT: .debug_info contents: ; CHECK-LABEL: .debug_info.dwo contents: ; CHECK: Compile Unit diff --git a/test/MC/ARM/dwarf-asm-multiple-sections-dwarf-2.s b/test/MC/ARM/dwarf-asm-multiple-sections-dwarf-2.s index 2519ca11b14..e6a36fc8e85 100644 --- a/test/MC/ARM/dwarf-asm-multiple-sections-dwarf-2.s +++ b/test/MC/ARM/dwarf-asm-multiple-sections-dwarf-2.s @@ -45,9 +45,8 @@ b: // DWARF-NEXT: 0x0000000000000004 11 0 1 0 0 is_stmt end_sequence -// DWARF: .debug_ranges contents: -// DWARF-NOT: {{0-9a-f}} -// DWARF: .debug_pubnames contents: +// DWARF-NOT: .debug_ranges contents: +// DWARF-NOT: .debug_pubnames contents: // RELOC: RELOCATION RECORDS FOR [.rel.debug_info]: diff --git a/test/MC/ARM/dwarf-asm-no-code.s b/test/MC/ARM/dwarf-asm-no-code.s index 1451e03bd62..dc1eb95e745 100644 --- a/test/MC/ARM/dwarf-asm-no-code.s +++ b/test/MC/ARM/dwarf-asm-no-code.s @@ -8,18 +8,10 @@ a: .long 42 -// DWARF: .debug_abbrev contents: -// DWARF-NEXT: < EMPTY > - -// DWARF: .debug_info contents: - -// DWARF: .debug_aranges contents: - +// DWARF: ELF32-arm-little +// DWARF-NOT: contents: // DWARF: .debug_line contents: -// DWARF: .debug_ranges contents: - - // RELOC-NOT: RELOCATION RECORDS FOR [.rel.debug_info]: // RELOC-NOT: RELOCATION RECORDS FOR [.rel.debug_ranges]: diff --git a/test/MC/ARM/dwarf-asm-nonstandard-section.s b/test/MC/ARM/dwarf-asm-nonstandard-section.s index 4209d09deeb..22a242e9103 100644 --- a/test/MC/ARM/dwarf-asm-nonstandard-section.s +++ b/test/MC/ARM/dwarf-asm-nonstandard-section.s @@ -37,9 +37,8 @@ b: // DWARF-NEXT: 0x0000000000000004 7 0 1 0 0 is_stmt end_sequence -// DWARF: .debug_ranges contents: -// DWARF-NOT: {{0-9a-f}} -// DWARF: .debug_pubnames contents: +// DWARF-NOT: .debug_ranges contents: +// DWARF-NOT: .debug_pubnames contents: diff --git a/test/MC/ARM/dwarf-asm-single-section.s b/test/MC/ARM/dwarf-asm-single-section.s index c09fe02ba70..d1211a6e48c 100644 --- a/test/MC/ARM/dwarf-asm-single-section.s +++ b/test/MC/ARM/dwarf-asm-single-section.s @@ -37,9 +37,8 @@ a: // DWARF-NEXT: 0x0000000000000004 7 0 1 0 0 is_stmt end_sequence -// DWARF: .debug_ranges contents: -// DWARF-NOT: {{0-9a-f}} -// DWARF: .debug_pubnames contents: +// DWARF-NOT: .debug_ranges contents: +// DWARF-NOT: .debug_pubnames contents: // RELOC: RELOCATION RECORDS FOR [.rel.debug_info]: diff --git a/test/tools/dsymutil/X86/basic-linking-x86.test b/test/tools/dsymutil/X86/basic-linking-x86.test index 828355298b5..60cde82bfad 100644 --- a/test/tools/dsymutil/X86/basic-linking-x86.test +++ b/test/tools/dsymutil/X86/basic-linking-x86.test @@ -140,8 +140,7 @@ CHECK: DW_AT_frame_base [DW_FORM_block1] (DW_OP_reg6 RBP) CHECK: NULL -CHECK: .debug_loc contents -CHECK-NOT: Location +CHECK-NOT: .debug_loc contents CHECK:.debug_aranges contents: CHECK-NEXT:Address Range Header: length = 0x0000002c, version = 0x0002, cu_offset = 0x00000000, addr_size = 0x08, seg_size = 0x00 diff --git a/test/tools/llvm-dwp/X86/empty.test b/test/tools/llvm-dwp/X86/empty.test index 7a9dd4258ff..8e465d00c80 100644 --- a/test/tools/llvm-dwp/X86/empty.test +++ b/test/tools/llvm-dwp/X86/empty.test @@ -1,8 +1,8 @@ RUN: llvm-dwp %p/../Inputs/empty.dwo -o %t RUN: llvm-dwarfdump -v %t | FileCheck %s -CHECK-LABEL: .debug_cu_index +CHECK: file format +CHECK-NOT: .debug_cu_index CHECK-NOT: version -CHECK-LABEL: .debug_tu_index +CHECK-NOT: .debug_tu_index CHECK-NOT: version -CHECK: .debug_ diff --git a/test/tools/llvm-dwp/X86/simple.test b/test/tools/llvm-dwp/X86/simple.test index c3035dceccf..2c42ac61937 100644 --- a/test/tools/llvm-dwp/X86/simple.test +++ b/test/tools/llvm-dwp/X86/simple.test @@ -76,8 +76,7 @@ TYPES: 3 [[DWOB]] {{\[}}[[BOFF]], [[XOFF]]) [0x0000[[BAOFF]], 0x00000099) NOTYP: 3 [[DWOA]] {{\[}}[[AOFF]], [[BOFF]]) [0x0000[[AAOFF]], 0x0000[[BAOFF]]) [0x00000000, 0x00000011) [0x00000000, 0x00000010) NOTYP: 4 [[DWOB]] {{\[}}[[BOFF]], [[XOFF]]) [0x0000[[BAOFF]], 0x00000075) [0x00000011, 0x00000022) [0x00000010, 0x00000024) -CHECK-LABEL: .debug_tu_index contents: -NOTYP-NOT: Index +CHECK-NOT: .debug_tu_index contents: TYPES: Index Signature TYPES ABBREV LINE STR_OFFSETS TYPES: 1 [[FOOSIG]] {{\[}}[[FOOUOFF]], [[BARUOFF]]) [0x0000[[AAOFF]], 0x0000[[BAOFF]]) [0x00000000, 0x0000001a) [0x00000000, 0x00000010) TYPES: 4 [[BARSIG]] {{\[}}[[BARUOFF]], [[XUOFF]]) [0x0000[[BAOFF]], 0x00000099) [0x0000001a, 0x00000034) [0x00000010, 0x00000024) diff --git a/tools/llvm-dwarfdump/llvm-dwarfdump.cpp b/tools/llvm-dwarfdump/llvm-dwarfdump.cpp index 8508982ab39..7e413866dc6 100644 --- a/tools/llvm-dwarfdump/llvm-dwarfdump.cpp +++ b/tools/llvm-dwarfdump/llvm-dwarfdump.cpp @@ -53,7 +53,7 @@ static opt DumpAll("all", desc("Dump all debug info sections"), cat(SectionCategory)); static alias DumpAllAlias("a", desc("Alias for -all"), aliasopt(DumpAll)); -static uint64_t DumpType = DIDT_Null; +static unsigned DumpType = DIDT_Null; #define HANDLE_DWARF_SECTION(ENUM_NAME, ELF_NAME, CMDLINE_NAME) \ static opt Dump##ENUM_NAME(CMDLINE_NAME, \ desc("Dump the " ELF_NAME " section"), \ @@ -99,8 +99,7 @@ static void DumpObjectFile(ObjectFile &Obj, Twine Filename) { Filename.str() + ": "); // The UUID dump already contains all the same information. if (!(DumpType & DIDT_UUID) || DumpType == DIDT_All) - outs() << Filename << ":\tfile format " << Obj.getFileFormatName() - << "\n\n"; + outs() << Filename << ":\tfile format " << Obj.getFileFormatName() << '\n'; // Dump the complete DWARF structure. DICtx->dump(outs(), GetDumpOpts());