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 /tapsets.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 'tapsets.cxx')
-rw-r--r-- | tapsets.cxx | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/tapsets.cxx b/tapsets.cxx index a149a913..cc078779 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -1253,10 +1253,14 @@ struct dwflpp const char *secname = dwfl_module_relocation_info (mod, i, NULL); dwfl_assert ("dwfl_module_relocation_info", secname == NULL); if (n > 1 || secname[0] != '\0') - // This gives us the module name, and section name within the - // module, for a kernel module (or other ET_REL module object). - obstack_printf (pool, " _stp_module_relocate (\"%s\",\"%s\",%#" PRIx64 ")", - modname, secname, address); + { + // This gives us the module name, and section name within the + // module, for a kernel module (or other ET_REL module object). + obstack_printf (pool, "({ static unsigned long addr = 0; "); + obstack_printf (pool, "if (addr==0) addr = _stp_module_relocate (\"%s\",\"%s\",%#" PRIx64 "); ", + modname, secname, address); + obstack_printf (pool, "addr; })"); + } else { throw semantic_error ("cannot relocate user-space dso (?) address"); @@ -3292,6 +3296,10 @@ dwarf_var_expanding_copy_visitor::visit_target_symbol (target_symbol *e) provide <target_symbol*> (this, e); semantic_error* saveme = new semantic_error (er); // copy it saveme->tok1 = e->tok; // XXX: token not passed to q.dw code generation routines + // NB: we can have multiple errors, since a $target variable + // may be expanded in several different contexts: + // function ("*") { $var } + saveme->chain = e->saved_conversion_error; e->saved_conversion_error = saveme; delete fdecl; delete ec; |