diff options
-rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp | 14 | ||||
-rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp | 24 |
2 files changed, 31 insertions, 7 deletions
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp index 949d6d08488..7b3a6cba176 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp @@ -184,9 +184,14 @@ DWARFDebugInfoEntry::FastExtract // Compile unit address sized values case DW_FORM_addr : - case DW_FORM_ref_addr : form_size = cu->GetAddressByteSize(); break; + case DW_FORM_ref_addr : + if (cu->GetVersion() <= 2) + form_size = cu->GetAddressByteSize(); + else + form_size = 4; // 4 bytes for DWARF 32, 8 bytes for DWARF 64, but we don't support DWARF64 yet + break; // 0 sized form case DW_FORM_flag_present: @@ -343,9 +348,14 @@ DWARFDebugInfoEntry::Extract // Compile unit address sized values case DW_FORM_addr : - case DW_FORM_ref_addr : form_size = cu_addr_size; break; + case DW_FORM_ref_addr : + if (cu->GetVersion() <= 2) + form_size = cu_addr_size; + else + form_size = 4; // 4 bytes for DWARF 32, 8 bytes for DWARF 64, but we don't support DWARF64 yet + break; // 0 sized form case DW_FORM_flag_present: diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp index 48232656b61..6113a146c93 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp @@ -38,7 +38,7 @@ static uint8_t g_form_sizes_addr4[] = 0, // 0x0d DW_FORM_sdata 4, // 0x0e DW_FORM_strp 0, // 0x0f DW_FORM_udata - 4, // 0x10 DW_FORM_ref_addr + 0, // 0x10 DW_FORM_ref_addr (addr size for DWARF2 and earlier, 4 bytes for DWARF32, 8 bytes for DWARF32 in DWARF 3 and later 1, // 0x11 DW_FORM_ref1 2, // 0x12 DW_FORM_ref2 4, // 0x13 DW_FORM_ref4 @@ -77,7 +77,7 @@ g_form_sizes_addr8[] = 0, // 0x0d DW_FORM_sdata 4, // 0x0e DW_FORM_strp 0, // 0x0f DW_FORM_udata - 8, // 0x10 DW_FORM_ref_addr + 0, // 0x10 DW_FORM_ref_addr (addr size for DWARF2 and earlier, 4 bytes for DWARF32, 8 bytes for DWARF32 in DWARF 3 and later 1, // 0x11 DW_FORM_ref1 2, // 0x12 DW_FORM_ref2 4, // 0x13 DW_FORM_ref4 @@ -145,7 +145,12 @@ DWARFFormValue::ExtractValue(const DataExtractor& data, lldb::offset_t* offset_p case DW_FORM_strp: m_value.value.uval = data.GetU32(offset_ptr); break; // case DW_FORM_APPLE_db_str: case DW_FORM_udata: m_value.value.uval = data.GetULEB128(offset_ptr); break; - case DW_FORM_ref_addr: m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFCompileUnit::GetAddressByteSize(cu)); break; + case DW_FORM_ref_addr: + if (cu->GetVersion() <= 2) + m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFCompileUnit::GetAddressByteSize(cu)); + else + m_value.value.uval = data.GetU32(offset_ptr); // 4 for DWARF32, 8 for DWARF64, but we don't support DWARF64 yet + break; case DW_FORM_ref1: m_value.value.uval = data.GetU8(offset_ptr); break; case DW_FORM_ref2: m_value.value.uval = data.GetU16(offset_ptr); break; case DW_FORM_ref4: m_value.value.uval = data.GetU32(offset_ptr); break; @@ -203,10 +208,16 @@ DWARFFormValue::SkipValue(dw_form_t form, const DataExtractor& debug_info_data, // Compile unit address sized values case DW_FORM_addr: - case DW_FORM_ref_addr: *offset_ptr += DWARFCompileUnit::GetAddressByteSize(cu); return true; + case DW_FORM_ref_addr: + if (cu->GetVersion() <= 2) + *offset_ptr += DWARFCompileUnit::GetAddressByteSize(cu); + else + *offset_ptr += 4;// 4 for DWARF32, 8 for DWARF64, but we don't support DWARF64 yet + return true; + // 0 bytes values (implied from DW_FORM) case DW_FORM_flag_present: return true; @@ -337,7 +348,10 @@ DWARFFormValue::Dump(Stream &s, const DataExtractor* debug_str_data, const DWARF case DW_FORM_ref_addr: { - s.Address(uvalue, sizeof (uint64_t) * 2); + if (cu->GetVersion() <= 2) + s.Address(uvalue, sizeof (uint64_t) * 2); + else + s.Address(uvalue, 4 * 2);// 4 for DWARF32, 8 for DWARF64, but we don't support DWARF64 yet break; } case DW_FORM_ref1: cu_relative_offset = true; if (verbose) s.Printf("cu + 0x%2.2x", (uint8_t)uvalue); break; |