This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
[RFC PATCH 1/2] Bug Translator 3016 : Error accessing members of anonymous structs / unions
- From: Prerna Saxena <prerna at linux dot vnet dot ibm dot com>
- To: systemtap at sourceware dot org
- Date: Fri, 29 Aug 2008 14:46:54 +0530
- Subject: [RFC PATCH 1/2] Bug Translator 3016 : Error accessing members of anonymous structs / unions
Hi all,
This patch modifies tapsets.cxx to enable members of anonymous structs/
unions to be recognised by the systemtap translator.
Pls let me know your comments..
Regards,
Prerna Saxena
Signed-off-by: Prerna Saxena <prerna@linux.vnet.ibm.com>
Index: systemtap/tapsets.cxx
===================================================================
--- systemtap.orig/tapsets.cxx
+++ systemtap/tapsets.cxx
@@ -1866,6 +1866,8 @@ struct dwflpp
{
Dwarf_Die *die = vardie;
Dwarf_Die struct_die;
+ Dwarf_Attribute temp_attr;
+
unsigned i = 0;
while (i < components.size())
{
@@ -1924,9 +1926,9 @@ struct dwflpp
switch (dwarf_child (die, die_mem))
{
case 1: /* No children. */
- throw semantic_error ("empty struct "
- + string (dwarf_diename_integrate (die) ?: "<anonymous>"));
- break;
+ clog<<"\n Empty Struct "
+ <<(dwarf_diename_integrate(die)?:"<anonymous>");
+ return NULL;
case -1: /* Error. */
default: /* Shouldn't happen */
throw semantic_error (string (typetag == DW_TAG_union_type ? "union" : "struct")
@@ -1941,14 +1943,36 @@ struct dwflpp
while (dwarf_tag (die) != DW_TAG_member
|| ({ const char *member = dwarf_diename_integrate (die);
member == NULL || string(member) != components[i].second; }))
+ {
+ if ( dwarf_diename (die) == NULL ) // handling Anonymous structs/unions
+ {
+ Dwarf_Die temp_die = *die;
+
+ if (!dwarf_attr_integrate (&temp_die, DW_AT_type, &temp_attr))
+ {
+ clog<<"\n Error in obtaining type attribute for "
+ <<(dwarf_diename(&temp_die)?:"<anonymous>");
+ return NULL;
+ }
+
+ if ( !dwarf_formref_die (&temp_attr,&temp_die) )
+ {
+ clog<<"\n Error in decoding type attribute for "
+ <<(dwarf_diename(&temp_die)?:"<anonymous>");
+ return NULL;
+ }
+
+ Dwarf_Die *result_die = translate_components(pool, tail, pc, components, &temp_die, &temp_die, &temp_attr );
+
+ if (result_die != NULL)
+ {
+ *attr_mem = temp_attr;
+ return result_die;
+ }
+ }
if (dwarf_siblingof (die, die_mem) != 0)
- {
- stringstream alternatives;
- print_members (&struct_die, alternatives);
- throw semantic_error ("field '" + components[i].second
- + "' not found (alternatives:"
- + alternatives.str () + ")");
- }
+ return NULL;
+ }
if (dwarf_attr_integrate (die, DW_AT_data_member_location,
attr_mem) == NULL)
@@ -2230,6 +2254,8 @@ struct dwflpp
Dwarf_Die die_mem, *die = NULL;
die = translate_components (&pool, &tail, pc, components,
&vardie, &die_mem, &attr_mem);
+ if(!die)
+ throw semantic_error("Translation failure");
/* Translate the assignment part, either
x = $foo->bar->baz[NN]
@@ -2297,6 +2323,8 @@ struct dwflpp
Dwarf_Die die_mem, *die = NULL;
die = translate_components (&pool, &tail, pc, components,
vardie, &die_mem, &attr_mem);
+ if(!die)
+ throw semantic_error("Translation Failure");
/* Translate the assignment part, either
x = $return->bar->baz[NN]