[DTrace-devel] [PATCH v2 2/3] Allow dt_cg_subr_arg_to_tstring() to take any subroutine arg index
Kris Van Hees
kris.van.hees at oracle.com
Thu Dec 21 02:44:51 UTC 2023
On Thu, Dec 14, 2023 at 03:13:27PM -0500, eugene.loh at oracle.com wrote:
>
> The function dt_cg_subr_arg_to_tstring() is used to generate BPF
> code for a variety of subroutines that output temporary strings.
> It sets up a BPF function call where one arg is a key arg from
> the subroutine being implemented. Typically the first subroutine
> arg is used.
>
> Allow any subroutine arg to be used, both for calculating the
> arg value and checking pointers.
>
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
> libdtrace/dt_cg.c | 23 ++++++++++++++---------
> 1 file changed, 14 insertions(+), 9 deletions(-)
>
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index 7a84be5d..a0c33a33 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -4937,8 +4937,8 @@ dt_cg_array_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
> */
> static void
> dt_cg_subr_arg_to_tstring(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp,
> - const char *fname, int isreg4, uint32_t val4,
> - int isreg5, uint32_t val5)
> + const char *fname, int argnum, int isreg4,
> + uint32_t val4, int isreg5, uint32_t val5)
> {
> dt_ident_t *idp;
> dt_node_t *arg = dnp->dn_args;
> @@ -4950,10 +4950,15 @@ dt_cg_subr_arg_to_tstring(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp,
> assert(dnp->dn_ident);
> isp = dnp->dn_ident->di_data;
> assert(isp && isp->dis_args);
> - argtype = &isp->dis_args[0];
> + assert(argnum < isp->dis_argc);
> + argtype = &isp->dis_args[argnum];
>
> /* handle the one "input value" */
> /* (its type matters only as to whether we check it is null */
> + while (argnum-- > 0) {
> + assert(arg != NULL);
> + arg = arg->dn_list;
> + }
> dt_cg_node(arg, dlp, drp);
> if (dt_node_is_pointer(argtype) || dt_node_is_string(argtype))
> dt_cg_check_ptr_arg(dlp, drp, arg, NULL);
> @@ -5002,21 +5007,21 @@ dt_cg_subr_arg_to_tstring(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp,
> static void
> dt_cg_subr_basename(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
> {
> - dt_cg_subr_arg_to_tstring(dnp, dlp, drp, "dt_basename", DT_IGNOR, 0,
> + dt_cg_subr_arg_to_tstring(dnp, dlp, drp, "dt_basename", 0, DT_IGNOR, 0,
> DT_IGNOR, 0);
> }
>
> static void
> dt_cg_subr_cleanpath(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
> {
> - dt_cg_subr_arg_to_tstring(dnp, dlp, drp, "dt_cleanpath", DT_IGNOR, 0,
> + dt_cg_subr_arg_to_tstring(dnp, dlp, drp, "dt_cleanpath", 0, DT_IGNOR, 0,
> DT_IGNOR, 0);
> }
>
> static void
> dt_cg_subr_dirname(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
> {
> - dt_cg_subr_arg_to_tstring(dnp, dlp, drp, "dt_dirname", DT_IGNOR, 0,
> + dt_cg_subr_arg_to_tstring(dnp, dlp, drp, "dt_dirname", 0, DT_IGNOR, 0,
> DT_IGNOR, 0);
> }
>
> @@ -5082,7 +5087,7 @@ dt_cg_subr_index(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
> static void
> dt_cg_subr_lltostr(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
> {
> - dt_cg_subr_arg_to_tstring(dnp, dlp, drp, "dt_lltostr", DT_IGNOR, 0,
> + dt_cg_subr_arg_to_tstring(dnp, dlp, drp, "dt_lltostr", 0, DT_IGNOR, 0,
> DT_IGNOR, 0);
> }
>
> @@ -6247,7 +6252,7 @@ dt_cg_subr_htonll(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
> static void
> dt_cg_subr_inet_ntoa(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
> {
> - dt_cg_subr_arg_to_tstring(dnp, dlp, drp, "dt_inet_ntoa", DT_IGNOR, 0,
> + dt_cg_subr_arg_to_tstring(dnp, dlp, drp, "dt_inet_ntoa", 0, DT_IGNOR, 0,
> DT_IGNOR, 0);
> }
>
> @@ -6312,7 +6317,7 @@ dt_cg_subr_inet_ntoa6(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
> if (tbloff > DIF_STROFF_MAX)
> longjmp(yypcb->pcb_jmpbuf, EDT_STR2BIG);
>
> - dt_cg_subr_arg_to_tstring(dnp, dlp, drp, "dt_inet_ntoa6",
> + dt_cg_subr_arg_to_tstring(dnp, dlp, drp, "dt_inet_ntoa6", 0,
> DT_ISIMM, tbloff,
> DT_ISIMM, strict && strict->dn_value ? 1 : 0);
> }
> --
> 2.18.4
>
>
More information about the DTrace-devel
mailing list