[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