]> sourceware.org Git - systemtap.git/commitdiff
PR10538: Improve location lookup for unions
authorJosh Stone <jistone@redhat.com>
Wed, 19 Aug 2009 20:30:31 +0000 (13:30 -0700)
committerJosh Stone <jistone@redhat.com>
Wed, 19 Aug 2009 20:49:42 +0000 (13:49 -0700)
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.

dwflpp.cxx

index 7384842924879b9cf4322e6f91faf55c34118338..b5663fff8a4253560c722facf8337608577aff59 100644 (file)
@@ -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);
                 }
This page took 0.093556 seconds and 5 git commands to generate.