diff options
author | Josh Stone <jistone@redhat.com> | 2009-08-19 13:30:31 -0700 |
---|---|---|
committer | Josh Stone <jistone@redhat.com> | 2009-08-19 13:49:42 -0700 |
commit | b57ba9b863f0bd99f70d9e4d64c5a11ec75f7317 (patch) | |
tree | 897f926a52f7f1e74b09ed2eba83ca365ddad436 /dwflpp.cxx | |
parent | 67e8280177ba8c812587685b66883bb1ea052af6 (diff) | |
download | systemtap-steved-b57ba9b863f0bd99f70d9e4d64c5a11ec75f7317.tar.gz systemtap-steved-b57ba9b863f0bd99f70d9e4d64c5a11ec75f7317.tar.xz systemtap-steved-b57ba9b863f0bd99f70d9e4d64c5a11ec75f7317.zip |
PR10538: Improve location lookup for unions
We had a bug that the starting call to find_struct_member used the same
memory for the parentdie and the resulting member. If parentdie is a
union, then the first member probably won't have a location, and we
actually assert that it must be a union. Since we wrote the result in
the same memory, we lost the real info about the parent, and so the
assertion failed.
* dwflpp.cxx (dwflpp::translate_components): Use distinct memory for the
parent and resulting member in the call to find_struct_member.
(dwflpp::find_struct_member): Remove the needless parentdie copy.
Diffstat (limited to 'dwflpp.cxx')
-rw-r--r-- | dwflpp.cxx | 15 |
1 files changed, 8 insertions, 7 deletions
@@ -1624,9 +1624,9 @@ dwflpp::find_struct_member(const target_symbol::component& c, vector<Dwarf_Attribute>& locs) { Dwarf_Attribute attr; - Dwarf_Die die = *parentdie; + Dwarf_Die die; - switch (dwarf_child (&die, &die)) + switch (dwarf_child (parentdie, &die)) { case 0: /* First child found. */ break; @@ -1634,8 +1634,8 @@ dwflpp::find_struct_member(const target_symbol::component& c, return false; case -1: /* Error. */ default: /* Shouldn't happen */ - throw semantic_error (string (dwarf_tag(&die) == DW_TAG_union_type ? "union" : "struct") - + string (dwarf_diename (&die) ?: "<anonymous>") + throw semantic_error (string (dwarf_tag(parentdie) == DW_TAG_union_type ? "union" : "struct") + + string (dwarf_diename (parentdie) ?: "<anonymous>") + string (dwarf_errmsg (-1)), c.tok); } @@ -1774,17 +1774,18 @@ dwflpp::translate_components(struct obstack *pool, } { + Dwarf_Die parentdie = *die; vector<Dwarf_Attribute> locs; - if (!find_struct_member(c, die, die, locs)) + if (!find_struct_member(c, &parentdie, die, locs)) { string alternatives; stringstream members; - print_members(die, members); + print_members(&parentdie, members); if (members.str().size() != 0) alternatives = " (alternatives:" + members.str(); throw semantic_error("unable to find member '" + c.member + "' for struct " - + string(dwarf_diename(die) ?: "<unknown>") + + string(dwarf_diename(&parentdie) ?: "<unknown>") + alternatives, c.tok); } |