[DTrace-devel] [PATCH 11/15] dlib: Add dt_dlib_add_probe_var()

Kris Van Hees kris.van.hees at oracle.com
Thu Feb 23 07:24:11 UTC 2023


This new function defines a BPF symbol (variable) with the fully
qualified probe name as name, and the probe ID as value.

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_dlibs.c       | 17 +++++++++++++++++
 libdtrace/dt_impl.h        |  2 ++
 libdtrace/dt_prov_uprobe.c |  7 ++-----
 3 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/libdtrace/dt_dlibs.c b/libdtrace/dt_dlibs.c
index eea0ba41..e3196b63 100644
--- a/libdtrace/dt_dlibs.c
+++ b/libdtrace/dt_dlibs.c
@@ -12,6 +12,7 @@
 #include <port.h>
 #include <dt_parser.h>
 #include <dt_program.h>
+#include <dt_probe.h>
 #include <dt_grammar.h>
 #include <dt_impl.h>
 #include <dt_bpf.h>
@@ -235,6 +236,22 @@ dt_dlib_add_var(dtrace_hdl_t *dtp, const char *name, uint_t id)
 	return dt_dlib_add_sym_id(dtp, name, DT_IDENT_SCALAR, id);
 }
 
+/*
+ * Add a BPF variable for a probe.
+ * The fully qualified probe name is tha variable name, and the probe ID is the
+ * value of the variable.
+ */
+dt_ident_t *
+dt_dlib_add_probe_var(dtrace_hdl_t *dtp, const dt_probe_t *prp)
+{
+	char	pn[DTRACE_FULLNAMELEN + 1];
+
+	snprintf(pn, DTRACE_FULLNAMELEN, "%s:%s:%s:%s", prp->desc->prv,
+		 prp->desc->mod, prp->desc->fun, prp->desc->prb);
+
+	return dt_dlib_add_var(dtp, pn, prp->desc->id);
+}
+
 /*
  * Return the DIFO for an external symbol.
  */
diff --git a/libdtrace/dt_impl.h b/libdtrace/dt_impl.h
index 9edef5ab..46db2878 100644
--- a/libdtrace/dt_impl.h
+++ b/libdtrace/dt_impl.h
@@ -738,6 +738,8 @@ extern dt_ident_t *dt_dlib_get_func(dtrace_hdl_t *, const char *);
 extern dt_ident_t *dt_dlib_get_map(dtrace_hdl_t *, const char *);
 extern dt_ident_t *dt_dlib_add_var(dtrace_hdl_t *dtp, const char *name,
 				   uint_t id);
+extern dt_ident_t *dt_dlib_add_probe_var(dtrace_hdl_t *dtp,
+					 const struct dt_probe *prp);
 extern dt_ident_t *dt_dlib_get_var(dtrace_hdl_t *, const char *);
 extern dtrace_difo_t *dt_dlib_get_func_difo(dtrace_hdl_t *, const dt_ident_t *);
 extern void dt_dlib_reset(dtrace_hdl_t *dtp, boolean_t);
diff --git a/libdtrace/dt_prov_uprobe.c b/libdtrace/dt_prov_uprobe.c
index 2d77176f..1ab1fe98 100644
--- a/libdtrace/dt_prov_uprobe.c
+++ b/libdtrace/dt_prov_uprobe.c
@@ -397,17 +397,14 @@ static void trampoline(dt_pcb_t *pcb)
 		const dt_probe_t	*pprp = pop->probe;
 		uint_t			lbl_next = dt_irlist_label(dlp);
 		pid_t			pid;
-		char			pn[DTRACE_FULLNAMELEN + 1];
 		dt_ident_t		*idp;
 
 		pid = dt_pid_get_pid(pprp->desc, pcb->pcb_hdl, pcb, NULL);
 		assert(pid != -1);
 
-		snprintf(pn, DTRACE_FULLNAMELEN, "%s:%s:%s:%s",
-			 pprp->desc->prv, pprp->desc->mod, pprp->desc->fun,
-			 pprp->desc->prb);
-		idp = dt_dlib_add_var(pcb->pcb_hdl, pn, pprp->desc->id);
+		idp = dt_dlib_add_probe_var(pcb->pcb_hdl, pprp);
 		assert(idp != NULL);
+
 		/*
 		 * Check whether this pid-provider probe serves the current
 		 * process, and emit a sequence of clauses for it when it does.
-- 
2.39.1




More information about the DTrace-devel mailing list