summaryrefslogtreecommitdiffstats
path: root/dwflpp.cxx
diff options
context:
space:
mode:
authorJosh Stone <jistone@redhat.com>2009-08-19 13:30:31 -0700
committerJosh Stone <jistone@redhat.com>2009-08-19 13:49:42 -0700
commitb57ba9b863f0bd99f70d9e4d64c5a11ec75f7317 (patch)
tree897f926a52f7f1e74b09ed2eba83ca365ddad436 /dwflpp.cxx
parent67e8280177ba8c812587685b66883bb1ea052af6 (diff)
downloadsystemtap-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.cxx15
1 files changed, 8 insertions, 7 deletions
diff --git a/dwflpp.cxx b/dwflpp.cxx
index 73848429..b5663fff 100644
--- a/dwflpp.cxx
+++ b/dwflpp.cxx
@@ -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);
}