[DTrace-devel] [PATCH] Manage clause flags

Kris Van Hees kris.van.hees at oracle.com
Fri Apr 2 22:12:05 PDT 2021


Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>

On Fri, Mar 19, 2021 at 04:21:33PM -0400, eugene.loh at oracle.com wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
> 
> Actions within a clause are subject to a variety of constraints --
> e.g., that a speculate() may not follow a data-recording action.
> An earlier patch ("Add clause flags") started to implement some
> such constraints by tracking clause flags where code for the
> functions was generated.  This costs a lot of duplicate code
> since, for example, all data-recording actions should be treated
> similarly, as should all aggregations.
> 
> Reimplement the management of clause flags.  Specifically,
> 
> - Remove the existing, customized management of dtsd_clauseflags.
> 
> - Remove the dead dt_stmt_append code from dt_cc.c
>   (and inline what little would remain).
> 
> - Add a new dt_cg_clsflags() to dt_cg.c based on the old
>   dt_stmt_append().
> 
>   Note that the old function, if it encountered a commit(), would
>   then look ahead at future actions for an aggregation.  Without
>   such look-ahead capabilities, the new function waits until an
>   aggregation and then looks backwards for a commit().  Either way,
>   an aggregation after a commit() will be caught, but it is
>   conceivable that, in a clause with multiple problems, which
>   problem is flagged will change.
> 
>   Also, handling of destructive actions is not yet complete.
> 
> - Call the new dt_cg_clsflags() before calling the function
>   that generates code for the action.  This means that
>   dt_cg_clsflags() is called from only two sites (one for
>   aggregations and one for not aggregations) rather than
>   from each action function.
> 
>   This also means that _dt_cg_actions[] must be populated
>   with more dtrace_actkind_t values, so that dt_cg_clsflags()
>   knows what sort of action it is dealing with.  On the other
>   hand, the only action kinds that dt_cg_clsflags() cares about
>   are:
>         kind == DTRACEACT_COMMIT
>         kind == DTRACEACT_SPECULATE
>         kind == DTRACEACT_EXIT
>         kind == DTRACEACT_DISCARD
>         kind == DTRACEACT_DIFEXPR
>         DTRACEACT_ISAGG(kind)
>         DTRACEACT_ISDESTRUCTIVE(kind)
>   So, for example, typical data-recording actions can get by
>   with the default kind==0;  also, all aggregations can be
>   handled with kind==DTRACEACT_AGGREGATION.
> 
> - Clean up the tests.  Some previously failing tests now pass.
>   In some cases, this requires removing some indexing, which
>   was not germane to the functionality being tested and has
>   been removed in other recent similar changes.  Make some
>   tests -- like the err.D_AGG_SPEC* tests -- more uniform.
> 
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
> ---
>  libdtrace/dt_cc.c                             | 129 +-----------
>  libdtrace/dt_cg.c                             | 184 ++++++++++++------
>  .../err.D_ACT_SPEC.SpeculateWithBreakPoint.d  |   8 +-
>  .../err.D_ACT_SPEC.SpeculateWithChill.d       |   8 +-
>  .../err.D_ACT_SPEC.SpeculateWithCopyOut.d     |   6 +-
>  .../err.D_ACT_SPEC.SpeculateWithCopyOutStr.d  |   5 +-
>  .../err.D_ACT_SPEC.SpeculateWithPanic.d       |   8 +-
>  .../err.D_ACT_SPEC.SpeculateWithRaise.d       |   7 +-
>  .../err.D_ACT_SPEC.SpeculateWithStop.d        |   7 +-
>  .../speculation/err.D_AGG_COMM.AggAftCommit.d |  14 +-
>  .../err.D_AGG_SPEC.SpeculateWithAvg.d         |  15 +-
>  .../err.D_AGG_SPEC.SpeculateWithCount.d       |  15 +-
>  .../err.D_AGG_SPEC.SpeculateWithLquant.d      |  26 +--
>  .../err.D_AGG_SPEC.SpeculateWithLquant.r      |   2 +-
>  .../err.D_AGG_SPEC.SpeculateWithMax.d         |  10 +-
>  .../err.D_AGG_SPEC.SpeculateWithMin.d         |  10 +-
>  .../err.D_AGG_SPEC.SpeculateWithQuant.d       |  21 +-
>  .../err.D_AGG_SPEC.SpeculateWithQuant.r       |   2 +-
>  .../err.D_AGG_SPEC.SpeculateWithSum.d         |  10 +-
>  .../speculation/tst.SpeculateWithRandom.d     |   9 +-
>  20 files changed, 192 insertions(+), 304 deletions(-)
> 
> diff --git a/libdtrace/dt_cc.c b/libdtrace/dt_cc.c
> index 2fe91ae4..0875fe70 100644
> --- a/libdtrace/dt_cc.c
> +++ b/libdtrace/dt_cc.c
> @@ -133,129 +133,6 @@ dt_stmt_create(dtrace_hdl_t *dtp, dtrace_ecbdesc_t *edp,
>  	return sdp;
>  }
>  
> -#ifdef FIXME
> -/*
> - * Utility function to determine if a given action description is destructive.
> - * The DIFOFLG_DESTRUCTIVE bit is set for us by the DIF assembler (see dt_as.c).
> - */
> -static int
> -dt_action_destructive(const dtrace_actdesc_t *ap)
> -{
> -	return (DTRACEACT_ISDESTRUCTIVE(ap->dtad_kind) ||
> -		(ap->dtad_kind == DTRACEACT_DIFEXPR &&
> -		 (ap->dtad_difo->dtdo_flags & DIFOFLG_DESTRUCTIVE)));
> -}
> -#endif
> -
> -static void
> -dt_stmt_append(dtrace_stmtdesc_t *sdp, const dt_node_t *dnp)
> -{
> -#ifdef FIXME
> -	dtrace_ecbdesc_t *edp = sdp->dtsd_ecbdesc;
> -	dtrace_actdesc_t *ap, *tap;
> -	int commit = 0;
> -	int speculate = 0;
> -	int datarec = 0;
> -
> -	/*
> -	 * Make sure that the new statement jibes with the rest of the ECB.
> -	 * FIXME: Eliminate this code once it's incorporated elsewhere.
> -	 */
> -	for (ap = edp->dted_action; ap != NULL; ap = ap->dtad_next) {
> -		if (ap->dtad_kind == DTRACEACT_COMMIT) {
> -			if (commit) {
> -				dnerror(dnp, D_COMM_COMM, "commit( ) may "
> -				    "not follow commit( )\n");
> -			}
> -
> -			if (datarec) {
> -				dnerror(dnp, D_COMM_DREC, "commit( ) may "
> -				    "not follow data-recording action(s)\n");
> -			}
> -
> -			for (tap = ap; tap != NULL; tap = tap->dtad_next) {
> -				if (!DTRACEACT_ISAGG(tap->dtad_kind))
> -					continue;
> -
> -				dnerror(dnp, D_AGG_COMM, "aggregating actions "
> -				    "may not follow commit( )\n");
> -			}
> -
> -			commit = 1;
> -			continue;
> -		}
> -
> -		if (ap->dtad_kind == DTRACEACT_SPECULATE) {
> -			if (speculate) {
> -				dnerror(dnp, D_SPEC_SPEC, "speculate( ) may "
> -				    "not follow speculate( )\n");
> -			}
> -
> -			if (commit) {
> -				dnerror(dnp, D_SPEC_COMM, "speculate( ) may "
> -				    "not follow commit( )\n");
> -			}
> -
> -			if (datarec) {
> -				dnerror(dnp, D_SPEC_DREC, "speculate( ) may "
> -				    "not follow data-recording action(s)\n");
> -			}
> -
> -			speculate = 1;
> -			continue;
> -		}
> -
> -		if (DTRACEACT_ISAGG(ap->dtad_kind)) {
> -			if (speculate) {
> -				dnerror(dnp, D_AGG_SPEC, "aggregating actions "
> -				    "may not follow speculate( )\n");
> -			}
> -
> -			datarec = 1;
> -			continue;
> -		}
> -
> -		if (speculate) {
> -			if (dt_action_destructive(ap)) {
> -				dnerror(dnp, D_ACT_SPEC, "destructive actions "
> -				    "may not follow speculate( )\n");
> -			}
> -
> -			if (ap->dtad_kind == DTRACEACT_EXIT) {
> -				dnerror(dnp, D_EXIT_SPEC, "exit( ) may not "
> -				    "follow speculate( )\n");
> -			}
> -		}
> -
> -		/*
> -		 * Exclude all non data-recording actions.
> -		 */
> -		if (dt_action_destructive(ap) ||
> -		    ap->dtad_kind == DTRACEACT_DISCARD)
> -			continue;
> -
> -		if (ap->dtad_kind == DTRACEACT_DIFEXPR &&
> -		    ap->dtad_difo->dtdo_rtype.dtdt_kind == DIF_TYPE_CTF &&
> -		    ap->dtad_difo->dtdo_rtype.dtdt_size == 0)
> -			continue;
> -
> -		if (commit) {
> -			dnerror(dnp, D_DREC_COMM, "data-recording actions "
> -			    "may not follow commit( )\n");
> -		}
> -
> -		if (!speculate)
> -			datarec = 1;
> -	}
> -#endif
> -
> -	if (dtrace_stmt_add(yypcb->pcb_hdl, yypcb->pcb_prog, sdp) != 0)
> -		longjmp(yypcb->pcb_jmpbuf, dtrace_errno(yypcb->pcb_hdl));
> -
> -	if (yypcb->pcb_stmt == sdp)
> -		yypcb->pcb_stmt = NULL;
> -}
> -
>  #ifdef FIXME
>  /*
>   * For the first element of an aggregation tuple or for printa(), we create a
> @@ -1644,7 +1521,11 @@ dt_compile_one_clause(dtrace_hdl_t *dtp, dt_node_t *cnp, dt_node_t *pnp)
>  	sdp->dtsd_clause = dt_clause_create(dtp, dt_as(yypcb));
>  
>  	assert(yypcb->pcb_stmt == sdp);
> -	dt_stmt_append(sdp, cnp);
> +	if (dtrace_stmt_add(yypcb->pcb_hdl, yypcb->pcb_prog, sdp) != 0)
> +		longjmp(yypcb->pcb_jmpbuf, dtrace_errno(yypcb->pcb_hdl));
> +
> +	if (yypcb->pcb_stmt == sdp)
> +		yypcb->pcb_stmt = NULL;
>  
>  	assert(yypcb->pcb_ecbdesc == edp);
>  	dt_ecbdesc_release(dtp, edp);
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index 27b32c87..c6443b63 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -770,6 +770,104 @@ dt_cg_store_val(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind,
>  	return -1;
>  }
>  
> +#ifdef FIXME
> +/*
> + * Utility function to determine if a given action description is destructive.
> + * The DIFOFLG_DESTRUCTIVE bit is set for us by the DIF assembler (see dt_as.c).
> + */
> +static int
> +dt_action_destructive(const dtrace_actdesc_t *ap)
> +{
> +	return (DTRACEACT_ISDESTRUCTIVE(ap->dtad_kind) ||
> +		(ap->dtad_kind == DTRACEACT_DIFEXPR &&
> +		 (ap->dtad_difo->dtdo_flags & DIFOFLG_DESTRUCTIVE)));
> +}
> +#endif
> +
> +static void
> +dt_cg_clsflags(dt_pcb_t *pcb, dtrace_actkind_t kind, const dt_node_t *dnp)
> +{
> +	int		*cfp = &pcb->pcb_stmt->dtsd_clauseflags;
> +
> +	if (kind == DTRACEACT_COMMIT) {
> +		if (*cfp & DT_CLSFLAG_COMMIT)
> +			dnerror(dnp, D_COMM_COMM,
> +			    "commit( ) may not follow commit( )\n");
> +		if (*cfp & DT_CLSFLAG_DATAREC)
> +			dnerror(dnp, D_COMM_DREC, "commit( ) may "
> +			    "not follow data-recording action(s)\n");
> +
> +		*cfp |= DT_CLSFLAG_COMMIT;
> +		return;
> +	}
> +
> +	if (kind == DTRACEACT_SPECULATE) {
> +		if (*cfp & DT_CLSFLAG_SPECULATE)
> +			dnerror(dnp, D_SPEC_SPEC,
> +			    "speculate( ) may not follow speculate( )\n");
> +
> +		if (*cfp & DT_CLSFLAG_COMMIT)
> +			dnerror(dnp, D_SPEC_COMM,
> +			    "speculate( ) may not follow commit( )\n");
> +
> +		if (*cfp & DT_CLSFLAG_DATAREC)
> +			dnerror(dnp, D_SPEC_DREC, "speculate( ) may "
> +			    "not follow data-recording action(s)\n");
> +
> +		*cfp |= DT_CLSFLAG_SPECULATE;
> +		return;
> +	}
> +
> +	if (DTRACEACT_ISAGG(kind)) {
> +		if (*cfp & DT_CLSFLAG_COMMIT)
> +			dnerror(dnp, D_AGG_COMM,
> +			    "aggregating actions may not follow commit( )\n");
> +		if (*cfp & DT_CLSFLAG_SPECULATE)
> +			dnerror(dnp, D_AGG_SPEC, "aggregating actions "
> +			    "may not follow speculate( )\n");
> +
> +		*cfp |= DT_CLSFLAG_DATAREC;
> +		return;
> +	}
> +
> +	if (*cfp & DT_CLSFLAG_SPECULATE) {
> +#ifdef FIXME
> +		if (dt_action_destructive(ap))
> +#else
> +		if (DTRACEACT_ISDESTRUCTIVE(kind))
> +#endif
> +			dnerror(dnp, D_ACT_SPEC, "destructive actions "
> +			    "may not follow speculate( )\n");
> +		if (kind == DTRACEACT_EXIT)
> +			dnerror(dnp, D_EXIT_SPEC,
> +			    "exit( ) may not follow speculate( )\n");
> +	}
> +
> +	/*
> +	 * Exclude all non data-recording actions.
> +	 */
> +#ifdef FIXME
> +	if (dt_action_destructive(ap) || kind == DTRACEACT_DISCARD)
> +#else
> +	if (DTRACEACT_ISDESTRUCTIVE(kind) || kind == DTRACEACT_DISCARD)
> +#endif
> +		return;
> +
> +#ifdef FIXME
> +	if (kind == DTRACEACT_DIFEXPR &&
> +	    ap->dtad_difo->dtdo_rtype.dtdt_kind == DIF_TYPE_CTF &&
> +	    ap->dtad_difo->dtdo_rtype.dtdt_size == 0)
> +		return;
> +#endif
> +
> +	if (*cfp & DT_CLSFLAG_COMMIT)
> +		dnerror(dnp, D_DREC_COMM,
> +		    "data-recording actions may not follow commit( )\n");
> +
> +	if (!(*cfp & DT_CLSFLAG_SPECULATE))
> +		*cfp |= DT_CLSFLAG_DATAREC;
> +}
> +
>  static void
>  dt_cg_act_breakpoint(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
>  {
> @@ -828,16 +926,6 @@ dt_cg_act_commit(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
>  {
>  	dt_irlist_t	*dlp = &pcb->pcb_ir;
>  	uint_t		off;
> -	int		*cfp = &pcb->pcb_stmt->dtsd_clauseflags;
> -
> -	/* process clause flags */
> -	if (*cfp & DT_CLSFLAG_COMMIT)
> -		dnerror(dnp, D_COMM_COMM,
> -		    "commit( ) may not follow commit( )\n");
> -	if (*cfp & DT_CLSFLAG_DATAREC)
> -		dnerror(dnp, D_COMM_DREC,
> -		    "commit( ) may not follow data-recording action(s)\n");
> -	*cfp |= DT_CLSFLAG_COMMIT;
>  
>  	dt_cg_node(dnp->dn_args, &pcb->pcb_ir, pcb->pcb_regs);
>  
> @@ -908,16 +996,6 @@ dt_cg_act_exit(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
>  {
>  	dt_irlist_t	*dlp = &pcb->pcb_ir;
>  	dt_ident_t	*state = dt_dlib_get_map(pcb->pcb_hdl, "state");
> -	int		*cfp = &pcb->pcb_stmt->dtsd_clauseflags;
> -
> -	/* process clause flags */
> -	if (*cfp & DT_CLSFLAG_SPECULATE)
> -		dnerror(dnp, D_EXIT_SPEC,
> -		    "exit( ) may not follow speculate( )\n");
> -	if (*cfp & DT_CLSFLAG_COMMIT)
> -		dnerror(dnp, D_DREC_COMM,
> -		    "data-recording actions may not follow commit( )\n");
> -	*cfp |= DT_CLSFLAG_EXIT | DT_CLSFLAG_DATAREC;
>  
>  	/* Record the exit code. */
>  	dt_cg_store_val(pcb, dnp->dn_args, DTRACEACT_EXIT, NULL, DT_ACT_EXIT);
> @@ -1013,13 +1091,6 @@ dt_cg_act_printa(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
>  	int		argc = 0, argr;
>  	char		n[DT_TYPE_NAMELEN];
>  	dt_ident_t	*aid, *fid;
> -	int		*cfp = &pcb->pcb_stmt->dtsd_clauseflags;
> -
> -	/* process clause flags */
> -	if (*cfp & DT_CLSFLAG_COMMIT)
> -		dnerror(dnp, D_DREC_COMM,
> -		    "data-recording actions may not follow commit( )\n");
> -	*cfp |= DT_CLSFLAG_DATAREC;
>  
>  	/* Count the arguments. */
>  	for (anp = dnp->dn_args; anp != NULL; anp = anp->dn_list)
> @@ -1096,13 +1167,6 @@ dt_cg_act_printf(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
>  	dt_pfargv_t	*pfp;
>  	char		n[DT_TYPE_NAMELEN];
>  	char		*str;
> -	int		*cfp = &pcb->pcb_stmt->dtsd_clauseflags;
> -
> -	/* process clause flags */
> -	if (*cfp & DT_CLSFLAG_COMMIT)
> -		dnerror(dnp, D_DREC_COMM,
> -		    "data-recording actions may not follow commit( )\n");
> -	*cfp |= DT_CLSFLAG_DATAREC;
>  
>  	/*
>  	 * Ensure that the format string is a string constant.
> @@ -1226,19 +1290,6 @@ dt_cg_act_speculate(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
>  {
>  	dt_irlist_t	*dlp = &pcb->pcb_ir;
>  	uint_t		off;
> -	int		*cfp = &pcb->pcb_stmt->dtsd_clauseflags;
> -
> -	/* process clause flags */
> -	if (*cfp & DT_CLSFLAG_SPECULATE)
> -		dnerror(dnp, D_SPEC_SPEC,
> -		    "speculate( ) may not follow speculate( )\n");
> -	if (*cfp & DT_CLSFLAG_COMMIT)
> -		dnerror(dnp, D_SPEC_COMM,
> -		    "speculate( ) may not follow commit( )\n");
> -	if (*cfp & DT_CLSFLAG_DATAREC)
> -		dnerror(dnp, D_SPEC_DREC,
> -		    "speculate( ) may not follow data-recording action(s)\n");
> -	*cfp |= DT_CLSFLAG_SPECULATE;
>  
>  	dt_cg_node(dnp->dn_args, &pcb->pcb_ir, pcb->pcb_regs);
>  
> @@ -1287,13 +1338,6 @@ dt_cg_act_trace(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
>  	char		n[DT_TYPE_NAMELEN];
>  	dt_node_t	*arg = dnp->dn_args;
>  	int		type = 0;
> -	int		*cfp = &pcb->pcb_stmt->dtsd_clauseflags;
> -
> -	/* process clause flags */
> -	if (*cfp & DT_CLSFLAG_COMMIT)
> -		dnerror(dnp, D_DREC_COMM,
> -		        "data-recording actions may not follow commit( )\n");
> -	*cfp |= DT_CLSFLAG_DATAREC;
>  
>  	if (dt_node_is_void(arg))
>  		dnerror(arg, D_TRACE_VOID,
> @@ -1417,17 +1461,26 @@ static const dt_cg_actdesc_t _dt_cg_actions[DT_ACT_MAX] = {
>  	[DT_ACT_IDX(DT_ACT_TRACE)]		= { &dt_cg_act_trace, },
>  	[DT_ACT_IDX(DT_ACT_TRACEMEM)]		= { &dt_cg_act_tracemem, },
>  	[DT_ACT_IDX(DT_ACT_STACK)]		= { &dt_cg_act_stack, },
> -	[DT_ACT_IDX(DT_ACT_STOP)]		= { &dt_cg_act_stop, },
> -	[DT_ACT_IDX(DT_ACT_BREAKPOINT)]		= { &dt_cg_act_breakpoint, },
> -	[DT_ACT_IDX(DT_ACT_PANIC)]		= { &dt_cg_act_panic, },
> -	[DT_ACT_IDX(DT_ACT_SPECULATE)]		= { &dt_cg_act_speculate, },
> -	[DT_ACT_IDX(DT_ACT_COMMIT)]		= { &dt_cg_act_commit, },
> -	[DT_ACT_IDX(DT_ACT_DISCARD)]		= { &dt_cg_act_discard, },
> -	[DT_ACT_IDX(DT_ACT_CHILL)]		= { &dt_cg_act_chill, },
> -	[DT_ACT_IDX(DT_ACT_EXIT)]		= { &dt_cg_act_exit, },
> +	[DT_ACT_IDX(DT_ACT_STOP)]		= { &dt_cg_act_stop,
> +						    DTRACEACT_STOP },
> +	[DT_ACT_IDX(DT_ACT_BREAKPOINT)]		= { &dt_cg_act_breakpoint,
> +						    DTRACEACT_BREAKPOINT },
> +	[DT_ACT_IDX(DT_ACT_PANIC)]		= { &dt_cg_act_panic,
> +						    DTRACEACT_PANIC },
> +	[DT_ACT_IDX(DT_ACT_SPECULATE)]		= { &dt_cg_act_speculate,
> +						    DTRACEACT_SPECULATE },
> +	[DT_ACT_IDX(DT_ACT_COMMIT)]		= { &dt_cg_act_commit,
> +						    DTRACEACT_COMMIT },
> +	[DT_ACT_IDX(DT_ACT_DISCARD)]		= { &dt_cg_act_discard,
> +						    DTRACEACT_DISCARD },
> +	[DT_ACT_IDX(DT_ACT_CHILL)]		= { &dt_cg_act_chill,
> +						    DTRACEACT_CHILL },
> +	[DT_ACT_IDX(DT_ACT_EXIT)]		= { &dt_cg_act_exit,
> +						    DTRACEACT_EXIT },
>  	[DT_ACT_IDX(DT_ACT_USTACK)]		= { &dt_cg_act_ustack, },
>  	[DT_ACT_IDX(DT_ACT_PRINTA)]		= { &dt_cg_act_printa, },
> -	[DT_ACT_IDX(DT_ACT_RAISE)]		= { &dt_cg_act_raise, },
> +	[DT_ACT_IDX(DT_ACT_RAISE)]		= { &dt_cg_act_raise,
> +						    DTRACEACT_RAISE },
>  	[DT_ACT_IDX(DT_ACT_CLEAR)]		= { &dt_cg_act_clear, },
>  	[DT_ACT_IDX(DT_ACT_NORMALIZE)]		= { &dt_cg_act_normalize, },
>  	[DT_ACT_IDX(DT_ACT_DENORMALIZE)]	= { &dt_cg_act_denormalize, },
> @@ -4533,6 +4586,7 @@ dt_cg_agg(dt_pcb_t *pcb, dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
>  
>  	assert(fid->di_id >= DT_AGG_BASE && fid->di_id < DT_AGG_HIGHEST);
>  
> +	dt_cg_clsflags(pcb, DTRACEACT_AGGREGATION, dnp);
>  	aggfp = _dt_cg_agg[DT_AGG_IDX(fid->di_id)];
>  	assert(aggfp != NULL);
>  
> @@ -4588,9 +4642,11 @@ dt_cg(dt_pcb_t *pcb, dt_node_t *dnp)
>  
>  				idp = act->dn_expr->dn_ident;
>  				actdp = &_dt_cg_actions[DT_ACT_IDX(idp->di_id)];
> -				if (actdp->fun)
> +				if (actdp->fun) {
> +					dt_cg_clsflags(pcb, actdp->kind, act);
>  					actdp->fun(pcb, act->dn_expr,
>  						   actdp->kind);
> +				}
>  				break;
>  			}
>  			case DT_NODE_AGG:
> diff --git a/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithBreakPoint.d b/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithBreakPoint.d
> index ebbeb5e9..50bbf177 100644
> --- a/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithBreakPoint.d
> +++ b/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithBreakPoint.d
> @@ -1,18 +1,16 @@
>  #!/usr/sbin/dtrace -ws
>  /*
>   * Oracle Linux DTrace.
> - * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2006, 2021, 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.
>   */
> -/* @@xfail: dtv2 */
> +
>  /*
> - * ASSERTION:
> - * Destructive actions may never be speculative.
> + * ASSERTION: Destructive actions may never be speculative.
>   *
>   * SECTION: Speculative Tracing/Using a Speculation
>   * SECTION: dtrace(1M) Utility/ -w option
> - *
>   */
>  #pragma D option quiet
>  
> diff --git a/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithChill.d b/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithChill.d
> index 13d0f3e3..47e248d2 100644
> --- a/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithChill.d
> +++ b/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithChill.d
> @@ -1,18 +1,16 @@
>  #!/usr/sbin/dtrace -ws
>  /*
>   * Oracle Linux DTrace.
> - * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2006, 2021, 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.
>   */
> -/* @@xfail: dtv2 */
> +
>  /*
> - * ASSERTION:
> - * Destructive actions may never be speculative.
> + * ASSERTION: Destructive actions may never be speculative.
>   *
>   * SECTION: Speculative Tracing/Using a Speculation
>   * SECTION: dtrace (1M) Utility/ -w option
> - *
>   */
>  #pragma D option quiet
>  
> diff --git a/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithCopyOut.d b/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithCopyOut.d
> index 08caeb4d..aae3e4ff 100644
> --- a/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithCopyOut.d
> +++ b/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithCopyOut.d
> @@ -1,18 +1,16 @@
>  #!/usr/sbin/dtrace -ws
>  /*
>   * Oracle Linux DTrace.
> - * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2006, 2021, 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.
>   */
>  /* @@xfail: dtv2 */
>  /*
> - * ASSERTION:
> - * Destructive actions may never be speculative.
> + * ASSERTION: Destructive actions may never be speculative.
>   *
>   * SECTION: Speculative Tracing/Using a Speculation
>   * SECTION: dtrace(1M) Utility/ -w option
> - *
>   */
>  #pragma D option quiet
>  
> diff --git a/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithCopyOutStr.d b/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithCopyOutStr.d
> index 00bd6faa..c75d1506 100644
> --- a/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithCopyOutStr.d
> +++ b/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithCopyOutStr.d
> @@ -1,14 +1,13 @@
>  #!/usr/sbin/dtrace -ws
>  /*
>   * Oracle Linux DTrace.
> - * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2006, 2021, 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.
>   */
>  /* @@xfail: dtv2 */
>  /*
> - * ASSERTION:
> - * Destructive actions may never be speculative.
> + * ASSERTION: Destructive actions may never be speculative.
>   *
>   * SECTION: Speculative Tracing/Using a Speculation
>   * SECTION: dtrace(1M) Utility/ -w option
> diff --git a/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithPanic.d b/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithPanic.d
> index fb6d5e21..80a3204d 100644
> --- a/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithPanic.d
> +++ b/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithPanic.d
> @@ -1,18 +1,16 @@
>  #!/usr/sbin/dtrace -ws
>  /*
>   * Oracle Linux DTrace.
> - * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2006, 2021, 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.
>   */
> -/* @@xfail: dtv2 */
> +
>  /*
> - * ASSERTION:
> - * Destructive actions may never be speculative.
> + * ASSERTION: Destructive actions may never be speculative.
>   *
>   * SECTION: Speculative Tracing/Using a Speculation
>   * SECTION: dtrace(1M) Utility/ -w option
> - *
>   */
>  #pragma D option quiet
>  
> diff --git a/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithRaise.d b/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithRaise.d
> index f1d392b1..a8c1c4d4 100644
> --- a/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithRaise.d
> +++ b/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithRaise.d
> @@ -1,14 +1,13 @@
>  #!/usr/sbin/dtrace -ws
>  /*
>   * Oracle Linux DTrace.
> - * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2006, 2021, 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.
>   */
> -/* @@xfail: dtv2 */
> +
>  /*
> - * ASSERTION:
> - * Destructive actions may never be speculative.
> + * ASSERTION: Destructive actions may never be speculative.
>   *
>   * SECTION: Speculative Tracing/Using a Speculation
>   * SECTION: dtrace(1M) Utility/ -w option
> diff --git a/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithStop.d b/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithStop.d
> index 72cf1cfb..a0bca73d 100644
> --- a/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithStop.d
> +++ b/test/unittest/speculation/err.D_ACT_SPEC.SpeculateWithStop.d
> @@ -1,14 +1,13 @@
>  #!/usr/sbin/dtrace -ws
>  /*
>   * Oracle Linux DTrace.
> - * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2006, 2021, 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.
>   */
> -/* @@xfail: dtv2 */
> +
>  /*
> - * ASSERTION:
> - * Destructive actions may never be speculative.
> + * ASSERTION: Destructive actions may never be speculative.
>   *
>   * SECTION: Speculative Tracing/Using a Speculation
>   * SECTION: dtrace(1M) Utility/ -w option
> diff --git a/test/unittest/speculation/err.D_AGG_COMM.AggAftCommit.d b/test/unittest/speculation/err.D_AGG_COMM.AggAftCommit.d
> index bf121a7d..cf007da6 100644
> --- a/test/unittest/speculation/err.D_AGG_COMM.AggAftCommit.d
> +++ b/test/unittest/speculation/err.D_AGG_COMM.AggAftCommit.d
> @@ -1,13 +1,12 @@
>  /*
>   * Oracle Linux DTrace.
> - * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2006, 2021, 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.
>   */
> -/* @@xfail: dtv2 */
> +
>  /*
> - * ASSERTION:
> - * A clause cannot contain a commit() followed by an aggregating action.
> + * ASSERTION: A clause cannot contain a commit() followed by an aggregating action.
>   *
>   * SECTION: Speculative Tracing/Committing a Speculation;
>   */
> @@ -15,5 +14,10 @@
>  BEGIN
>  {
>  	commit(1);
> -	@a["foo"] = count();
> +	@a = count();
> +	exit(1);
> +}
> +ERROR
> +{
> +	exit(1);
>  }
> diff --git a/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithAvg.d b/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithAvg.d
> index 8ed7f115..4c624787 100644
> --- a/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithAvg.d
> +++ b/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithAvg.d
> @@ -1,16 +1,14 @@
>  /*
>   * Oracle Linux DTrace.
> - * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2006, 2021, 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.
>   */
> -/* @@xfail: dtv2 */
> +
>  /*
> - * ASSERTION:
> - * Aggregating actions may never be speculative.
> + * ASSERTION: Aggregating functions may never be speculative.
>   *
>   * SECTION: Speculative Tracing/Using a Speculation
> - *
>   */
>  #pragma D option quiet
>  
> @@ -25,7 +23,7 @@ profile:::tick-1sec
>  	var = speculation();
>  	speculate(var);
>  	printf("Speculation ID: %d", var);
> -	@avrg["speculate"] = avg(i);
> +	@avrg = avg(i);
>  	i++;
>  }
>  
> @@ -39,8 +37,3 @@ ERROR
>  {
>  	exit(0);
>  }
> -
> -END
> -{
> -	exit(0);
> -}
> diff --git a/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithCount.d b/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithCount.d
> index 35e18465..475a6b26 100644
> --- a/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithCount.d
> +++ b/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithCount.d
> @@ -1,16 +1,14 @@
>  /*
>   * Oracle Linux DTrace.
> - * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2006, 2021, 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.
>   */
> -/* @@xfail: dtv2 */
> +
>  /*
> - * ASSERTION:
> - * Aggregating functions may never be speculative.
> + * ASSERTION: Aggregating functions may never be speculative.
>   *
>   * SECTION: Speculative Tracing/Using a Speculation
> - *
>   */
>  #pragma D option quiet
>  
> @@ -25,7 +23,7 @@ profile:::tick-1sec
>  	var = speculation();
>  	speculate(var);
>  	printf("Speculation ID: %d", var);
> -	@counts["speculate"] = count();
> +	@counts = count();
>  	i++;
>  }
>  
> @@ -39,8 +37,3 @@ ERROR
>  {
>  	exit(0);
>  }
> -
> -END
> -{
> -	exit(0);
> -}
> diff --git a/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithLquant.d b/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithLquant.d
> index 91c4f05e..bfd19544 100644
> --- a/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithLquant.d
> +++ b/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithLquant.d
> @@ -1,16 +1,14 @@
>  /*
>   * Oracle Linux DTrace.
> - * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2006, 2021, 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.
>   */
> -/* @@xfail: dtv2 */
> +
>  /*
> - * ASSERTION:
> - * Aggregating functions may never be speculative.
> + * ASSERTION: Aggregating functions may never be speculative.
>   *
>   * SECTION: Speculative Tracing/Using a Speculation
> - *
>   */
>  #pragma D option quiet
>  
> @@ -19,22 +17,17 @@ BEGIN
>  	i = 0;
>  }
>  
> -syscall:::entry
> -{
> -	self->ts = timestamp;
> -}
> -
> -syscall:::return
> -/self->ts/
> +profile:::tick-1sec
> +/i < 1/
>  {
>  	var = speculation();
>  	speculate(var);
>  	printf("Speculation ID: %d", var);
> -	@Lqauntus[execname] = lquantize(timestamp - self->ts, 0, 100, 1);
> +	@Lquantus = lquantize(i, 0, 100, 1);
>  	i++;
>  }
>  
> -syscall:::
> +profile:::tick-1sec
>  /1 == i/
>  {
>  	exit(0);
> @@ -44,8 +37,3 @@ ERROR
>  {
>  	exit(0);
>  }
> -
> -END
> -{
> -	exit(0);
> -}
> diff --git a/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithLquant.r b/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithLquant.r
> index e62f578e..30d3e12f 100644
> --- a/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithLquant.r
> +++ b/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithLquant.r
> @@ -1,2 +1,2 @@
>  -- @@stderr --
> -dtrace: failed to compile script test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithLquant.d: [D_AGG_SPEC] line 33: aggregating actions may not follow speculate( )
> +dtrace: failed to compile script test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithLquant.d: [D_AGG_SPEC] line 28: aggregating actions may not follow speculate( )
> diff --git a/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithMax.d b/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithMax.d
> index 31ea7f3f..39e3cebd 100644
> --- a/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithMax.d
> +++ b/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithMax.d
> @@ -1,16 +1,14 @@
>  /*
>   * Oracle Linux DTrace.
> - * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2006, 2021, 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.
>   */
> -/* @@xfail: dtv2 */
> +
>  /*
> - * ASSERTION:
> - * Aggregating functions may never be speculative.
> + * ASSERTION: Aggregating functions may never be speculative.
>   *
>   * SECTION: Speculative Tracing/Using a Speculation
> - *
>   */
>  #pragma D option quiet
>  
> @@ -25,7 +23,7 @@ profile:::tick-1sec
>  	var = speculation();
>  	speculate(var);
>  	printf("Speculation ID: %d", var);
> -	@Maximus["speculate"] = max(i);
> +	@Maximus = max(i);
>  	i++;
>  }
>  
> diff --git a/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithMin.d b/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithMin.d
> index b9ebea4a..b3f6ee88 100644
> --- a/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithMin.d
> +++ b/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithMin.d
> @@ -1,16 +1,14 @@
>  /*
>   * Oracle Linux DTrace.
> - * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2006, 2021, 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.
>   */
> -/* @@xfail: dtv2 */
> +
>  /*
> - * ASSERTION:
> - * Aggregating functions may never be speculative.
> + * ASSERTION: Aggregating functions may never be speculative.
>   *
>   * SECTION: Speculative Tracing/Using a Speculation
> - *
>   */
>  #pragma D option quiet
>  
> @@ -25,7 +23,7 @@ profile:::tick-1sec
>  	var = speculation();
>  	speculate(var);
>  	printf("Speculation ID: %d", var);
> -	@Minimus["speculate"] = min(i);
> +	@Minimus = min(i);
>  	i++;
>  }
>  
> diff --git a/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithQuant.d b/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithQuant.d
> index 4d34aafe..342971b2 100644
> --- a/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithQuant.d
> +++ b/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithQuant.d
> @@ -1,16 +1,14 @@
>  /*
>   * Oracle Linux DTrace.
> - * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2006, 2021, 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.
>   */
> -/* @@xfail: dtv2 */
> +
>  /*
> - * ASSERTION:
> - * Aggregating functions may never be speculative.
> + * ASSERTION: Aggregating functions may never be speculative.
>   *
>   * SECTION: Speculative Tracing/Using a Speculation
> - *
>   */
>  #pragma D option quiet
>  
> @@ -19,22 +17,17 @@ BEGIN
>  	i = 0;
>  }
>  
> -syscall:::entry
> -{
> -	self->ts = timestamp;
> -}
> -
> -syscall:::return
> -/self->ts/
> +profile:::tick-1sec
> +/i < 1/
>  {
>  	var = speculation();
>  	speculate(var);
>  	printf("Speculation ID: %d", var);
> -	@Qauntus[execname] = quantize(timestamp - self->ts);
> +	@Quantus = quantize(i);
>  	i++;
>  }
>  
> -syscall:::
> +profile:::tick-1sec
>  /1 == i/
>  {
>  	exit(0);
> diff --git a/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithQuant.r b/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithQuant.r
> index 0fd3d5a2..e08a3b45 100644
> --- a/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithQuant.r
> +++ b/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithQuant.r
> @@ -1,2 +1,2 @@
>  -- @@stderr --
> -dtrace: failed to compile script test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithQuant.d: [D_AGG_SPEC] line 33: aggregating actions may not follow speculate( )
> +dtrace: failed to compile script test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithQuant.d: [D_AGG_SPEC] line 28: aggregating actions may not follow speculate( )
> diff --git a/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithSum.d b/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithSum.d
> index dd2720c1..a4fd0857 100644
> --- a/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithSum.d
> +++ b/test/unittest/speculation/err.D_AGG_SPEC.SpeculateWithSum.d
> @@ -1,16 +1,14 @@
>  /*
>   * Oracle Linux DTrace.
> - * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2006, 2021, 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.
>   */
> -/* @@xfail: dtv2 */
> +
>  /*
> - * ASSERTION:
> - * Aggregating functions may never be speculative.
> + * ASSERTION: Aggregating functions may never be speculative.
>   *
>   * SECTION: Speculative Tracing/Using a Speculation
> - *
>   */
>  #pragma D option quiet
>  
> @@ -25,7 +23,7 @@ profile:::tick-1sec
>  	var = speculation();
>  	speculate(var);
>  	printf("Speculation ID: %d", var);
> -	@sums["speculate"] = sum(i);
> +	@sums = sum(i);
>  	i++;
>  }
>  
> diff --git a/test/unittest/speculation/tst.SpeculateWithRandom.d b/test/unittest/speculation/tst.SpeculateWithRandom.d
> index 30ab3794..0e280974 100644
> --- a/test/unittest/speculation/tst.SpeculateWithRandom.d
> +++ b/test/unittest/speculation/tst.SpeculateWithRandom.d
> @@ -1,18 +1,15 @@
>  /*
>   * Oracle Linux DTrace.
> - * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2006, 2021, 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.
>   */
> -/* @@xfail: dtv2 */
>  
>  /*
> - * ASSERTION:
> - * When speculate() is called with an inactive buffer number, it is
> - * ignored.
> + * ASSERTION: When speculate() is called with an inactive buffer number,
> + * it is ignored.
>   *
>   * SECTION: Speculative Tracing/Creating a Speculation
> - *
>   */
>  #pragma D option quiet
>  BEGIN
> -- 
> 2.18.4
> 
> 
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel



More information about the DTrace-devel mailing list