diff options
author | fche <fche> | 2005-08-01 19:39:05 +0000 |
---|---|---|
committer | fche <fche> | 2005-08-01 19:39:05 +0000 |
commit | fe3d01fa89a373b8f930689cf2375cc04cb57b74 (patch) | |
tree | 47be3fb3f9de03b6205b05828112fc9df969dbdb | |
parent | d8067b24c81ff89a28ece9c52ba35fe6136d35f2 (diff) | |
download | systemtap-steved-fe3d01fa89a373b8f930689cf2375cc04cb57b74.tar.gz systemtap-steved-fe3d01fa89a373b8f930689cf2375cc04cb57b74.tar.xz systemtap-steved-fe3d01fa89a373b8f930689cf2375cc04cb57b74.zip |
2005-08-01 Frank Ch. Eigler <fche@elastic.org>
* elaborate.cxx (derive_probes, semantic_pass_symbols): Improve
error message specificity.
* translate.cxx (emit_module_init): Compact partial registration
recovery code.
(emit_module_exit): Invert deregistration sequence.
* testsuite/buildok/four.stp: Some module() test case.
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | elaborate.cxx | 69 | ||||
-rw-r--r-- | tapsets.cxx | 2 | ||||
-rwxr-xr-x | testsuite/buildok/four.stp | 6 | ||||
-rw-r--r-- | translate.cxx | 37 |
5 files changed, 68 insertions, 55 deletions
@@ -1,5 +1,14 @@ 2005-08-01 Frank Ch. Eigler <fche@elastic.org> + * elaborate.cxx (derive_probes, semantic_pass_symbols): Improve + error message specificity. + * translate.cxx (emit_module_init): Compact partial registration + recovery code. + (emit_module_exit): Invert deregistration sequence. + * testsuite/buildok/four.stp: Some module() test case. + +2005-08-01 Frank Ch. Eigler <fche@elastic.org> + * elaborate.cxx (derive_probes): Print error if results empty. * tapsets.cxx (dwflpp_assert): Handle positive RCs, which likely came from errno. diff --git a/elaborate.cxx b/elaborate.cxx index 90de32c7..54d102ec 100644 --- a/elaborate.cxx +++ b/elaborate.cxx @@ -359,27 +359,35 @@ symresolution_info::derive_probes (match_node * root, map<string, literal *> param_map; vector<probe *> re_expand; - derived_probe_builder * builder = - root->find_builder(loc->components, 0, param_vec); - - if (!builder) - throw semantic_error ("no match for probe point family"); - - param_vec_to_map(param_vec, param_map); - - unsigned num_atbegin = dps.size(); - builder->build(session, p, loc, param_map, re_expand, dps); - - // Recursively expand any further-expanding results - if (!re_expand.empty()) - { - for (unsigned j = 0; j < re_expand.size(); ++j) - derive_probes(root, re_expand[j], dps); - } - - unsigned num_atend = dps.size(); - if (num_atbegin == num_atend) // nothing new derived! - throw semantic_error ("no match for probe point"); + try + { + derived_probe_builder * builder = + root->find_builder(loc->components, 0, param_vec); + + if (!builder) + throw semantic_error ("no match for probe point family"); + + param_vec_to_map(param_vec, param_map); + + unsigned num_atbegin = dps.size(); + builder->build(session, p, loc, param_map, re_expand, dps); + + // Recursively expand any further-expanding results + if (!re_expand.empty()) + { + for (unsigned j = 0; j < re_expand.size(); ++j) + derive_probes(root, re_expand[j], dps); + } + + unsigned num_atend = dps.size(); + if (num_atbegin == num_atend) // nothing new derived! + throw semantic_error ("no match for probe point"); + } + catch (const semantic_error& e) + { + session.print_error (e); + cerr << " while: resolving probe point " << *loc << endl; + } } } @@ -612,20 +620,9 @@ semantic_pass_symbols (systemtap_session& s) probe* p = dome->probes [i]; vector<derived_probe*> dps; - try - { - // much magic happens here: probe alias expansion, - // provider identification - sym.derive_probes (s.pattern_root, p, dps); - } - catch (const semantic_error& e) - { - cerr << "while resolving probe point list:" << endl; - for (unsigned k=0; k<p->locations.size(); k++) - cerr << " " << *p->locations[k] << endl; - s.print_error (e); - // dps.erase (dps.begin(), dps.end()); - } + // much magic happens here: probe alias expansion, + // provider identification + sym.derive_probes (s.pattern_root, p, dps); for (unsigned j=0; j<dps.size(); j++) { @@ -645,7 +642,7 @@ semantic_pass_symbols (systemtap_session& s) } } } - + return s.num_errors; // all those print_error calls } diff --git a/tapsets.cxx b/tapsets.cxx index a51ce4e4..25be7166 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -1275,6 +1275,7 @@ dwarf_derived_probe::register_patterns(match_node * root) // .process("foo") register_function_and_statement_variants(root->bind(TOK_KERNEL), dw); + // XXX: may need to disable these for 2005-08 release register_function_and_statement_variants(root->bind_str(TOK_MODULE), dw); register_function_and_statement_variants(root->bind_str(TOK_PROCESS), dw); } @@ -1329,7 +1330,6 @@ dwarf_derived_probe::emit_registrations (translator_output* o, unsigned probenum void dwarf_derived_probe::emit_deregistrations (translator_output* o, unsigned probenum) { - o->newline(); o->newline() << "unregister_kprobe (& " << probe_entry_struct_kprobe_name(probenum) << ");"; diff --git a/testsuite/buildok/four.stp b/testsuite/buildok/four.stp new file mode 100755 index 00000000..8ceff188 --- /dev/null +++ b/testsuite/buildok/four.stp @@ -0,0 +1,6 @@ +#! stap -p4 + +probe module("ext3").function("*") +{ + log ("ext3 fn") +} diff --git a/translate.cxx b/translate.cxx index 78a75d91..85dfc925 100644 --- a/translate.cxx +++ b/translate.cxx @@ -633,15 +633,8 @@ c_unparser::emit_module_init () // We need to deregister any already probes set up - this is // essential for kprobes. if (i > 0) - // NB: This may be an END probe. It may refuse to run - // if the session_state was ERRORed - for (unsigned j=i; j>0; j--) - { - o->newline() << "/* deregister " << j-1 << " */"; - session->probes[j-1]->emit_deregistrations (o, j-1); - } - // XXX: ignore rc - o->newline() << "goto out;"; + o->newline() << "goto unregister_" << (i-1) << ";"; + o->newline(-1) << "}"; } @@ -652,10 +645,22 @@ c_unparser::emit_module_init () o->newline() << "if (atomic_read (&session_state) == STAP_SESSION_STARTING)"; o->newline(1) << "atomic_set (&session_state, STAP_SESSION_RUNNING);"; // XXX: else maybe set anyrc and thus return a failure from module_init? - o->indent(-1); + o->newline(-1) << "goto out;"; + + // recovery code for partially successful registration (rc != 0) + o->newline(); + for (int i=session->probes.size()-2; i >= 0; i--) // NB: -2 + { + o->newline(-1) << "unregister_" << i << ":"; + o->indent(1); + session->probes[i]->emit_deregistrations (o, i); + // NB: This may be an END probe. It will refuse to run + // if the session_state was ERRORed. + } + o->newline(); - o->newline() << "out:"; - o->newline() << "return rc;"; + o->newline(-1) << "out:"; + o->newline(1) << "return rc;"; o->newline(-1) << "}" << endl; } @@ -688,15 +693,11 @@ c_unparser::emit_module_exit () // o->newline(-1) << "if (holdon) msleep (5);"; o->newline(-1) << "} while (holdon);"; o->newline(-1); - // XXX: might like to have an escape hatch, in case some probe is // genuinely stuck - for (unsigned i=0; i<session->probes.size(); i++) - { - o->newline() << "/* deregister " << i << " */"; - session->probes[i]->emit_deregistrations (o, i); - } + for (int i=session->probes.size()-1; i>=0; i--) + session->probes[i]->emit_deregistrations (o, i); for (unsigned i=0; i<session->globals.size(); i++) { |