[DTrace-devel] [PATCH] Allow dt_cg_arglist() to handle the NULL case
Kris Van Hees
kris.van.hees at oracle.com
Mon Aug 15 18:45:01 UTC 2022
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, &noargs, 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 at oracle.com>
---
libdtrace/dt_bpf.c | 18 +++++++++++-------
libdtrace/dt_cg.c | 10 +++++++---
libdtrace/dt_impl.h | 1 +
libdtrace/dt_open.c | 4 +++-
4 files changed, 22 insertions(+), 11 deletions(-)
diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c
index 4cb0eec6..f3f8c79d 100644
--- a/libdtrace/dt_bpf.c
+++ b/libdtrace/dt_bpf.c
@@ -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);
diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 175c4b95..0963f202 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -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);
@@ -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");
/*
@@ -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);
diff --git a/libdtrace/dt_impl.h b/libdtrace/dt_impl.h
index c1ff6256..85a1e7c9 100644
--- a/libdtrace/dt_impl.h
+++ b/libdtrace/dt_impl.h
@@ -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 */
diff --git a/libdtrace/dt_open.c b/libdtrace/dt_open.c
index f5cbd499..581172e2 100644
--- a/libdtrace/dt_open.c
+++ b/libdtrace/dt_open.c
@@ -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);
--
2.34.1
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://oss.oracle.com/pipermail/dtrace-devel/attachments/20220815/4326505c/attachment-0001.html>
More information about the DTrace-devel
mailing list