This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
[RFC PATCH 2/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:52:18 +0530
- Subject: [RFC PATCH 2/2] Bug Translator 3016 : Error accessing members of anonymous structs / unions
Hi All,
This patch modifies tapsets.cxx to enable the systemtap translator to
print all probable members of a struct / union (including members on
anonymous structs/unions nested in it) upon a mismatch in resolving
member names.
Regards,
Prerna Saxena
Signed-off-by : Prerna Saxena <prerna@linux.vnet.ibm.com>
Index: systemtap/tapsets.cxx
===================================================================
--- systemtap.orig/tapsets.cxx
+++ systemtap/tapsets.cxx
@@ -1845,9 +1845,33 @@ struct dwflpp
// Output each sibling's name to 'o'.
while (dwarf_tag (die) == DW_TAG_member)
{
- const char *member = (dwarf_diename_integrate (die) ?: "<anonymous>");
+ const char *member = dwarf_diename_integrate (die) ;
+
+ if ( member != NULL )
+
+ o << " " << member;
+
+ else
+ {
+ Dwarf_Die temp_die = *die;
+ Dwarf_Attribute temp_attr ;
+
+ 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 ;
+ }
- o << " " << member;
+ if ( ! dwarf_formref_die (&temp_attr,&temp_die))
+ {
+ clog<<"\n Error in decoding type attribute for "
+ <<(dwarf_diename(&temp_die)?:"<anonymous>");
+ return ;
+ }
+ print_members(&temp_die,o);
+
+ }
if (dwarf_siblingof (die, &die_mem) != 0)
break;
@@ -2255,7 +2279,12 @@ struct dwflpp
die = translate_components (&pool, &tail, pc, components,
&vardie, &die_mem, &attr_mem);
if(!die)
- throw semantic_error("Translation failure");
+ {
+ die = dwarf_formref_die (&attr_mem, &vardie);
+ stringstream alternatives;
+ print_members(die,alternatives);
+ throw semantic_error("Translation failure : ALTERNATIVES [ " + alternatives.str() + " ] \n");
+ }
/* Translate the assignment part, either
x = $foo->bar->baz[NN]
@@ -2324,7 +2353,13 @@ struct dwflpp
die = translate_components (&pool, &tail, pc, components,
vardie, &die_mem, &attr_mem);
if(!die)
- throw semantic_error("Translation Failure");
+ {
+ die = dwarf_formref_die (&attr_mem, vardie);
+ stringstream alternatives;
+ print_members(die,alternatives);
+ throw semantic_error("Translation failure : ALTERNATIVES [ " + alternatives.str() + " ] \n");
+ }
+
/* Translate the assignment part, either
x = $return->bar->baz[NN]