[Lldb-commits] [PATCH] D14631: [dwarf] Handle DWARF forms for address other than DW_FORM_GNU_addr_index and DW_FORM_addr.
Greg Clayton via lldb-commits
lldb-commits at lists.llvm.org
Fri Nov 13 09:58:55 PST 2015
clayborg requested changes to this revision.
clayborg added a comment.
This revision now requires changes to proceed.
This is not the right fix. Compilers that emit addresses with DW_FORM_data* forms are saying that this address is an offset from the DW_AT_low_pc so this function will not return a valid address, but it will now return an offset. If you have a compiler that is actually emitting addresses incorrectly using DW_FORM_data* when the values are not offsets, the compiler should be fixed.
There are two solutions to this:
1 - modify DWARFFormValue::Address() to return LLDB_INVALID_ADDRESS if the form is not DW_FORM_addr or DW_FORM_GNU_addr_index.
2 - modify DWARFFormValue::Address() to take an lldb::addr_t that is the base address that the DW_FORM_data* would be relative to. This argument could be defaulted:
dw_addr_t
DWARFFormValue::Address(lldb::addr_t base_addr = LLDB_INVALID_ADDRESS) const
Then in the code we would do:
dw_addr_t
DWARFFormValue::Address(lldb::addr_t base_addr) const
{
switch (m_form)
{
case DW_FORM_addr:
return Unsigned();
case DW_FORM_GNU_addr_index:
if (m_cu)
{
SymbolFileDWARF* symbol_file = m_cu->GetSymbolFileDWARF();
if (symbol_file)
{
uint32_t index_size = m_cu->GetAddressByteSize();
dw_offset_t addr_base = m_cu->GetAddrBase();
lldb::offset_t offset = addr_base + m_value.value.uval * index_size;
return symbol_file->get_debug_addr_data().GetMaxU64(&offset, index_size);
}
}
break;
case DW_FORM_data1:
case DW_FORM_data2:
case DW_FORM_data4:
case DW_FORM_data8:
case DW_FORM_sdata:
case DW_FORM_udata:
if (base_addr != LLDB_INVALID_ADDRESS)
return base_addr + Unsigned();
default:
break;
}
return LLDB_INVALID_ADDRESS;
}
Repository:
rL LLVM
http://reviews.llvm.org/D14631
More information about the lldb-commits
mailing list