Skip to content

Commit

Permalink
Ensure proper probe compilation context is set for trampolines
Browse files Browse the repository at this point in the history
Trampolines are generated per-probe, well after the clauses have been
compiled.  The code generation for the trampolines was not setting the
proper probe context which could lead to obscure issues like not having
the proper probe argument information when the trampoline is generated.

Signed-off-by: Kris Van Hees <kris.van.hees@oracle.com>
Reviewed-by: Eugene Loh <eugene.loh@oracle.com>
  • Loading branch information
kvanhees committed Jul 6, 2021
1 parent 53b33a8 commit 351d461
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 8 deletions.
9 changes: 6 additions & 3 deletions libdtrace/dt_cc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1560,7 +1560,7 @@ dt_compile_xlator(dt_node_t *dnp)
}

void
dt_setcontext(dtrace_hdl_t *dtp, dtrace_probedesc_t *pdp)
dt_setcontext(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp)
{
const dtrace_pattr_t *pap;
dt_probe_t *prp;
Expand All @@ -1585,7 +1585,7 @@ dt_setcontext(dtrace_hdl_t *dtp, dtrace_probedesc_t *pdp)
isdigit(pdp->prv[strlen(pdp->prv) - 1]) &&
((pvp = dt_provider_lookup(dtp, pdp->prv)) == NULL ||
pvp->pv_flags & DT_PROVIDER_PID) &&
dt_pid_create_probes(pdp, dtp, yypcb) != 0) {
dt_pid_create_probes((dtrace_probedesc_t *)pdp, dtp, yypcb) != 0) {
longjmp(yypcb->pcb_jmpbuf, EDT_COMPILER);
}

Expand Down Expand Up @@ -2117,7 +2117,7 @@ dt_construct(dtrace_hdl_t *dtp, dt_probe_t *prp, uint_t cflags, dt_ident_t *idp)
pcb.pcb_context = DT_CTX_DPROG;
pcb.pcb_token = DT_CTX_DPROG;
pcb.pcb_probe = prp;
pcb.pcb_pdesc = NULL;
pcb.pcb_pdesc = prp->desc;

if ((err = setjmp(yypcb->pcb_jmpbuf)) != 0)
goto out;
Expand All @@ -2134,6 +2134,7 @@ dt_construct(dtrace_hdl_t *dtp, dt_probe_t *prp, uint_t cflags, dt_ident_t *idp)
if (yypcb->pcb_pragmas != NULL)
dt_idhash_iter(yypcb->pcb_pragmas, dt_idpragma, NULL);

dt_setcontext(dtp, yypcb->pcb_pdesc);
tnp = dt_node_trampoline(prp);
dt_node_type_assign(tnp, dtp->dt_ints[0].did_ctfp,
dtp->dt_ints[0].did_type);
Expand Down Expand Up @@ -2164,6 +2165,8 @@ dt_construct(dtrace_hdl_t *dtp, dt_probe_t *prp, uint_t cflags, dt_ident_t *idp)
ctf_write(dtp->dt_ddefs->dm_ctfp, dtp->dt_ddefs_fd) == CTF_ERR))
dt_dprintf("failed to update CTF cache: %s\n", strerror(errno));

dt_endcontext(dtp);

dt_pcb_pop(dtp, err);
dt_set_errno(dtp, err);

Expand Down
2 changes: 1 addition & 1 deletion libdtrace/dt_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -698,7 +698,7 @@ extern uint64_t dt_stddev(uint64_t *, uint64_t);

extern int dt_options_load(dtrace_hdl_t *);

extern void dt_setcontext(dtrace_hdl_t *, dtrace_probedesc_t *);
extern void dt_setcontext(dtrace_hdl_t *, const dtrace_probedesc_t *);
extern void dt_endcontext(dtrace_hdl_t *);

extern void dt_dlib_init(dtrace_hdl_t *dtp);
Expand Down
9 changes: 5 additions & 4 deletions libdtrace/dt_pid.c
Original file line number Diff line number Diff line change
Expand Up @@ -504,7 +504,7 @@ dt_pid_fix_mod(dt_pid_probe_t *pp, dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,

static int
dt_pid_create_pid_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
dt_pcb_t *pcb, dt_proc_t *dpr)
dt_pcb_t *pcb, dt_proc_t *dpr)
{
dt_pid_probe_t pp;
int ret = 0;
Expand Down Expand Up @@ -685,8 +685,8 @@ dt_pid_create_usdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
#endif

static pid_t
dt_pid_get_pid(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb,
dt_proc_t *dpr)
dt_pid_get_pid(const dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb,
dt_proc_t *dpr)
{
pid_t pid;
char *end;
Expand Down Expand Up @@ -741,7 +741,8 @@ dt_pid_create_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb)
dpr = dt_proc_lookup(dtp, pid);
assert(dpr != NULL);

if ((err = dt_pid_create_pid_probes(pdp, dtp, pcb, dpr)) == 0) {
err = dt_pid_create_pid_probes(pdp, dtp, pcb, dpr);
if (err == 0) {
/*
* Alert other retained enablings which may match
* against the newly created probes.
Expand Down

0 comments on commit 351d461

Please sign in to comment.