summaryrefslogtreecommitdiffstats
path: root/elaborate.cxx
diff options
context:
space:
mode:
authorfche <fche>2006-12-19 22:00:15 +0000
committerfche <fche>2006-12-19 22:00:15 +0000
commit7e41d3dc4003b7e05731173f6b22cc9e1b05f057 (patch)
treef552fed50ac5d02ba2e56b588f73ef0dd48382b8 /elaborate.cxx
parent642da0daffeeecbcfa1aa78b6d95b5cfa90827d4 (diff)
downloadsystemtap-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.cxx73
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();
}