diff options
author | fche <fche> | 2008-03-03 21:36:50 +0000 |
---|---|---|
committer | fche <fche> | 2008-03-03 21:36:50 +0000 |
commit | b0be9bdb8c6972d847cad50a1e699f1fa806ad99 (patch) | |
tree | 66b3e148a84447d69f1340447c5edba8bf2055cd /elaborate.cxx | |
parent | aae3e9a9a9cb64560070de2d1de30b08252b1e81 (diff) | |
download | systemtap-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.cxx | 18 |
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 |