From: Jan Kratochvil Date: Thu, 24 Aug 2017 14:39:11 +0000 (+0200) Subject: DWARF-5 Fix DW_FORM_implicit_const X-Git-Tag: gdb-8.0.1-release~22 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f74f69f45570ced87b9f778983a63157b551a129;p=thirdparty%2Fbinutils-gdb.git DWARF-5 Fix DW_FORM_implicit_const -gdwarf-4: ptype logical type = const char [2] (gdb) PASS: gdb.base/constvars.exp: ptype logical -gdwarf-5: ptype logical type = const char [] (gdb) FAIL: gdb.base/constvars.exp: ptype logical <2><2fc>: Abbrev Number: 1 (DW_TAG_variable) <2fd> DW_AT_name : (indirect string, offset: 0x2eb): logical <301> DW_AT_decl_file : 1 1 DW_TAG_variable [no children] DW_AT_name DW_FORM_strp DW_AT_decl_file DW_FORM_implicit_const: 1 During symbol reading, invalid attribute class or form for 'DW_FORM_implicit_const' in '(null)'. gdb/ChangeLog 2017-08-24 Jan Kratochvil PR symtab/22003 * dwarf2read.c (dwarf2_const_value_attr, dump_die_shallow) (dwarf2_get_attr_constant_value, dwarf2_fetch_constant_bytes) (skip_form_bytes, attr_form_is_constant): Handle DW_FORM_implicit_const. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d6cd4c584d3..9ce59c16684 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2017-08-24 Jan Kratochvil + + PR symtab/22003 + * dwarf2read.c (dwarf2_const_value_attr, dump_die_shallow) + (dwarf2_get_attr_constant_value, dwarf2_fetch_constant_bytes) + (skip_form_bytes, attr_form_is_constant): Handle DW_FORM_implicit_const. + 2017-08-24 Jan Kratochvil * dwarf2read.c (build_type_psymtabs_reader): New prototype. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 96b5c78b00f..8503e6171ce 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -19430,6 +19430,7 @@ dwarf2_const_value_attr (const struct attribute *attr, struct type *type, break; case DW_FORM_sdata: + case DW_FORM_implicit_const: *value = DW_SND (attr); break; @@ -20423,6 +20424,10 @@ dump_die_shallow (struct ui_file *f, int indent, struct die_info *die) fprintf_unfiltered (f, "unexpected attribute form: DW_FORM_indirect"); break; + case DW_FORM_implicit_const: + fprintf_unfiltered (f, "constant: %s", + plongest (DW_SND (&die->attrs[i]))); + break; default: fprintf_unfiltered (f, "unsupported attribute form: %d.", die->attrs[i].form); @@ -20514,7 +20519,7 @@ dwarf2_get_ref_die_offset (const struct attribute *attr) static LONGEST dwarf2_get_attr_constant_value (const struct attribute *attr, int default_value) { - if (attr->form == DW_FORM_sdata) + if (attr->form == DW_FORM_sdata || attr->form == DW_FORM_implicit_const) return DW_SND (attr); else if (attr->form == DW_FORM_udata || attr->form == DW_FORM_data1 @@ -20849,6 +20854,7 @@ dwarf2_fetch_constant_bytes (sect_offset sect_off, break; case DW_FORM_sdata: + case DW_FORM_implicit_const: type = die_type (die, cu); result = write_constant_as_bytes (obstack, byte_order, type, DW_SND (attr), len); @@ -21785,6 +21791,9 @@ skip_form_bytes (bfd *abfd, const gdb_byte *bytes, const gdb_byte *buffer_end, } break; + case DW_FORM_implicit_const: + break; + default: { complain: @@ -22426,6 +22435,7 @@ attr_form_is_constant (const struct attribute *attr) case DW_FORM_data2: case DW_FORM_data4: case DW_FORM_data8: + case DW_FORM_implicit_const: return 1; default: return 0;