public inbox for dtrace@lists.linux.dev
 help / color / mirror / Atom feed
* [PATCH 2/4] provider, cg: add reject_clasue() callback
@ 2025-07-15  5:48 Kris Van Hees
  2025-07-15 10:35 ` Nick Alcock
  2025-07-15 18:34 ` [DTrace-devel] " Eugene Loh
  0 siblings, 2 replies; 5+ messages in thread
From: Kris Van Hees @ 2025-07-15  5:48 UTC (permalink / raw)
  To: dtrace, dtrace-devel

Future providers will require functionality to determine whether a
clause for one of its probes needs to be rejected for some reason.

Since the callback is invoked during trampoline creation, rejection
must result in a compilation error.  The callback is responsible for
this.  If it returns, the clause is accepted.

Signed-off-by: Kris Van Hees <kris.van.hees@oracle.com>
---
 libdtrace/dt_cg.c       | 22 ++++++++++++++++------
 libdtrace/dt_provider.h |  2 ++
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index d80b0a55..738597ed 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -855,16 +855,26 @@ dt_cg_tramp_map_args(dt_pcb_t *pcb, dt_argdesc_t *args, size_t nargs)
 }
 
 typedef struct {
-	dt_irlist_t	*dlp;
-	dt_activity_t	act;
-	uint_t		lbl_exit;
+	const dt_probe_t	*prp;
+	dt_irlist_t		*dlp;
+	dt_activity_t		act;
+	uint_t			lbl_exit;
 } dt_clause_arg_t;
 
 static int
 dt_cg_call_clause(dtrace_hdl_t *dtp, dtrace_stmtdesc_t *sdp, dt_clause_arg_t *arg)
 {
-	dt_irlist_t	*dlp = arg->dlp;
-	dt_ident_t	*idp = sdp->dtsd_clause;
+	const dt_probe_t	*prp = arg->prp;
+	dt_irlist_t		*dlp = arg->dlp;
+	dt_ident_t		*idp = sdp->dtsd_clause;
+
+	/*
+	 * Ensure the clause is valid for the probe.  Call the reject_clause()
+	 * hook if defined, otherwise apply default checks.  Rejection of the
+	 * clause must be reported as a compilation error.
+	 */
+	if (prp->prov->impl->reject_clause != NULL)
+		prp->prov->impl->reject_clause(prp, sdp->dtsd_clauseflags);
 
 	/*
 	 *	if (*dctx.act != act)	// ldw %r0, [%r9 + DCTX_ACT]
@@ -895,7 +905,7 @@ void
 dt_cg_tramp_call_clauses(dt_pcb_t *pcb, const dt_probe_t *prp, dt_activity_t act)
 {
 	dt_irlist_t	*dlp = &pcb->pcb_ir;
-	dt_clause_arg_t	arg = { dlp, act, pcb->pcb_exitlbl };
+	dt_clause_arg_t	arg = { prp, dlp, act, pcb->pcb_exitlbl };
 
 	dt_probe_stmt_iter(pcb->pcb_hdl, prp, (dt_stmt_f *)dt_cg_call_clause, &arg);
 }
diff --git a/libdtrace/dt_provider.h b/libdtrace/dt_provider.h
index 2a3bba80..a7263f5d 100644
--- a/libdtrace/dt_provider.h
+++ b/libdtrace/dt_provider.h
@@ -52,6 +52,8 @@ typedef struct dt_provimpl {
 		       const pid_probespec_t *psp);
 	void (*enable)(dtrace_hdl_t *dtp,	/* enable the given probe */
 		       struct dt_probe *prp);
+	void (*reject_clause)(const struct dt_probe *prp, int clsflags);
+						/* check clause flags */
 	int (*trampoline)(dt_pcb_t *pcb,	/* generate BPF trampoline */
 			   uint_t exitlbl);
 	int (*load_prog)(dtrace_hdl_t *dtp, const struct dt_probe *prp,
-- 
2.43.5


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-07-16 10:53 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-15  5:48 [PATCH 2/4] provider, cg: add reject_clasue() callback Kris Van Hees
2025-07-15 10:35 ` Nick Alcock
2025-07-15 15:10   ` Kris Van Hees
2025-07-16 10:53     ` Nick Alcock
2025-07-15 18:34 ` [DTrace-devel] " Eugene Loh

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox