[DTrace-devel] [PATCH v6 03/19] Deprecate enabled probe ID (epid)
Kris Van Hees
kris.van.hees at oracle.com
Thu Sep 19 10:25:40 UTC 2024
On Thu, Sep 19, 2024 at 05:57:19AM -0400, Kris Van Hees wrote:
> Great patch. Found a few smallish things though that we probably want to
> address before putting this in (potential risks for buffer overruns).
>
> Also, because dt_stmts is constructed from the programs being presented for
> loading by the consumer (which is a 2nd step after the consumer uses libdtrace
> to compile the statements), it is technically possible that not all elements
> in dt_stmts will be filled in. There is no guarantee that a consumer will
> present every compiled program for loading (though in practice that is of
> course not going to happen).
>
> But since libdtrace allows this by design, every indexing of dt_stmts (there
> are only a few - marked below) should first make sure that the element is not
> NULL.
>
> On Tue, Sep 17, 2024 at 02:08:12PM -0400, eugene.loh at oracle.com wrote:
> > From: Eugene Loh <eugene.loh at oracle.com>
> >
> > Historically, the enabled probe id (epid) was an integer, passed from
> > producer to consumer, that uniquely identified probe ID and statement
> > (data description). It was used in error reporting and was available
> > to D users via a built-in variable "epid".
> >
> > However, its value was opaque to users and difficult to use.
> >
> > Deprecate the use of EPID:
> >
> > *) Have the producer pass to the consumer the probe ID and statement
> > ID explicitly, instead of passing an opaque integer that requires
> > additional lookup tables.
> >
> > *) Keep an array dt_stmts[] of statements, from which we can retrieve
> > probe descriptions and data descriptions.
> >
> > *) Remove data structures related to epid: dt_ddesc[], dt_pdesc[],
> > dt_nextepid, dt_maxprobe, etc.
> >
> > Nevertheless, continue to provide a value for the built-in "epid" variable
> > for back compatability. Expand the epid from 4 bytes to 8 bytes: the
> > upper half is the probe ID and the lower half the statement ID.
> >
> > The output buffer (written by the producer, read by the consumer) is
> > rearranged slightly. Note that:
> >
> > *) It starts with a 4-byte size, which perf_event writes.
> >
> > *) The beginning of the output buffer should have 8-byte alignment.
> >
> > *) The beginning of the trace data within the output buffer should
> > also have 8-byte alignment.
> >
> > *) So we rearrange as follows:
> >
> > old new
> >
> > 0: pad / size pad / size <==
> > 4: pad specid
> > 8: epid <== prid
> > 12: specid stid
> > 16: data[n] data[n]
> >
> > The arrow <== indicates where the buffer starts.
> >
> > For error reporting:
> >
> > *) Report errors in terms of the probe ID (and description) and the
> > clause function name, which is decipherable in terms of the
> > disassembly output. Specifically, change ERROR-probe arguments:
> >
> > -) arg1 changes from epid to the probe ID
> >
> > -) arg2 changes from "clause index" (which is no longer needed)
> > to the statement ID that identifies the clause named in
> > disassembly output
> >
> > *) No longer report the "action number", which has lost much of its
> > meaning in the port to eBPF. Nonetheless, keep dteda_action; its
> > value is not used, but set the value to stid for possible future use.
> >
> > Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
> > ---
> > bpf/get_bvar.c | 5 +-
> > bpf/probe_error.c | 8 +-
> > include/dtrace/metadesc.h | 4 +-
> > include/dtrace/universal.h | 3 +-
> > libdtrace/dt_bpf.c | 2 -
> > libdtrace/dt_bpf.h | 46 +++++----
> > libdtrace/dt_cc.c | 47 +++-------
> > libdtrace/dt_cg.c | 49 +++++-----
> > libdtrace/dt_consume.c | 85 +++++++++--------
> > libdtrace/dt_dctx.h | 21 +++--
> > libdtrace/dt_dlibs.c | 2 -
> > libdtrace/dt_error.c | 2 +-
> > libdtrace/dt_handle.c | 41 ++++----
> > libdtrace/dt_impl.h | 15 +--
> > libdtrace/dt_map.c | 94 ++-----------------
> > libdtrace/dt_open.c | 5 +-
> > libdtrace/dt_program.c | 9 +-
> > libdtrace/dtrace.h | 3 +-
> > test/demo/builtin/eipd.d | 4 -
> > test/demo/dtrace/error.r | 2 +-
> > test/demo/spec/specopen.d | 5 +-
> > test/stress/buffering/tst.resize3-manual.d | 2 +-
> > test/stress/buffering/tst.resize3-manual.r | 2 +-
> > test/stress/buffering/tst.resize3.d | 2 +-
> > test/stress/buffering/tst.resize3.r | 2 +-
> > test/unittest/actions/setopt/tst.badopt.r | 14 +--
> > .../arrays/tst.declared-bounds.runtime_out.r | 2 +-
> > test/unittest/codegen/err.deref_0.r | 2 +-
> > test/unittest/codegen/err.deref_1.r | 2 +-
> > test/unittest/codegen/err.deref_i0.r | 2 +-
> > test/unittest/codegen/err.deref_i1.r | 2 +-
> > .../unittest/codegen/err.deref_string-assoc.r | 2 +-
> > test/unittest/codegen/err.deref_string-gvar.r | 2 +-
> > test/unittest/codegen/err.deref_string-lvar.r | 2 +-
> > test/unittest/codegen/err.deref_string-tvar.r | 2 +-
> > .../codegen/err.str_NULL_plus_offset-assoc.r | 2 +-
> > .../codegen/err.str_NULL_plus_offset-lvar.r | 2 +-
> > .../codegen/err.str_NULL_plus_offset-tvar.r | 2 +-
> > .../codegen/err.str_NULL_plus_offset.r | 2 +-
> > test/unittest/disasm/tst.vartab-bvar.r | 2 +-
> > test/unittest/drops/drp.DTRACEDROP_DBLERROR.r | 2 +-
> > .../tst.DTRACEFLT_BADADDR.null_ptr_field.d | 6 +-
> > .../tst.DTRACEFLT_BADADDR.null_ptr_field.r | 2 +-
> > test/unittest/error/tst.DTRACEFLT_BADADDR.r | 4 +-
> > test/unittest/error/tst.DTRACEFLT_BADADDR2.r | 4 +-
> > .../error/tst.DTRACEFLT_DIVZERO.div.d | 11 ++-
> > .../error/tst.DTRACEFLT_DIVZERO.div.r | 2 +-
> > .../error/tst.DTRACEFLT_DIVZERO.mod.d | 11 ++-
> > .../error/tst.DTRACEFLT_DIVZERO.mod.r | 2 +-
> > test/unittest/error/tst.DTRACEFLT_UNKNOWN.r | 4 +-
> > .../error/tst.clause_scope-begin-ended.r | 2 +-
> > test/unittest/error/tst.clause_scope-begin.r | 2 +-
> > .../unittest/error/tst.clause_scope-regular.r | 2 +-
> > .../error/tst.clause_scope-regular.r.p | 8 +-
> > test/unittest/error/tst.error.r | 2 +-
> > test/unittest/error/tst.errorend.r | 2 +-
> > .../alloca/err.alloca-bcopy-before-beyond.r | 2 +-
> > .../alloca/err.alloca-bcopy-before-bottom.r | 2 +-
> > .../alloca/err.alloca-bcopy-beyond-top.r | 2 +-
> > .../alloca/err.alloca-bcopy-crossing-bottom.r | 2 +-
> > .../alloca/err.alloca-bcopy-crossing-top.r | 2 +-
> > .../alloca/err.alloca-crossing-clauses.r | 2 +-
> > .../alloca/err.alloca-load-before-bottom.r | 2 +-
> > .../funcs/alloca/err.alloca-load-beyond-top.r | 2 +-
> > .../alloca/err.alloca-load-crossing-bottom.r | 2 +-
> > .../alloca/err.alloca-null-deref-lvalue.r | 2 +-
> > .../funcs/alloca/err.alloca-null-deref.r | 2 +-
> > .../err.alloca-scratch-exceeding-bcopy.r | 2 +-
> > .../alloca/err.alloca-store-before-bottom.r | 2 +-
> > .../alloca/err.alloca-store-beyond-top.r | 2 +-
> > .../alloca/err.alloca-store-crossing-bottom.r | 2 +-
> > test/unittest/funcs/bcopy/err.badbcopy1.r | 2 +-
> > test/unittest/funcs/bcopy/err.badbcopy4.r | 2 +-
> > test/unittest/funcs/bcopy/err.badbcopy5.r | 2 +-
> > test/unittest/funcs/bcopy/err.badbcopy6.r | 2 +-
> > test/unittest/funcs/bcopy/err.badbcopy7.r | 2 +-
> > test/unittest/funcs/bcopy/err.badbcopy8.r | 2 +-
> > test/unittest/funcs/copyin/err.badaddr.r | 2 +-
> > test/unittest/funcs/copyin/err.null_arg1.r | 2 +-
> > test/unittest/funcs/copyinstr/err.badaddr.r | 2 +-
> > test/unittest/funcs/copyinstr/err.null_arg1.r | 2 +-
> > test/unittest/funcs/copyinto/err.badaddr.r | 2 +-
> > test/unittest/funcs/copyinto/err.badsize.r | 2 +-
> > test/unittest/funcs/copyinto/err.null_arg1.r | 2 +-
> > test/unittest/funcs/err.badalloca.r | 2 +-
> > test/unittest/funcs/err.badalloca.r.p | 8 +-
> > test/unittest/funcs/err.link_ntopbadaddr.r | 2 +-
> > test/unittest/funcs/err.link_ntopbadarg.r | 2 +-
> > .../inet_ntoa6/err.inet_ntoa6.arg1_null.r | 2 +-
> > .../err.inet_ntoa6.arg1_null_const.r | 2 +-
> > test/unittest/funcs/strlen/tst.null.r | 2 +-
> > test/unittest/funcs/strtok/tst.strtok_null.r | 2 +-
> > .../funcs/strtok/tst.strtok_nulldel.r | 2 +-
> > .../funcs/strtok/tst.strtok_nullstr.r | 2 +-
> > .../funcs/strtok/tst.strtok_nullstr2.r | 2 +-
> > .../funcs/substr/err.substr_null_arg1.r | 2 +-
> > test/unittest/pointers/err.AllocaOverrun.r | 2 +-
> > test/unittest/pointers/err.BadAlign.r | 2 +-
> > test/unittest/pointers/err.InvalidAddress2.r | 2 +-
> > test/unittest/pointers/err.InvalidAddress4.r | 2 +-
> > .../speculation/err.CommitWithInvalid.r | 2 +-
> > .../speculation/err.DiscardWithInvalid.r | 2 +-
> > .../speculation/tst.SpecSizeVariations.r | 22 -----
> > .../speculation/tst.SpecSizeVariations.sh | 2 +-
> > test/unittest/speculation/tst.negcommit.r | 2 +-
> > .../variables/bvar/tst.arg3-ERROR-b.sh | 2 +-
> > .../unittest/variables/bvar/tst.arg3-ERROR.sh | 2 +-
> > 107 files changed, 292 insertions(+), 404 deletions(-)
> > delete mode 100644 test/demo/builtin/eipd.d
> >
> > diff --git a/bpf/get_bvar.c b/bpf/get_bvar.c
> > index a0c04f3a3..37f29a591 100644
> > --- a/bpf/get_bvar.c
> > +++ b/bpf/get_bvar.c
> > @@ -48,8 +48,9 @@ noinline uint64_t dt_get_bvar(const dt_dctx_t *dctx, uint32_t id, uint32_t idx)
> > mst->tstamp = bpf_ktime_get_ns();
> >
> > return mst->tstamp;
> > - case DIF_VAR_EPID:
> > - return mst->epid;
> > + case DIF_VAR_EPID: {
> > + return (((uint64_t)mst->prid) << 32) | mst->stid;
> > + }
> > case DIF_VAR_ID:
> > return mst->prid;
> > case DIF_VAR_ARG0: case DIF_VAR_ARG1: case DIF_VAR_ARG2:
> > diff --git a/bpf/probe_error.c b/bpf/probe_error.c
> > index 1081ee71d..a9233b7c9 100644
> > --- a/bpf/probe_error.c
> > +++ b/bpf/probe_error.c
> > @@ -16,8 +16,8 @@ extern int64_t dt_error(const dt_dctx_t *dctx);
> > /*
> > * DTrace ERROR probes provide 6 arguments:
> > * arg0 = always NULL (used to be kernel consumer state pointer)
> > - * arg1 = EPID of probe that triggered the fault
> > - * arg2 = clause index of code that triggered the fault
> > + * arg1 = probe ID that triggered the fault
> > + * arg2 = statement ID that triggered the fault
> > * arg3 = BPF offset in the clause that triggered the fault (or -1)
> > * arg4 = fault type
> > * arg5 = fault-specific value (usually address being accessed or 0)
> > @@ -30,8 +30,8 @@ noinline void dt_probe_error(const dt_dctx_t *dctx, uint64_t pc, uint64_t fault,
> >
> > __builtin_memcpy(mst->saved_argv, mst->argv, sizeof(mst->saved_argv));
> > mst->argv[0] = 0;
> > - mst->argv[1] = mst->epid;
> > - mst->argv[2] = mst->clid;
> > + mst->argv[1] = mst->prid;
> > + mst->argv[2] = mst->stid;
> > mst->argv[3] = pc;
> > mst->argv[4] = fault;
> > mst->argv[5] = illval;
> > diff --git a/include/dtrace/metadesc.h b/include/dtrace/metadesc.h
> > index ab9061f73..41125ff13 100644
> > --- a/include/dtrace/metadesc.h
> > +++ b/include/dtrace/metadesc.h
> > @@ -19,8 +19,8 @@
> >
> > /*
> > * DTrace separates the trace data stream from the metadata stream. The only
> > - * metadata tokens placed in the data stream are enabled probe identifiers
> > - * (EPIDs) or (in the case of aggregations) aggregation identifiers. In order
> > + * metadata tokens placed in the data stream are probe and statement identifiers
> > + * or (in the case of aggregations) aggregation identifiers. In order
> > * to determine the structure of the data, DTrace uses the token to perform a
> > * lookup to retrieve the corresponding description of the enabled probe (via
> > * the dtrace_datadesc structure) or the aggregation (via the dtrace_aggdesc
> > diff --git a/include/dtrace/universal.h b/include/dtrace/universal.h
> > index d65624899..325586e57 100644
> > --- a/include/dtrace/universal.h
> > +++ b/include/dtrace/universal.h
> > @@ -17,7 +17,6 @@
> >
> > #define DTRACE_CPUALL -1 /* all CPUs */
> > #define DTRACE_IDNONE 0 /* invalid probe identifier */
> > -#define DTRACE_EPIDNONE 0 /* invalid enabled probe identifier */
> > #define DTRACE_AGGIDNONE 0 /* invalid aggregation identifier */
> > #define DTRACE_AGGVARIDNONE 0 /* invalid aggregation variable ID */
> > #define DTRACE_CACHEIDNONE 0 /* invalid predicate cache */
> > @@ -37,7 +36,7 @@ typedef uint16_t dtrace_actkind_t; /* action kind */
> >
> > typedef uint32_t dtrace_aggid_t; /* aggregation identifier */
> > typedef uint32_t dtrace_cacheid_t; /* predicate cache identifier */
> > -typedef uint32_t dtrace_epid_t; /* enabled probe identifier */
> > +typedef uint32_t dtrace_stid_t; /* statement identifier */
> > typedef uint32_t dtrace_optid_t; /* option identifier */
> > typedef uint32_t dtrace_specid_t; /* speculation identifier */
> >
> > diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c
> > index df427c864..ad11d178e 100644
> > --- a/libdtrace/dt_bpf.c
> > +++ b/libdtrace/dt_bpf.c
> > @@ -774,7 +774,6 @@ gmap_create_cpuinfo(dtrace_hdl_t *dtp)
> > * The size of the memory region is the sum of:
> > * - size of the DTrace machine state, rounded up to the nearest
> > * multiple of 8
> > - * - 8 bytes padding for trace buffer alignment purposes
> > * - maximum trace buffer record size, rounded up to the nearest
> > * multiple of 8
> > * - size of dctx->mem (see dt_dctx.h)
> > @@ -783,7 +782,6 @@ static int
> > gmap_create_mem(dtrace_hdl_t *dtp)
> > {
> > size_t sz = roundup(sizeof(dt_mstate_t), 8) +
> > - 8 +
> > roundup(dtp->dt_maxreclen, 8) +
> > DMEM_SIZE(dtp);
> >
> > diff --git a/libdtrace/dt_bpf.h b/libdtrace/dt_bpf.h
> > index 5b2df2641..5716d2320 100644
> > --- a/libdtrace/dt_bpf.h
> > +++ b/libdtrace/dt_bpf.h
> > @@ -32,30 +32,28 @@ extern "C" {
> > (dtp)->dt_bpffeatures |= (feat); \
> > } while (0)
> >
> > -#define DT_CONST_EPID 1
> > -#define DT_CONST_PRID 2
> > -#define DT_CONST_CLID 3
> > -#define DT_CONST_ARGC 4
> > -#define DT_CONST_STBSZ 5
> > -#define DT_CONST_STRSZ 6
> > -#define DT_CONST_STKSIZ 7
> > -#define DT_CONST_BOOTTM 8
> > -#define DT_CONST_NSPEC 9
> > -#define DT_CONST_NCPUS 10
> > -#define DT_CONST_PC 11
> > -#define DT_CONST_TUPSZ 12
> > -#define DT_CONST_TASK_PID 13
> > -#define DT_CONST_TASK_TGID 14
> > -#define DT_CONST_TASK_REAL_PARENT 15
> > -#define DT_CONST_TASK_COMM 16
> > -#define DT_CONST_MUTEX_OWNER 17
> > -#define DT_CONST_RWLOCK_CNTS 18
> > -#define DT_CONST_DCTX_RODATA 19
> > -#define DT_CONST_RODATA_OFF 20
> > -#define DT_CONST_RODATA_SIZE 21
> > -#define DT_CONST_ZERO_OFF 22
> > -#define DT_CONST_STACK_OFF 23
> > -#define DT_CONST_STACK_SKIP 24
> > +#define DT_CONST_PRID 1
> > +#define DT_CONST_ARGC 2
> > +#define DT_CONST_STBSZ 3
> > +#define DT_CONST_STRSZ 4
> > +#define DT_CONST_STKSIZ 5
> > +#define DT_CONST_BOOTTM 6
> > +#define DT_CONST_NSPEC 7
> > +#define DT_CONST_NCPUS 8
> > +#define DT_CONST_PC 9
> > +#define DT_CONST_TUPSZ 10
> > +#define DT_CONST_TASK_PID 11
> > +#define DT_CONST_TASK_TGID 12
> > +#define DT_CONST_TASK_REAL_PARENT 13
> > +#define DT_CONST_TASK_COMM 14
> > +#define DT_CONST_MUTEX_OWNER 15
> > +#define DT_CONST_RWLOCK_CNTS 16
> > +#define DT_CONST_DCTX_RODATA 17
> > +#define DT_CONST_RODATA_OFF 18
> > +#define DT_CONST_RODATA_SIZE 19
> > +#define DT_CONST_ZERO_OFF 20
> > +#define DT_CONST_STACK_OFF 21
> > +#define DT_CONST_STACK_SKIP 22
> >
> > #define DT_BPF_LOG_SIZE_DEFAULT (UINT32_MAX >> 8)
> > #define DT_BPF_LOG_SIZE_SMALL 4096
> > diff --git a/libdtrace/dt_cc.c b/libdtrace/dt_cc.c
> > index 2a7d36d53..d0b56528b 100644
> > --- a/libdtrace/dt_cc.c
> > +++ b/libdtrace/dt_cc.c
> > @@ -123,6 +123,7 @@ dt_stmt_create(dtrace_hdl_t *dtp, dtrace_ecbdesc_t *edp,
> > if (sdp == NULL)
> > longjmp(yypcb->pcb_jmpbuf, EDT_NOMEM);
> >
> > + sdp->dtsd_id = dtp->dt_stmt_nextid++;
> > assert(yypcb->pcb_stmt == NULL);
> > yypcb->pcb_stmt = sdp;
> > yypcb->pcb_maxrecs = 0;
> > @@ -130,11 +131,10 @@ dt_stmt_create(dtrace_hdl_t *dtp, dtrace_ecbdesc_t *edp,
> > return sdp;
> > }
> >
> > -static dt_ident_t *
> > -dt_clause_create(dtrace_hdl_t *dtp, dtrace_difo_t *dp)
> > +static void
> > +dt_stmt_set_clause(dtrace_hdl_t *dtp, dtrace_difo_t *dp, dtrace_stmtdesc_t *sdp)
> > {
> > char *name;
> > - int len;
> > dt_ident_t *idp;
> >
> > /*
> > @@ -153,25 +153,21 @@ dt_clause_create(dtrace_hdl_t *dtp, dtrace_difo_t *dp)
> > /*
> > * Generate a symbol name.
> > */
> > - len = snprintf(NULL, 0, "dt_clause_%d", dtp->dt_clause_nextid) + 1;
> > - name = dt_alloc(dtp, len);
> > - if (name == NULL)
> > + if (asprintf(&name, "dt_clause_%d", sdp->dtsd_id) < 0)
> > longjmp(yypcb->pcb_jmpbuf, EDT_NOMEM);
> >
> > - snprintf(name, len, "dt_clause_%d", dtp->dt_clause_nextid++);
> > -
> > /*
> > * Add the symbol to the BPF identifier table and associate the DIFO
> > * with the symbol.
> > */
> > idp = dt_dlib_add_func(dtp, name);
> > - dt_free(dtp, name);
> > + free(name);
> > if (idp == NULL)
> > longjmp(yypcb->pcb_jmpbuf, EDT_NOMEM);
> >
> > dt_ident_set_data(idp, dp);
> >
> > - return idp;
> > + sdp->dtsd_clause = idp;
> > }
> >
> > static void
> > @@ -211,7 +207,7 @@ dt_compile_one_clause(dtrace_hdl_t *dtp, dt_node_t *cnp, dt_node_t *pnp)
> > * Compile the clause (predicate and action).
> > */
> > dt_cg(yypcb, cnp);
> > - sdp->dtsd_clause = dt_clause_create(dtp, dt_as(yypcb));
> > + dt_stmt_set_clause(dtp, dt_as(yypcb), sdp);
> >
> > assert(yypcb->pcb_stmt == sdp);
> > if (dtrace_stmt_add(yypcb->pcb_hdl, yypcb->pcb_prog, sdp) != 0)
> > @@ -944,7 +940,7 @@ static int get_boottime() {
> > static int
> > dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
> > dt_ident_t *idp, const dtrace_difo_t *sdp, uint_t *pcp,
> > - uint_t *rcp, uint_t *vcp, dtrace_epid_t epid, uint_t clid)
> > + uint_t *rcp, uint_t *vcp)
> > {
> > uint_t pc = *pcp;
> > uint_t rc = *rcp;
> > @@ -955,7 +951,6 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
> > uint_t len = sdp->dtdo_brelen;
> > const dof_relodesc_t *rp = sdp->dtdo_breltab;
> > dof_relodesc_t *nrp = &dp->dtdo_breltab[rc];
> > - dtrace_id_t prid = prp->desc->id;
> > int no_deps = 0;
> >
> > if (idp != NULL) {
> > @@ -1026,7 +1021,6 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
> > for (; len != 0; len--, rp++, nrp++) {
> > const char *name = dt_difo_getstr(sdp, rp->dofr_name);
> > dtrace_difo_t *rdp;
> > - dtrace_epid_t nepid;
> > int ipc;
> >
> > idp = dt_dlib_get_sym(dtp, name);
> > @@ -1041,15 +1035,9 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
> > }
> >
> > switch (idp->di_id) {
> > - case DT_CONST_EPID:
> > - nrp->dofr_data = epid;
> > - continue;
> > case DT_CONST_PRID:
> > nrp->dofr_data = prp->desc->id;
> > continue;
> > - case DT_CONST_CLID:
> > - nrp->dofr_data = clid;
> > - continue;
> > case DT_CONST_ARGC:
> > nrp->dofr_data = 0; /* FIXME */
> > continue;
> > @@ -1193,11 +1181,6 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
> > case DT_CONST_STACK_SKIP:
> > nrp->dofr_data = prp->prov->impl->stack_skip;
> > continue;
> > - default:
> > - /* probe name -> value is probe id */
> > - if (strchr(idp->di_name, ':') != NULL)
> > - prid = rp->dofr_data;
> > - continue;
> > }
> >
> > continue;
> > @@ -1213,13 +1196,8 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
> > rdp = dt_dlib_get_func_difo(dtp, idp);
> > if (rdp == NULL)
> > return -1;
> > - if (rdp->dtdo_ddesc != NULL) {
> > - nepid = dt_epid_add(dtp, rdp->dtdo_ddesc, prid);
> > - clid++;
> > - } else
> > - nepid = 0;
> > ipc = dt_link_construct(dtp, prp, dp, idp, rdp, pcp,
> > - rcp, vcp, nepid, clid);
> > + rcp, vcp);
> > if (ipc == -1)
> > return -1;
> >
> > @@ -1260,8 +1238,8 @@ dt_link_resolve(dtrace_hdl_t *dtp, dtrace_difo_t *dp)
> > continue;
> >
> > /*
> > - * We are only relocating constants (EPID and ARGC) and call
> > - * instructions to functions that have been linked in.
> > + * We are only relocating constants and call instructions to
> > + * functions that have been linked in.
> > */
> > switch (idp->di_kind) {
> > case DT_IDENT_SCALAR:
> > @@ -1333,8 +1311,7 @@ dt_link(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
> > */
> > insc = relc = varc = 0;
> >
> > - rc = dt_link_construct(dtp, prp, fdp, idp, dp, &insc, &relc, &varc, 0,
> > - 0);
> > + rc = dt_link_construct(dtp, prp, fdp, idp, dp, &insc, &relc, &varc);
> > dt_dlib_reset(dtp, B_FALSE);
> > if (rc == -1)
> > goto fail;
> > diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> > index f6c88c5ca..39c27ab0e 100644
> > --- a/libdtrace/dt_cg.c
> > +++ b/libdtrace/dt_cg.c
> > @@ -277,15 +277,9 @@ dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act)
> > * buf = rc + roundup(sizeof(dt_mstate_t), 8);
> > * // add %r0, roundup(
> > * sizeof(dt_mstate_t), 8)
> > - * *((uint64_t *)&buf[0]) = 0;
> > - * // stdw [%r0 + 0], 0
> > - * buf += 8; // add %r0, 8
> > - * // (%r0 = pointer to buffer space)
> > * dctx.buf = buf; // stdw [%r9 + DCTX_BUF], %r0
> > */
> > emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, roundup(sizeof(dt_mstate_t), 8)));
> > - emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_0, 0, 0));
> > - emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8));
> > emit(dlp, BPF_STORE(BPF_DW, BPF_REG_9, DCTX_BUF, BPF_REG_0));
> >
> > /*
> > @@ -1047,8 +1041,9 @@ dt_cg_tramp_error(dt_pcb_t *pcb)
> > *
> > * - Store the base pointer to the output data buffer in %r9.
> > * - Initialize the machine state (dctx->mst).
> > - * - Store the epid at [%r9 + DBUF_EPID].
> > * - Store 0 to indicate no active speculation at [%r9 + DBUF_SPECID].
> > + * - Store the prid at [%r9 + DBUF_PRID].
> > + * - Store the stid at [%r9 + DBUF_STID].
> > * - Evaluate the predicate expression and return if false.
> > *
> > * The dt_program() function will always return 0.
> > @@ -1057,11 +1052,6 @@ static void
> > dt_cg_prologue(dt_pcb_t *pcb, dt_node_t *pred)
> > {
> > dt_irlist_t *dlp = &pcb->pcb_ir;
> > - dt_ident_t *epid = dt_dlib_get_var(pcb->pcb_hdl, "EPID");
> > - dt_ident_t *clid = dt_dlib_get_var(pcb->pcb_hdl, "CLID");
> > -
> > - assert(epid != NULL);
> > - assert(clid != NULL);
> >
> > /*
> > * void dt_program(dt_dctx_t *dctx)
> > @@ -1093,18 +1083,13 @@ dt_cg_prologue(dt_pcb_t *pcb, dt_node_t *pred)
> > * // stdw [%r0 + DMST_FAULT], 0
> > * dctx->mst->tstamp = 0; // stdw [%r0 + DMST_TSTAMP], 0
> > * dctx->mst->specsize = 0;// stdw [%r0 + DMST_SPECSIZE], 0
> > - * dctx->mst->epid = EPID; // stw [%r0 + DMST_EPID], EPID
> > - * dctx->mst->clid = CLID; // stw [%r0 + DMST_CLID], CLID
> > - * *((uint32_t *)&buf[DBUF_EPID]) = EPID;
> > - * // stw [%r9 + DBUF_EPID], EPID
> > + * dctx->mst->stid = STID; // stw [%r0 + DMST_STID], STID
> > */
> > emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_0, DCTX_MST));
> > emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_0, DMST_FAULT, 0));
> > emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_0, DMST_TSTAMP, 0));
> > emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_0, DMST_SPECSIZE, 0));
> > - emite(dlp, BPF_STORE_IMM(BPF_W, BPF_REG_0, DMST_EPID, -1), epid);
> > - emite(dlp, BPF_STORE_IMM(BPF_W, BPF_REG_0, DMST_CLID, -1), clid);
> > - emite(dlp, BPF_STORE_IMM(BPF_W, BPF_REG_9, DBUF_EPID, -1), epid);
> > + emit(dlp, BPF_STORE_IMM(BPF_W, BPF_REG_0, DMST_STID, pcb->pcb_stmt->dtsd_id));
> >
> > /*
> > * Set the speculation ID field to zero to indicate no active
> > @@ -1114,6 +1099,17 @@ dt_cg_prologue(dt_pcb_t *pcb, dt_node_t *pred)
> > */
> > emit(dlp, BPF_STORE_IMM(BPF_W, BPF_REG_9, DBUF_SPECID, 0));
> >
> > + /*
> > + * *((uint32_t *)&buf[DBUF_PRID]) = dctx->mst->prid;
> > + * // ld %r1, [%r0 + DMST_PRID]
> > + * // st [%r9 + DBUF_PRID], %r1
> > + * *((uint32_t *)&buf[DBUF_STID]) = stid;
> > + * // st [%r9 + DBUF_STID], stid
> > + */
> > + emit (dlp, BPF_LOAD(BPF_W, BPF_REG_1, BPF_REG_0, DMST_PRID));
> > + emit (dlp, BPF_STORE(BPF_W, BPF_REG_9, DBUF_PRID, BPF_REG_1));
> > + emit (dlp, BPF_STORE_IMM(BPF_W, BPF_REG_9, DBUF_STID, pcb->pcb_stmt->dtsd_id));
> > +
> > /*
> > * If there is a predicate:
> > *
> > @@ -1132,10 +1128,9 @@ dt_cg_prologue(dt_pcb_t *pcb, dt_node_t *pred)
> > TRACE_REGSET("Prologue: End ");
> >
> > /*
> > - * Account for 32-bit EPID (at offset 0) and 32-bit speculation ID (at
> > - * offset 4).
> > + * Set the offset for the beginning of trace data.
> > */
> > - pcb->pcb_bufoff += 2 * sizeof(uint32_t);
> > + pcb->pcb_bufoff = DBUF_DATA;
> > }
> >
> > /*
> > @@ -1170,15 +1165,15 @@ dt_cg_epilogue(dt_pcb_t *pcb)
> > /*
> > * rc = bpf_perf_event_output(dctx->ctx, &buffers,
> > * BPF_F_CURRENT_CPU,
> > - * buf - 4, bufoff + 4);
> > + * buf + 4, bufoff - 4);
> > * // lddw %r1, [%fp + DT_STK_DCTX]
> > * // lddw %r1, [%r1 + DCTX_CTX]
> > * // lddw %r2, &buffers
> > * // lddw %r3, BPF_F_CURRENT_CPU
> > * // mov %r4, %r9
> > - * // add %r4, -4
> > + * // add %r4, 4
> > * // mov %r5, pcb->pcb_bufoff
> > - * // add %r5, 4
> > + * // add %r5, -4
> > * // call bpf_perf_event_output
> > */
> > emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_1, BPF_REG_FP, DT_STK_DCTX));
> > @@ -1186,9 +1181,9 @@ dt_cg_epilogue(dt_pcb_t *pcb)
> > dt_cg_xsetx(dlp, buffers, DT_LBL_NONE, BPF_REG_2, buffers->di_id);
> > dt_cg_xsetx(dlp, NULL, DT_LBL_NONE, BPF_REG_3, BPF_F_CURRENT_CPU);
> > emit(dlp, BPF_MOV_REG(BPF_REG_4, BPF_REG_9));
> > - emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -4));
> > + emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 4));
> > emit(dlp, BPF_MOV_IMM(BPF_REG_5, pcb->pcb_bufoff));
> > - emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 4));
> > + emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, -4));
> > emit(dlp, BPF_CALL_HELPER(BPF_FUNC_perf_event_output));
> >
> > /*
> > diff --git a/libdtrace/dt_consume.c b/libdtrace/dt_consume.c
> > index 6d93613d4..3e8e1b465 100644
> > --- a/libdtrace/dt_consume.c
> > +++ b/libdtrace/dt_consume.c
> > @@ -15,9 +15,11 @@
> > #include <alloca.h>
> > #include <dt_impl.h>
> > #include <dt_aggregate.h>
> > +#include <dt_dctx.h>
> > #include <dt_module.h>
> > #include <dt_pcap.h>
> > #include <dt_peb.h>
> > +#include <dt_probe.h>
> > #include <dt_state.h>
> > #include <dt_string.h>
> > #include <libproc.h>
> > @@ -433,7 +435,7 @@ static dt_htab_ops_t dt_spec_buf_htab_ops = {
> > };
> >
> > static int
> > -dt_flowindent(dtrace_hdl_t *dtp, dtrace_probedata_t *data, dtrace_epid_t last)
> > +dt_flowindent(dtrace_hdl_t *dtp, dtrace_probedata_t *data, dtrace_id_t lastprid, dtrace_stid_t laststid)
> > {
> > dtrace_probedesc_t *pd = data->dtpda_pdesc;
> > dtrace_flowkind_t flow = DTRACEFLOW_NONE;
> > @@ -445,7 +447,7 @@ dt_flowindent(dtrace_hdl_t *dtp, dtrace_probedata_t *data, dtrace_epid_t last)
> > static const char *r_str[2] = { " <- ", " <= " };
> > static const char *ent = "entry", *ret = "return";
> > static int entlen = 0, retlen = 0;
> > - dtrace_epid_t id = data->dtpda_epid;
> > + dtrace_stid_t stid = data->dtpda_stid;
> >
> > if (entlen == 0) {
> > assert(retlen == 0);
> > @@ -473,13 +475,12 @@ dt_flowindent(dtrace_hdl_t *dtp, dtrace_probedata_t *data, dtrace_epid_t last)
> >
> > /*
> > * If we're going to indent this, we need to check the ID of our last
> > - * call. If we're looking at the same probe ID but a different EPID,
> > + * call. If we're looking at the same probe ID but a different STID,
> > * we _don't_ want to indent. (Yes, there are some minor holes in
> > * this scheme -- it's a heuristic.)
> > */
> > if (flow == DTRACEFLOW_ENTRY) {
> > - if (last != DTRACE_EPIDNONE && id != last &&
> > - pd->id == dtp->dt_pdesc[last]->id)
> > + if (stid != laststid && pd->id == lastprid)
> > flow = DTRACEFLOW_NONE;
> > }
> >
> > @@ -2145,8 +2146,8 @@ static dtrace_workstatus_t
> > dt_consume_one_probe(dtrace_hdl_t *dtp, FILE *fp, char *data, uint32_t size,
> > dtrace_probedata_t *pdat, dtrace_consume_probe_f *efunc,
> > dtrace_consume_rec_f *rfunc, int flow, int quiet,
> > - int peekflags, dtrace_epid_t *last, int committing,
> > - void *arg);
> > + int peekflags, dtrace_id_t *lastprid,
> > + dtrace_stid_t *laststid, int committing, void *arg);
> >
> > /*
> > * Commit one speculation.
> > @@ -2155,7 +2156,8 @@ static dtrace_workstatus_t
> > dt_commit_one_spec(dtrace_hdl_t *dtp, FILE *fp, dt_spec_buf_t *dtsb,
> > dtrace_probedata_t *pdat, dtrace_consume_probe_f *efunc,
> > dtrace_consume_rec_f *rfunc, int flow, int quiet,
> > - int peekflags, dtrace_epid_t *last, void *arg)
> > + int peekflags, dtrace_id_t *lastprid,
> > + dtrace_stid_t *laststid, void *arg)
> > {
> > dt_spec_buf_data_t *dsbd;
> >
> > @@ -2169,7 +2171,7 @@ dt_commit_one_spec(dtrace_hdl_t *dtp, FILE *fp, dt_spec_buf_t *dtsb,
> > ret = dt_consume_one_probe(dtp, fp, dsbd->dsbd_data,
> > dsbd->dsbd_size, &specpdat,
> > efunc, rfunc, flow, quiet,
> > - peekflags, last, 1, arg);
> > + peekflags, lastprid, laststid, 1, arg);
> > if (ret != DTRACE_WORKSTATUS_OKAY)
> > return ret;
> > }
> > @@ -2181,34 +2183,33 @@ static dtrace_workstatus_t
> > dt_consume_one_probe(dtrace_hdl_t *dtp, FILE *fp, char *data, uint32_t size,
> > dtrace_probedata_t *pdat, dtrace_consume_probe_f *efunc,
> > dtrace_consume_rec_f *rfunc, int flow, int quiet,
> > - int peekflags, dtrace_epid_t *last, int committing,
> > - void *arg)
> > + int peekflags, dtrace_id_t *lastprid,
> > + dtrace_stid_t *laststid, int committing, void *arg)
> > {
> > - dtrace_epid_t epid;
> > + dtrace_specid_t specid;
> > + dtrace_id_t prid;
> > + dtrace_stid_t stid;
> > dtrace_datadesc_t *epd;
> > dt_spec_buf_t tmpl;
> > dt_spec_buf_t *dtsb;
> > - int specid;
> > int i;
> > int rval;
> > dtrace_workstatus_t ret;
> > int commit_discard_seen, only_commit_discards;
> > int data_recording = 1;
> >
> > - epid = ((uint32_t *)data)[0];
> > - specid = ((uint32_t *)data)[1];
> > + specid = *((dtrace_specid_t *)(data + DBUF_SPECID));
> > + prid = *((dtrace_id_t *)(data + DBUF_PRID));
> > + stid = *((dtrace_stid_t *)(data + DBUF_STID));
> >
> > - /*
> > - * Fill in the epid and address of the epid in the buffer. We need to
> > - * pass this to the efunc and possibly to create speculations.
> > - */
> > - pdat->dtpda_epid = epid;
> > + pdat->dtpda_stid = stid;
> > pdat->dtpda_data = data;
> >
> > - rval = dt_epid_lookup(dtp, epid, &pdat->dtpda_ddesc,
> > - &pdat->dtpda_pdesc);
> > - if (rval != 0)
> > - return dt_set_errno(dtp, EDT_BADEPID);
> > + if (prid > dtp->dt_probe_id)
> > + return dt_set_errno(dtp, EDT_BADID);
> > + pdat->dtpda_pdesc = (dtrace_probedesc_t *)dtp->dt_probes[prid]->desc;
> > + if (dt_stid_lookup(dtp, stid, &pdat->dtpda_ddesc) != 0)
> > + return dt_set_errno(dtp, EDT_BADSTID);
> >
> > epd = pdat->dtpda_ddesc;
> > if (epd->dtdd_uarg != DT_ECB_DEFAULT) {
> > @@ -2306,7 +2307,7 @@ dt_consume_one_probe(dtrace_hdl_t *dtp, FILE *fp, char *data, uint32_t size,
> >
> > if (data_recording) {
> > if (flow)
> > - dt_flowindent(dtp, pdat, *last);
> > + dt_flowindent(dtp, pdat, *lastprid, *laststid);
> >
> > rval = (*efunc)(pdat, arg);
> >
> > @@ -2569,14 +2570,15 @@ dt_consume_one_probe(dtrace_hdl_t *dtp, FILE *fp, char *data, uint32_t size,
> > }
> >
> > /*
> > - * Call the record callback with a NULL record to indicate
> > - * that we're done processing this EPID. The return value is ignored in
> > - * this case. XXX should we respect at least DTRACE_CONSUME_ABORT?
> > + * Call the record callback with a NULL record to indicate that we're
> > + * done processing this record. The return value is ignored in this
> > + * case. XXX should we respect at least DTRACE_CONSUME_ABORT?
> > */
> > if (data_recording) {
> > (*rfunc)(pdat, NULL, arg);
> >
> > - *last = epid;
> > + *lastprid = prid;
> > + *laststid = stid;
> > }
> >
> > /*
> > @@ -2597,7 +2599,7 @@ dt_consume_one_probe(dtrace_hdl_t *dtp, FILE *fp, char *data, uint32_t size,
> > if ((ret = dt_commit_one_spec(dtp, fp, dtsb,
> > pdat, efunc, rfunc,
> > flow, quiet, peekflags,
> > - last, arg)) !=
> > + lastprid, laststid, arg)) !=
> > DTRACE_WORKSTATUS_OKAY) {
> > dt_spec_buf_data_destroy(dtp, dtsb);
> > return ret;
> > @@ -2623,7 +2625,7 @@ static dtrace_workstatus_t
> > dt_consume_one(dtrace_hdl_t *dtp, FILE *fp, char *buf,
> > dtrace_probedata_t *pdat, dtrace_consume_probe_f *efunc,
> > dtrace_consume_rec_f *rfunc, int flow, int quiet, int peekflags,
> > - dtrace_epid_t *last, void *arg)
> > + dtrace_id_t *lastprid, dtrace_stid_t *laststid, void *arg)
> > {
> > char *data = buf;
> > struct perf_event_header *hdr;
> > @@ -2639,9 +2641,9 @@ dt_consume_one(dtrace_hdl_t *dtp, FILE *fp, char *buf,
> > * struct {
> > * struct perf_event_header header;
> > * uint32_t size;
> > - * uint32_t pad;
> > - * uint32_t epid;
> > * uint32_t specid;
> > + * uint32_t prid;
> > + * uint32_t stid;
> > * uint64_t data[n];
> > * }
> > * and 'data' points to the 'size' member at this point.
> > @@ -2651,17 +2653,21 @@ dt_consume_one(dtrace_hdl_t *dtp, FILE *fp, char *buf,
> > return dt_set_errno(dtp, EDT_DSIZE);
> >
> > size = *(uint32_t *)data;
> > - data += sizeof(size);
> > ptr += sizeof(size) + size;
> > if (ptr != buf + hdr->size)
> > return dt_set_errno(dtp, EDT_DSIZE);
> >
> > - data += sizeof(uint32_t); /* skip padding */
> > - size -= sizeof(uint32_t);
> > + /*
> > + * "size" measures from after &size to the end. But buffer
> > + * offsets are relative to &size itself, to preserve 8-byte
> > + * alignment. So, we leave data pointing at &size, and we
> > + * increase size by 4 bytes.
> > + */
> > + size += 4;
> >
> > return dt_consume_one_probe(dtp, fp, data, size, pdat, efunc,
> > rfunc, flow, quiet, peekflags,
> > - last, 0, arg);
> > + lastprid, laststid, 0, arg);
> > } else if (hdr->type == PERF_RECORD_LOST) {
> > return DTRACE_WORKSTATUS_OKAY;
> > } else
> > @@ -2692,7 +2698,8 @@ dt_consume_cpu(dtrace_hdl_t *dtp, FILE *fp, dt_peb_t *peb,
> > {
> > struct perf_event_mmap_page *rb_page = (void *)peb->base;
> > struct perf_event_header *hdr;
> > - dtrace_epid_t last = DTRACE_EPIDNONE;
> > + dtrace_id_t lastprid;
> > + dtrace_stid_t laststid;
> > char *base;
> > char *event;
> > uint32_t len;
> > @@ -2764,7 +2771,7 @@ dt_consume_cpu(dtrace_hdl_t *dtp, FILE *fp, dt_peb_t *peb,
> > }
> >
> > rval = dt_consume_one(dtp, fp, event, &pdat, efunc, rfunc, flow,
> > - quiet, peekflags, &last, arg);
> > + quiet, peekflags, &lastprid, &laststid, arg);
> > if (rval == DTRACE_WORKSTATUS_DONE)
> > return DTRACE_WORKSTATUS_OKAY;
> > if (rval != DTRACE_WORKSTATUS_OKAY)
> > diff --git a/libdtrace/dt_dctx.h b/libdtrace/dt_dctx.h
> > index d8232868d..beb037072 100644
> > --- a/libdtrace/dt_dctx.h
> > +++ b/libdtrace/dt_dctx.h
> > @@ -25,9 +25,8 @@
> > * The DTrace machine state.
> > */
> > typedef struct dt_mstate {
> > - uint32_t epid; /* Enabled probe ID */
> > uint32_t prid; /* Probe ID */
> > - uint32_t clid; /* Clause ID (unique per probe) */
> > + uint32_t stid; /* Statement ID */
> > uint32_t tag; /* Tag (for future use) */
> > uint32_t scratch_top; /* Current top of scratch space */
> > int32_t syscall_errno; /* syscall errno */
> > @@ -41,9 +40,8 @@ typedef struct dt_mstate {
> > uint64_t saved_argv[6]; /* Saved arguments */
> > } dt_mstate_t;
> >
> > -#define DMST_EPID offsetof(dt_mstate_t, epid)
> > #define DMST_PRID offsetof(dt_mstate_t, prid)
> > -#define DMST_CLID offsetof(dt_mstate_t, clid)
> > +#define DMST_STID offsetof(dt_mstate_t, stid)
> > #define DMST_TAG offsetof(dt_mstate_t, tag)
> > #define DMST_SCRATCH_TOP offsetof(dt_mstate_t, scratch_top)
> > #define DMST_ERRNO offsetof(dt_mstate_t, syscall_errno)
> > @@ -90,16 +88,23 @@ typedef struct dt_dctx {
> > * The dctx->buf pointer references a block of memory that contains:
> > *
> > * +----------------+
> > - * 0 -> | EPID |
> > + * 0 -> | size |
> > * +----------------+
> > - * 4 -> | Speculation ID |
> > + * 4 -> | Speculation ID |
> > * +----------------+
> > - * | Trace Data |
> > + * 8 -> | PRID |
> > + * +----------------+
> > + * 12 -> | STID |
> > + * +----------------+
> > + * 16 -> | Trace Data |
> > * | ... |
> > * +----------------+
> > */
> > -#define DBUF_EPID 0
> > +#define DBUF_SIZE 0
> > #define DBUF_SPECID 4
> > +#define DBUF_PRID 8
> > +#define DBUF_STID 12
> > +#define DBUF_DATA 16
> >
> > /*
> > * The dctx->mem pointer references a block of memory that contains:
> > diff --git a/libdtrace/dt_dlibs.c b/libdtrace/dt_dlibs.c
> > index bc883e110..ba4d4abef 100644
> > --- a/libdtrace/dt_dlibs.c
> > +++ b/libdtrace/dt_dlibs.c
> > @@ -73,9 +73,7 @@ static const dt_ident_t dt_bpf_symbols[] = {
> > DT_BPF_SYMBOL(tuples, DT_IDENT_PTR),
> >
> > /* BPF internal identifiers */
> > - DT_BPF_SYMBOL_ID(EPID, DT_IDENT_SCALAR, DT_CONST_EPID),
> > DT_BPF_SYMBOL_ID(PRID, DT_IDENT_SCALAR, DT_CONST_PRID),
> > - DT_BPF_SYMBOL_ID(CLID, DT_IDENT_SCALAR, DT_CONST_CLID),
> > DT_BPF_SYMBOL_ID(ARGC, DT_IDENT_SCALAR, DT_CONST_ARGC),
> > DT_BPF_SYMBOL_ID(STBSZ, DT_IDENT_SCALAR, DT_CONST_STBSZ),
> > DT_BPF_SYMBOL_ID(STRSZ, DT_IDENT_SCALAR, DT_CONST_STRSZ),
> > diff --git a/libdtrace/dt_error.c b/libdtrace/dt_error.c
> > index dbf18c766..16a605d3f 100644
> > --- a/libdtrace/dt_error.c
> > +++ b/libdtrace/dt_error.c
> > @@ -54,7 +54,7 @@ static const struct {
> > { EDT_DOFFSET, "Data record offset exceeds buffer boundary" },
> > { EDT_DALIGN, "Data record has inappropriate alignment" },
> > { EDT_DSIZE, "Data record has incorrect size" },
> > - { EDT_BADEPID, "Invalid EPID" },
> > + { EDT_BADSTID, "Invalid statement ID" },
> > { EDT_BADOPTNAME, "Invalid option name" },
> > { EDT_BADOPTVAL, "Invalid value for specified option" },
> > { EDT_BADOPTCTX, "Option cannot be used from within a D program" },
> > diff --git a/libdtrace/dt_handle.c b/libdtrace/dt_handle.c
> > index 4c9b94132..468dde546 100644
> > --- a/libdtrace/dt_handle.c
> > +++ b/libdtrace/dt_handle.c
> > @@ -14,6 +14,7 @@
> > #include <alloca.h>
> >
> > #include <dt_impl.h>
> > +#include <dt_probe.h>
> > #include <dt_program.h>
> >
> > static const char _dt_errprog[] =
> > @@ -127,9 +128,9 @@ dt_handle_err(dtrace_hdl_t *dtp, dtrace_probedata_t *data)
> > dtrace_datadesc_t *dd = data->dtpda_ddesc, *errdd;
> > dtrace_probedesc_t *pd = data->dtpda_pdesc, *errpd;
> > dtrace_errdata_t err;
> > - dtrace_epid_t epid;
> > + dtrace_id_t prid;
> > + dtrace_stid_t stid;
> >
> > - char where[30];
> > char details[30];
> > char offinfo[30];
> > const int slop = 80;
> > @@ -144,34 +145,32 @@ dt_handle_err(dtrace_hdl_t *dtp, dtrace_probedata_t *data)
> > return dt_set_errno(dtp, EDT_BADERROR);
> >
> > /*
> > - * This is an error. We have the following items here: EPID,
> > - * faulting action, BPF pc, fault code and faulting address.
> > + * This is an error. We have the following items here: PRID,
> > + * statement ID, BPF pc, fault code and faulting address.
> > */
> > - epid = (uint32_t)DT_REC(uint64_t, 0);
> > + prid = DT_REC(uint64_t, 0);
> > + stid = DT_REC(uint64_t, 1);
> >
> > - if (dt_epid_lookup(dtp, epid, &errdd, &errpd) != 0)
> > + if (prid > dtp->dt_probe_id)
> > return dt_set_errno(dtp, EDT_BADERROR);
> > -
> > + if (dt_stid_lookup(dtp, stid, &errdd) != 0)
> > + return dt_set_errno(dtp, EDT_BADERROR);
> > + errpd = (dtrace_probedesc_t *)dtp->dt_probes[prid]->desc;
> > err.dteda_ddesc = errdd;
> > err.dteda_pdesc = errpd;
> > err.dteda_cpu = data->dtpda_cpu;
> > - err.dteda_action = (int)DT_REC(uint64_t, 1);
> > + err.dteda_action = stid;
> > err.dteda_offset = (int)DT_REC(uint64_t, 2);
> > err.dteda_fault = (int)DT_REC(uint64_t, 3);
> > err.dteda_addr = DT_REC(uint64_t, 4);
> >
> > faultstr = dtrace_faultstr(dtp, err.dteda_fault);
Pre-existing, but faultstr is not needed if you use asprintf() below. And
without asprintf(), faultstr should be used in the sprintf() below rather
than calling dtrace_faultstr() a 2nd time.
> > - len = sizeof(where) + sizeof(offinfo) + strlen(faultstr) +
> > + len = sizeof(offinfo) + strlen(faultstr) +
> > strlen(errpd->prv) + strlen(errpd->mod) + strlen(errpd->fun) +
> > strlen(errpd->prb) + slop;
> >
> > str = (char *)alloca(len);
> >
> > - if (err.dteda_action == 0)
> > - sprintf(where, "predicate");
> > - else
> > - sprintf(where, "action #%d", err.dteda_action);
> > -
> > if (err.dteda_offset != -1)
> > sprintf(offinfo, " at BPF pc %d", err.dteda_offset);
>
> Pre-existing, but this should probably use asprintf() and avoid the constant
> size limit. Especially since the sprintf() is potentially dangerous because
> it should at least have been snprintf().
>
> > else
> > @@ -195,11 +194,12 @@ no_addr:
> > details[0] = 0;
> > }
>
> Pre-existing, but this should probably use asprintf() and avoid the constant
> size limit. Especially since the sprintf() is potentially dangerous because
> it should at least have been snprintf().
>
> >
> > - snprintf(str, len, "error on enabled probe ID %u (ID %u: %s:%s:%s:%s): "
> > - "%s%s in %s%s",
> > - epid, errpd->id, errpd->prv, errpd->mod, errpd->fun,
> > + snprintf(str, len, "error in %s for probe ID %u (%s:%s:%s:%s): "
> > + "%s%s%s",
> > + dtp->dt_stmts[stid]->dtsd_clause->di_name,
> > + errpd->id, errpd->prv, errpd->mod, errpd->fun,
> > errpd->prb, dtrace_faultstr(dtp, err.dteda_fault), details,
> > - where, offinfo);
> > + offinfo);
>
> This definitely should use asprintf() (and free the string at the end), because
> of the potential for buffer overwrite due to the fixed size of len. Yes, in
> reality we know that all the strings being copied into the output string will
> be bound correctly, but it is still a risk if someone changing this code and
> makes a calculation mistake. Using asprintf() will avoid all that.
>
> Also an unsafe indexing of dtp->dt_stmts,
>
> >
> > err.dteda_msg = str;
> >
> > @@ -256,8 +256,9 @@ dt_handle_liberr(dtrace_hdl_t *dtp, const dtrace_probedata_t *data,
> > str = alloca(len);
> >
> > snprintf(str, len,
> > - "error on enabled probe ID %u (ID %u: %s:%s:%s:%s): %s",
> > - data->dtpda_epid, errpd->id, errpd->prv, errpd->mod,
> > + "error in %s for probe ID %u (%s:%s:%s:%s): %s",
> > + dtp->dt_stmts[data->dtpda_stid]->dtsd_clause->di_name,
> > + errpd->id, errpd->prv, errpd->mod,
> > errpd->fun, errpd->prb, faultstr);
>
> Same as above... Use asprintf() to avoid the risk of buffer overrun at some
> point.
>
> Also an unsafe indexing of dtp->dt_stmts,
>
> > err.dteda_msg = str;
> > diff --git a/libdtrace/dt_impl.h b/libdtrace/dt_impl.h
> > index e073fe2a0..b8f0ca366 100644
> > --- a/libdtrace/dt_impl.h
> > +++ b/libdtrace/dt_impl.h
> > @@ -271,10 +271,11 @@ struct dtrace_hdl {
> > const char *dt_errtag; /* tag used with last call to dt_set_errmsg() */
> > dt_pcb_t *dt_pcb; /* pointer to current parsing control block */
> > ulong_t dt_gen; /* compiler generation number */
> > - uint_t dt_clause_nextid; /* next ID to use for programs */
> > + uint_t dt_stmt_nextid; /* next ID to use for statements */
> > dt_list_t dt_programs; /* linked list of dtrace_prog_t's */
> > dt_list_t dt_xlators; /* linked list of dt_xlator_t's */
> > dt_list_t dt_enablings; /* list of (to be) enabled probes */
> > + dtrace_stmtdesc_t **dt_stmts; /* array of stmts */
> > struct dt_xlator **dt_xlatormap; /* dt_xlator_t's indexed by dx_id */
> > id_t dt_xlatorid; /* next dt_xlator_t id to assign */
> > dt_ident_t *dt_externs; /* linked list of external symbol identifiers */
> > @@ -341,10 +342,6 @@ struct dtrace_hdl {
> > ctf_id_t dt_type_symaddr; /* cached CTF identifier for _symaddr type */
> > ctf_id_t dt_type_usymaddr; /* cached CTF ident. for _usymaddr type */
> > ctf_id_t dt_type_void; /* cached CTF identifier for void type */
> > - dtrace_epid_t dt_nextepid; /* next enabled probe ID to assign */
> > - size_t dt_maxprobe; /* max enabled probe ID */
> > - dtrace_datadesc_t **dt_ddesc; /* probe data descriptions */
> > - dtrace_probedesc_t **dt_pdesc; /* probe descriptions for enabled prbs */
> > size_t dt_maxagg; /* max aggregation ID */
> > dtrace_aggdesc_t **dt_adesc; /* aggregation descriptions */
> > struct dt_aggregate *dt_aggregate; /* aggregate */
> > @@ -604,7 +601,7 @@ enum {
> > EDT_DOFFSET, /* record data offset error */
> > EDT_DALIGN, /* record data alignment error */
> > EDT_DSIZE, /* record data size error */
> > - EDT_BADEPID, /* invalid enabled probe id */
> > + EDT_BADSTID, /* invalid statement id */
> > EDT_BADOPTNAME, /* invalid dtrace_setopt option name */
> > EDT_BADOPTVAL, /* invalid dtrace_setopt option value */
> > EDT_BADOPTCTX, /* invalid dtrace_setopt option context */
> > @@ -771,11 +768,7 @@ extern dtrace_datadesc_t *dt_datadesc_hold(dtrace_datadesc_t *ddp);
> > extern void dt_datadesc_release(dtrace_hdl_t *, dtrace_datadesc_t *);
> > extern dtrace_datadesc_t *dt_datadesc_create(dtrace_hdl_t *);
> > extern int dt_datadesc_finalize(dtrace_hdl_t *, dtrace_datadesc_t *);
> > -extern dtrace_epid_t dt_epid_add(dtrace_hdl_t *, dtrace_datadesc_t *,
> > - dtrace_id_t);
> > -extern int dt_epid_lookup(dtrace_hdl_t *, dtrace_epid_t, dtrace_datadesc_t **,
> > - dtrace_probedesc_t **);
> > -extern void dt_epid_destroy(dtrace_hdl_t *);
> > +extern int dt_stid_lookup(dtrace_hdl_t *, dtrace_stid_t, dtrace_datadesc_t **);
> > typedef void (*dt_cg_gap_f)(dt_pcb_t *, int);
> > extern uint32_t dt_rec_add(dtrace_hdl_t *, dt_cg_gap_f, dtrace_actkind_t,
> > uint32_t, uint16_t, dt_pfargv_t *, uint64_t);
> > diff --git a/libdtrace/dt_map.c b/libdtrace/dt_map.c
> > index 60a2eca2e..50d0aaa75 100644
> > --- a/libdtrace/dt_map.c
> > +++ b/libdtrace/dt_map.c
> > @@ -85,98 +85,18 @@ dt_datadesc_finalize(dtrace_hdl_t *dtp, dtrace_datadesc_t *ddp)
> > return 0;
> > }
> >
> > -/*
> > - * Associate a probe data description and probe description with an enabled
> > - * probe ID. This means that the given ID refers to the program matching the
> > - * probe data description being attached to the probe that matches the probe
> > - * description.
> > - */
> > -dtrace_epid_t
> > -dt_epid_add(dtrace_hdl_t *dtp, dtrace_datadesc_t *ddp, dtrace_id_t prid)
> > -{
> > - dtrace_id_t max = dtp->dt_maxprobe;
> > - dtrace_epid_t epid;
> > -
> > - epid = dtp->dt_nextepid++;
> > - if (epid >= max || dtp->dt_ddesc == NULL) {
> > - dtrace_id_t nmax = max ? (max << 1) : 2;
> > - dtrace_datadesc_t **nddesc;
> > - dtrace_probedesc_t **npdesc;
> > -
> > - nddesc = dt_calloc(dtp, nmax, sizeof(void *));
> > - npdesc = dt_calloc(dtp, nmax, sizeof(void *));
> > - if (nddesc == NULL || npdesc == NULL) {
> > - dt_free(dtp, nddesc);
> > - dt_free(dtp, npdesc);
> > - return dt_set_errno(dtp, EDT_NOMEM);
> > - }
> > -
> > - if (dtp->dt_ddesc != NULL) {
> > - size_t osize = max * sizeof(void *);
> > -
> > - memcpy(nddesc, dtp->dt_ddesc, osize);
> > - dt_free(dtp, dtp->dt_ddesc);
> > - memcpy(npdesc, dtp->dt_pdesc, osize);
> > - dt_free(dtp, dtp->dt_pdesc);
> > - }
> > -
> > - dtp->dt_ddesc = nddesc;
> > - dtp->dt_pdesc = npdesc;
> > - dtp->dt_maxprobe = nmax;
> > - }
> > -
> > - if (dtp->dt_ddesc[epid] != NULL)
> > - return epid;
> > -
> > - dtp->dt_ddesc[epid] = dt_datadesc_hold(ddp);
> > - dtp->dt_pdesc[epid] = (dtrace_probedesc_t *)dtp->dt_probes[prid]->desc;
> > -
> > - return epid;
> > -}
> > -
> > int
> > -dt_epid_lookup(dtrace_hdl_t *dtp, dtrace_epid_t epid, dtrace_datadesc_t **ddp,
> > - dtrace_probedesc_t **pdp)
> > +dt_stid_lookup(dtrace_hdl_t *dtp, dtrace_stid_t stid, dtrace_datadesc_t **ddp)
> > {
> > - if (epid >= dtp->dt_maxprobe ||
> > - dtp->dt_ddesc[epid] == NULL || dtp->dt_pdesc[epid] == NULL)
> > - return -1;
> > -
> > - *ddp = dtp->dt_ddesc[epid];
> > - *pdp = dtp->dt_pdesc[epid];
> > -
> > - return 0;
> > -}
> > -
> > -void
> > -dt_epid_destroy(dtrace_hdl_t *dtp)
> > -{
> > - size_t i;
> > -
> > - assert((dtp->dt_pdesc != NULL && dtp->dt_ddesc != NULL &&
> > - dtp->dt_maxprobe > 0) || (dtp->dt_pdesc == NULL &&
> > - dtp->dt_ddesc == NULL && dtp->dt_maxprobe == 0));
> > -
> > - if (dtp->dt_pdesc == NULL)
> > - return;
> > + dtrace_difo_t *rdp;
> >
> > - for (i = 0; i < dtp->dt_maxprobe; i++) {
> > - if (dtp->dt_ddesc[i] == NULL) {
> > - assert(dtp->dt_pdesc[i] == NULL);
> > - continue;
> > - }
> > -
> > - dt_datadesc_release(dtp, dtp->dt_ddesc[i]);
> > - assert(dtp->dt_pdesc[i] != NULL);
> > - }
> > + if (stid >= dtp->dt_stmt_nextid)
> > + return -1;
> >
> > - free(dtp->dt_pdesc);
> > - dtp->dt_pdesc = NULL;
> > + rdp = dt_dlib_get_func_difo(dtp, dtp->dt_stmts[stid]->dtsd_clause);
>
> Unsafe indexing of dtp->dt_stmts,
>
> > + *ddp = rdp->dtdo_ddesc;
> >
> > - free(dtp->dt_ddesc);
> > - dtp->dt_ddesc = NULL;
> > - dtp->dt_nextepid = 0;
> > - dtp->dt_maxprobe = 0;
> > + return (*ddp == NULL) ? -1 : 0;
> > }
> >
> > uint32_t
> > diff --git a/libdtrace/dt_open.c b/libdtrace/dt_open.c
> > index 77ffb6d2b..848141ddc 100644
> > --- a/libdtrace/dt_open.c
> > +++ b/libdtrace/dt_open.c
> > @@ -170,7 +170,7 @@ static const dt_ident_t _dtrace_globals[] = {
> > { "discard", DT_IDENT_ACTFUNC, 0, DT_ACT_DISCARD, DT_ATTR_STABCMN, DT_VERS_1_0,
> > &dt_idops_func, "void(int)" },
> > { "epid", DT_IDENT_SCALAR, 0, DIF_VAR_EPID, DT_ATTR_STABCMN, DT_VERS_1_0,
> > - &dt_idops_type, "uint_t" },
> > + &dt_idops_type, "uint64_t" },
> > { "errno", DT_IDENT_SCALAR, 0, DIF_VAR_ERRNO, DT_ATTR_STABCMN, DT_VERS_1_0,
> > &dt_idops_type, "int" },
> > { "execname", DT_IDENT_SCALAR, 0, DIF_VAR_EXECNAME,
> > @@ -739,8 +739,6 @@ dt_vopen(int version, int flags, int *errp,
> > dt_proc_hash_create(dtp);
> > dt_proc_signal_init(dtp);
> > dtp->dt_proc_fd = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK);
> > - dtp->dt_nextepid = 1;
> > - dtp->dt_maxprobe = 0;
> > if (dt_aggregate_init(dtp) == -1)
> > return set_open_errno(dtp, errp, dtrace_errno(dtp));
> > dtp->dt_vmax = DT_VERS_LATEST;
> > @@ -1303,7 +1301,6 @@ dtrace_close(dtrace_hdl_t *dtp)
> > if (dtp->dt_poll_fd != -1)
> > close(dtp->dt_poll_fd);
> >
> > - dt_epid_destroy(dtp);
> > dt_aggid_destroy(dtp);
> > dt_buffered_destroy(dtp);
> > dt_aggregate_destroy(dtp);
> > diff --git a/libdtrace/dt_program.c b/libdtrace/dt_program.c
> > index 0e2c1e2af..a7c11bbae 100644
> > --- a/libdtrace/dt_program.c
> > +++ b/libdtrace/dt_program.c
> > @@ -100,7 +100,7 @@ dtrace_program_info(dtrace_hdl_t *dtp, dtrace_prog_t *pgp,
> >
> > /*
> > * If there aren't any actions, account for the fact that
> > - * recording the epid will generate a record.
> > + * the default action will generate a record.
> > */
> > dp = dt_dlib_get_func_difo(dtp, stp->ds_desc->dtsd_clause);
> > if (dp != NULL)
> > @@ -165,6 +165,13 @@ dt_prog_stmt(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, dtrace_stmtdesc_t *sdp,
> > dtrace_probedesc_t *pdp = &sdp->dtsd_ecbdesc->dted_probe;
> > int rc;
> >
> > + if (dtp->dt_stmts == NULL) {
> > + dtp->dt_stmts = dt_calloc(dtp, dtp->dt_stmt_nextid, sizeof(dtrace_stmtdesc_t *));
> > + if (dtp->dt_stmts == NULL)
> > + return dt_set_errno(dtp, EDT_NOMEM);
> > + }
> > + dtp->dt_stmts[sdp->dtsd_id] = sdp;
> > +
> > st.cnt = cnt;
> > st.sdp = sdp;
> > rc = dt_probe_iter(dtp, pdp, (dt_probe_f *)dt_stmt_probe, NULL, &st);
> > diff --git a/libdtrace/dtrace.h b/libdtrace/dtrace.h
> > index 09a87977f..0f716cd40 100644
> > --- a/libdtrace/dtrace.h
> > +++ b/libdtrace/dtrace.h
> > @@ -150,6 +150,7 @@ typedef struct dtrace_stmtdesc {
> > dtrace_attribute_t dtsd_descattr; /* probedesc attributes */
> > dtrace_attribute_t dtsd_stmtattr; /* statement attributes */
> > int dtsd_clauseflags; /* clause flags */
> > + int dtsd_id; /* index in dtp->dt_stmts */
> > } dtrace_stmtdesc_t;
> >
> > /* dtsd clause flags */
> > @@ -189,7 +190,7 @@ typedef enum {
> >
> > typedef struct dtrace_probedata {
> > dtrace_hdl_t *dtpda_handle; /* handle to DTrace library */
> > - dtrace_epid_t dtpda_epid; /* enabled probe ID */
> > + dtrace_stid_t dtpda_stid; /* statement ID */
> > dtrace_datadesc_t *dtpda_ddesc; /* probe data description */
> > dtrace_probedesc_t *dtpda_pdesc; /* probe description */
> > unsigned int dtpda_cpu; /* CPU for data */
> > diff --git a/test/demo/builtin/eipd.d b/test/demo/builtin/eipd.d
> > deleted file mode 100644
> > index 659b09406..000000000
> > --- a/test/demo/builtin/eipd.d
> > +++ /dev/null
> > @@ -1,4 +0,0 @@
> > -BEGIN {
> > - trace(epid);
> > - exit(0);
> > -}
> > diff --git a/test/demo/dtrace/error.r b/test/demo/dtrace/error.r
> > index d3904f47a..3c434721a 100644
> > --- a/test/demo/dtrace/error.r
> > +++ b/test/demo/dtrace/error.r
> > @@ -3,4 +3,4 @@
> >
> > -- @@stderr --
> > dtrace: script 'test/demo/dtrace/error.d' matched 2 probes
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/demo/spec/specopen.d b/test/demo/spec/specopen.d
> > index 528d6c254..c510045b8 100644
> > --- a/test/demo/spec/specopen.d
> > +++ b/test/demo/spec/specopen.d
> > @@ -2,7 +2,7 @@
> >
> > /*
> > * Oracle Linux DTrace.
> > - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
> > + * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved.
> > * Licensed under the Universal Permissive License v 1.0 as shown at
> > * http://oss.oracle.com/licenses/upl.
> > */
> > @@ -33,8 +33,7 @@ fbt:::
> > /self->spec/
> > {
> > /*
> > - * A speculate() with no other actions speculates the default action:
> > - * tracing the EPID.
> > + * A speculate() with no other actions speculates the default action.
> > */
> > speculate(self->spec);
> > }
> > diff --git a/test/stress/buffering/tst.resize3-manual.d b/test/stress/buffering/tst.resize3-manual.d
> > index 99589beb0..56c8575dc 100644
> > --- a/test/stress/buffering/tst.resize3-manual.d
> > +++ b/test/stress/buffering/tst.resize3-manual.d
> > @@ -31,7 +31,7 @@ BEGIN
> > BEGIN
> > {
> > speculate(spec);
> > - trace(epid);
> > + trace(12345678);
> > }
> >
> > BEGIN
> > diff --git a/test/stress/buffering/tst.resize3-manual.r b/test/stress/buffering/tst.resize3-manual.r
> > index 43b647c7e..3a1fd5da6 100644
> > --- a/test/stress/buffering/tst.resize3-manual.r
> > +++ b/test/stress/buffering/tst.resize3-manual.r
> > @@ -1,5 +1,5 @@
> > FUNCTION:NAME
> > - :BEGIN 3
> > + :BEGIN 12345678
> > :BEGIN
> >
> > -- @@stderr --
> > diff --git a/test/stress/buffering/tst.resize3.d b/test/stress/buffering/tst.resize3.d
> > index 59fe0b4ae..464bf5660 100644
> > --- a/test/stress/buffering/tst.resize3.d
> > +++ b/test/stress/buffering/tst.resize3.d
> > @@ -27,7 +27,7 @@ BEGIN
> > BEGIN
> > {
> > speculate(spec);
> > - trace(epid);
> > + trace(12345678);
> > }
> >
> > BEGIN
> > diff --git a/test/stress/buffering/tst.resize3.r b/test/stress/buffering/tst.resize3.r
> > index 9c4711589..33384c717 100644
> > --- a/test/stress/buffering/tst.resize3.r
> > +++ b/test/stress/buffering/tst.resize3.r
> > @@ -1,5 +1,5 @@
> > FUNCTION:NAME
> > - :BEGIN 3
> > + :BEGIN 12345678
> > :BEGIN
> >
> > -- @@stderr --
> > diff --git a/test/unittest/actions/setopt/tst.badopt.r b/test/unittest/actions/setopt/tst.badopt.r
> > index 29e39fd43..e2f6d2c3d 100644
> > --- a/test/unittest/actions/setopt/tst.badopt.r
> > +++ b/test/unittest/actions/setopt/tst.badopt.r
> > @@ -1,16 +1,16 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "Nixon" to "1": Invalid option name
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "Nixon" to "1": Invalid option name
> >
> > -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "Harding" to "1": Invalid option name
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "Harding" to "1": Invalid option name
> >
> > -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "Hoover" to "1": Invalid option name
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "Hoover" to "1": Invalid option name
> >
> > -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "Bush" to "1": Invalid option name
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "Bush" to "1": Invalid option name
> >
> > -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "quiet" to "um, no": Invalid value for specified option
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "quiet" to "um, no": Invalid value for specified option
> >
> > -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "aggrate" to "0.5hz": Invalid value for specified option
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "aggrate" to "0.5hz": Invalid value for specified option
> >
> > -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "bufsize" to "1m": Operation illegal when tracing is active
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "bufsize" to "1m": Operation illegal when tracing is active
> >
> > diff --git a/test/unittest/arrays/tst.declared-bounds.runtime_out.r b/test/unittest/arrays/tst.declared-bounds.runtime_out.r
> > index 4917528d5..9ab1ab8da 100644
> > --- a/test/unittest/arrays/tst.declared-bounds.runtime_out.r
> > +++ b/test/unittest/arrays/tst.declared-bounds.runtime_out.r
> > @@ -1,3 +1,3 @@
> > expected run-time error
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): index out of bounds (8) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): index out of bounds (8) at BPF pc NNN
> > diff --git a/test/unittest/codegen/err.deref_0.r b/test/unittest/codegen/err.deref_0.r
> > index 07c1dc52e..812ca4332 100644
> > --- a/test/unittest/codegen/err.deref_0.r
> > +++ b/test/unittest/codegen/err.deref_0.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (0) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address (0) at BPF pc NNN
> > diff --git a/test/unittest/codegen/err.deref_1.r b/test/unittest/codegen/err.deref_1.r
> > index a2ca8ac48..01ca10375 100644
> > --- a/test/unittest/codegen/err.deref_1.r
> > +++ b/test/unittest/codegen/err.deref_1.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (1) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNN
> > diff --git a/test/unittest/codegen/err.deref_i0.r b/test/unittest/codegen/err.deref_i0.r
> > index 07c1dc52e..812ca4332 100644
> > --- a/test/unittest/codegen/err.deref_i0.r
> > +++ b/test/unittest/codegen/err.deref_i0.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (0) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address (0) at BPF pc NNN
> > diff --git a/test/unittest/codegen/err.deref_i1.r b/test/unittest/codegen/err.deref_i1.r
> > index a2ca8ac48..01ca10375 100644
> > --- a/test/unittest/codegen/err.deref_i1.r
> > +++ b/test/unittest/codegen/err.deref_i1.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (1) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNN
> > diff --git a/test/unittest/codegen/err.deref_string-assoc.r b/test/unittest/codegen/err.deref_string-assoc.r
> > index 082779925..5d4a36fff 100644
> > --- a/test/unittest/codegen/err.deref_string-assoc.r
> > +++ b/test/unittest/codegen/err.deref_string-assoc.r
> > @@ -1,3 +1,3 @@
> > 66
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address (1) in action #2 at BPF pc NNN
> > +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNN
> > diff --git a/test/unittest/codegen/err.deref_string-gvar.r b/test/unittest/codegen/err.deref_string-gvar.r
> > index 082779925..5d4a36fff 100644
> > --- a/test/unittest/codegen/err.deref_string-gvar.r
> > +++ b/test/unittest/codegen/err.deref_string-gvar.r
> > @@ -1,3 +1,3 @@
> > 66
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address (1) in action #2 at BPF pc NNN
> > +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNN
> > diff --git a/test/unittest/codegen/err.deref_string-lvar.r b/test/unittest/codegen/err.deref_string-lvar.r
> > index 082779925..5d4a36fff 100644
> > --- a/test/unittest/codegen/err.deref_string-lvar.r
> > +++ b/test/unittest/codegen/err.deref_string-lvar.r
> > @@ -1,3 +1,3 @@
> > 66
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address (1) in action #2 at BPF pc NNN
> > +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNN
> > diff --git a/test/unittest/codegen/err.deref_string-tvar.r b/test/unittest/codegen/err.deref_string-tvar.r
> > index 082779925..5d4a36fff 100644
> > --- a/test/unittest/codegen/err.deref_string-tvar.r
> > +++ b/test/unittest/codegen/err.deref_string-tvar.r
> > @@ -1,3 +1,3 @@
> > 66
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address (1) in action #2 at BPF pc NNN
> > +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNN
> > diff --git a/test/unittest/codegen/err.str_NULL_plus_offset-assoc.r b/test/unittest/codegen/err.str_NULL_plus_offset-assoc.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/codegen/err.str_NULL_plus_offset-assoc.r
> > +++ b/test/unittest/codegen/err.str_NULL_plus_offset-assoc.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/codegen/err.str_NULL_plus_offset-lvar.r b/test/unittest/codegen/err.str_NULL_plus_offset-lvar.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/codegen/err.str_NULL_plus_offset-lvar.r
> > +++ b/test/unittest/codegen/err.str_NULL_plus_offset-lvar.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/codegen/err.str_NULL_plus_offset-tvar.r b/test/unittest/codegen/err.str_NULL_plus_offset-tvar.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/codegen/err.str_NULL_plus_offset-tvar.r
> > +++ b/test/unittest/codegen/err.str_NULL_plus_offset-tvar.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/codegen/err.str_NULL_plus_offset.r b/test/unittest/codegen/err.str_NULL_plus_offset.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/codegen/err.str_NULL_plus_offset.r
> > +++ b/test/unittest/codegen/err.str_NULL_plus_offset.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/disasm/tst.vartab-bvar.r b/test/unittest/disasm/tst.vartab-bvar.r
> > index 06d7c52bb..53e5f6180 100644
> > --- a/test/unittest/disasm/tst.vartab-bvar.r
> > +++ b/test/unittest/disasm/tst.vartab-bvar.r
> > @@ -4,7 +4,7 @@ curthread scl glb r D type (pointer) (size 8)
> > timestamp scl glb r D type (integer) (size 8)
> > vtimestamp scl glb r D type (integer) (size 8)
> > ipl scl glb r D type (integer) (size 4)
> > -epid scl glb r D type (integer) (size 4)
> > +epid scl glb r D type (integer) (size 8)
> > id scl glb r D type (integer) (size 4)
> > arg0 scl glb r D type (integer) (size 8)
> > arg1 scl glb r D type (integer) (size 8)
> > diff --git a/test/unittest/drops/drp.DTRACEDROP_DBLERROR.r b/test/unittest/drops/drp.DTRACEDROP_DBLERROR.r
> > index 9fa54dd94..364e08606 100644
> > --- a/test/unittest/drops/drp.DTRACEDROP_DBLERROR.r
> > +++ b/test/unittest/drops/drp.DTRACEDROP_DBLERROR.r
> > @@ -4,4 +4,4 @@
> > -- @@stderr --
> > dtrace: script 'test/unittest/drops/drp.DTRACEDROP_DBLERROR.d' matched 3 probes
> > dtrace: [DTRACEDROP_DBLERROR] 1 error in ERROR probe enabling
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.d b/test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.d
> > index df3ded2d1..8b7a4d63f 100644
> > --- a/test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.d
> > +++ b/test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.d
> > @@ -1,6 +1,6 @@
> > /*
> > * Oracle Linux DTrace.
> > - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved.
> > + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
> > * Licensed under the Universal Permissive License v 1.0 as shown at
> > * http://oss.oracle.com/licenses/upl.
> > */
> > @@ -15,13 +15,13 @@
> >
> > BEGIN
> > {
> > - myepid = epid;
> > + myid = id;
> > trace(((struct task_struct *)NULL)->pid);
> > exit(1);
> > }
> >
> > ERROR
> > {
> > - exit(arg1 != myepid || arg2 != 1 || arg4 != DTRACEFLT_BADADDR ||
> > + exit(arg1 != myid || arg2 != 0 || arg4 != DTRACEFLT_BADADDR ||
> > arg5 != 0);
> > }
> > diff --git a/test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.r b/test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.r
> > +++ b/test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/error/tst.DTRACEFLT_BADADDR.r b/test/unittest/error/tst.DTRACEFLT_BADADDR.r
> > index b9f5f43c8..ec23cd453 100644
> > --- a/test/unittest/error/tst.DTRACEFLT_BADADDR.r
> > +++ b/test/unittest/error/tst.DTRACEFLT_BADADDR.r
> > @@ -1,6 +1,6 @@
> > -The arguments are 3 1 1 0
> > +The arguments are 1 1 1 0
> > The value of arg4 should be 1
> > The value of arg5 should be 0
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/error/tst.DTRACEFLT_BADADDR2.r b/test/unittest/error/tst.DTRACEFLT_BADADDR2.r
> > index 6c5fa119c..712678d82 100644
> > --- a/test/unittest/error/tst.DTRACEFLT_BADADDR2.r
> > +++ b/test/unittest/error/tst.DTRACEFLT_BADADDR2.r
> > @@ -1,6 +1,6 @@
> > -The arguments are 3 1 1 16384
> > +The arguments are 1 1 1 16384
> > The value of arg4 should be 1
> > The value of arg5 should be 16384
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.d b/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.d
> > index bcd5e9aab..b1d154239 100644
> > --- a/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.d
> > +++ b/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.d
> > @@ -1,6 +1,6 @@
> > /*
> > * Oracle Linux DTrace.
> > - * Copyright (c) 2006, 2022, Oracle and/or its affiliates. All rights reserved.
> > + * Copyright (c) 2006, 2024, Oracle and/or its affiliates. All rights reserved.
> > * Licensed under the Universal Permissive License v 1.0 as shown at
> > * http://oss.oracle.com/licenses/upl.
> > */
> > @@ -13,9 +13,14 @@
> >
> > #pragma D option quiet
> >
> > +BEGIN { myid = id } /* clause 0 */
> > +BEGIN { myid = id } /* clause 1 */
> > +BEGIN { myid = id } /* clause 2 */
> > +BEGIN { myid = id } /* clause 3 */
> > +
> > BEGIN
> > {
> > - myepid = epid;
> > + myid = id;
> > i = 1;
> > j = 2;
> > j = i / (j - 2);
> > @@ -24,6 +29,6 @@ BEGIN
> >
> > ERROR
> > {
> > - exit(arg1 != myepid || arg2 != 1 || arg4 != DTRACEFLT_DIVZERO ||
> > + exit(arg1 != myid || arg2 != 4 || arg4 != DTRACEFLT_DIVZERO ||
> > arg5 != 0);
> > }
> > diff --git a/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.r b/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.r
> > index e6d6afa2f..45a787e5c 100644
> > --- a/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.r
> > +++ b/test/unittest/error/tst.DTRACEFLT_DIVZERO.div.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): divide-by-zero in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_4 for probe ID 1 (dtrace:::BEGIN): divide-by-zero at BPF pc NNN
> > diff --git a/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.d b/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.d
> > index 105523f82..69452d8c5 100644
> > --- a/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.d
> > +++ b/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.d
> > @@ -1,6 +1,6 @@
> > /*
> > * Oracle Linux DTrace.
> > - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved.
> > + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
> > * Licensed under the Universal Permissive License v 1.0 as shown at
> > * http://oss.oracle.com/licenses/upl.
> > */
> > @@ -13,9 +13,14 @@
> >
> > #pragma D option quiet
> >
> > +BEGIN { myid = id; } /* clause 0 */
> > +BEGIN { myid = id; } /* clause 1 */
> > +BEGIN { myid = id; } /* clause 2 */
> > +BEGIN { myid = id; } /* clause 3 */
> > +
> > BEGIN
> > {
> > - myepid = epid;
> > + myid = id;
> > i = 1;
> > j = 2;
> > j = i % (j - 2);
> > @@ -24,6 +29,6 @@ BEGIN
> >
> > ERROR
> > {
> > - exit(arg1 != myepid || arg2 != 1 || arg4 != DTRACEFLT_DIVZERO ||
> > + exit(arg1 != myid || arg2 != 4 || arg4 != DTRACEFLT_DIVZERO ||
> > arg5 != 0);
> > }
> > diff --git a/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.r b/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.r
> > index e6d6afa2f..45a787e5c 100644
> > --- a/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.r
> > +++ b/test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): divide-by-zero in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_4 for probe ID 1 (dtrace:::BEGIN): divide-by-zero at BPF pc NNN
> > diff --git a/test/unittest/error/tst.DTRACEFLT_UNKNOWN.r b/test/unittest/error/tst.DTRACEFLT_UNKNOWN.r
> > index 1e4fdd644..caa5570f7 100644
> > --- a/test/unittest/error/tst.DTRACEFLT_UNKNOWN.r
> > +++ b/test/unittest/error/tst.DTRACEFLT_UNKNOWN.r
> > @@ -1,5 +1,5 @@
> > -The arguments are 3 1 PC 1 64
> > +The arguments are 1 1 PC 1 64
> > The value of arg4 = 0
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/error/tst.clause_scope-begin-ended.r b/test/unittest/error/tst.clause_scope-begin-ended.r
> > index 8d57382ee..e806cc809 100644
> > --- a/test/unittest/error/tst.clause_scope-begin-ended.r
> > +++ b/test/unittest/error/tst.clause_scope-begin-ended.r
> > @@ -2,4 +2,4 @@ Error fired
> > Clause executed
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/error/tst.clause_scope-begin.r b/test/unittest/error/tst.clause_scope-begin.r
> > index 8d57382ee..e806cc809 100644
> > --- a/test/unittest/error/tst.clause_scope-begin.r
> > +++ b/test/unittest/error/tst.clause_scope-begin.r
> > @@ -2,4 +2,4 @@ Error fired
> > Clause executed
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/error/tst.clause_scope-regular.r b/test/unittest/error/tst.clause_scope-regular.r
> > index fff6fe1e9..d1b71add9 100644
> > --- a/test/unittest/error/tst.clause_scope-regular.r
> > +++ b/test/unittest/error/tst.clause_scope-regular.r
> > @@ -2,4 +2,4 @@ Error fired
> > Clause executed
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID nnn: profile:::tick-10ms): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_1 for probe ID nnn (profile:::tick-10ms): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/error/tst.clause_scope-regular.r.p b/test/unittest/error/tst.clause_scope-regular.r.p
> > index 7659601b7..f7a200c46 100755
> > --- a/test/unittest/error/tst.clause_scope-regular.r.p
> > +++ b/test/unittest/error/tst.clause_scope-regular.r.p
> > @@ -1,3 +1,7 @@
> > -#!/bin/sed -f
> > +#!/usr/bin/awk -f
> > +
> > # This report has a variable probe ID in it.
> > -s/ID [0-9][0-9]*: profile/ID nnn: profile/
> > +{
> > + sub("for probe ID [0-9][0-9]* .profile", "for probe ID nnn (profile");
> > + print;
> > +}
> > diff --git a/test/unittest/error/tst.error.r b/test/unittest/error/tst.error.r
> > index 0d29bcc8d..d9f80037e 100644
> > --- a/test/unittest/error/tst.error.r
> > +++ b/test/unittest/error/tst.error.r
> > @@ -1,4 +1,4 @@
> > Error fired
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/error/tst.errorend.r b/test/unittest/error/tst.errorend.r
> > index 73abf6976..9c07fa700 100644
> > --- a/test/unittest/error/tst.errorend.r
> > +++ b/test/unittest/error/tst.errorend.r
> > @@ -2,4 +2,4 @@ Error fired
> > End fired after exit
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_2 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/alloca/err.alloca-bcopy-before-beyond.r b/test/unittest/funcs/alloca/err.alloca-bcopy-before-beyond.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/alloca/err.alloca-bcopy-before-beyond.r
> > +++ b/test/unittest/funcs/alloca/err.alloca-bcopy-before-beyond.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/alloca/err.alloca-bcopy-before-bottom.r b/test/unittest/funcs/alloca/err.alloca-bcopy-before-bottom.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/alloca/err.alloca-bcopy-before-bottom.r
> > +++ b/test/unittest/funcs/alloca/err.alloca-bcopy-before-bottom.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/alloca/err.alloca-bcopy-beyond-top.r b/test/unittest/funcs/alloca/err.alloca-bcopy-beyond-top.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/alloca/err.alloca-bcopy-beyond-top.r
> > +++ b/test/unittest/funcs/alloca/err.alloca-bcopy-beyond-top.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/alloca/err.alloca-bcopy-crossing-bottom.r b/test/unittest/funcs/alloca/err.alloca-bcopy-crossing-bottom.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/alloca/err.alloca-bcopy-crossing-bottom.r
> > +++ b/test/unittest/funcs/alloca/err.alloca-bcopy-crossing-bottom.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/alloca/err.alloca-bcopy-crossing-top.r b/test/unittest/funcs/alloca/err.alloca-bcopy-crossing-top.r
> > index 4257f5679..fab8ca7f5 100644
> > --- a/test/unittest/funcs/alloca/err.alloca-bcopy-crossing-top.r
> > +++ b/test/unittest/funcs/alloca/err.alloca-bcopy-crossing-top.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/alloca/err.alloca-crossing-clauses.r b/test/unittest/funcs/alloca/err.alloca-crossing-clauses.r
> > index f5ff855de..6bea5653f 100644
> > --- a/test/unittest/funcs/alloca/err.alloca-crossing-clauses.r
> > +++ b/test/unittest/funcs/alloca/err.alloca-crossing-clauses.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #2 at BPF pc NNN
> > +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/alloca/err.alloca-load-before-bottom.r b/test/unittest/funcs/alloca/err.alloca-load-before-bottom.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/alloca/err.alloca-load-before-bottom.r
> > +++ b/test/unittest/funcs/alloca/err.alloca-load-before-bottom.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/alloca/err.alloca-load-beyond-top.r b/test/unittest/funcs/alloca/err.alloca-load-beyond-top.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/alloca/err.alloca-load-beyond-top.r
> > +++ b/test/unittest/funcs/alloca/err.alloca-load-beyond-top.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/alloca/err.alloca-load-crossing-bottom.r b/test/unittest/funcs/alloca/err.alloca-load-crossing-bottom.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/alloca/err.alloca-load-crossing-bottom.r
> > +++ b/test/unittest/funcs/alloca/err.alloca-load-crossing-bottom.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/alloca/err.alloca-null-deref-lvalue.r b/test/unittest/funcs/alloca/err.alloca-null-deref-lvalue.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/alloca/err.alloca-null-deref-lvalue.r
> > +++ b/test/unittest/funcs/alloca/err.alloca-null-deref-lvalue.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/alloca/err.alloca-null-deref.r b/test/unittest/funcs/alloca/err.alloca-null-deref.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/alloca/err.alloca-null-deref.r
> > +++ b/test/unittest/funcs/alloca/err.alloca-null-deref.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/alloca/err.alloca-scratch-exceeding-bcopy.r b/test/unittest/funcs/alloca/err.alloca-scratch-exceeding-bcopy.r
> > index 4257f5679..fab8ca7f5 100644
> > --- a/test/unittest/funcs/alloca/err.alloca-scratch-exceeding-bcopy.r
> > +++ b/test/unittest/funcs/alloca/err.alloca-scratch-exceeding-bcopy.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/alloca/err.alloca-store-before-bottom.r b/test/unittest/funcs/alloca/err.alloca-store-before-bottom.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/alloca/err.alloca-store-before-bottom.r
> > +++ b/test/unittest/funcs/alloca/err.alloca-store-before-bottom.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/alloca/err.alloca-store-beyond-top.r b/test/unittest/funcs/alloca/err.alloca-store-beyond-top.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/alloca/err.alloca-store-beyond-top.r
> > +++ b/test/unittest/funcs/alloca/err.alloca-store-beyond-top.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/alloca/err.alloca-store-crossing-bottom.r b/test/unittest/funcs/alloca/err.alloca-store-crossing-bottom.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/alloca/err.alloca-store-crossing-bottom.r
> > +++ b/test/unittest/funcs/alloca/err.alloca-store-crossing-bottom.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/bcopy/err.badbcopy1.r b/test/unittest/funcs/bcopy/err.badbcopy1.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/bcopy/err.badbcopy1.r
> > +++ b/test/unittest/funcs/bcopy/err.badbcopy1.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/bcopy/err.badbcopy4.r b/test/unittest/funcs/bcopy/err.badbcopy4.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/bcopy/err.badbcopy4.r
> > +++ b/test/unittest/funcs/bcopy/err.badbcopy4.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/bcopy/err.badbcopy5.r b/test/unittest/funcs/bcopy/err.badbcopy5.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/bcopy/err.badbcopy5.r
> > +++ b/test/unittest/funcs/bcopy/err.badbcopy5.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/bcopy/err.badbcopy6.r b/test/unittest/funcs/bcopy/err.badbcopy6.r
> > index 4257f5679..fab8ca7f5 100644
> > --- a/test/unittest/funcs/bcopy/err.badbcopy6.r
> > +++ b/test/unittest/funcs/bcopy/err.badbcopy6.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/bcopy/err.badbcopy7.r b/test/unittest/funcs/bcopy/err.badbcopy7.r
> > index 4257f5679..fab8ca7f5 100644
> > --- a/test/unittest/funcs/bcopy/err.badbcopy7.r
> > +++ b/test/unittest/funcs/bcopy/err.badbcopy7.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/bcopy/err.badbcopy8.r b/test/unittest/funcs/bcopy/err.badbcopy8.r
> > index 4257f5679..fab8ca7f5 100644
> > --- a/test/unittest/funcs/bcopy/err.badbcopy8.r
> > +++ b/test/unittest/funcs/bcopy/err.badbcopy8.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/copyin/err.badaddr.r b/test/unittest/funcs/copyin/err.badaddr.r
> > index ba4a46953..7b0c59496 100644
> > --- a/test/unittest/funcs/copyin/err.badaddr.r
> > +++ b/test/unittest/funcs/copyin/err.badaddr.r
> > @@ -3,4 +3,4 @@
> >
> > -- @@stderr --
> > dtrace: script 'test/unittest/funcs/copyin/err.badaddr.d' matched 2 probes
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/copyin/err.null_arg1.r b/test/unittest/funcs/copyin/err.null_arg1.r
> > index a806d1077..270dc9ce9 100644
> > --- a/test/unittest/funcs/copyin/err.null_arg1.r
> > +++ b/test/unittest/funcs/copyin/err.null_arg1.r
> > @@ -3,4 +3,4 @@
> >
> > -- @@stderr --
> > dtrace: script 'test/unittest/funcs/copyin/err.null_arg1.d' matched 2 probes
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/copyinstr/err.badaddr.r b/test/unittest/funcs/copyinstr/err.badaddr.r
> > index 0f566d6e1..6f3419796 100644
> > --- a/test/unittest/funcs/copyinstr/err.badaddr.r
> > +++ b/test/unittest/funcs/copyinstr/err.badaddr.r
> > @@ -3,4 +3,4 @@
> >
> > -- @@stderr --
> > dtrace: script 'test/unittest/funcs/copyinstr/err.badaddr.d' matched 2 probes
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/copyinstr/err.null_arg1.r b/test/unittest/funcs/copyinstr/err.null_arg1.r
> > index cdd7c22c5..cac3de0ef 100644
> > --- a/test/unittest/funcs/copyinstr/err.null_arg1.r
> > +++ b/test/unittest/funcs/copyinstr/err.null_arg1.r
> > @@ -3,4 +3,4 @@
> >
> > -- @@stderr --
> > dtrace: script 'test/unittest/funcs/copyinstr/err.null_arg1.d' matched 2 probes
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/copyinto/err.badaddr.r b/test/unittest/funcs/copyinto/err.badaddr.r
> > index 11861e1fb..c86debc07 100644
> > --- a/test/unittest/funcs/copyinto/err.badaddr.r
> > +++ b/test/unittest/funcs/copyinto/err.badaddr.r
> > @@ -3,4 +3,4 @@
> >
> > -- @@stderr --
> > dtrace: script 'test/unittest/funcs/copyinto/err.badaddr.d' matched 2 probes
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/copyinto/err.badsize.r b/test/unittest/funcs/copyinto/err.badsize.r
> > index ec4b062ec..1be8abf4a 100644
> > --- a/test/unittest/funcs/copyinto/err.badsize.r
> > +++ b/test/unittest/funcs/copyinto/err.badsize.r
> > @@ -3,4 +3,4 @@
> >
> > -- @@stderr --
> > dtrace: script 'test/unittest/funcs/copyinto/err.badsize.d' matched 2 probes
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/copyinto/err.null_arg1.r b/test/unittest/funcs/copyinto/err.null_arg1.r
> > index f568ee5c1..215e0f19a 100644
> > --- a/test/unittest/funcs/copyinto/err.null_arg1.r
> > +++ b/test/unittest/funcs/copyinto/err.null_arg1.r
> > @@ -3,4 +3,4 @@
> >
> > -- @@stderr --
> > dtrace: script 'test/unittest/funcs/copyinto/err.null_arg1.d' matched 2 probes
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/err.badalloca.r b/test/unittest/funcs/err.badalloca.r
> > index 302243300..078630b65 100644
> > --- a/test/unittest/funcs/err.badalloca.r
> > +++ b/test/unittest/funcs/err.badalloca.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 4 (ID NNN: profile:::tick-1): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_1 for probe ID NNN (profile:::tick-1): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/err.badalloca.r.p b/test/unittest/funcs/err.badalloca.r.p
> > index d7a88a396..93d0acfbd 100755
> > --- a/test/unittest/funcs/err.badalloca.r.p
> > +++ b/test/unittest/funcs/err.badalloca.r.p
> > @@ -1,3 +1,7 @@
> > -#!/bin/sed -f
> > +#!/usr/bin/awk -f
> >
> > -s/(ID [0-9]*/(ID NNN/g
> > +# This report has a variable probe ID in it.
> > +{
> > + sub("for probe ID [0-9]* .profile", "for probe ID NNN (profile");
> > + print;
> > +}
> > diff --git a/test/unittest/funcs/err.link_ntopbadaddr.r b/test/unittest/funcs/err.link_ntopbadaddr.r
> > index b798b5e05..5acdfe612 100644
> > --- a/test/unittest/funcs/err.link_ntopbadaddr.r
> > +++ b/test/unittest/funcs/err.link_ntopbadaddr.r
> > @@ -1,3 +1,3 @@
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> >
> > diff --git a/test/unittest/funcs/err.link_ntopbadarg.r b/test/unittest/funcs/err.link_ntopbadarg.r
> > index e386a67c5..32c13ddec 100644
> > --- a/test/unittest/funcs/err.link_ntopbadarg.r
> > +++ b/test/unittest/funcs/err.link_ntopbadarg.r
> > @@ -1,3 +1,3 @@
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): illegal operation in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): illegal operation at BPF pc NNN
> >
> > diff --git a/test/unittest/funcs/inet_ntoa6/err.inet_ntoa6.arg1_null.r b/test/unittest/funcs/inet_ntoa6/err.inet_ntoa6.arg1_null.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/inet_ntoa6/err.inet_ntoa6.arg1_null.r
> > +++ b/test/unittest/funcs/inet_ntoa6/err.inet_ntoa6.arg1_null.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/inet_ntoa6/err.inet_ntoa6.arg1_null_const.r b/test/unittest/funcs/inet_ntoa6/err.inet_ntoa6.arg1_null_const.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/inet_ntoa6/err.inet_ntoa6.arg1_null_const.r
> > +++ b/test/unittest/funcs/inet_ntoa6/err.inet_ntoa6.arg1_null_const.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/strlen/tst.null.r b/test/unittest/funcs/strlen/tst.null.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/strlen/tst.null.r
> > +++ b/test/unittest/funcs/strlen/tst.null.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/strtok/tst.strtok_null.r b/test/unittest/funcs/strtok/tst.strtok_null.r
> > index 03226aa12..319af487b 100644
> > --- a/test/unittest/funcs/strtok/tst.strtok_null.r
> > +++ b/test/unittest/funcs/strtok/tst.strtok_null.r
> > @@ -3,4 +3,4 @@
> >
> > -- @@stderr --
> > dtrace: script 'test/unittest/funcs/strtok/tst.strtok_null.d' matched 2 probes
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/strtok/tst.strtok_nulldel.r b/test/unittest/funcs/strtok/tst.strtok_nulldel.r
> > index 70f8e4e2d..82bbba199 100644
> > --- a/test/unittest/funcs/strtok/tst.strtok_nulldel.r
> > +++ b/test/unittest/funcs/strtok/tst.strtok_nulldel.r
> > @@ -3,4 +3,4 @@
> >
> > -- @@stderr --
> > dtrace: script 'test/unittest/funcs/strtok/tst.strtok_nulldel.d' matched 2 probes
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/strtok/tst.strtok_nullstr.r b/test/unittest/funcs/strtok/tst.strtok_nullstr.r
> > index a57b24693..1183b2bd5 100644
> > --- a/test/unittest/funcs/strtok/tst.strtok_nullstr.r
> > +++ b/test/unittest/funcs/strtok/tst.strtok_nullstr.r
> > @@ -3,4 +3,4 @@
> >
> > -- @@stderr --
> > dtrace: script 'test/unittest/funcs/strtok/tst.strtok_nullstr.d' matched 2 probes
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/strtok/tst.strtok_nullstr2.r b/test/unittest/funcs/strtok/tst.strtok_nullstr2.r
> > index d7df3acac..082e0e0ce 100644
> > --- a/test/unittest/funcs/strtok/tst.strtok_nullstr2.r
> > +++ b/test/unittest/funcs/strtok/tst.strtok_nullstr2.r
> > @@ -4,4 +4,4 @@
> >
> > -- @@stderr --
> > dtrace: script 'test/unittest/funcs/strtok/tst.strtok_nullstr2.d' matched 4 probes
> > -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #2 at BPF pc NNN
> > +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/funcs/substr/err.substr_null_arg1.r b/test/unittest/funcs/substr/err.substr_null_arg1.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/funcs/substr/err.substr_null_arg1.r
> > +++ b/test/unittest/funcs/substr/err.substr_null_arg1.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/pointers/err.AllocaOverrun.r b/test/unittest/pointers/err.AllocaOverrun.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/pointers/err.AllocaOverrun.r
> > +++ b/test/unittest/pointers/err.AllocaOverrun.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/pointers/err.BadAlign.r b/test/unittest/pointers/err.BadAlign.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/pointers/err.BadAlign.r
> > +++ b/test/unittest/pointers/err.BadAlign.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/pointers/err.InvalidAddress2.r b/test/unittest/pointers/err.InvalidAddress2.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/pointers/err.InvalidAddress2.r
> > +++ b/test/unittest/pointers/err.InvalidAddress2.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/pointers/err.InvalidAddress4.r b/test/unittest/pointers/err.InvalidAddress4.r
> > index 187543b63..fa9c63a9e 100644
> > --- a/test/unittest/pointers/err.InvalidAddress4.r
> > +++ b/test/unittest/pointers/err.InvalidAddress4.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
> > diff --git a/test/unittest/speculation/err.CommitWithInvalid.r b/test/unittest/speculation/err.CommitWithInvalid.r
> > index fc072417d..0449b2421 100644
> > --- a/test/unittest/speculation/err.CommitWithInvalid.r
> > +++ b/test/unittest/speculation/err.CommitWithInvalid.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): illegal operation in action #2 at BPF pc NNN
> > +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): illegal operation at BPF pc NNN
> > diff --git a/test/unittest/speculation/err.DiscardWithInvalid.r b/test/unittest/speculation/err.DiscardWithInvalid.r
> > index fc072417d..0449b2421 100644
> > --- a/test/unittest/speculation/err.DiscardWithInvalid.r
> > +++ b/test/unittest/speculation/err.DiscardWithInvalid.r
> > @@ -1,3 +1,3 @@
> >
> > -- @@stderr --
> > -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): illegal operation in action #2 at BPF pc NNN
> > +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): illegal operation at BPF pc NNN
> > diff --git a/test/unittest/speculation/tst.SpecSizeVariations.r b/test/unittest/speculation/tst.SpecSizeVariations.r
> > index 51f0596c6..2748b307d 100644
> > --- a/test/unittest/speculation/tst.SpecSizeVariations.r
> > +++ b/test/unittest/speculation/tst.SpecSizeVariations.r
> > @@ -11,26 +11,6 @@ Speculative buffer ID: 1
> > 123456706
> > counts: 1 1
> >
> > -Speculative buffer ID: 1
> > -123456700
> > -123456701
> > -123456702
> > -123456703
> > -123456704
> > -123456705
> > -123456706
> > -counts: 1 1
> > -
> > -Speculative buffer ID: 1
> > -123456700
> > -123456701
> > -123456702
> > -123456703
> > -123456704
> > -123456705
> > -123456706
> > -counts: 2 1
> > -
> > Speculative buffer ID: 1
> > 123456700
> > 123456701
> > @@ -64,5 +44,3 @@ counts: 2 1
> > dtrace: 2 speculative drops
> > dtrace: 1 speculative drop
> > dtrace: 1 speculative drop
> > -dtrace: 1 speculative drop
> > -dtrace: 1 speculative drop
> > diff --git a/test/unittest/speculation/tst.SpecSizeVariations.sh b/test/unittest/speculation/tst.SpecSizeVariations.sh
> > index 75e527d9f..79995b597 100755
> > --- a/test/unittest/speculation/tst.SpecSizeVariations.sh
> > +++ b/test/unittest/speculation/tst.SpecSizeVariations.sh
> > @@ -9,7 +9,7 @@
> >
> > dtrace=$1
> >
> > -for x in 63 64 79 80 143 144; do
> > +for x in 71 72 159 160; do
> > $dtrace $dt_flags -xspecsize=$x -qn '
> > BEGIN
> > {
> > diff --git a/test/unittest/speculation/tst.negcommit.r b/test/unittest/speculation/tst.negcommit.r
> > index 69f246a01..cf8fb6f87 100644
> > --- a/test/unittest/speculation/tst.negcommit.r
> > +++ b/test/unittest/speculation/tst.negcommit.r
> > @@ -3,4 +3,4 @@
> >
> > -- @@stderr --
> > dtrace: script 'test/unittest/speculation/tst.negcommit.d' matched 2 probes
> > -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): illegal operation in action #1 at BPF pc NNN
> > +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): illegal operation at BPF pc NNN
> > diff --git a/test/unittest/variables/bvar/tst.arg3-ERROR-b.sh b/test/unittest/variables/bvar/tst.arg3-ERROR-b.sh
> > index 94a9ab9ac..2f6e51c3b 100755
> > --- a/test/unittest/variables/bvar/tst.arg3-ERROR-b.sh
> > +++ b/test/unittest/variables/bvar/tst.arg3-ERROR-b.sh
> > @@ -59,7 +59,7 @@ awk 'BEGIN {
> > next;
> > }
> >
> > - /error on enabled probe/ {
> > + /error in dt_clause_/ {
> > if (!($NF in sites)) {
> > print;
> > print " No call to dt_probe_error found at PC " $NF;
> > diff --git a/test/unittest/variables/bvar/tst.arg3-ERROR.sh b/test/unittest/variables/bvar/tst.arg3-ERROR.sh
> > index 4f2c70f38..38cb38df9 100755
> > --- a/test/unittest/variables/bvar/tst.arg3-ERROR.sh
> > +++ b/test/unittest/variables/bvar/tst.arg3-ERROR.sh
> > @@ -120,7 +120,7 @@ done
> >
> > # Do a sanity check on DTrace's error output.
> >
> > -awk '/^dtrace: error on enabled probe ID [0-9]* \(ID 1: dtrace:::BEGIN): invalid address \(0x40) in action #[0-9] at BPF pc [0-9]*$/ { print $NF }' \
> > +awk '/^dtrace: error in dt_clause_[1-4] for probe ID 1 \(dtrace:::BEGIN): invalid address \(0x40) at BPF pc [0-9]*$/ { print $NF }' \
> > disasm.out > err_pcs.txt.chk1
> > if ! diff -q err_pcs.txt err_pcs.txt.chk1; then
> > echo ERROR: problem with DTrace error output
> > --
> > 2.43.5
> >
More information about the DTrace-devel
mailing list