[DTrace-devel] [PATCH] Use pcb_exitlbl in trampoline instead of allocating a label

Kris Van Hees kris.van.hees at oracle.com
Tue Jan 12 08:48:43 PST 2021


Clauses used to be compiled into their own program, with a trampoline
prologues and epilogue surrounding the actual clause implementation.
This required a specific exit label to be alloocated for use in the
trampoline because the compiler-generated label (pcb_exitlbl) was
specific to the clause implementation.

Now that clauses are compiled into proper functions, and the trampoline
is its own function (the main program function), the trampoline specific
exit label is no longer needed.  We can use the compiler-generated label
(pcb_exitlbl) instead.

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_cg.c           | 30 +++++++++++++-----------------
 libdtrace/dt_cg.h           |  9 ++++-----
 libdtrace/dt_prov_dtrace.c  |  7 +++----
 libdtrace/dt_prov_fbt.c     |  5 ++---
 libdtrace/dt_prov_profile.c |  5 ++---
 libdtrace/dt_prov_sdt.c     |  5 ++---
 libdtrace/dt_prov_syscall.c |  5 ++---
 7 files changed, 28 insertions(+), 38 deletions(-)

diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 43af80d1..be29fee4 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -37,17 +37,15 @@ static void dt_cg_node(dt_node_t *, dt_irlist_t *, dt_regset_t *);
  *
  * The caller should NOT depend on any register values that exist at the end of
  * the trampoline prologue.
- *
- * This function returns a label id to be passed to dt_cg_tramp_epilogue().
  */
-uint_t
+void
 dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act)
 {
 	dtrace_hdl_t	*dtp = pcb->pcb_hdl;
 	dt_irlist_t	*dlp = &pcb->pcb_ir;
 	dt_ident_t	*mem = dt_dlib_get_map(dtp, "mem");
 	dt_ident_t	*state = dt_dlib_get_map(dtp, "state");
-	uint_t		lbl_exit = dt_irlist_label(dlp);
+	uint_t		lbl_exit = pcb->pcb_exitlbl;
 
 	assert(mem != NULL);
 
@@ -154,11 +152,9 @@ dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act)
 		emit(dlp, BPF_BRANCH_IMM(BPF_JEQ, BPF_REG_0, 0, lbl_exit));
 		emit(dlp, BPF_STORE(BPF_DW, BPF_REG_FP, DCTX_FP(DCTX_AGG), BPF_REG_0));
 	}
-
-	return lbl_exit;
 }
 
-uint_t
+void
 dt_cg_tramp_prologue(dt_pcb_t *pcb)
 {
 	return dt_cg_tramp_prologue_act(pcb, DT_ACTIVITY_ACTIVE);
@@ -194,17 +190,17 @@ dt_cg_call_clause(dtrace_hdl_t *dtp, dt_ident_t *idp, dt_clause_arg_t *arg)
 }
 
 static void
-dt_cg_tramp_call_clauses(dt_pcb_t *pcb, uint_t lbl_exit, dt_activity_t act)
+dt_cg_tramp_call_clauses(dt_pcb_t *pcb, dt_activity_t act)
 {
 	dt_irlist_t	*dlp = &pcb->pcb_ir;
-	dt_clause_arg_t	arg = { dlp, act, lbl_exit };
+	dt_clause_arg_t	arg = { dlp, act, pcb->pcb_exitlbl };
 
 	dt_probe_clause_iter(pcb->pcb_hdl, pcb->pcb_probe,
 			     (dt_clause_f *)dt_cg_call_clause, &arg);
 }
 
 static void
-dt_cg_tramp_return(dt_pcb_t *pcb, uint_t lbl_exit)
+dt_cg_tramp_return(dt_pcb_t *pcb)
 {
 	dt_irlist_t	*dlp = &pcb->pcb_ir;
 
@@ -214,24 +210,24 @@ dt_cg_tramp_return(dt_pcb_t *pcb, uint_t lbl_exit)
 	 *				// exit
 	 * }
 	 */
-	emitl(dlp, lbl_exit,
+	emitl(dlp, pcb->pcb_exitlbl,
 		   BPF_MOV_IMM(BPF_REG_0, 0));
 	emit(dlp,  BPF_RETURN());
 }
 
 void
