[DTrace-devel] [PATCH] print() action: identify ctf object used for print

Alan Maguire alan.maguire at oracle.com
Fri Apr 12 10:56:59 UTC 2024


when generating code for print() action we need to identify source
of CTF; is it shared CTF, cdefs or ddefs? use DTRACE_OBJ* values
and store this as a record argument.  Then when consuming records
we can use either shared CTF, cdef or ddef CTF as appropriate.

This fixes an issue encountered when using a shared kernel type
with alloca()ed memory; DTrace assumed the type was in ddefs
and it wasn't so it wasn't displayed.  This change fixes that and
all tests continue to pass.

Signed-off-by: Alan Maguire <alan.maguire at oracle.com>
---
 libdtrace/dt_cg.c      | 11 ++++++++++-
 libdtrace/dt_consume.c |  7 +++++--
 libdtrace/dt_printf.c  | 11 ++++++++---
 libdtrace/dt_printf.h  |  2 +-
 4 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 27246a40..eedf6662 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -2831,6 +2831,7 @@ dt_cg_act_print(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
 	ctf_file_t	*fp = addr->dn_ctfp;
 	ctf_id_t	type = addr->dn_type;
 	char		n[DT_TYPE_NAMELEN];
+	const char	*ctf_obj;
 	size_t		size;
 
 	type = ctf_type_reference(fp, type);
@@ -2842,9 +2843,17 @@ dt_cg_act_print(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
 			"print( ) argument #1 reference has type '%s' with size 0; cannot print( ) it.\n",
 			ctf_type_name(fp, type, n, sizeof(n)));
 
-	/* reserve space for addr/type, data/size */
+	/* reserve space for addr/type, ctf file identification, data/size */
 	addr_off = dt_rec_add(dtp, dt_cg_fill_gap, DTRACEACT_PRINT,
 			      sizeof(uint64_t), 8, NULL, type);
+	if (fp == dtp->dt_shared_ctf)
+		ctf_obj = DTRACE_OBJ_KMODS;
+	else if (fp == dtp->dt_cdefs->dm_ctfp)
+		ctf_obj = DTRACE_OBJ_CDEFS;
+	else
+		ctf_obj = DTRACE_OBJ_DDEFS;
+	dt_rec_add(dtp, dt_cg_fill_gap, DTRACEACT_PRINT,
+		   sizeof(uint64_t), 8, NULL, (uint64_t)ctf_obj);
 	data_off = dt_rec_add(dtp, dt_cg_fill_gap, DTRACEACT_PRINT,
 			      size, 8, NULL, size);
 
diff --git a/libdtrace/dt_consume.c b/libdtrace/dt_consume.c
index dec2314b..0d6f2642 100644
--- a/libdtrace/dt_consume.c
+++ b/libdtrace/dt_consume.c
@@ -1987,9 +1987,11 @@ static int
 dt_print_print(dtrace_hdl_t *dtp, FILE *fp, dtrace_recdesc_t *rec,
 	       const caddr_t buf)
 {
-	dtrace_recdesc_t *data_rec = rec + 1;
+	dtrace_recdesc_t *ctf_rec = rec + 1;
+	dtrace_recdesc_t *data_rec = rec + 2;
 	size_t max_size = dtp->dt_options[DTRACEOPT_PRINTSIZE];
 	size_t size = (size_t)data_rec->dtrd_arg;
+	const char *ctf_obj = (const char *)ctf_rec->dtrd_arg;
 	uint64_t printaddr;
 
 	if (size > max_size)
@@ -1998,7 +2000,8 @@ dt_print_print(dtrace_hdl_t *dtp, FILE *fp, dtrace_recdesc_t *rec,
 	if (dt_read_scalar(buf, rec, &printaddr) < 0)
 		return dt_set_errno(dtp, EDT_PRINT);
 
-	return dt_print_type(dtp, fp, printaddr, (ctf_id_t)rec->dtrd_arg,
+	return dt_print_type(dtp, fp, printaddr, ctf_obj,
+			     (ctf_id_t)rec->dtrd_arg,
 			     (caddr_t)buf + data_rec->dtrd_offset, size);
 }
 
diff --git a/libdtrace/dt_printf.c b/libdtrace/dt_printf.c
index 50842216..b88ba14b 100644
--- a/libdtrace/dt_printf.c
+++ b/libdtrace/dt_printf.c
@@ -2236,13 +2236,18 @@ err:
 
 int
 dt_print_type(dtrace_hdl_t *dtp, FILE *fp, uint64_t printaddr,
-	      ctf_id_t type, caddr_t data, size_t size)
+	      const char *ctf_obj, ctf_id_t type, caddr_t data, size_t size)
 {
 	struct dt_visit_arg dva;
 
 	dva.dv_dtp = dtp;
 	dva.dv_fp = fp;
-	dva.dv_ctfp = dtp->dt_ddefs->dm_ctfp;
+	if (ctf_obj == DTRACE_OBJ_KMODS)
+		dva.dv_ctfp = dtp->dt_shared_ctf;
+	else if (ctf_obj == DTRACE_OBJ_CDEFS)
+		dva.dv_ctfp = dtp->dt_cdefs->dm_ctfp;
+	else
+		dva.dv_ctfp = dtp->dt_ddefs->dm_ctfp;
 	dva.dv_data = data;
 	dva.dv_size = size;
 	dva.dv_last_depth = 0;
@@ -2260,5 +2265,5 @@ dt_print_type(dtrace_hdl_t *dtp, FILE *fp, uint64_t printaddr,
 	if (dt_print_close_parens(&dva, 0) < 0)
 		return -1;
 
-	return 2;
+	return 3;
 }
diff --git a/libdtrace/dt_printf.h b/libdtrace/dt_printf.h
index 9771c4a8..b72ff55b 100644
--- a/libdtrace/dt_printf.h
+++ b/libdtrace/dt_printf.h
@@ -108,7 +108,7 @@ extern int dt_print_ustack(dtrace_hdl_t *, FILE *,
     const char *, caddr_t, uint64_t);
 extern int dt_print_mod(dtrace_hdl_t *, FILE *, const char *, caddr_t);
 extern int dt_print_umod(dtrace_hdl_t *, FILE *, const char *, caddr_t);
-extern int dt_print_type(dtrace_hdl_t *, FILE *, uint64_t, ctf_id_t,
+extern int dt_print_type(dtrace_hdl_t *, FILE *, uint64_t, const char *, ctf_id_t,
 			 caddr_t, size_t);
 
 #ifdef	__cplusplus
-- 
2.39.3




More information about the DTrace-devel mailing list