[DTrace-devel] [PATCH 14/16] cg: allow declaring variables from trampolines

Kris Van Hees kris.van.hees at oracle.com
Sat Jan 13 00:24:26 UTC 2024


Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_cg.c | 39 +++++++++++++++++++++++++++++++++++++++
 libdtrace/dt_cg.h |  1 +
 2 files changed, 40 insertions(+)

diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 227b4b3c..b898cfaf 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -663,6 +663,45 @@ dt_cg_tramp_var(const char *name)
 	return dnp;
 }
 
+void
+dt_cg_tramp_decl_var(dt_pcb_t *pcb, dt_ident_t *idp)
+{
+	dtrace_hdl_t		*dtp = pcb->pcb_hdl;
+	dt_idhash_t		*dhp;
+	uint_t			id;
+	dtrace_typeinfo_t	dtt;
+
+
+	if (idp->di_flags & DT_IDFLG_LOCAL)
+		dhp = pcb->pcb_locals;
+	else if (idp->di_flags & DT_IDFLG_TLS)
+		dhp = dtp->dt_tls;
+	else
+		dhp = dtp->dt_globals;
+
+	if (dt_idhash_lookup(dhp, idp->di_name))
+		return;
+
+	if (dt_idhash_nextid(dhp, &id) == -1)
+		xyerror(D_ID_OFLOW, "cannot create %s: limit on number of "
+				    "%s variables exceeded\n", idp->di_name,
+				    dt_idhash_name(dhp));
+
+	if (dt_idhash_insert(dhp, idp->di_name, idp->di_kind, idp->di_flags,
+			     id, idp->di_attr, idp->di_vers,
+			     idp->di_ops ? idp->di_ops : &dt_idops_thaw,
+			     idp->di_iarg, 0) == NULL)
+		longjmp(yypcb->pcb_jmpbuf, EDT_NOMEM);
+
+	idp = dt_idhash_lookup(dhp, idp->di_name);
+	assert(idp != NULL);
+	if (dtrace_lookup_by_type(dtp, DTRACE_OBJ_EVERY, idp->di_iarg,
+				  &dtt) == -1)
+		longjmp(yypcb->pcb_jmpbuf, EDT_CTF);
+
+	dt_ident_type_assign(idp, dtt.dtt_ctfp, dtt.dtt_type);
+}
+
 /*
  * Generate code to store the value (or address of the named variable in
  * register 'reg'.
diff --git a/libdtrace/dt_cg.h b/libdtrace/dt_cg.h
index 3d0f3618..6d895731 100644
--- a/libdtrace/dt_cg.h
+++ b/libdtrace/dt_cg.h
@@ -27,6 +27,7 @@ extern void dt_cg_tramp_copy_regs(dt_pcb_t *pcb);
 extern void dt_cg_tramp_copy_args_from_regs(dt_pcb_t *pcb, int called);
 extern void dt_cg_tramp_copy_pc_from_regs(dt_pcb_t *pcb);
 extern void dt_cg_tramp_copy_rval_from_regs(dt_pcb_t *pcb);
+extern void dt_cg_tramp_decl_var(dt_pcb_t *pcb, dt_ident_t *idp);
 extern void dt_cg_tramp_get_var(dt_pcb_t *pcb, const char *name, int isstore,
 				int reg);
 extern void dt_cg_tramp_del_var(dt_pcb_t *pcb, const char *name);
-- 
2.42.0




More information about the DTrace-devel mailing list