summaryrefslogtreecommitdiffstats
path: root/elaborate.cxx
diff options
context:
space:
mode:
authorfche <fche>2008-03-03 21:36:50 +0000
committerfche <fche>2008-03-03 21:36:50 +0000
commitb0be9bdb8c6972d847cad50a1e699f1fa806ad99 (patch)
tree66b3e148a84447d69f1340447c5edba8bf2055cd /elaborate.cxx
parentaae3e9a9a9cb64560070de2d1de30b08252b1e81 (diff)
downloadsystemtap-steved-b0be9bdb8c6972d847cad50a1e699f1fa806ad99.tar.gz
systemtap-steved-b0be9bdb8c6972d847cad50a1e699f1fa806ad99.tar.xz
systemtap-steved-b0be9bdb8c6972d847cad50a1e699f1fa806ad99.zip
PR5516: assignment to $pointers
2008-03-03 Frank Ch. Eigler <fche@elastic.org> PR5516 * elaborate.cxx (symbol_fetcher, dead_assignment_remover): Support unresolved $target lvalues. Propagate pretty error messages. * staptree.cxx (varuse_collecting_visitor target_symbol): Ditto. * staptree.h: Corresponding decl. * loc2c.c: c_translate_pointer_store: New function. * loc2c.h: Corresponding decl. * tapsets.cxx (dwflpp::translate_final_fetch_or_store): Call it for $target pointer assignments. 2008-03-03 Frank Ch. Eigler <fche@elastic.org> PR5516 * buildok/twentynine.stp: New test.
Diffstat (limited to 'elaborate.cxx')
-rw-r--r--elaborate.cxx18
1 files changed, 10 insertions, 8 deletions
diff --git a/elaborate.cxx b/elaborate.cxx
index 75714102..abb4c73b 100644
--- a/elaborate.cxx
+++ b/elaborate.cxx
@@ -696,8 +696,7 @@ struct symbol_fetcher
{
symbol *&sym;
- symbol_fetcher (symbol *&sym)
- : sym(sym)
+ symbol_fetcher (symbol *&sym): sym(sym)
{}
void visit_symbol (symbol* e)
@@ -705,6 +704,11 @@ struct symbol_fetcher
sym = e;
}
+ void visit_target_symbol (target_symbol* e)
+ {
+ sym = e;
+ }
+
void visit_arrayindex (arrayindex* e)
{
e->base->visit_indexable (this);
@@ -722,9 +726,7 @@ get_symbol_within_expression (expression *e)
symbol *sym = NULL;
symbol_fetcher fetcher(sym);
e->visit (&fetcher);
- if (!sym)
- throw semantic_error("Unable to find symbol in expression", e->tok);
- return sym;
+ return sym; // NB: may be null!
}
static symbol *
@@ -1718,12 +1720,12 @@ void
dead_assignment_remover::visit_assignment (assignment* e)
{
symbol* left = get_symbol_within_expression (e->left);
- vardecl* leftvar = left->referent;
+ vardecl* leftvar = left->referent; // NB: may be 0 for unresolved $target
if (current_expr && // see XXX above: this case represents a missed
// optimization opportunity
- *current_expr == e) // we're not nested any deeper than expected
+ *current_expr == e && // we're not nested any deeper than expected
+ leftvar) // not unresolved $target; intended sideeffect cannot be elided
{
- // clog << "Checking assignment to " << leftvar->name << " at " << *e->tok << endl;
if (vut.read.find(leftvar) == vut.read.end()) // var never read?
{
// NB: Not so fast! The left side could be an array whose