[DTrace-devel] [PATCH 59/61] Add disassembly for aggregation variables
Kris Van Hees
kris.van.hees at oracle.com
Wed Aug 31 20:32:41 UTC 2022
On Fri, Jul 08, 2022 at 10:45:43AM -0400, eugene.loh--- via DTrace-devel wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
>
> 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 | 19 +++++++++++++++++++
> test/unittest/disasm/tst.ann-agg.r | 3 +++
> test/unittest/disasm/tst.ann-agg.sh | 22 ++++++++++++++++++++++
> 3 files changed, 44 insertions(+)
> create mode 100644 test/unittest/disasm/tst.ann-agg.r
> create mode 100755 test/unittest/disasm/tst.ann-agg.sh
>
> diff --git a/libdtrace/dt_dis.c b/libdtrace/dt_dis.c
> index 98fcd20e..8af6a246 100644
> --- a/libdtrace/dt_dis.c
> +++ b/libdtrace/dt_dis.c
> @@ -355,6 +355,25 @@ dt_dis_bpf_args(const dtrace_difo_t *dp, const char *fn,
> snprintf(buf, len, "%s",
> dt_dis_varname_id(dp, in->imm, DIFV_SCOPE_GLOBAL, addr));
> return buf;
> + } else if (strcmp(fn, "dt_get_agg") == 0) {
> + /*
> + * If the immediately preceding instruction is a 16-byte
> + * instruction, back up to streamline instruction counting.
> + */
> + if (in[-2].code == (BPF_LD | BPF_DW | BPF_IMM) &&
> + in[-1].code == 0)
> + in--;
> +
> + /*
> + * We know that the previous six instructions exist and
> + * move the variable id to a register in the first instruction
> + * of that seqeuence (because we wrote the code generator to
> + * emit the instructions in this exact order.)
> + */
> + in -= 6;
> + snprintf(buf, len, "@%s",
> + dt_dis_varname_id(dp, in->imm, DIFV_SCOPE_GLOBAL, addr));
> + return buf;
> } else if (strcmp(fn, "dt_get_tvar") == 0) {
> /*
> * We know that the previous three instructions exist and
> diff --git a/test/unittest/disasm/tst.ann-agg.r b/test/unittest/disasm/tst.ann-agg.r
> new file mode 100644
> index 00000000..c14f6464
> --- /dev/null
> +++ b/test/unittest/disasm/tst.ann-agg.r
> @@ -0,0 +1,3 @@
> +85 0 1 0000 ffffffff call dt_get_agg ! @myvar_agg
> +85 0 1 0000 ffffffff call dt_get_agg ! @myvar_agg_3keys
> +85 0 1 0000 ffffffff call dt_get_agg ! @myvar_agg_min
> diff --git a/test/unittest/disasm/tst.ann-agg.sh b/test/unittest/disasm/tst.ann-agg.sh
> new file mode 100755
> index 00000000..3f8e74a4
> --- /dev/null
> +++ b/test/unittest/disasm/tst.ann-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
> +
> +$dtrace $dt_flags -Sen '
> +BEGIN
> +{
> + myvar_global = 0xdeadbeef;
> + @myvar_agg = quantize(myvar_global);
> + @myvar_agg_3keys[1, 2, "hi"] = sum(myvar_global);
> + @myvar_agg_min = min(myvar_global);
> + exit(0);
> +}
> +' 2>&1 | awk '/ call dt_get_agg/ { sub(/^[^:]+: /, ""); print; }'
> +
> +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