[DTrace-devel] [PATCH] Better diagnosibility for D scripts relying on dt_cg_arglist()
eugene.loh at oracle.com
eugene.loh at oracle.com
Wed Feb 10 11:24:58 PST 2021
From: Eugene Loh <eugene.loh at oracle.com>
The function dt_cg_arglist() is not yet implemented properly.
Currently, D scripts that rely on its functionality fail,
emitting multiple opaque lines of BPF verifier output. E.g.,
# dtrace -n 'BEGIN {d_path(&(curthread->fs->pwd));}'
...10 lines...
BPF: jump out of range from insn 115 to 191
...4 lines...
# dtrace -n 'BEGIN {a[1] = 3;}'
dtrace: description 'BEGIN ' matched 1 probe
BPF: call to invalid destination
...4 lines...
Insert dnerror() calls at dt_cg_arglist()'s call sites to report
clearly what the problem is. A model is how aggregation tuples
are currently being handled:
# dtrace -n 'BEGIN {@a[1] = count();}'
dtrace: ...: indexing is not supported yet: @a
With the fix,
# dtrace -n 'BEGIN {d_path(&(curthread->fs->pwd));}'
dtrace: ...: functions are not yet supported: d_path
# dtrace -n 'BEGIN {a[1] = 3;}'
dtrace: ...: arrays are not yet supported: a
The DT_TOK_IDENT / DT_NODE_VAR / DT_IDENT_ARRAY code path that
calls dt_cg_assoc_op() -> dt_cg_arglist() remains uninstrumented.
Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
libdtrace/dt_cg.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 9f2a427b..f87d416e 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -2399,8 +2399,14 @@ dt_cg_asgn_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
if (dnp->dn_left->dn_kind == DT_NODE_VAR) {
idp = dt_ident_resolve(dnp->dn_left->dn_ident);
- if (idp->di_kind == DT_IDENT_ARRAY)
+ if (idp->di_kind == DT_IDENT_ARRAY) {
+ /* FIXME */
+ dnerror(dnp, D_UNKNOWN,
+ "arrays are not yet supported: %s\n",
+ idp->di_name);
+
dt_cg_arglist(idp, dnp->dn_left->dn_args, dlp, drp);
+ }
dt_cg_store_var(dnp, dlp, drp, idp);
} else {
@@ -3085,6 +3091,10 @@ dt_cg_node(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
dt_idkind_name(idp->di_kind), idp->di_name);
}
+ /* FIXME */
+ dnerror(dnp, D_UNKNOWN,
+ "functions are not yet supported: %s\n",
+ idp->di_name);
dt_cg_arglist(dnp->dn_ident, dnp->dn_args, dlp, drp);
if ((dnp->dn_reg = dt_regset_alloc(drp)) == -1)
--
2.18.4
More information about the DTrace-devel
mailing list