Debugger: Handle DW_FORM_exprloc.
Get rid of AC_EXPRESSION. DW_FORM_exprloc is for all practical intents and purposes identical to DW_FORM_block except with a more explicit intent. As such, simply treat it the same as a block attribute. Gets value resolution working on DWARF4.
This commit is contained in:
parent
f74ad62fd4
commit
6882d4b5d7
@ -18,8 +18,7 @@ enum {
|
||||
AC_MACPTR = 1 << (ATTRIBUTE_CLASS_MACPTR - 1),
|
||||
AC_RANGELISTPTR = 1 << (ATTRIBUTE_CLASS_RANGELISTPTR - 1),
|
||||
AC_REFERENCE = 1 << (ATTRIBUTE_CLASS_REFERENCE - 1),
|
||||
AC_STRING = 1 << (ATTRIBUTE_CLASS_STRING - 1),
|
||||
AC_EXPRESSION = 1 << (ATTRIBUTE_CLASS_EXPRESSION - 1)
|
||||
AC_STRING = 1 << (ATTRIBUTE_CLASS_STRING - 1)
|
||||
};
|
||||
|
||||
|
||||
@ -43,15 +42,12 @@ struct attribute_name_info_entry {
|
||||
|
||||
static const attribute_name_info_entry kAttributeNameInfos[] = {
|
||||
{ ENTRY(sibling), AC_REFERENCE },
|
||||
{ ENTRY(location), AC_BLOCK | AC_EXPRESSION | AC_LOCLISTPTR },
|
||||
{ ENTRY(location), AC_BLOCK | AC_LOCLISTPTR },
|
||||
{ ENTRY(name), AC_STRING },
|
||||
{ ENTRY(ordering), AC_CONSTANT },
|
||||
{ ENTRY(byte_size), AC_BLOCK | AC_EXPRESSION | AC_CONSTANT
|
||||
| AC_REFERENCE },
|
||||
{ ENTRY(bit_offset), AC_BLOCK | AC_EXPRESSION | AC_CONSTANT
|
||||
| AC_REFERENCE },
|
||||
{ ENTRY(bit_size), AC_BLOCK | AC_EXPRESSION | AC_CONSTANT
|
||||
| AC_REFERENCE },
|
||||
{ ENTRY(byte_size), AC_BLOCK | AC_CONSTANT | AC_REFERENCE },
|
||||
{ ENTRY(bit_offset), AC_BLOCK | AC_CONSTANT | AC_REFERENCE },
|
||||
{ ENTRY(bit_size), AC_BLOCK | AC_CONSTANT | AC_REFERENCE },
|
||||
{ ENTRY(stmt_list), AC_LINEPTR },
|
||||
{ ENTRY(low_pc), AC_ADDRESS },
|
||||
{ ENTRY(high_pc), AC_ADDRESS },
|
||||
@ -60,7 +56,7 @@ static const attribute_name_info_entry kAttributeNameInfos[] = {
|
||||
{ ENTRY(discr_value), AC_CONSTANT },
|
||||
{ ENTRY(visibility), AC_CONSTANT },
|
||||
{ ENTRY(import), AC_REFERENCE },
|
||||
{ ENTRY(string_length), AC_BLOCK | AC_EXPRESSION | AC_LOCLISTPTR },
|
||||
{ ENTRY(string_length), AC_BLOCK | AC_LOCLISTPTR },
|
||||
{ ENTRY(common_reference), AC_REFERENCE },
|
||||
{ ENTRY(comp_dir), AC_STRING },
|
||||
{ ENTRY(const_value), AC_BLOCK | AC_CONSTANT | AC_STRING },
|
||||
@ -68,26 +64,21 @@ static const attribute_name_info_entry kAttributeNameInfos[] = {
|
||||
{ ENTRY(default_value), AC_REFERENCE },
|
||||
{ ENTRY(inline), AC_CONSTANT },
|
||||
{ ENTRY(is_optional), AC_FLAG },
|
||||
{ ENTRY(lower_bound), AC_BLOCK | AC_EXPRESSION | AC_CONSTANT
|
||||
| AC_REFERENCE },
|
||||
{ ENTRY(lower_bound), AC_BLOCK | AC_CONSTANT | AC_REFERENCE },
|
||||
{ ENTRY(producer), AC_STRING },
|
||||
{ ENTRY(prototyped), AC_FLAG },
|
||||
{ ENTRY(return_addr), AC_BLOCK | AC_EXPRESSION | AC_LOCLISTPTR },
|
||||
{ ENTRY(return_addr), AC_BLOCK | AC_LOCLISTPTR },
|
||||
{ ENTRY(start_scope), AC_CONSTANT },
|
||||
{ ENTRY(bit_stride), AC_CONSTANT | AC_EXPRESSION
|
||||
| AC_REFERENCE },
|
||||
{ ENTRY(upper_bound), AC_BLOCK | AC_EXPRESSION | AC_CONSTANT
|
||||
| AC_REFERENCE },
|
||||
{ ENTRY(bit_stride), AC_BLOCK | AC_CONSTANT | AC_REFERENCE },
|
||||
{ ENTRY(upper_bound), AC_BLOCK | AC_CONSTANT | AC_REFERENCE },
|
||||
{ ENTRY(abstract_origin), AC_REFERENCE },
|
||||
{ ENTRY(accessibility), AC_CONSTANT },
|
||||
{ ENTRY(address_class), AC_CONSTANT },
|
||||
{ ENTRY(artificial), AC_FLAG },
|
||||
{ ENTRY(base_types), AC_REFERENCE },
|
||||
{ ENTRY(calling_convention), AC_CONSTANT },
|
||||
{ ENTRY(count), AC_BLOCK | AC_EXPRESSION | AC_CONSTANT
|
||||
| AC_REFERENCE },
|
||||
{ ENTRY(data_member_location), AC_BLOCK | AC_EXPRESSION | AC_CONSTANT
|
||||
| AC_LOCLISTPTR },
|
||||
{ ENTRY(count), AC_BLOCK | AC_CONSTANT | AC_REFERENCE },
|
||||
{ ENTRY(data_member_location), AC_BLOCK | AC_CONSTANT | AC_LOCLISTPTR },
|
||||
{ ENTRY(decl_column), AC_CONSTANT },
|
||||
{ ENTRY(decl_file), AC_CONSTANT },
|
||||
{ ENTRY(decl_line), AC_CONSTANT },
|
||||
@ -95,27 +86,24 @@ static const attribute_name_info_entry kAttributeNameInfos[] = {
|
||||
{ ENTRY(discr_list), AC_BLOCK },
|
||||
{ ENTRY(encoding), AC_CONSTANT },
|
||||
{ ENTRY(external), AC_FLAG },
|
||||
{ ENTRY(frame_base), AC_BLOCK | AC_EXPRESSION | AC_LOCLISTPTR },
|
||||
{ ENTRY(frame_base), AC_BLOCK | AC_LOCLISTPTR },
|
||||
{ ENTRY(friend), AC_REFERENCE },
|
||||
{ ENTRY(identifier_case), AC_CONSTANT },
|
||||
{ ENTRY(macro_info), AC_MACPTR },
|
||||
{ ENTRY(namelist_item), AC_BLOCK | AC_REFERENCE },
|
||||
{ ENTRY(priority), AC_REFERENCE },
|
||||
{ ENTRY(segment), AC_BLOCK | AC_EXPRESSION | AC_LOCLISTPTR },
|
||||
{ ENTRY(segment), AC_BLOCK | AC_LOCLISTPTR },
|
||||
{ ENTRY(specification), AC_REFERENCE },
|
||||
{ ENTRY(static_link), AC_BLOCK | AC_EXPRESSION | AC_LOCLISTPTR },
|
||||
{ ENTRY(static_link), AC_BLOCK | AC_LOCLISTPTR },
|
||||
{ ENTRY(type), AC_REFERENCE },
|
||||
{ ENTRY(use_location), AC_BLOCK | AC_EXPRESSION | AC_LOCLISTPTR },
|
||||
{ ENTRY(use_location), AC_BLOCK | AC_LOCLISTPTR },
|
||||
{ ENTRY(variable_parameter), AC_FLAG },
|
||||
{ ENTRY(virtuality), AC_CONSTANT },
|
||||
{ ENTRY(vtable_elem_location), AC_BLOCK | AC_LOCLISTPTR },
|
||||
{ ENTRY(allocated), AC_BLOCK | AC_EXPRESSION | AC_CONSTANT
|
||||
| AC_REFERENCE },
|
||||
{ ENTRY(associated), AC_BLOCK | AC_EXPRESSION | AC_CONSTANT
|
||||
| AC_REFERENCE },
|
||||
{ ENTRY(data_location), AC_BLOCK | AC_EXPRESSION },
|
||||
{ ENTRY(byte_stride), AC_BLOCK | AC_EXPRESSION | AC_CONSTANT
|
||||
| AC_REFERENCE },
|
||||
{ ENTRY(allocated), AC_BLOCK | AC_CONSTANT | AC_REFERENCE },
|
||||
{ ENTRY(associated), AC_BLOCK | AC_CONSTANT | AC_REFERENCE },
|
||||
{ ENTRY(data_location), AC_BLOCK },
|
||||
{ ENTRY(byte_stride), AC_BLOCK | AC_CONSTANT | AC_REFERENCE },
|
||||
{ ENTRY(entry_pc), AC_ADDRESS },
|
||||
{ ENTRY(use_UTF8), AC_FLAG },
|
||||
{ ENTRY(extension), AC_REFERENCE },
|
||||
@ -146,11 +134,11 @@ static const attribute_name_info_entry kAttributeNameInfos[] = {
|
||||
{ ENTRY(const_expr), AC_FLAG },
|
||||
{ ENTRY(enum_class), AC_FLAG },
|
||||
{ ENTRY(linkage_name), AC_STRING },
|
||||
{ ENTRY(call_site_value), AC_BLOCK | AC_EXPRESSION },
|
||||
{ ENTRY(call_site_data_value), AC_BLOCK | AC_EXPRESSION },
|
||||
{ ENTRY(call_site_target), AC_BLOCK | AC_EXPRESSION },
|
||||
{ ENTRY(call_site_value), AC_BLOCK },
|
||||
{ ENTRY(call_site_data_value), AC_BLOCK },
|
||||
{ ENTRY(call_site_target), AC_BLOCK },
|
||||
{ ENTRY(call_site_target_clobbered),
|
||||
AC_BLOCK | AC_EXPRESSION },
|
||||
AC_BLOCK },
|
||||
{ ENTRY(tail_call), AC_FLAG },
|
||||
{ ENTRY(all_tail_call_sites), AC_FLAG },
|
||||
{ ENTRY(all_call_sites), AC_FLAG },
|
||||
@ -192,7 +180,7 @@ static const attribute_info_entry kAttributeFormInfos[] = {
|
||||
{ ENTRY(indirect), AC_REFERENCE },
|
||||
{ ENTRY(sec_offset), AC_LINEPTR | AC_LOCLISTPTR | AC_MACPTR
|
||||
| AC_RANGELISTPTR },
|
||||
{ ENTRY(exprloc), AC_EXPRESSION },
|
||||
{ ENTRY(exprloc), AC_BLOCK },
|
||||
{ ENTRY(flag_present), AC_FLAG },
|
||||
{ ENTRY(ref_sig8), AC_REFERENCE },
|
||||
{}
|
||||
|
@ -25,8 +25,7 @@ enum {
|
||||
ATTRIBUTE_CLASS_MACPTR = 7,
|
||||
ATTRIBUTE_CLASS_RANGELISTPTR = 8,
|
||||
ATTRIBUTE_CLASS_REFERENCE = 9,
|
||||
ATTRIBUTE_CLASS_STRING = 10,
|
||||
ATTRIBUTE_CLASS_EXPRESSION = 11
|
||||
ATTRIBUTE_CLASS_STRING = 10
|
||||
};
|
||||
|
||||
|
||||
|
@ -1378,6 +1378,7 @@ DwarfFile::_ParseEntryAttributes(DataReader& dataReader,
|
||||
attributeValue.SetToString(dataReader.ReadString());
|
||||
break;
|
||||
case DW_FORM_block:
|
||||
case DW_FORM_exprloc:
|
||||
blockLength = dataReader.ReadUnsignedLEB128(0);
|
||||
break;
|
||||
case DW_FORM_block1:
|
||||
@ -1436,9 +1437,6 @@ DwarfFile::_ParseEntryAttributes(DataReader& dataReader,
|
||||
case DW_FORM_ref_udata:
|
||||
value = dataReader.ReadUnsignedLEB128(0);
|
||||
break;
|
||||
case DW_FORM_exprloc:
|
||||
value = dataReader.ReadUnsignedLEB128(0);
|
||||
break;
|
||||
case DW_FORM_flag_present:
|
||||
attributeValue.SetToFlag(true);
|
||||
break;
|
||||
@ -1523,11 +1521,6 @@ DwarfFile::_ParseEntryAttributes(DataReader& dataReader,
|
||||
case ATTRIBUTE_CLASS_STRING:
|
||||
// already set
|
||||
break;
|
||||
case ATTRIBUTE_CLASS_EXPRESSION:
|
||||
WARNING("Skipping unhandled attribute class expression.\n");
|
||||
// TODO: implement
|
||||
dataReader.Skip(value);
|
||||
break;
|
||||
}
|
||||
|
||||
if (dataReader.HasOverflow()) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user