mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-14 23:29:51 +00:00
[DebugInfo] Fix printing values of forms which depend on the DWARF format.
The values are 8 bytes long in DWARF64, so they should not be truncated to uint32_t on dumping. Differential Revision: https://reviews.llvm.org/D79093
This commit is contained in:
parent
fd1a3e0dc7
commit
1447dd8d77
@ -481,12 +481,12 @@ void DWARFFormValue::dump(raw_ostream &OS, DIDumpOptions DumpOpts) const {
|
||||
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 @@ void DWARFFormValue::dump(raw_ostream &OS, DIDumpOptions DumpOpts) const {
|
||||
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:
|
||||
|
@ -339,4 +339,60 @@ INSTANTIATE_TEST_CASE_P(
|
||||
ErrorParams{DW_FORM_strp_sup, {}},
|
||||
ErrorParams{DW_FORM_ref_sig8, {}}), );
|
||||
|
||||
using DumpValueParams =
|
||||
std::tuple<Form, ArrayRef<uint8_t>, DwarfFormat, StringRef>;
|
||||
struct DumpValueFixture : public testing::TestWithParam<DumpValueParams> {
|
||||
void SetUp() override {
|
||||
std::tie(Fm, InitialData, Format, ExpectedResult) = GetParam();
|
||||
}
|
||||
|
||||
Form Fm;
|
||||
ArrayRef<uint8_t> 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<uint8_t> DumpTestSample32 = toBytes(DumpTestSample32Val);
|
||||
const uint64_t DumpTestSample64Val = 0x11223344556677;
|
||||
ArrayRef<uint8_t> 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
|
||||
|
Loading…
Reference in New Issue
Block a user