[DTrace-devel] [PATCH 07/14] Inline assoc_op() into load_var()

eugene.loh at oracle.com eugene.loh at oracle.com
Tue May 2 03:47:15 UTC 2023


From: Eugene Loh <eugene.loh at oracle.com>

A subsequent patch will consolidate common code.

Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
 libdtrace/dt_cg.c | 116 ++++++++++++++++++++++------------------------
 1 file changed, 56 insertions(+), 60 deletions(-)

diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 895b83db..37237dec 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -2501,7 +2501,8 @@ dt_cg_load_scalar(dt_node_t *dnp, uint_t op, ssize_t size, dt_irlist_t *dlp,
 }
 
 static void
-dt_cg_assoc_op(dt_node_t *dst, dt_irlist_t *dlp, dt_regset_t *drp);
+dt_cg_arglist(dt_ident_t *idp, dt_node_t *args, dt_irlist_t *dlp,
+	      dt_regset_t *drp);
 
 static void
 dt_cg_load_var(dt_node_t *dst, dt_irlist_t *dlp, dt_regset_t *drp)
@@ -2511,7 +2512,60 @@ dt_cg_load_var(dt_node_t *dst, dt_irlist_t *dlp, dt_regset_t *drp)
 	idp->di_flags |= DT_IDFLG_DIFR;
 
 	if (dst->dn_ident->di_kind == DT_IDENT_ARRAY) {
-		dt_cg_assoc_op(dst, dlp, drp);
+		dt_ident_t	*idp = dt_dlib_get_func(yypcb->pcb_hdl, "dt_get_assoc");
+		uint_t		varid;
+
+		TRACE_REGSET("    assoc_op: Begin");
+
+		assert(idp != NULL);
+		assert(dst->dn_kind == DT_NODE_VAR);
+		assert(!(dst->dn_ident->di_flags & DT_IDFLG_LOCAL));
+		assert(dst->dn_args != NULL);
+
+		/* Get the tuple. */
+		dt_cg_arglist(dst->dn_ident, dst->dn_args, dlp, drp);
+
+		if ((dst->dn_reg = dt_regset_alloc(drp)) == -1)
+			longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
+		if (dt_regset_xalloc_args(drp) == -1)
+			longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
+
+		varid = dst->dn_ident->di_id - DIF_VAR_OTHER_UBASE;
+
+		emit(dlp,  BPF_MOV_IMM(BPF_REG_1, varid));
+		emit(dlp,  BPF_MOV_REG(BPF_REG_2, dst->dn_args->dn_reg));
+		dt_regset_free(drp, dst->dn_args->dn_reg);
+		emit(dlp,  BPF_MOV_IMM(BPF_REG_3, 0));
+		emit(dlp,  BPF_MOV_IMM(BPF_REG_4, 0));
+		dt_cg_zerosptr(BPF_REG_5, dlp, drp);
+		dt_regset_xalloc(drp, BPF_REG_0);
+		emite(dlp, BPF_CALL_FUNC(idp->di_id), idp);
+		dt_regset_free_args(drp);
+
+		if (dst->dn_flags & DT_NF_REF) {
+			emit(dlp,  BPF_MOV_REG(dst->dn_reg, BPF_REG_0));
+		} else {
+			size_t	size = dt_node_type_size(dst);
+			uint_t	lbl_notnull = dt_irlist_label(dlp);
+			uint_t	lbl_done = dt_irlist_label(dlp);
+
+			assert(size > 0 && size <= 8 &&
+			       (size & (size - 1)) == 0);
+
+			emit(dlp,  BPF_BRANCH_IMM(BPF_JNE, BPF_REG_0, 0, lbl_notnull));
+			emit(dlp,  BPF_MOV_IMM(dst->dn_reg, 0));
+			emit(dlp,  BPF_JUMP(lbl_done));
+			emitl(dlp, lbl_notnull,
+				   BPF_LOAD(ldstw[size], dst->dn_reg, BPF_REG_0, 0));
+			dt_cg_promote(dst, size, dlp, drp);
+			emitl(dlp, lbl_done,
+				   BPF_NOP());
+		}
+
+		dt_regset_free(drp, BPF_REG_0);
+
+		TRACE_REGSET("    assoc_op: End  ");
+
 		return;
 	}
 
@@ -3998,64 +4052,6 @@ dt_cg_asgn_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
 	}
 }
 
-static void
-dt_cg_assoc_op(dt_node_t *dst, dt_irlist_t *dlp, dt_regset_t *drp)
-{
-	dt_ident_t	*idp = dt_dlib_get_func(yypcb->pcb_hdl, "dt_get_assoc");
-	uint_t		varid;
-
-	TRACE_REGSET("    assoc_op: Begin");
-
-	assert(idp != NULL);
-	assert(dst->dn_kind == DT_NODE_VAR);
-	assert(!(dst->dn_ident->di_flags & DT_IDFLG_LOCAL));
-	assert(dst->dn_args != NULL);
-
-	/* Get the tuple. */
-	dt_cg_arglist(dst->dn_ident, dst->dn_args, dlp, drp);
-
-	if ((dst->dn_reg = dt_regset_alloc(drp)) == -1)
-		longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
-	if (dt_regset_xalloc_args(drp) == -1)
-		longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
-
-	varid = dst->dn_ident->di_id - DIF_VAR_OTHER_UBASE;
-
-	emit(dlp,  BPF_MOV_IMM(BPF_REG_1, varid));
-	emit(dlp,  BPF_MOV_REG(BPF_REG_2, dst->dn_args->dn_reg));
-	dt_regset_free(drp, dst->dn_args->dn_reg);
-	emit(dlp,  BPF_MOV_IMM(BPF_REG_3, 0));
-	emit(dlp,  BPF_MOV_IMM(BPF_REG_4, 0));
-	dt_cg_zerosptr(BPF_REG_5, dlp, drp);
-	dt_regset_xalloc(drp, BPF_REG_0);
-	emite(dlp, BPF_CALL_FUNC(idp->di_id), idp);
-	dt_regset_free_args(drp);
-
-	if (dst->dn_flags & DT_NF_REF) {
-		emit(dlp,  BPF_MOV_REG(dst->dn_reg, BPF_REG_0));
-	} else {
-		size_t	size = dt_node_type_size(dst);
-		uint_t	lbl_notnull = dt_irlist_label(dlp);
-		uint_t	lbl_done = dt_irlist_label(dlp);
-
-		assert(size > 0 && size <= 8 &&
-		       (size & (size - 1)) == 0);
-
-		emit(dlp,  BPF_BRANCH_IMM(BPF_JNE, BPF_REG_0, 0, lbl_notnull));
-		emit(dlp,  BPF_MOV_IMM(dst->dn_reg, 0));
-		emit(dlp,  BPF_JUMP(lbl_done));
-		emitl(dlp, lbl_notnull,
-			   BPF_LOAD(ldstw[size], dst->dn_reg, BPF_REG_0, 0));
-		dt_cg_promote(dst, size, dlp, drp);
-		emitl(dlp, lbl_done,
-			   BPF_NOP());
-	}
-
-	dt_regset_free(drp, BPF_REG_0);
-
-	TRACE_REGSET("    assoc_op: End  ");
-}
-
 static void
 dt_cg_uregs(unsigned int idx, dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
 {
-- 
2.18.4




More information about the DTrace-devel mailing list