diff options
author | fche <fche> | 2006-12-19 22:00:15 +0000 |
---|---|---|
committer | fche <fche> | 2006-12-19 22:00:15 +0000 |
commit | 7e41d3dc4003b7e05731173f6b22cc9e1b05f057 (patch) | |
tree | f552fed50ac5d02ba2e56b588f73ef0dd48382b8 /elaborate.cxx | |
parent | 642da0daffeeecbcfa1aa78b6d95b5cfa90827d4 (diff) | |
download | systemtap-steved-7e41d3dc4003b7e05731173f6b22cc9e1b05f057.tar.gz systemtap-steved-7e41d3dc4003b7e05731173f6b22cc9e1b05f057.tar.xz systemtap-steved-7e41d3dc4003b7e05731173f6b22cc9e1b05f057.zip |
2006-12-19 Frank Ch. Eigler <fche@redhat.com>
PR 3522.
* tapsets.cxx (dwflpp::emit_address): Call
_stp_module_relocate only once per session.
Error message cleanup: duplicate elimination etc.
* session.h (saved_errors): Store a set of 'em.
(num_errors): Return set size. Remove old numeric field.
Update all callers.
* elaborate.cxx (systemtap_session::print_errors):
Print each encountered message just once.
* staptree (semantic_error): Make msg2 writeable.
Add a chain field.
* tapsets.cxx (*var_expanding*:visit_target_symbol): Set saved
semantic_error's chain field.
* elaborate.cxx (register_library_aliases, visit_foreach_loop,
visit_functioncall, derive_probes): Plop "while: ..." error
message prefix/suffix right into the semantic_error message string.
* parse.cxx (lexer::scan): Identify erroneous token better
in error message for unresolvable $N/@M command line args.
* util.h (lex_cast_hex): Use std::hex, not std::ios::hex.
2006-12-19 Frank Ch. Eigler <fche@redhat.com>
PR 3522.
* buildok/twentyfive.stp: New test for static $var access.
Diffstat (limited to 'elaborate.cxx')
-rw-r--r-- | elaborate.cxx | 73 |
1 files changed, 49 insertions, 24 deletions
diff --git a/elaborate.cxx b/elaborate.cxx index 06ddaf36..d74af612 100644 --- a/elaborate.cxx +++ b/elaborate.cxx @@ -449,10 +449,14 @@ systemtap_session::register_library_aliases() } catch (const semantic_error& e) { - cerr << "while: registering probe alias "; - alias->printsig(cerr); - cerr << endl; - print_error (e); + semantic_error* er = new semantic_error (e); // copy it + stringstream msg; + msg << e.msg2; + msg << " while registering probe alias "; + alias->printsig(msg); + er->msg2 = msg.str(); + print_error (* er); + delete er; } } } @@ -508,8 +512,14 @@ derive_probes (systemtap_session& s, catch (const semantic_error& e) { // XXX: prefer not to print_error at every nest/unroll level - s.print_error (e); - cerr << "while: resolving probe point " << *loc << endl; + + semantic_error* er = new semantic_error (e); // copy it + stringstream msg; + msg << e.msg2; + msg << " while resolving probe point " << *loc; + er->msg2 = msg.str(); + s.print_error (* er); + delete er; } loc->optional = old_loc_opt; @@ -709,7 +719,7 @@ semantic_pass_vars (systemtap_session & sess) sess.probes[i]->body->visit (&chk); } - return sess.num_errors; + return sess.num_errors(); } // ------------------------------------------------------------------------ @@ -811,7 +821,7 @@ semantic_pass_stats (systemtap_session & sess) } } - return sess.num_errors; + return sess.num_errors(); } // ------------------------------------------------------------------------ @@ -905,7 +915,7 @@ semantic_pass_symbols (systemtap_session& s) } } - return s.num_errors; // all those print_error calls + return s.num_errors(); // all those print_error calls } @@ -952,8 +962,7 @@ systemtap_session::systemtap_session (): perfmon_derived_probes(0), op (0), up (0), kprobes_text_initialized (false), - kprobes_text_start (0), kprobes_text_end (0), - num_errors (0) + kprobes_text_start (0), kprobes_text_end (0) { } @@ -961,14 +970,27 @@ systemtap_session::systemtap_session (): void systemtap_session::print_error (const semantic_error& e) { - cerr << "semantic error: " << e.what (); + string message_str; + stringstream message; + + message << "semantic error: " << e.what (); if (e.tok1 || e.tok2) - cerr << ": "; - if (e.tok1) cerr << *e.tok1; - cerr << e.msg2; - if (e.tok2) cerr << *e.tok2; - cerr << endl; - num_errors ++; + message << ": "; + if (e.tok1) message << *e.tok1; + message << e.msg2; + if (e.tok2) message << *e.tok2; + message << endl; + message_str = message.str(); + + // Duplicate elimination + if (seen_errors.find (message_str) == seen_errors.end()) + { + seen_errors.insert (message_str); + cerr << message_str; + } + + if (e.chain) + print_error (* e.chain); } @@ -1018,9 +1040,10 @@ symresolution_info::visit_foreach_loop (foreach_loop* e) array->referent = d; else { - cerr << "while searching for arity " << e->indexes.size() - << " array:\n"; - throw semantic_error ("unresolved global array " + array->name, e->tok); + stringstream msg; + msg << "unresolved arity-" << e->indexes.size() + << " global array " << array->name; + throw semantic_error (msg.str(), e->tok); } } } @@ -1161,8 +1184,10 @@ symresolution_info::visit_functioncall (functioncall* e) e->referent = d; else { - cerr << "while searching for arity " << e->args.size() << " function:\n"; - throw semantic_error ("unresolved function call", e->tok); + stringstream msg; + msg << "unresolved arity-" << e->args.size() + << " function"; + throw semantic_error (msg.str(), e->tok); } } @@ -1795,7 +1820,7 @@ semantic_pass_types (systemtap_session& s) } } - return rc + s.num_errors; + return rc + s.num_errors(); } |