diff --git a/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp b/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp --- a/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp @@ -481,12 +481,12 @@ break; case DW_FORM_strp: if (DumpOpts.Verbose) - OS << format(" .debug_str[0x%8.8x] = ", (uint32_t)UValue); + OS << format(" .debug_str[0x%8.8" PRIx64 "] = ", UValue); dumpString(OS); break; case DW_FORM_line_strp: if (DumpOpts.Verbose) - OS << format(" .debug_line_str[0x%8.8x] = ", (uint32_t)UValue); + OS << format(" .debug_line_str[0x%8.8" PRIx64 "] = ", UValue); dumpString(OS); break; case DW_FORM_strx: @@ -550,9 +550,8 @@ OS << format("indexed (0x%x) loclist = ", (uint32_t)UValue); break; - // Should be formatted to 64-bit for DWARF64. case DW_FORM_sec_offset: - AddrOS << format("0x%08x", (uint32_t)UValue); + AddrOS << format("0x%08" PRIx64, UValue); break; default: diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFFormValueTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFFormValueTest.cpp --- a/llvm/unittests/DebugInfo/DWARF/DWARFFormValueTest.cpp +++ b/llvm/unittests/DebugInfo/DWARF/DWARFFormValueTest.cpp @@ -339,4 +339,60 @@ ErrorParams{DW_FORM_strp_sup, {}}, ErrorParams{DW_FORM_ref_sig8, {}}), ); +using DumpValueParams = + std::tuple, DwarfFormat, StringRef>; +struct DumpValueFixture : public testing::TestWithParam { + void SetUp() override { + std::tie(Fm, InitialData, Format, ExpectedResult) = GetParam(); + } + + Form Fm; + ArrayRef InitialData; + DwarfFormat Format; + StringRef ExpectedResult; +}; + +TEST_P(DumpValueFixture, Test) { + SCOPED_TRACE(formatv("Fm = {0}, InitialData = [{1}], Format = {2}", Fm, + toHex(InitialData), + Format == DWARF64 ? "DWARF64" : "DWARF32")); + DWARFDataExtractor Data(InitialData, sys::IsLittleEndianHost, 8); + DWARFFormValue Form(Fm); + uint64_t Offset = 0; + Form.extractValue(Data, &Offset, {0, 0, Format}); + + std::string Output; + raw_string_ostream OS(Output); + + DIDumpOptions Opts; + Opts.Verbose = true; + Opts.ShowAddresses = true; + + Form.dump(OS, Opts); + OS.flush(); + + EXPECT_EQ(Output, ExpectedResult); +} + +const uint32_t DumpTestSample32Val = 0x112233; +ArrayRef DumpTestSample32 = toBytes(DumpTestSample32Val); +const uint64_t DumpTestSample64Val = 0x11223344556677; +ArrayRef DumpTestSample64 = toBytes(DumpTestSample64Val); + +INSTANTIATE_TEST_CASE_P( + DumpValueParams, DumpValueFixture, + testing::Values(DumpValueParams{DW_FORM_strp, DumpTestSample32, DWARF32, + " .debug_str[0x00112233] = "}, + DumpValueParams{DW_FORM_strp, DumpTestSample64, DWARF64, + " .debug_str[0x11223344556677] = "}, + DumpValueParams{DW_FORM_line_strp, DumpTestSample32, + DWARF32, " .debug_line_str[0x00112233] = "}, + DumpValueParams{DW_FORM_line_strp, DumpTestSample64, + DWARF64, + " .debug_line_str[0x11223344556677] = "}, + DumpValueParams{DW_FORM_sec_offset, DumpTestSample32, + DWARF32, "0x00112233"}, + DumpValueParams{DW_FORM_sec_offset, DumpTestSample64, + DWARF64, "0x11223344556677"}), ); + } // end anonymous namespace