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:
Rene Gollent 2013-07-17 17:08:14 -04:00
parent f74ad62fd4
commit 6882d4b5d7
3 changed files with 27 additions and 47 deletions

View File

@ -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 },
{}

View File

@ -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
};

View File

@ -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()) {