[DTrace-devel] [PATCH v2 3/5] Include aggregates in the DIFO vartab
Eugene Loh
eugene.loh at oracle.com
Mon Nov 30 11:56:18 PST 2020
I'm curious about two things:
On 11/24/2020 01:50 PM, Kris Van Hees wrote:
> Aggregates used to be handled as special identifiers. Under the new
> design they will be handled more like variables and it is therefore
> warranted to include them in the variable table.
>
> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
> include/dtrace/dif_defines.h | 1 +
> libdtrace/dt_as.c | 24 +++++++++++++++++++-----
> libdtrace/dt_dis.c | 3 +++
> 3 files changed, 23 insertions(+), 5 deletions(-)
>
> diff --git a/include/dtrace/dif_defines.h b/include/dtrace/dif_defines.h
> index b983c45c..216bce42 100644
> --- a/include/dtrace/dif_defines.h
> +++ b/include/dtrace/dif_defines.h
> @@ -275,6 +275,7 @@ typedef uint32_t dif_instr_t;
>
> #define DIFV_KIND_ARRAY 0
> #define DIFV_KIND_SCALAR 1
> +#define DIFV_KIND_AGGREGATE 2
>
> #define DIFV_SCOPE_GLOBAL 0
> #define DIFV_SCOPE_THREAD 1
> diff --git a/libdtrace/dt_as.c b/libdtrace/dt_as.c
> index 3169cf66..437a2d86 100644
> --- a/libdtrace/dt_as.c
> +++ b/libdtrace/dt_as.c
> @@ -61,7 +61,9 @@ dt_countvar(dt_idhash_t *dhp, dt_ident_t *idp, void *data)
> size_t *np = data;
>
> if (idp->di_flags & (DT_IDFLG_DIFR | DT_IDFLG_DIFW))
> - (*np)++; /* include variable in vartab */
> + (*np)++; /* include variable in vartab */
> + else if (idp->di_kind == DT_IDENT_AGG)
> + (*np)++; /* include variable in vartab */
How about collapsing those to be:
if (idp->di_flags & (DT_IDFLG_DIFR | DT_IDFLG_DIFW))||
idp->di_kind == DT_IDENT_AGG)
(*np)++; /* include variable in vartab */
That would be more compact and would also mimic the expression in
dt_copyvar(), seen immediately following.
> return (0);
> }
> @@ -76,8 +78,9 @@ dt_copyvar(dt_idhash_t *dhp, dt_ident_t *idp, dtrace_hdl_t *dtp)
> ssize_t stroff;
> dt_node_t dn;
>
> - if (!(idp->di_flags & (DT_IDFLG_DIFR | DT_IDFLG_DIFW)))
> - return (0); /* omit variable from vartab */
> + if (!(idp->di_flags & (DT_IDFLG_DIFR | DT_IDFLG_DIFW)) &&
> + idp->di_kind != DT_IDENT_AGG)
> + return 0; /* omit variable from vartab */
>
> dvp = &pcb->pcb_difo->dtdo_vartab[pcb->pcb_asvidx++];
> stroff = dt_strtab_insert(dtp->dt_ccstab, idp->di_name);
> @@ -91,8 +94,17 @@ dt_copyvar(dt_idhash_t *dhp, dt_ident_t *idp, dtrace_hdl_t *dtp)
> dvp->dtdv_id = idp->di_id;
> dvp->dtdv_flags = 0;
>
> - dvp->dtdv_kind = (idp->di_kind == DT_IDENT_ARRAY) ?
> - DIFV_KIND_ARRAY : DIFV_KIND_SCALAR;
> + switch (idp->di_kind) {
> + case DT_IDENT_AGG:
> + dvp->dtdv_kind = DIFV_KIND_AGGREGATE;
> + break;
> + case DT_IDENT_ARRAY:
> + dvp->dtdv_kind = DIFV_KIND_ARRAY;
> + break;
> + default:
> + dvp->dtdv_kind = DIFV_KIND_SCALAR;
> + }
> +
>
> if (idp->di_flags & DT_IDFLG_LOCAL)
> dvp->dtdv_scope = DIFV_SCOPE_LOCAL;
> @@ -358,6 +370,7 @@ fail:
> * table we insert the corresponding variable names into the strtab.
> */
> dt_idhash_iter(dtp->dt_tls, dt_countvar, &n);
> + dt_idhash_iter(dtp->dt_aggs, dt_countvar, &n);
> dt_idhash_iter(dtp->dt_globals, dt_countvar, &n);
> dt_idhash_iter(pcb->pcb_locals, dt_countvar, &n);
>
> @@ -369,6 +382,7 @@ fail:
> longjmp(pcb->pcb_jmpbuf, EDT_NOMEM);
>
> dt_idhash_iter(dtp->dt_tls, (dt_idhash_f *)dt_copyvar, dtp);
> + dt_idhash_iter(dtp->dt_aggs, (dt_idhash_f *)dt_copyvar, dtp);
> dt_idhash_iter(dtp->dt_globals, (dt_idhash_f *)dt_copyvar, dtp);
> dt_idhash_iter(pcb->pcb_locals, (dt_idhash_f *)dt_copyvar, dtp);
> }
> diff --git a/libdtrace/dt_dis.c b/libdtrace/dt_dis.c
> index 342db62b..b10c3867 100644
> --- a/libdtrace/dt_dis.c
> +++ b/libdtrace/dt_dis.c
> @@ -663,6 +663,9 @@ dt_dis_difo(const dtrace_difo_t *dp, FILE *fp)
> char kind[4], scope[4], range[12], flags[16] = { 0 };
>
> switch (v->dtdv_kind) {
> + case DIFV_KIND_AGGREGATE:
> + strcpy(kind, "agg");
> + break;
> case DIFV_KIND_ARRAY:
> strcpy(kind, "arr");
> break;
I realize that this is not yet sufficient to generate disassembly for
aggregations, but I'm just wondering what tests we have for this.
Actually, hang on, do I not know where to look, or is it the case that
we have absolutely no tests of any kind for disassembly? That would seem
to be a big omission.
More information about the DTrace-devel
mailing list