From 5cc5056844a402c6cf466c8ca45119a4540b5900 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 7 Jul 2009 20:19:40 +0200 Subject: PR10348 Compilation failure with gcc 4.5 snapshot: switch jumps over vars. * loc2c-test.c (print_vars): Define attr_mem, typedie_mem and typedie before switch. * loc2c.c (translate): Wrap case DW_OP_drop in block brackets. (location_relative): Initialize stack. --- loc2c-test.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'loc2c-test.c') diff --git a/loc2c-test.c b/loc2c-test.c index 01edc805..01108573 100644 --- a/loc2c-test.c +++ b/loc2c-test.c @@ -378,6 +378,9 @@ static void print_vars (unsigned int indent, Dwarf_Die *die) { Dwarf_Die child; + Dwarf_Attribute attr_mem; + Dwarf_Die typedie_mem; + Dwarf_Die *typedie; if (dwarf_child (die, &child) == 0) do switch (dwarf_tag (&child)) @@ -387,9 +390,7 @@ print_vars (unsigned int indent, Dwarf_Die *die) printf ("%*s%-30s[%6" PRIx64 "]", indent, "", dwarf_diename (&child), (uint64_t) dwarf_dieoffset (&child)); - Dwarf_Attribute attr_mem; - Dwarf_Die typedie_mem; - Dwarf_Die *typedie = dwarf_formref_die + typedie = dwarf_formref_die (dwarf_attr_integrate (&child, DW_AT_type, &attr_mem), &typedie_mem); print_type (typedie, '\t'); -- cgit From 619d9aaf011c975159a79d34259083a596162bf1 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 7 Jul 2009 14:35:10 +0200 Subject: Add support for constant struct member field offsets. * loc2c.h (c_translate_add_offset): New function prototype. * loc2c.c (c_translate_add_offset): New function implementation. * loc2c-test.c (handle_variable): Use c_translate_add_offset if appropriate. * dwflpp.cxx (translate_location): Likewise. --- loc2c-test.c | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) (limited to 'loc2c-test.c') diff --git a/loc2c-test.c b/loc2c-test.c index 01108573..688f4a8b 100644 --- a/loc2c-test.c +++ b/loc2c-test.c @@ -214,10 +214,35 @@ handle_variable (Dwarf_Die *scopes, int nscopes, int out, } else { - locexpr = get_location (cubias, pc, &attr_mem, &locexpr_len); - c_translate_location (&pool, NULL, NULL, NULL, - 1, cubias, pc, locexpr, locexpr_len, - &tail, NULL); + /* We are expection a block, constant or loclistptr. */ + unsigned int form = dwarf_whatform (&attr_mem); + Dwarf_Sword off; + switch (form) + { + /* constant */ + case DW_FORM_data1: + case DW_FORM_data2: + case DW_FORM_sdata: + case DW_FORM_udata: + if (dwarf_formsdata (&attr_mem, &off) != 0) + error (2, 0, _("Bad offset for %s %s: %s"), + typetag == DW_TAG_union_type ? "union" : "struct", + dwarf_diename_integrate (die) ?: "", + dwarf_errmsg (-1)); + if (off != 0) + c_translate_add_offset (&pool, 1, + dwarf_diename_integrate (die) + ?: "", off, &tail); + break; + + default: + locexpr = get_location (cubias, pc, &attr_mem, + &locexpr_len); + c_translate_location (&pool, NULL, NULL, NULL, + 1, cubias, pc, locexpr, locexpr_len, + &tail, NULL); + break; + } } ++fields; break; -- cgit