diff options
Diffstat (limited to 'llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp')
-rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp | 70 |
1 files changed, 33 insertions, 37 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp b/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp index e97ae81345b80..a7da5acc380b5 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp @@ -241,11 +241,13 @@ bool DWARFFormValue::extractValue(const DWARFDataExtractor &Data, Ctx = &CU->getContext(); C = Ctx; U = CU; + Format = FP.Format; bool Indirect = false; bool IsBlock = false; Value.data = nullptr; // Read the value for the form into value and follow and DW_FORM_indirect // instances we run into + Error Err = Error::success(); do { Indirect = false; switch (Form) { @@ -253,24 +255,25 @@ bool DWARFFormValue::extractValue(const DWARFDataExtractor &Data, case DW_FORM_ref_addr: { uint16_t Size = (Form == DW_FORM_addr) ? FP.AddrSize : FP.getRefAddrByteSize(); - Value.uval = Data.getRelocatedValue(Size, OffsetPtr, &Value.SectionIndex); + Value.uval = + Data.getRelocatedValue(Size, OffsetPtr, &Value.SectionIndex, &Err); break; } case DW_FORM_exprloc: case DW_FORM_block: - Value.uval = Data.getULEB128(OffsetPtr); + Value.uval = Data.getULEB128(OffsetPtr, &Err); IsBlock = true; break; case DW_FORM_block1: - Value.uval = Data.getU8(OffsetPtr); + Value.uval = Data.getU8(OffsetPtr, &Err); IsBlock = true; break; case DW_FORM_block2: - Value.uval = Data.getU16(OffsetPtr); + Value.uval = Data.getU16(OffsetPtr, &Err); IsBlock = true; break; case DW_FORM_block4: - Value.uval = Data.getU32(OffsetPtr); + Value.uval = Data.getU32(OffsetPtr, &Err); IsBlock = true; break; case DW_FORM_data1: @@ -278,28 +281,28 @@ bool DWARFFormValue::extractValue(const DWARFDataExtractor &Data, case DW_FORM_flag: case DW_FORM_strx1: case DW_FORM_addrx1: - Value.uval = Data.getU8(OffsetPtr); + Value.uval = Data.getU8(OffsetPtr, &Err); break; case DW_FORM_data2: case DW_FORM_ref2: case DW_FORM_strx2: case DW_FORM_addrx2: - Value.uval = Data.getU16(OffsetPtr); + Value.uval = Data.getU16(OffsetPtr, &Err); break; case DW_FORM_strx3: - Value.uval = Data.getU24(OffsetPtr); + Value.uval = Data.getU24(OffsetPtr, &Err); break; case DW_FORM_data4: case DW_FORM_ref4: case DW_FORM_ref_sup4: case DW_FORM_strx4: case DW_FORM_addrx4: - Value.uval = Data.getRelocatedValue(4, OffsetPtr); + Value.uval = Data.getRelocatedValue(4, OffsetPtr, nullptr, &Err); break; case DW_FORM_data8: case DW_FORM_ref8: case DW_FORM_ref_sup8: - Value.uval = Data.getRelocatedValue(8, OffsetPtr); + Value.uval = Data.getRelocatedValue(8, OffsetPtr, nullptr, &Err); break; case DW_FORM_data16: // Treat this like a 16-byte block. @@ -307,19 +310,23 @@ bool DWARFFormValue::extractValue(const DWARFDataExtractor &Data, IsBlock = true; break; case DW_FORM_sdata: - Value.sval = Data.getSLEB128(OffsetPtr); + Value.sval = Data.getSLEB128(OffsetPtr, &Err); break; case DW_FORM_udata: case DW_FORM_ref_udata: case DW_FORM_rnglistx: case DW_FORM_loclistx: - Value.uval = Data.getULEB128(OffsetPtr); + case DW_FORM_GNU_addr_index: + case DW_FORM_GNU_str_index: + case DW_FORM_addrx: + case DW_FORM_strx: + Value.uval = Data.getULEB128(OffsetPtr, &Err); break; case DW_FORM_string: - Value.cstr = Data.getCStr(OffsetPtr); + Value.cstr = Data.getCStr(OffsetPtr, &Err); break; case DW_FORM_indirect: - Form = static_cast<dwarf::Form>(Data.getULEB128(OffsetPtr)); + Form = static_cast<dwarf::Form>(Data.getULEB128(OffsetPtr, &Err)); Indirect = true; break; case DW_FORM_strp: @@ -328,39 +335,27 @@ bool DWARFFormValue::extractValue(const DWARFDataExtractor &Data, case DW_FORM_GNU_strp_alt: case DW_FORM_line_strp: case DW_FORM_strp_sup: { - Value.uval = - Data.getRelocatedValue(FP.getDwarfOffsetByteSize(), OffsetPtr); + Value.uval = Data.getRelocatedValue(FP.getDwarfOffsetByteSize(), + OffsetPtr, nullptr, &Err); break; } case DW_FORM_flag_present: Value.uval = 1; break; case DW_FORM_ref_sig8: - Value.uval = Data.getU64(OffsetPtr); - break; - case DW_FORM_GNU_addr_index: - case DW_FORM_GNU_str_index: - case DW_FORM_addrx: - case DW_FORM_strx: - Value.uval = Data.getULEB128(OffsetPtr); + Value.uval = Data.getU64(OffsetPtr, &Err); break; default: // DWARFFormValue::skipValue() will have caught this and caused all // DWARF DIEs to fail to be parsed, so this code is not be reachable. llvm_unreachable("unsupported form"); } - } while (Indirect); + } while (Indirect && !Err); - if (IsBlock) { - StringRef Str = Data.getData().substr(*OffsetPtr, Value.uval); - Value.data = nullptr; - if (!Str.empty()) { - Value.data = Str.bytes_begin(); - *OffsetPtr += Value.uval; - } - } + if (IsBlock) + Value.data = Data.getBytes(OffsetPtr, Value.uval, &Err).bytes_begin(); - return true; + return !errorToBool(std::move(Err)); } void DWARFFormValue::dumpSectionedAddress(raw_ostream &OS, @@ -392,6 +387,7 @@ void DWARFFormValue::dump(raw_ostream &OS, DIDumpOptions DumpOpts) const { raw_ostream &AddrOS = DumpOpts.ShowAddresses ? WithColor(OS, HighlightColor::Address).get() : nulls(); + int OffsetDumpWidth = 2 * dwarf::getDwarfOffsetByteSize(Format); switch (Form) { case DW_FORM_addr: dumpSectionedAddress(AddrOS, DumpOpts, {Value.uval, Value.SectionIndex}); @@ -487,12 +483,13 @@ 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%0*" PRIx64 "] = ", OffsetDumpWidth, 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%0*" PRIx64 "] = ", OffsetDumpWidth, + UValue); dumpString(OS); break; case DW_FORM_strx: @@ -556,9 +553,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%0*" PRIx64, OffsetDumpWidth, UValue); break; default: |