summaryrefslogtreecommitdiffstats
path: root/tapsets.cxx
diff options
context:
space:
mode:
authorJosh Stone <jistone@redhat.com>2009-04-13 19:50:23 -0700
committerJosh Stone <jistone@redhat.com>2009-04-13 19:50:23 -0700
commitb9c2e81cc7a62336ec1daf374cb3411add772ab4 (patch)
treea4bd05ef043f77e6cfe8c78b6f24879f68689910 /tapsets.cxx
parent675e4d2a0635f822e8258c3f219c6dda685c67cf (diff)
downloadsystemtap-steved-b9c2e81cc7a62336ec1daf374cb3411add772ab4.tar.gz
systemtap-steved-b9c2e81cc7a62336ec1daf374cb3411add772ab4.tar.xz
systemtap-steved-b9c2e81cc7a62336ec1daf374cb3411add772ab4.zip
PR10067: fix bitfield access
* tapsets.cxx (dwflpp::translate_components): Eliminate the extra die-dereference at the end of the loop (a regression from @casts). * runtime/loc2c-runtime.h (store_bitfield): Use the target as the representative type, since the base is always int64_t. Also be a bit more aggressive with masking and parentheses. * testsuite/systemtap.base/bitfield.*: New test for R/W bitfields.
Diffstat (limited to 'tapsets.cxx')
-rw-r--r--tapsets.cxx7
1 files changed, 5 insertions, 2 deletions
diff --git a/tapsets.cxx b/tapsets.cxx
index 094ae358..c63151e1 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -2006,7 +2006,7 @@ struct dwflpp
Dwarf_Die *die_mem,
Dwarf_Attribute *attr_mem)
{
- Dwarf_Die *die = die_mem;
+ Dwarf_Die *die = NULL;
Dwarf_Die struct_die;
Dwarf_Attribute temp_attr;
@@ -2015,6 +2015,9 @@ struct dwflpp
if (vardie)
*die_mem = *vardie;
+ if (e->components.empty())
+ return die_mem;
+
static unsigned int func_call_level ;
static unsigned int dwarf_error_flag ; // indicates current error is dwarf error
static unsigned int dwarf_error_count ; // keeps track of no of dwarf errors
@@ -2031,6 +2034,7 @@ struct dwflpp
obstack_printf (pool, "c->last_stmt = %s;", lex_cast_qstring(piece).c_str());
#endif
+ die = die ? dwarf_formref_die (attr_mem, die_mem) : die_mem;
const int typetag = dwarf_tag (die);
switch (typetag)
{
@@ -2188,7 +2192,6 @@ struct dwflpp
/* Now iterate on the type in DIE's attribute. */
if (dwarf_attr_integrate (die, DW_AT_type, attr_mem) == NULL)
throw semantic_error ("cannot get type of field: " + string(dwarf_errmsg (-1)), e->tok);
- die = dwarf_formref_die (attr_mem, die_mem);
}
return die;
}