[DTrace-devel] [PATCH] printf: fake type node is only needed for aggregation printing
Eugene Loh
eugene.loh at oracle.com
Sat Aug 30 03:38:45 UTC 2025
Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
On 8/29/25 14:46, Kris Van Hees wrote:
> Regular printf validation was passing DTRACEACT_AGGREGATION as kind
> argument, even though the action was not doing anything with
> aggregations. Pass DTRACEACT_NONE instead because the argument is not
> used in that case.
>
> Also, do not populate the fake type node if the validation is called
> for anything other than aggregations.
>
> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
> libdtrace/dt_cg.c | 2 +-
> libdtrace/dt_printf.c | 34 +++++++++++++++++++---------------
> 2 files changed, 20 insertions(+), 16 deletions(-)
>
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index 7af3dd44b..77699c786 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -2482,7 +2482,7 @@ dt_cg_act_printf(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
> */
> pfp = dt_printf_create(pcb->pcb_hdl, str);
> dt_printf_validate(pfp, DT_PRINTF_EXACTLEN, dnp->dn_ident, 1,
> - DTRACEACT_AGGREGATION, arg1);
> + DTRACEACT_NONE, arg1);
>
> /*
> * If no arguments are provided we will be printing a string constant.
> diff --git a/libdtrace/dt_printf.c b/libdtrace/dt_printf.c
> index 21ec74111..1e01d4687 100644
> --- a/libdtrace/dt_printf.c
> +++ b/libdtrace/dt_printf.c
> @@ -961,8 +961,8 @@ dt_printf_destroy(dt_pfargv_t *pfv)
> }
>
> void
> -dt_printf_validate(dt_pfargv_t *pfv, uint_t flags,
> - dt_ident_t *idp, int foff, dtrace_actkind_t kind, dt_node_t *dnp)
> +dt_printf_validate(dt_pfargv_t *pfv, uint_t flags, dt_ident_t *idp, int foff,
> + dtrace_actkind_t kind, dt_node_t *dnp)
> {
> dt_pfargd_t *pfd = pfv->pfv_argv;
> const char *func = idp->di_name;
> @@ -980,21 +980,25 @@ dt_printf_validate(dt_pfargv_t *pfv, uint_t flags,
>
> pfv->pfv_flags = flags;
>
> - /*
> - * We fake up a parse node representing the type that can be used with
> - * an aggregation result conversion, which -- for all but count() --
> - * is a signed quantity.
> - */
> - if (kind != DT_AGG_COUNT)
> - aggtype = "int64_t";
> - else
> - aggtype = "uint64_t";
> + memset(&aggnode, 0, sizeof(aggnode));
> +
> + if (flags & DT_PRINTF_AGGREGATION) {
> + /*
> + * We fake up a parse node representing the type that can be
> + * used with an aggregation result conversion, which -- for all
> + * but count() -- is a signed quantity.
> + */
> + if (kind != DT_AGG_COUNT)
> + aggtype = "int64_t";
> + else
> + aggtype = "uint64_t";
>
> - if (dt_type_lookup(aggtype, &dtt) != 0)
> - xyerror(D_TYPE_ERR, "failed to lookup agg type %s\n", aggtype);
> + if (dt_type_lookup(aggtype, &dtt) != 0)
> + xyerror(D_TYPE_ERR, "failed to lookup agg type %s\n",
> + aggtype);
>
> - memset(&aggnode, 0, sizeof(aggnode));
> - dt_node_type_assign(&aggnode, dtt.dtt_ctfp, dtt.dtt_type);
> + dt_node_type_assign(&aggnode, dtt.dtt_ctfp, dtt.dtt_type);
> + }
>
> for (i = 0, j = 0; i < pfv->pfv_argc; i++, pfd = pfd->pfd_next) {
> const dt_pfconv_t *pfc = pfd->pfd_conv;
More information about the DTrace-devel
mailing list