[DTrace-devel] [PATCH v2 2/3] Allow dt_cg_subr_arg_to_tstring() to take any subroutine arg index

eugene.loh at oracle.com eugene.loh at oracle.com
Thu Dec 14 20:13:27 UTC 2023


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 | 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