Skip to content

Commit

Permalink
Allow dt_cg_arglist() to handle the NULL case
Browse files Browse the repository at this point in the history
Even if an argument is empty, we might want to call dt_cg_arglist() to
construct a pointer to a tuple.

Callers can use the following pseudo-code to accomplish this:

	dt_node_t	noargs = {
				dnp->dn_ctfp,
				dtp->dt_type_void,
			};

	...

	if (dnp->dn_aggtup == NULL)
		dnp->dn_aggtup = &noargs;

	dt_cg_arglist(aid, dnp->dn_aggtup, dlp, drp);

	... <use dnp->dn_aggtup->dn_reg> ...

	if (dnp->aggtup == &noargs)
		dnp->aggtup = NULL;

	... <dnp->dn_aggtup->dn_reg is not used anympre> ...

Signed-off-by: Kris Van Hees <kris.van.hees@oracle.com>
Reviewed-by: Eugene Loh <eugene.loh@oracle.com>
  • Loading branch information
kvanhees committed Aug 31, 2022
1 parent 2b71d6e commit bb342c3
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 11 deletions.
18 changes: 11 additions & 7 deletions libdtrace/dt_bpf.c
Original file line number Diff line number Diff line change
Expand Up @@ -510,15 +510,19 @@ dt_bpf_gmap_create(dtrace_hdl_t *dtp)
dvarc = dtp->dt_options[DTRACEOPT_DYNVARSIZE] /
dtp->dt_maxdvarsize;

if (dvarc > 0 &&
create_gmap(dtp, "dvars", BPF_MAP_TYPE_HASH,
sizeof(uint64_t), dtp->dt_maxdvarsize, dvarc) == -1)
if (dvarc > 0) {
if (create_gmap(dtp, "dvars", BPF_MAP_TYPE_HASH,
sizeof(uint64_t), dtp->dt_maxdvarsize,
dvarc) == -1)
return -1; /* dt_errno is set for us */

if (dtp->dt_maxtuplesize > 0 &&
create_gmap(dtp, "tuples", BPF_MAP_TYPE_HASH,
dtp->dt_maxtuplesize, sizeof(uint64_t), dvarc) == -1)
return -1; /* dt_errno is set for us */
assert(dtp->dt_maxtuplesize > 0);

if (create_gmap(dtp, "tuples", BPF_MAP_TYPE_HASH,
dtp->dt_maxtuplesize, sizeof(uint64_t),
dvarc) == -1)
return -1; /* dt_errno is set for us */
}

/* Populate the 'cpuinfo' map. */
dt_bpf_map_update(ci_mapfd, &key, dtp->dt_conf.cpus);
Expand Down
10 changes: 7 additions & 3 deletions libdtrace/dt_cg.c
Original file line number Diff line number Diff line change
Expand Up @@ -2600,13 +2600,17 @@ dt_cg_arglist(dt_ident_t *idp, dt_node_t *args, dt_irlist_t *dlp,
const dt_idsig_t *isp = idp->di_data;
dt_node_t *dnp;
dt_ident_t *maxtupsz = dt_dlib_get_var(dtp, "TUPSZ");
int i;
int i = 0;
int treg, areg;
uint_t tuplesize;

TRACE_REGSET(" arglist: Begin");

for (dnp = args, i = 0; dnp != NULL; dnp = dnp->dn_list, i++) {
/* A 'void' args node indicates an empty argument list. */
if (dt_node_is_void(args))
goto empty_args;

for (dnp = args; dnp != NULL; dnp = dnp->dn_list, i++) {
/* Bail early if we run out of tuple slots. */
if (i > dtp->dt_conf.dtc_diftupregs)
longjmp(yypcb->pcb_jmpbuf, EDT_NOTUPREG);
Expand All @@ -2623,6 +2627,7 @@ dt_cg_arglist(dt_ident_t *idp, dt_node_t *args, dt_irlist_t *dlp,
dt_regset_free(drp, BPF_REG_0);
}

empty_args:
TRACE_REGSET(" arglist: Stack");

/*
Expand Down Expand Up @@ -6669,7 +6674,6 @@ dt_cg_agg(dt_pcb_t *pcb, dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
dnerror(dnp->dn_aggtup, D_ARR_BADREF, "indexing is not "
"supported yet: @%s\n", dnp->dn_ident->di_name);


assert(fid->di_id >= DT_AGG_BASE && fid->di_id < DT_AGG_HIGHEST);

dt_cg_clsflags(pcb, DTRACEACT_AGGREGATION, dnp);
Expand Down
1 change: 1 addition & 0 deletions libdtrace/dt_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,7 @@ struct dtrace_hdl {
ctf_id_t dt_type_stack; /* cached CTF identifier for stack type */
ctf_id_t dt_type_symaddr; /* cached CTF identifier for _symaddr type */
ctf_id_t dt_type_usymaddr; /* cached CTF ident. for _usymaddr type */
ctf_id_t dt_type_void; /* cached CTF identifier for void type */
dtrace_epid_t dt_nextepid; /* next enabled probe ID to assign */
size_t dt_maxprobe; /* max enabled probe ID */
dtrace_datadesc_t **dt_ddesc; /* probe data descriptions */
Expand Down
4 changes: 3 additions & 1 deletion libdtrace/dt_open.c
Original file line number Diff line number Diff line change
Expand Up @@ -1055,10 +1055,12 @@ dt_vopen(int version, int flags, int *errp,
dtp->dt_type_usymaddr = ctf_add_typedef(dmp->dm_ctfp, CTF_ADD_ROOT,
"_usymaddr", ctf_lookup_by_name(dmp->dm_ctfp, "void"));

dtp->dt_type_void = ctf_lookup_by_name(dmp->dm_ctfp, "void");

if (dtp->dt_type_func == CTF_ERR || dtp->dt_type_fptr == CTF_ERR ||
dtp->dt_type_str == CTF_ERR || dtp->dt_type_dyn == CTF_ERR ||
dtp->dt_type_stack == CTF_ERR || dtp->dt_type_symaddr == CTF_ERR ||
dtp->dt_type_usymaddr == CTF_ERR) {
dtp->dt_type_usymaddr == CTF_ERR || dtp->dt_type_void == CTF_ERR) {
dt_dprintf("failed to add intrinsic to D container: %s\n",
ctf_errmsg(ctf_errno(dmp->dm_ctfp)));
return set_open_errno(dtp, errp, EDT_CTF);
Expand Down

0 comments on commit bb342c3

Please sign in to comment.