diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | elaborate.cxx | 71 | ||||
-rw-r--r-- | tapsets.cxx | 2 |
3 files changed, 49 insertions, 29 deletions
@@ -1,5 +1,10 @@ 2005-10-10 Frank Ch. Eigler <fche@elastic.org> + * elaborate.cxx (match_node::bind): Improve error message. + (register_library_aliases): Catch and verbosify error message. + (semantic_pass): Provide a back-up exception catcher. + +2005-10-10 Frank Ch. Eigler <fche@elastic.org> PR 1456. * translate.cxx (c_unparser_assignment): Rename "pre" field to "post", add blurb to clarify polarity. diff --git a/elaborate.cxx b/elaborate.cxx index d9f83939..de10f7f2 100644 --- a/elaborate.cxx +++ b/elaborate.cxx @@ -171,7 +171,7 @@ void match_node::bind(derived_probe_builder * e) { if (end) - throw semantic_error("already have a pattern ending"); + throw semantic_error("duplicate probe point pattern"); end = e; } @@ -337,29 +337,32 @@ systemtap_session::register_library_aliases() for (unsigned a = 0; a < file->aliases.size(); ++a) { probe_alias * alias = file->aliases[a]; - for (unsigned n = 0; n < alias->alias_names.size(); ++n) - { - probe_point * name = alias->alias_names[n]; - if (false && verbose) - { - clog << "registering probe alias "; - for (unsigned c = 0; c < name->components.size(); ++c) - clog << (c > 0 ? "." : "") << name->components[c]->functor; - clog << endl; - } - match_node * n = pattern_root; - for (unsigned c = 0; c < name->components.size(); ++c) - { - probe_point::component * comp = name->components[c]; - // XXX: alias parameters - if (comp->arg) - throw semantic_error("alias component " - + comp->functor - + " contains illegal parameter"); - n = n->bind(comp->functor); - } - n->bind(new alias_expansion_builder(alias)); - } + try + { + for (unsigned n = 0; n < alias->alias_names.size(); ++n) + { + probe_point * name = alias->alias_names[n]; + match_node * n = pattern_root; + for (unsigned c = 0; c < name->components.size(); ++c) + { + probe_point::component * comp = name->components[c]; + // XXX: alias parameters + if (comp->arg) + throw semantic_error("alias component " + + comp->functor + + " contains illegal parameter"); + n = n->bind(comp->functor); + } + n->bind(new alias_expansion_builder(alias)); + } + } + catch (const semantic_error& e) + { + print_error (e); + cerr << " while: registering probe alias "; + alias->printsig(cerr); + cerr << endl; + } } } } @@ -648,12 +651,22 @@ semantic_pass_symbols (systemtap_session& s) int semantic_pass (systemtap_session& s) { - s.register_library_aliases(); - register_standard_tapsets(s); + int rc = 0; - int rc = semantic_pass_symbols (s); - if (rc == 0) rc = semantic_pass_types (s); - if (rc == 0) rc = semantic_pass_maps (s); + try + { + s.register_library_aliases(); + register_standard_tapsets(s); + + rc = semantic_pass_symbols (s); + if (rc == 0) rc = semantic_pass_types (s); + if (rc == 0) rc = semantic_pass_maps (s); + } + catch (const semantic_error& e) + { + s.print_error (e); + } + return rc; } diff --git a/tapsets.cxx b/tapsets.cxx index 5a7a0726..b079ec59 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -1241,6 +1241,8 @@ dwflpp fprintf(memstream, "if (0) goto deref_fault;\n"); // XXX: deref flag not reliable; emit fault label unconditionally + // XXX: print the faulting address, like the user_string/kernel_string + // tapset functions do if (deref) ; fprintf(memstream, "deref_fault:\n" |