summaryrefslogtreecommitdiffstats
path: root/tapset-utrace.cxx
diff options
context:
space:
mode:
authorFrank Ch. Eigler <fche@elastic.org>2010-02-25 13:33:28 -0500
committerFrank Ch. Eigler <fche@elastic.org>2010-02-25 13:38:50 -0500
commitc69a87e094e5e66daee8399838c8475f023ddc04 (patch)
tree4136d58cbebed28ccd40d3d983aac8179ed6ce1f /tapset-utrace.cxx
parente7227e90cd1414b2d02884617da0346134892526 (diff)
downloadsystemtap-steved-c69a87e094e5e66daee8399838c8475f023ddc04.tar.gz
systemtap-steved-c69a87e094e5e66daee8399838c8475f023ddc04.tar.xz
systemtap-steved-c69a87e094e5e66daee8399838c8475f023ddc04.zip
PR11005: @defined part 2: clarify/standardize internal handling of unresolvable $variables
* staptree.cxx (target_symbol::chain): New function. * staptree.h: Declare it. * (*): Use it instead of hand-chaining to target_symbol->saved_conversion_error. * tapset-mark.cxx (*::visit_target_symbol): Chain resolution error object, do not throw. * tapset-procfs.cxx (*::visit_target_symbol): Ditto. * tapset-utrace.cxx (*::visit_target_symbol): Ditto. * tapsets.cxx (*::visit_target_symbol): Ditto. (*::visit_defined_op): Explain & enforce the above. * testsuite/semok/thirtysix.stp: Expand. * testsuite/systemtap.base/sdt_misc.exp: Bonus fix: make work with blddir != srcdir.
Diffstat (limited to 'tapset-utrace.cxx')
-rw-r--r--tapset-utrace.cxx37
1 files changed, 23 insertions, 14 deletions
diff --git a/tapset-utrace.cxx b/tapset-utrace.cxx
index 4820ecf9..64433a24 100644
--- a/tapset-utrace.cxx
+++ b/tapset-utrace.cxx
@@ -582,20 +582,29 @@ utrace_var_expanding_visitor::visit_target_symbol (target_symbol* e)
{
assert(e->base_name.size() > 0 && e->base_name[0] == '$');
- if (flags != UDPF_SYSCALL && flags != UDPF_SYSCALL_RETURN)
- throw semantic_error ("only \"process(PATH_OR_PID).syscall\" and \"process(PATH_OR_PID).syscall.return\" probes support target symbols",
- e->tok);
-
- if (e->addressof)
- throw semantic_error("cannot take address of utrace variable", e->tok);
-
- if (e->base_name.substr(0,4) == "$arg" || e->base_name == "$$parms")
- visit_target_symbol_arg(e);
- else if (e->base_name == "$syscall" || e->base_name == "$return")
- visit_target_symbol_context(e);
- else
- throw semantic_error ("invalid target symbol for utrace probe, $syscall, $return, $argN or $$parms expected",
- e->tok);
+ try
+ {
+ if (flags != UDPF_SYSCALL && flags != UDPF_SYSCALL_RETURN)
+ throw semantic_error ("only \"process(PATH_OR_PID).syscall\" and \"process(PATH_OR_PID).syscall.return\" probes support target symbols",
+ e->tok);
+
+ if (e->addressof)
+ throw semantic_error("cannot take address of utrace variable", e->tok);
+
+ if (e->base_name.substr(0,4) == "$arg" || e->base_name == "$$parms")
+ visit_target_symbol_arg(e);
+ else if (e->base_name == "$syscall" || e->base_name == "$return")
+ visit_target_symbol_context(e);
+ else
+ throw semantic_error ("invalid target symbol for utrace probe, $syscall, $return, $argN or $$parms expected",
+ e->tok);
+ }
+ catch (const semantic_error &er)
+ {
+ e->chain (new semantic_error(er));
+ provide(e);
+ return;
+ }
}