[DTrace-devel] [PATCH 2/3] Delay setting %r1 to reduce reg overwrite
eugene.loh at oracle.com
eugene.loh at oracle.com
Wed Aug 30 01:54:32 UTC 2023
From: Eugene Loh <eugene.loh at oracle.com>
Register management is currently a little risky. In this case,
we set %r1 first even though theoretically that could overwrite
some value. We might as well delay setting %r1 since its value
depends on no other registers.
Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
libdtrace/dt_cg.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 5210d71d..ef44067a 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -4633,7 +4633,6 @@ dt_cg_subr_arg_to_tstring(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp,
if (dt_regset_xalloc_args(drp) == -1)
longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
- emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_1, BPF_REG_FP, DT_STK_DCTX));
emit(dlp, BPF_MOV_REG(BPF_REG_2, arg->dn_reg));
dt_regset_free(drp, arg->dn_reg);
if (dt_node_is_string(arg))
@@ -4646,6 +4645,8 @@ dt_cg_subr_arg_to_tstring(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp,
else if (isreg == DT_ISIMM)
emit(dlp, BPF_MOV_IMM(BPF_REG_4, val));
+ emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_1, BPF_REG_FP, DT_STK_DCTX));
+
idp = dt_dlib_get_func(yypcb->pcb_hdl, fname);
assert(idp != NULL);
dt_regset_xalloc(drp, BPF_REG_0);
--
2.18.4
More information about the DTrace-devel
mailing list