summaryrefslogtreecommitdiffstats
path: root/loc2c-test.c
diff options
context:
space:
mode:
Diffstat (limited to 'loc2c-test.c')
-rw-r--r--loc2c-test.c33
1 files changed, 29 insertions, 4 deletions
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) ?: "<anonymous>",
+ 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;