-dt_cg_tramp_epilogue(dt_pcb_t *pcb, uint_t lbl_exit)
+dt_cg_tramp_epilogue(dt_pcb_t *pcb)
 {
-	dt_cg_tramp_call_clauses(pcb, lbl_exit, DT_ACTIVITY_ACTIVE);
-	dt_cg_tramp_return(pcb, lbl_exit);
+	dt_cg_tramp_call_clauses(pcb, DT_ACTIVITY_ACTIVE);
+	dt_cg_tramp_return(pcb);
 }
 
 void
-dt_cg_tramp_epilogue_advance(dt_pcb_t *pcb, uint_t lbl_exit, dt_activity_t act)
+dt_cg_tramp_epilogue_advance(dt_pcb_t *pcb, dt_activity_t act)
 {
 	dt_irlist_t	*dlp = &pcb->pcb_ir;
 
-	dt_cg_tramp_call_clauses(pcb, lbl_exit, act);
+	dt_cg_tramp_call_clauses(pcb, act);
 
 	/*
 	 *	(*dctx.act)++;		// lddw %r0, [%fp + DCTX_FP(DCTX_ACT)]
@@ -242,7 +238,7 @@ dt_cg_tramp_epilogue_advance(dt_pcb_t *pcb, uint_t lbl_exit, dt_activity_t act)
 	emit(dlp, BPF_MOV_IMM(BPF_REG_1, 1));
 	emit(dlp, BPF_XADD_REG(BPF_W, BPF_REG_0, 0, BPF_REG_1));
 
-	dt_cg_tramp_return(pcb, lbl_exit);
+	dt_cg_tramp_return(pcb);
 }
 
 /*
diff --git a/libdtrace/dt_cg.h b/libdtrace/dt_cg.h
index 54e01df7..a041f6b9 100644
--- a/libdtrace/dt_cg.h
+++ b/libdtrace/dt_cg.h
@@ -19,11 +19,10 @@ extern "C" {
 extern void dt_cg(dt_pcb_t *, dt_node_t *);
 extern void dt_cg_xsetx(dt_irlist_t *, dt_ident_t *, uint_t, int, uint64_t);
 extern dt_irnode_t *dt_cg_node_alloc(uint_t, struct bpf_insn);
-extern uint_t dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act);
-extern uint_t dt_cg_tramp_prologue(dt_pcb_t *pcb);
-extern void dt_cg_tramp_epilogue(dt_pcb_t *pcb, uint_t lbl_exit);
-extern void dt_cg_tramp_epilogue_advance(dt_pcb_t *pcb, uint_t lbl_exit,
-					 dt_activity_t act);
+extern void dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act);
+extern void dt_cg_tramp_prologue(dt_pcb_t *pcb);
+extern void dt_cg_tramp_epilogue(dt_pcb_t *pcb);
+extern void dt_cg_tramp_epilogue_advance(dt_pcb_t *pcb, dt_activity_t act);
 
 #ifdef	__cplusplus
 }
diff --git a/libdtrace/dt_prov_dtrace.c b/libdtrace/dt_prov_dtrace.c
index 50449478..dc77ce04 100644
--- a/libdtrace/dt_prov_dtrace.c
+++ b/libdtrace/dt_prov_dtrace.c
@@ -74,7 +74,6 @@ static void trampoline(dt_pcb_t *pcb)
 {
 	int		i;
 	dt_irlist_t	*dlp = &pcb->pcb_ir;
-	uint_t		lbl_exit;
 	dt_activity_t	act;
 	int		adv_act;
 	uint32_t	key = 0;
@@ -113,7 +112,7 @@ static void trampoline(dt_pcb_t *pcb)
 		adv_act = 0;
 	}
 
-	lbl_exit = dt_cg_tramp_prologue_act(pcb, act);
+	dt_cg_tramp_prologue_act(pcb, act);
 
 	if (key) {
 		/*
@@ -212,9 +211,9 @@ static void trampoline(dt_pcb_t *pcb)
 		emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_7, DCTX_FP(DMST_ARG(i)), 0));
 
 	if (adv_act)
-		dt_cg_tramp_epilogue_advance(pcb, lbl_exit, act);
+		dt_cg_tramp_epilogue_advance(pcb, act);
 	else
-		dt_cg_tramp_epilogue(pcb, lbl_exit);
+		dt_cg_tramp_epilogue(pcb);
 }
 
 static char *uprobe_spec(dtrace_hdl_t *dtp, const char *prb)
diff --git a/libdtrace/dt_prov_fbt.c b/libdtrace/dt_prov_fbt.c
index 66efeec7..81dba92a 100644
--- a/libdtrace/dt_prov_fbt.c
+++ b/libdtrace/dt_prov_fbt.c
@@ -162,9 +162,8 @@ static void trampoline(dt_pcb_t *pcb)
 {
 	int		i;
 	dt_irlist_t	*dlp = &pcb->pcb_ir;
-	uint_t		lbl_exit;
 
-	lbl_exit = dt_cg_tramp_prologue(pcb);
+	dt_cg_tramp_prologue(pcb);
 
 	/*
 	 * We cannot assume anything about the state of any registers so set up
@@ -226,7 +225,7 @@ static void trampoline(dt_pcb_t *pcb)
 	for (i = 6; i < ARRAY_SIZE(((dt_mstate_t *)0)->argv); i++)
 		emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_7, DCTX_FP(DMST_ARG(i)), 0));
 
-	dt_cg_tramp_epilogue(pcb, lbl_exit);
+	dt_cg_tramp_epilogue(pcb);
 }
 
 static int attach(dtrace_hdl_t *dtp, const dt_probe_t *prp, int bpf_fd)
diff --git a/libdtrace/dt_prov_profile.c b/libdtrace/dt_prov_profile.c
index cb38043e..3ce2d586 100644
--- a/libdtrace/dt_prov_profile.c
+++ b/libdtrace/dt_prov_profile.c
@@ -217,9 +217,8 @@ static void trampoline(dt_pcb_t *pcb)
 {
 	int		i;
 	dt_irlist_t	*dlp = &pcb->pcb_ir;
-	uint_t		lbl_exit;
 
-	lbl_exit = dt_cg_tramp_prologue(pcb);
+	dt_cg_tramp_prologue(pcb);
 
 	/*
 	 * We cannot assume anything about the state of any registers so set up
@@ -270,7 +269,7 @@ static void trampoline(dt_pcb_t *pcb)
 	for (i = 1; i < ARRAY_SIZE(((dt_mstate_t *)0)->argv); i++)
 		emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_7, DCTX_FP(DMST_ARG(i)), 0));
 
-	dt_cg_tramp_epilogue(pcb, lbl_exit);
+	dt_cg_tramp_epilogue(pcb);
 }
 
 static int attach(dtrace_hdl_t *dtp, const dt_probe_t *prp, int bpf_fd)
diff --git a/libdtrace/dt_prov_sdt.c b/libdtrace/dt_prov_sdt.c
index 50bdb961..28f88e12 100644
--- a/libdtrace/dt_prov_sdt.c
+++ b/libdtrace/dt_prov_sdt.c
@@ -394,9 +394,8 @@ static void trampoline(dt_pcb_t *pcb)
 {
 	int		i;
 	dt_irlist_t	*dlp = &pcb->pcb_ir;
-	uint_t		lbl_exit;
 
-	lbl_exit = dt_cg_tramp_prologue(pcb);
+	dt_cg_tramp_prologue(pcb);
 
 	/*
 	 * We cannot assume anything about the state of any registers so set up
@@ -429,7 +428,7 @@ static void trampoline(dt_pcb_t *pcb)
 	for (i = 0; i < pcb->pcb_pinfo.dtp_argc; i++)
 		emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_7, DMST_ARG(i), 0));
 
-	dt_cg_tramp_epilogue(pcb, lbl_exit);
+	dt_cg_tramp_epilogue(pcb);
 }
 
 static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
diff --git a/libdtrace/dt_prov_syscall.c b/libdtrace/dt_prov_syscall.c
index f72e708e..24680895 100644
--- a/libdtrace/dt_prov_syscall.c
+++ b/libdtrace/dt_prov_syscall.c
@@ -147,9 +147,8 @@ static void trampoline(dt_pcb_t *pcb)
 {
 	int		i;
 	dt_irlist_t	*dlp = &pcb->pcb_ir;
-	uint_t		lbl_exit;
 
-	lbl_exit = dt_cg_tramp_prologue(pcb);
+	dt_cg_tramp_prologue(pcb);
 
 	/*
 	 * We cannot assume anything about the state of any registers so set up
@@ -193,7 +192,7 @@ static void trampoline(dt_pcb_t *pcb)
 	for ( ; i < ARRAY_SIZE(((dt_mstate_t *)0)->argv); i++)
 		emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_7, DMST_ARG(i), 0));
 
-	dt_cg_tramp_epilogue(pcb, lbl_exit);
+	dt_cg_tramp_epilogue(pcb);
 }
 
 static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
-- 
2.28.0




More information about the DTrace-devel mailing list