[DTrace-devel] [PATCH 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 14 19:11:36 UTC 2023
On Thu, Dec 14, 2023 at 01:40:00PM -0500, eugene.loh--- via DTrace-devel wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
>
> 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>
> ---
> libdtrace/dt_cg.c | 18 ++++++++++--------
> 1 file changed, 10 insertions(+), 8 deletions(-)
>
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index 7a84be5d..0a9a09b3 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -4938,7 +4938,7 @@ 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)
> + int isreg5, uint32_t val5, int argnum)
I would suggest placing the argument in slightly different order (mostly making
sure the optional arguments are at the end):
dt_cg_subr_arg_to_tstring(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp,
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,12 @@ 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];
> + argtype = &isp->dis_args[argnum];
I think you should add an assert that argnum is not outside the valid range
for the prototype (number of arguments). Just to be safe.
>
> /* handle the one "input value" */
> /* (its type matters only as to whether we check it is null */
> + while (argnum-- > 0)
> + arg = arg->dn_list;
I think you should add a check for arg != NULL or an assert to ensure that we
do not accidentally deref a NULL pointer. That would be an internal compiler
error but still - just to be safe.
> 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);
> @@ -5003,21 +5005,21 @@ 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_IGNOR, 0);
> + DT_IGNOR, 0, 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_IGNOR, 0);
> + DT_IGNOR, 0, 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_IGNOR, 0);
> + DT_IGNOR, 0, 0);
> }
>
> static void
> @@ -5083,7 +5085,7 @@ 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_IGNOR, 0);
> + DT_IGNOR, 0, 0);
> }
>
> static void
> @@ -6248,7 +6250,7 @@ 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_IGNOR, 0);
> + DT_IGNOR, 0, 0);
> }
>
> static void
> @@ -6314,7 +6316,7 @@ dt_cg_subr_inet_ntoa6(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
>
> dt_cg_subr_arg_to_tstring(dnp, dlp, drp, "dt_inet_ntoa6",
> DT_ISIMM, tbloff,
> - DT_ISIMM, strict && strict->dn_value ? 1 : 0);
> + DT_ISIMM, strict && strict->dn_value ? 1 : 0, 0);
> }
>
> static void
> --
> 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