[DTrace-devel] [PATCH 58/61] Make sure disassembly distinguishes between gvars and agg vars

Kris Van Hees kris.van.hees at oracle.com
Wed Aug 31 20:32:08 UTC 2022


On Fri, Jul 08, 2022 at 10:45:42AM -0400, eugene.loh--- via DTrace-devel wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
> 
> When the disassembler recognizes access of a variable by value,
> it looks up a variable name that matches the offset and scope.
> The scope of aggregation variables is also "global", however,
> and so the presence of aggregations can lead to incorrect
> disassembly of global variables.
> 
> Check the variable "kind" when looking up variables accessed
> by value.
> 
> When the disassembler recognizes aggregation names, a similar
> test for them can be introduced.
> 
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>

Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>

... queued for dev

> ---
>  libdtrace/dt_dis.c                       |  1 +
>  test/unittest/disasm/tst.ann-gvar-agg.r  |  1 +
>  test/unittest/disasm/tst.ann-gvar-agg.sh | 22 ++++++++++++++++++++++
>  3 files changed, 24 insertions(+)
>  create mode 100644 test/unittest/disasm/tst.ann-gvar-agg.r
>  create mode 100755 test/unittest/disasm/tst.ann-gvar-agg.sh
> 
> diff --git a/libdtrace/dt_dis.c b/libdtrace/dt_dis.c
> index 58c02fd5..98fcd20e 100644
> --- a/libdtrace/dt_dis.c
> +++ b/libdtrace/dt_dis.c
> @@ -71,6 +71,7 @@ dt_dis_varname_off(const dtrace_difo_t *dp, uint_t off, uint_t scope, uint_t add
>  	for (i = 0; i < dp->dtdo_varlen; i++) {
>  		const dtrace_difv_t *dvp = &dp->dtdo_vartab[i];
>  		if (dvp->dtdv_offset == off && dvp->dtdv_scope == scope &&
> +		    dvp->dtdv_kind != DIFV_KIND_AGGREGATE &&
>  		    dvp->dtdv_insn_from <= addr && addr <= dvp->dtdv_insn_to) {
>  			if (dvp->dtdv_name < dp->dtdo_strlen)
>  				return dt_difo_getstr(dp, dvp->dtdv_name);
> diff --git a/test/unittest/disasm/tst.ann-gvar-agg.r b/test/unittest/disasm/tst.ann-gvar-agg.r
> new file mode 100644
> index 00000000..41cafcd0
> --- /dev/null
> +++ b/test/unittest/disasm/tst.ann-gvar-agg.r
> @@ -0,0 +1 @@
> +myvar_global
> diff --git a/test/unittest/disasm/tst.ann-gvar-agg.sh b/test/unittest/disasm/tst.ann-gvar-agg.sh
> new file mode 100755
> index 00000000..81f1c511
> --- /dev/null
> +++ b/test/unittest/disasm/tst.ann-gvar-agg.sh
> @@ -0,0 +1,22 @@
> +#!/bin/bash
> +#
> +# Oracle Linux DTrace.
> +# Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
> +# Licensed under the Universal Permissive License v 1.0 as shown at
> +# http://oss.oracle.com/licenses/upl.
> +#
> +
> +dtrace=$1
> +
> +# Test that annotation of gvars is not confused by agg vars.
> +
> +$dtrace $dt_flags -Sen '
> +BEGIN
> +{
> +	@myvar_agg = count();
> +	myvar_global = 0xdeadbeef;
> +	exit(0);
> +}
> +' 2>&1 | grep -A4 deadbeef | awk '/myvar_/ {print $NF}'
> +
> +exit $?
> -- 
> 2.18.4
> 
> 
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel



More information about the DTrace-devel mailing list