[llvm] 0a4defe - [llvm-dwarfdump][Stats] Clean up

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Mon May 4 15:34:39 PDT 2020


Thanks for the cleanup! But could you include more details in your commit
message, especially when so many different changes are incorporated in one
commit (best to separate them as much as possible) - "clean up",
"refactor", "fix", "improve" are all fairly vague and more details in the
commit message (doesn't have to be exhaustive, but a general idea of what
sort of things are being done would be handy)?

On Mon, May 4, 2020 at 12:36 AM Djordje Todorovic via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

>
> Author: Djordje Todorovic
> Date: 2020-05-04T09:35:40+02:00
> New Revision: 0a4defe8c8772268b6f8b63c6baa45dac5064834
>
> URL:
> https://github.com/llvm/llvm-project/commit/0a4defe8c8772268b6f8b63c6baa45dac5064834
> DIFF:
> https://github.com/llvm/llvm-project/commit/0a4defe8c8772268b6f8b63c6baa45dac5064834.diff
>
> LOG: [llvm-dwarfdump][Stats] Clean up
>
> This addresses:
>   -Clean up the source code
>   -Refactor the JSON fields
>   -Fix the test cases
>   -Improve the docs for the stats output
>
> Differential Revision: https://reviews.llvm.org/D77789
>
> Added:
>
>
> Modified:
>     llvm/docs/CommandGuide/llvm-dwarfdump.rst
>     llvm/test/DebugInfo/X86/dwarf-callsite-related-attrs.ll
>     llvm/test/tools/llvm-dwarfdump/X86/locstats.ll
>     llvm/test/tools/llvm-dwarfdump/X86/statistics-base-address.s
>     llvm/test/tools/llvm-dwarfdump/X86/statistics-dwo.test
>     llvm/test/tools/llvm-dwarfdump/X86/statistics-v3.test
>     llvm/test/tools/llvm-dwarfdump/X86/statistics.ll
>     llvm/test/tools/llvm-dwarfdump/X86/stats-dbg-callsite-info.ll
>     llvm/test/tools/llvm-dwarfdump/X86/stats-inlining-multi-cu.ll
>     llvm/test/tools/llvm-dwarfdump/X86/stats-inlining-single-cu.ll
>     llvm/test/tools/llvm-dwarfdump/X86/stats-mulitple-cu-out-of-line.ll
>     llvm/test/tools/llvm-dwarfdump/X86/stats-multiple-cu-members.ll
>     llvm/test/tools/llvm-dwarfdump/X86/stats-multiple-cu-same-name.ll
>     llvm/tools/llvm-dwarfdump/Statistics.cpp
>     llvm/utils/llvm-locstats/llvm-locstats.py
>
> Removed:
>
>
>
>
> ################################################################################
> diff  --git a/llvm/docs/CommandGuide/llvm-dwarfdump.rst
> b/llvm/docs/CommandGuide/llvm-dwarfdump.rst
> index 840c93345d29..fcd22299ec08 100644
> --- a/llvm/docs/CommandGuide/llvm-dwarfdump.rst
> +++ b/llvm/docs/CommandGuide/llvm-dwarfdump.rst
> @@ -112,7 +112,8 @@ OPTIONS
>  .. option:: --statistics
>
>              Collect debug info quality metrics and print the results
> -            as machine-readable single-line JSON output.
> +            as machine-readable single-line JSON output. The output
> +            format is described in the section below
> (:ref:`stats-format`).
>
>  .. option:: --summarize-types
>
> @@ -162,6 +163,30 @@ OPTIONS
>
>              Read command-line options from `<FILE>`.
>
> +.. _stats-format:
> +
> +FORMAT OF STATISTICS OUTPUT
> +---------------------------
> +
> +The ::option:`--statistics` option generates single-line JSON output
> +representing quality metrics of the processed debug info. These metrics
> are
> +useful to compare changes between two compilers, particularly for judging
> +the effect that a change to the compiler has on the debug info quality.
> +
> +The output is formatted as key-value pairs. The first pair contains a
> version
> +number. The following naming scheme is used for the keys:
> +
> +      - `variables` ==> local variables and parameters
> +      - `local vars` ==> local variables
> +      - `params` ==> formal parameters
> +
> +For aggregated values, the following keys are used:
> +
> +      - `sum_of_all_variables(...)` ==> the sum applied to all variables
> +      - `#bytes` ==> the number of bytes
> +      - `#variables - entry values ...` ==> the number of variables
> excluding
> +        the entry values etc.
> +
>  EXIT STATUS
>  -----------
>
>
> diff  --git a/llvm/test/DebugInfo/X86/dwarf-callsite-related-attrs.ll
> b/llvm/test/DebugInfo/X86/dwarf-callsite-related-attrs.ll
> index 3a34ff38809f..53d21764ad04 100644
> --- a/llvm/test/DebugInfo/X86/dwarf-callsite-related-attrs.ll
> +++ b/llvm/test/DebugInfo/X86/dwarf-callsite-related-attrs.ll
> @@ -20,7 +20,7 @@
>  ; RUN: llvm-as < %s | llvm-dis | llvm-as | llvm-dis -o /dev/null
>
>  ; VERIFY: No errors.
> -; STATS: "call site DIEs":6
> +; STATS: "#call site DIEs":6
>
>  @sink = global i32 0, align 4, !dbg !0
>
>
> diff  --git a/llvm/test/tools/llvm-dwarfdump/X86/locstats.ll
> b/llvm/test/tools/llvm-dwarfdump/X86/locstats.ll
> index 7521806c624f..832ecbe219ca 100644
> --- a/llvm/test/tools/llvm-dwarfdump/X86/locstats.ll
> +++ b/llvm/test/tools/llvm-dwarfdump/X86/locstats.ll
> @@ -1,89 +1,89 @@
>  ; RUN: llc -debug-entry-values %s -o - -filetype=obj \
>  ; RUN:   | llvm-dwarfdump -statistics - | FileCheck %s
> -;
> -; CHECK: "entry value scope bytes covered":5
> -; CHECK: "formal params scope bytes total":20
> -; CHECK: "formal params scope bytes covered":20
> -; CHECK: "formal params entry value scope bytes covered":5
> -; CHECK: "vars scope bytes total":90
> -; CHECK: "vars scope bytes covered":60
> -; CHECK: "vars entry value scope bytes covered":0
> -; CHECK: "total variables procesed by location statistics":6
> -; CHECK: "variables with 0% of its scope covered":1
> -; CHECK: "variables with (0%,10%) of its scope covered":0
> -; CHECK: "variables with [10%,20%) of its scope covered":0
> -; CHECK: "variables with [20%,30%) of its scope covered":0
> -; CHECK: "variables with [30%,40%) of its scope covered":0
> -; CHECK: "variables with [40%,50%) of its scope covered":0
> -; CHECK: "variables with [50%,60%) of its scope covered":1
> -; CHECK: "variables with [60%,70%) of its scope covered":0
> -; CHECK: "variables with [70%,80%) of its scope covered":0
> -; CHECK: "variables with [80%,90%) of its scope covered":1
> -; CHECK: "variables with [90%,100%) of its scope covered":0
> -; CHECK: "variables with 100% of its scope covered":3
> -; CHECK: "variables (excluding the debug entry values) with 0% of its
> scope covered":1
> -; CHECK: "variables (excluding the debug entry values) with (0%,10%) of
> its scope covered":0
> -; CHECK: "variables (excluding the debug entry values) with [10%,20%) of
> its scope covered":0
> -; CHECK: "variables (excluding the debug entry values) with [20%,30%) of
> its scope covered":0
> -; CHECK: "variables (excluding the debug entry values) with [30%,40%) of
> its scope covered":0
> -; CHECK: "variables (excluding the debug entry values) with [40%,50%) of
> its scope covered":0
> -; CHECK: "variables (excluding the debug entry values) with [50%,60%) of
> its scope covered":2
> -; CHECK: "variables (excluding the debug entry values) with [60%,70%) of
> its scope covered":0
> -; CHECK: "variables (excluding the debug entry values) with [70%,80%) of
> its scope covered":0
> -; CHECK: "variables (excluding the debug entry values) with [80%,90%) of
> its scope covered":1
> -; CHECK: "variables (excluding the debug entry values) with [90%,100%) of
> its scope covered":0
> -; CHECK: "variables (excluding the debug entry values) with 100% of its
> scope covered":2
> -; CHECK: "total params procesed by location statistics":2
> -; CHECK: "params with 0% of its scope covered":0
> -; CHECK: "params with (0%,10%) of its scope covered":0
> -; CHECK: "params with [10%,20%) of its scope covered":0
> -; CHECK: "params with [20%,30%) of its scope covered":0
> -; CHECK: "params with [30%,40%) of its scope covered":0
> -; CHECK: "params with [40%,50%) of its scope covered":0
> -; CHECK: "params with [50%,60%) of its scope covered":0
> -; CHECK: "params with [60%,70%) of its scope covered":0
> -; CHECK: "params with [70%,80%) of its scope covered":0
> -; CHECK: "params with [80%,90%) of its scope covered":0
> -; CHECK: "params with [90%,100%) of its scope covered":0
> -; CHECK: "params with 100% of its scope covered":2
> -; CHECK: "params (excluding the debug entry values) with 0% of its scope
> covered":0
> -; CHECK: "params (excluding the debug entry values) with (0%,10%) of its
> scope covered":0
> -; CHECK: "params (excluding the debug entry values) with [10%,20%) of its
> scope covered":0
> -; CHECK: "params (excluding the debug entry values) with [20%,30%) of its
> scope covered":0
> -; CHECK: "params (excluding the debug entry values) with [30%,40%) of its
> scope covered":0
> -; CHECK: "params (excluding the debug entry values) with [40%,50%) of its
> scope covered":0
> -; CHECK: "params (excluding the debug entry values) with [50%,60%) of its
> scope covered":1
> -; CHECK: "params (excluding the debug entry values) with [60%,70%) of its
> scope covered":0
> -; CHECK: "params (excluding the debug entry values) with [70%,80%) of its
> scope covered":0
> -; CHECK: "params (excluding the debug entry values) with [80%,90%) of its
> scope covered":0
> -; CHECK: "params (excluding the debug entry values) with [90%,100%) of
> its scope covered":0
> -; CHECK: "params (excluding the debug entry values) with 100% of its
> scope covered":1
> -; CHECK: "total vars procesed by location statistics":4
> -; CHECK: "vars with 0% of its scope covered":1
> -; CHECK: "vars with (0%,10%) of its scope covered":0
> -; CHECK: "vars with [10%,20%) of its scope covered":0
> -; CHECK: "vars with [20%,30%) of its scope covered":0
> -; CHECK: "vars with [30%,40%) of its scope covered":0
> -; CHECK: "vars with [40%,50%) of its scope covered":0
> -; CHECK: "vars with [50%,60%) of its scope covered":1
> -; CHECK: "vars with [60%,70%) of its scope covered":0
> -; CHECK: "vars with [70%,80%) of its scope covered":0
> -; CHECK: "vars with [80%,90%) of its scope covered":1
> -; CHECK: "vars with [90%,100%) of its scope covered":0
> -; CHECK: "vars with 100% of its scope covered":1
> -; CHECK: "vars (excluding the debug entry values) with 0% of its scope
> covered":1
> -; CHECK: "vars (excluding the debug entry values) with (0%,10%) of its
> scope covered":0
> -; CHECK: "vars (excluding the debug entry values) with [10%,20%) of its
> scope covered":0
> -; CHECK: "vars (excluding the debug entry values) with [20%,30%) of its
> scope covered":0
> -; CHECK: "vars (excluding the debug entry values) with [30%,40%) of its
> scope covered":0
> -; CHECK: "vars (excluding the debug entry values) with [40%,50%) of its
> scope covered":0
> -; CHECK: "vars (excluding the debug entry values) with [50%,60%) of its
> scope covered":1
> -; CHECK: "vars (excluding the debug entry values) with [60%,70%) of its
> scope covered":0
> -; CHECK: "vars (excluding the debug entry values) with [70%,80%) of its
> scope covered":0
> -; CHECK: "vars (excluding the debug entry values) with [80%,90%) of its
> scope covered":1
> -; CHECK: "vars (excluding the debug entry values) with [90%,100%) of its
> scope covered":0
> -; CHECK: "vars (excluding the debug entry values) with 100% of its scope
> covered":1
> -;
> +
> +; CHECK: "sum_all_variables(#bytes in parent scope covered by
> DW_OP_entry_value)":5
> +; CHECK: "sum_all_params(#bytes in parent scope)":20
> +; CHECK: "sum_all_params(#bytes in parent scope covered by
> DW_AT_location)":20
> +; CHECK: "sum_all_params(#bytes in parent scope covered by
> DW_OP_entry_value)":5
> +; CHECK: "sum_all_local_vars(#bytes in parent scope)":90
> +; CHECK: "sum_all_local_vars(#bytes in parent scope covered by
> DW_AT_location)":60
> +; CHECK: "sum_all_local_vars(#bytes in parent scope covered by
> DW_OP_entry_value)":0
> +; CHECK: "#variables processed by location statistics":6
> +; CHECK: "#variables with 0% of parent scope covered by DW_AT_location":1
> +; CHECK: "#variables with (0%,10%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#variables with [10%,20%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#variables with [20%,30%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#variables with [30%,40%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#variables with [40%,50%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#variables with [50%,60%) of parent scope covered by
> DW_AT_location":1
> +; CHECK: "#variables with [60%,70%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#variables with [70%,80%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#variables with [80%,90%) of parent scope covered by
> DW_AT_location":1
> +; CHECK: "#variables with [90%,100%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#variables with 100% of parent scope covered by
> DW_AT_location":3
> +; CHECK: "#variables - entry values with 0% of parent scope covered by
> DW_AT_location":1
> +; CHECK: "#variables - entry values with (0%,10%) of parent scope covered
> by DW_AT_location":0
> +; CHECK: "#variables - entry values with [10%,20%) of parent scope
> covered by DW_AT_location":0
> +; CHECK: "#variables - entry values with [20%,30%) of parent scope
> covered by DW_AT_location":0
> +; CHECK: "#variables - entry values with [30%,40%) of parent scope
> covered by DW_AT_location":0
> +; CHECK: "#variables - entry values with [40%,50%) of parent scope
> covered by DW_AT_location":0
> +; CHECK: "#variables - entry values with [50%,60%) of parent scope
> covered by DW_AT_location":2
> +; CHECK: "#variables - entry values with [60%,70%) of parent scope
> covered by DW_AT_location":0
> +; CHECK: "#variables - entry values with [70%,80%) of parent scope
> covered by DW_AT_location":0
> +; CHECK: "#variables - entry values with [80%,90%) of parent scope
> covered by DW_AT_location":1
> +; CHECK: "#variables - entry values with [90%,100%) of parent scope
> covered by DW_AT_location":0
> +; CHECK: "#variables - entry values with 100% of parent scope covered by
> DW_AT_location":2
> +; CHECK: "#params processed by location statistics":2
> +; CHECK: "#params with 0% of parent scope covered by DW_AT_location":0
> +; CHECK: "#params with (0%,10%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#params with [10%,20%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#params with [20%,30%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#params with [30%,40%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#params with [40%,50%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#params with [50%,60%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#params with [60%,70%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#params with [70%,80%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#params with [80%,90%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#params with [90%,100%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#params with 100% of parent scope covered by DW_AT_location":2
> +; CHECK: "#params - entry values with 0% of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#params - entry values with (0%,10%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#params - entry values with [10%,20%) of parent scope covered
> by DW_AT_location":0
> +; CHECK: "#params - entry values with [20%,30%) of parent scope covered
> by DW_AT_location":0
> +; CHECK: "#params - entry values with [30%,40%) of parent scope covered
> by DW_AT_location":0
> +; CHECK: "#params - entry values with [40%,50%) of parent scope covered
> by DW_AT_location":0
> +; CHECK: "#params - entry values with [50%,60%) of parent scope covered
> by DW_AT_location":1
> +; CHECK: "#params - entry values with [60%,70%) of parent scope covered
> by DW_AT_location":0
> +; CHECK: "#params - entry values with [70%,80%) of parent scope covered
> by DW_AT_location":0
> +; CHECK: "#params - entry values with [80%,90%) of parent scope covered
> by DW_AT_location":0
> +; CHECK: "#params - entry values with [90%,100%) of parent scope covered
> by DW_AT_location":0
> +; CHECK: "#params - entry values with 100% of parent scope covered by
> DW_AT_location":1
> +; CHECK: "#local vars processed by location statistics":4
> +; CHECK: "#local vars with 0% of parent scope covered by DW_AT_location":1
> +; CHECK: "#local vars with (0%,10%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#local vars with [10%,20%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#local vars with [20%,30%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#local vars with [30%,40%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#local vars with [40%,50%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#local vars with [50%,60%) of parent scope covered by
> DW_AT_location":1
> +; CHECK: "#local vars with [60%,70%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#local vars with [70%,80%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#local vars with [80%,90%) of parent scope covered by
> DW_AT_location":1
> +; CHECK: "#local vars with [90%,100%) of parent scope covered by
> DW_AT_location":0
> +; CHECK: "#local vars with 100% of parent scope covered by
> DW_AT_location":1
> +; CHECK: "#local vars - entry values with 0% of parent scope covered by
> DW_AT_location":1
> +; CHECK: "#local vars - entry values with (0%,10%) of parent scope
> covered by DW_AT_location":0
> +; CHECK: "#local vars - entry values with [10%,20%) of parent scope
> covered by DW_AT_location":0
> +; CHECK: "#local vars - entry values with [20%,30%) of parent scope
> covered by DW_AT_location":0
> +; CHECK: "#local vars - entry values with [30%,40%) of parent scope
> covered by DW_AT_location":0
> +; CHECK: "#local vars - entry values with [40%,50%) of parent scope
> covered by DW_AT_location":0
> +; CHECK: "#local vars - entry values with [50%,60%) of parent scope
> covered by DW_AT_location":1
> +; CHECK: "#local vars - entry values with [60%,70%) of parent scope
> covered by DW_AT_location":0
> +; CHECK: "#local vars - entry values with [70%,80%) of parent scope
> covered by DW_AT_location":0
> +; CHECK: "#local vars - entry values with [80%,90%) of parent scope
> covered by DW_AT_location":1
> +; CHECK: "#local vars - entry values with [90%,100%) of parent scope
> covered by DW_AT_location":0
> +; CHECK: "#local vars - entry values with 100% of parent scope covered by
> DW_AT_location":1
> +
>  ; The source code of the test case:
>  ; extern void fn3(int *);
>  ; extern void fn2 (int);
> @@ -102,7 +102,7 @@
>  ;   fn2 (a);
>  ;   u --;
>  ; }
> -;
> +
>  ; __attribute__((noinline))
>  ; int f()
>  ; {
> @@ -112,7 +112,7 @@
>  ;   fn1 (l, k);
>  ;   return 0;
>  ; }
> -;
> +
>  ; ModuleID = 'test.c'
>  source_filename = "test.c"
>  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
>
> diff  --git a/llvm/test/tools/llvm-dwarfdump/X86/statistics-base-address.s
> b/llvm/test/tools/llvm-dwarfdump/X86/statistics-base-address.s
> index 1a933f5a0994..ca9b7c9781e1 100644
> --- a/llvm/test/tools/llvm-dwarfdump/X86/statistics-base-address.s
> +++ b/llvm/test/tools/llvm-dwarfdump/X86/statistics-base-address.s
> @@ -5,8 +5,8 @@
>  # RUN: llvm-mc -triple x86_64-pc-linux %s -filetype=obj -o %t
>  # RUN: llvm-dwarfdump --statistics %t | FileCheck %s
>
> -# CHECK: "vars scope bytes total":12
> -# CHECK: "vars scope bytes covered":8
> +# CHECK: "sum_all_local_vars(#bytes in parent scope)":12
> +# CHECK: "sum_all_local_vars(#bytes in parent scope covered by
> DW_AT_location)":8
>
>          .text
>
>
> diff  --git a/llvm/test/tools/llvm-dwarfdump/X86/statistics-dwo.test
> b/llvm/test/tools/llvm-dwarfdump/X86/statistics-dwo.test
> index 1ca1503f4e70..1b8e63986758 100644
> --- a/llvm/test/tools/llvm-dwarfdump/X86/statistics-dwo.test
> +++ b/llvm/test/tools/llvm-dwarfdump/X86/statistics-dwo.test
> @@ -69,28 +69,28 @@ RUN: llvm-dwarfdump --statistics
> statistics-fib.split-dwarf.o | FileCheck %s
>  # }
>  #
>
> -CHECK: "version":4
> -CHECK: "source functions":3
> -CHECK: "source functions with location":3
> -CHECK: "inlined functions":7
> -CHECK: "inlined funcs with abstract origins":7
> -CHECK: "unique source variables":9
> -CHECK: "source variables":30
> +CHECK: "version":5
> +CHECK: "#functions":3
> +CHECK: "#functions with location":3
> +CHECK: "#inlined functions":7
> +CHECK: "#inlined functions with abstract origins":7
> +CHECK: "#unique source variables":9
> +CHECK: "#source variables":30
>
>  # Ideally the value below would be 33 but currently it's not.
> -CHECK: "variables with location":22
> -CHECK: "call site entries":7
> -CHECK: "scope bytes total":2817
> -CHECK: "scope bytes covered":1160
> -CHECK: "total function size":594
> -CHECK: "total inlined function size":345
> -CHECK: "total formal params":12
> -CHECK: "formal params with source location":12
> -CHECK: "formal params with type":12
> -CHECK: "formal params with binary location":12
> -CHECK: "total vars":18
> -CHECK: "vars with source location":18
> -CHECK: "vars with type":18
> +CHECK: "#source variables with location":22
> +CHECK: "#call site entries":7
> +CHECK: "sum_all_variables(#bytes in parent scope)":2817
> +CHECK: "sum_all_variables(#bytes in parent scope covered by
> DW_AT_location)":1160
> +CHECK: "#bytes witin functions":594
> +CHECK: "#bytes witin inlined functions":345
> +CHECK: "#params":12
> +CHECK: "#params with source location":12
> +CHECK: "#params with type":12
> +CHECK: "#params with binary location":12
> +CHECK: "#local vars":18
> +CHECK: "#local vars with source location":18
> +CHECK: "#local vars with type":18
>
>  # Ideally the value below would be 18, but currently it's not.
> -CHECK: "vars with binary location":10
> +CHECK: "#local vars with binary location":10
>
> diff  --git a/llvm/test/tools/llvm-dwarfdump/X86/statistics-v3.test
> b/llvm/test/tools/llvm-dwarfdump/X86/statistics-v3.test
> index a16ae8c30ced..257849b46f3c 100644
> --- a/llvm/test/tools/llvm-dwarfdump/X86/statistics-v3.test
> +++ b/llvm/test/tools/llvm-dwarfdump/X86/statistics-v3.test
> @@ -64,28 +64,28 @@ RUN: llvm-dwarfdump --statistics %t-statistics-fib.o |
> FileCheck %s
>  # }
>  #
>
> -CHECK: "version":4
> -CHECK: "source functions":3
> -CHECK: "source functions with location":3
> -CHECK: "inlined functions":8
> -CHECK: "inlined funcs with abstract origins":8
> -CHECK: "unique source variables":9
> -CHECK: "source variables":33
> +CHECK: "version":5
> +CHECK: "#functions":3
> +CHECK: "#functions with location":3
> +CHECK: "#inlined functions":8
> +CHECK: "#inlined functions with abstract origins":8
> +CHECK: "#unique source variables":9
> +CHECK: "#source variables":33
>
>  # Ideally the value below would be 33 but currently it's not.
> -CHECK: "variables with location":24
> -CHECK: "call site entries":8
> -CHECK: "scope bytes total":3072
> -CHECK: "scope bytes covered":1188
> -CHECK: "total function size":636
> -CHECK: "total inlined function size":388
> -CHECK: "total formal params":13
> -CHECK: "formal params with source location":13
> -CHECK: "formal params with type":13
> -CHECK: "formal params with binary location":13
> -CHECK: "total vars":20
> -CHECK: "vars with source location":20
> -CHECK: "vars with type":20
> +CHECK: "#source variables with location":24
> +CHECK: "#call site entries":8
> +CHECK: "sum_all_variables(#bytes in parent scope)":3072
> +CHECK: "sum_all_variables(#bytes in parent scope covered by
> DW_AT_location)":1188
> +CHECK: "#bytes witin functions":636
> +CHECK: "#bytes witin inlined functions":388
> +CHECK: "#params":13
> +CHECK: "#params with source location":13
> +CHECK: "#params with type":13
> +CHECK: "#params with binary location":13
> +CHECK: "#local vars":20
> +CHECK: "#local vars with source location":20
> +CHECK: "#local vars with type":20
>
>  # Ideally the value below would be 20, but currently it's not.
> -CHECK: "vars with binary location":11
> +CHECK: "#local vars with binary location":11
>
> diff  --git a/llvm/test/tools/llvm-dwarfdump/X86/statistics.ll
> b/llvm/test/tools/llvm-dwarfdump/X86/statistics.ll
> index 33a091ca811c..2683db3efbab 100644
> --- a/llvm/test/tools/llvm-dwarfdump/X86/statistics.ll
> +++ b/llvm/test/tools/llvm-dwarfdump/X86/statistics.ll
> @@ -1,6 +1,6 @@
>  ; RUN: llc -O0 %s -o - -filetype=obj \
>  ; RUN:   | llvm-dwarfdump -statistics - | FileCheck %s
> -; CHECK: "version":4
> +; CHECK: "version":5
>
>  ; namespace test {
>  ;  extern int a;
> @@ -35,24 +35,24 @@
>  ;     - non-constant member S:fn,
>  ;     - arguments of S:fn.
>
> -; CHECK: "unique source variables":9
> +; CHECK: "#unique source variables":9
>  ; +1 extra inline i.
> -; CHECK: "source variables":10
> +; CHECK: "#source variables":10
>  ; -1 square::i
> -; CHECK: "variables with location":9
> -; CHECK: "scope bytes total":[[BYTES:[0-9]+]]
> +; CHECK: "#source variables with location":9
> +; CHECK: "sum_all_local_vars(#bytes in parent scope)":[[BYTES:[0-9]+]]
>  ; Because of the dbg.value in the middle of the function, the pc range
> coverage
>  ; must be below 100%.
> -; CHECK-NOT: "scope bytes covered":0
> -; CHECK-NOT: "scope bytes covered":[[BYTES]]
> -; CHECK: "scope bytes covered":
> -; CHECK: "total function size":[[FUNCSIZE:[0-9]+]]
> -; CHECK: "total inlined function size":[[INLINESIZE:[0-9]+]]
> -; CHECK: "size of __debug_info":380
> -; CHECK: "size of __debug_loc":35
> -; CHECK: "size of __debug_abbrev":303
> -; CHECK: "size of __debug_line":117
> -; CHECK: "size of __debug_str":204
> +; CHECK-NOT: "sum_all_local_vars(#bytes in parent scope covered by
> DW_AT_location)":0
> +; CHECK-NOT "sum_all_local_vars(#bytes in parent scope covered by
> DW_AT_location)":[[BYTES]]
> +; CHECK: "sum_all_local_vars(#bytes in parent scope covered by
> DW_AT_location)":
> +; CHECK: "#bytes witin functions":[[FUNCSIZE:[0-9]+]]
> +; CHECK: "#bytes witin inlined functions":[[INLINESIZE:[0-9]+]]
> +; CHECK: "#bytes in __debug_info":380
> +; CHECK: "#bytes in __debug_loc":35
> +; CHECK: "#bytes in __debug_abbrev":303
> +; CHECK: "#bytes in __debug_line":117
> +; CHECK: "#bytes in __debug_str":204
>
>  ; ModuleID = '/tmp/quality.cpp'
>  source_filename = "/tmp/quality.cpp"
>
> diff  --git
> a/llvm/test/tools/llvm-dwarfdump/X86/stats-dbg-callsite-info.ll
> b/llvm/test/tools/llvm-dwarfdump/X86/stats-dbg-callsite-info.ll
> index d126757398ff..7f7e3438c14f 100644
> --- a/llvm/test/tools/llvm-dwarfdump/X86/stats-dbg-callsite-info.ll
> +++ b/llvm/test/tools/llvm-dwarfdump/X86/stats-dbg-callsite-info.ll
> @@ -12,8 +12,8 @@
>  ;   foo(&local1, arg2, 10, 15, arg3 + 3, arg1 + arg2);
>  ; }
>  ;
> -; CHECK: "call site DIEs":2
> -; CHECK-SAME: "call site parameter DIEs":6
> +; CHECK: "#call site DIEs":2
> +; CHECK-SAME: "#call site parameter DIEs":6
>  ;
>  ; ModuleID = 'test.c'
>  source_filename = "test.c"
>
> diff  --git
> a/llvm/test/tools/llvm-dwarfdump/X86/stats-inlining-multi-cu.ll
> b/llvm/test/tools/llvm-dwarfdump/X86/stats-inlining-multi-cu.ll
> index e6e193c2004d..0615e867fca1 100644
> --- a/llvm/test/tools/llvm-dwarfdump/X86/stats-inlining-multi-cu.ll
> +++ b/llvm/test/tools/llvm-dwarfdump/X86/stats-inlining-multi-cu.ll
> @@ -3,11 +3,11 @@
>
>  ; Test that abstract origins in multiple CUs are uniqued.
>
> -; CHECK:      "source functions":4,
> -; CHECK-SAME: "inlined functions":2,
> -; CHECK-SAME: "unique source variables":4
> -; CHECK-SAME: "source variables":6
> -; CHECK-SAME: "variables with location":6
> +; CHECK:      "#functions":4,
> +; CHECK-SAME: "#inlined functions":2,
> +; CHECK-SAME: "#unique source variables":4
> +; CHECK-SAME: "#source variables":6
> +; CHECK-SAME: "#source variables with location":6
>
>  ;header.h:
>  ;extern "C" int getchar();
>
> diff  --git
> a/llvm/test/tools/llvm-dwarfdump/X86/stats-inlining-single-cu.ll
> b/llvm/test/tools/llvm-dwarfdump/X86/stats-inlining-single-cu.ll
> index 5a4c3541a5c4..c56e6a55049a 100644
> --- a/llvm/test/tools/llvm-dwarfdump/X86/stats-inlining-single-cu.ll
> +++ b/llvm/test/tools/llvm-dwarfdump/X86/stats-inlining-single-cu.ll
> @@ -4,11 +4,11 @@
>  ; This test serves as a baseline / sanity-check for
> stats-inlining-multi-cu.ll
>  ; The results for both tests should be identical.
>
> -; CHECK:      "source functions":4,
> -; CHECK-SAME: "inlined functions":2,
> -; CHECK-SAME: "unique source variables":4
> -; CHECK-SAME: "source variables":6
> -; CHECK-SAME: "variables with location":6
> +; CHECK:      "#functions":4,
> +; CHECK-SAME: "#inlined functions":2,
> +; CHECK-SAME: "#unique source variables":4
> +; CHECK-SAME: "#source variables":6
> +; CHECK-SAME: "#source variables with location":6
>
>  ;header.h:
>  ;extern "C" int getchar();
>
> diff  --git
> a/llvm/test/tools/llvm-dwarfdump/X86/stats-mulitple-cu-out-of-line.ll
> b/llvm/test/tools/llvm-dwarfdump/X86/stats-mulitple-cu-out-of-line.ll
> index 53c202babb23..cc644d1bdb5c 100644
> --- a/llvm/test/tools/llvm-dwarfdump/X86/stats-mulitple-cu-out-of-line.ll
> +++ b/llvm/test/tools/llvm-dwarfdump/X86/stats-mulitple-cu-out-of-line.ll
> @@ -18,12 +18,12 @@
>  ; #include "test.h"
>  ; int far() { return foo(42); }
>
> -; CHECK:      "source functions":3
> -; CHECK-SAME: "source functions with location":3
> -; CHECK-SAME: "inlined functions":0
> -; CHECK-SAME: "unique source variables":1
> -; CHECK-SAME: "source variables":2
> -; CHECK-SAME: "variables with location":2
> +; CHECK:      "#functions":3
> +; CHECK-SAME: "#functions with location":3
> +; CHECK-SAME: "#inlined functions":0
> +; CHECK-SAME: "#unique source variables":1
> +; CHECK-SAME: "#source variables":2
> +; CHECK-SAME: "#source variables with location":2
>
>  target datalayout =
> "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
>  target triple = "x86_64-unknown-linux-gnu"
>
> diff  --git
> a/llvm/test/tools/llvm-dwarfdump/X86/stats-multiple-cu-members.ll
> b/llvm/test/tools/llvm-dwarfdump/X86/stats-multiple-cu-members.ll
> index 5cc529e9dc0d..c5ea22c48b45 100644
> --- a/llvm/test/tools/llvm-dwarfdump/X86/stats-multiple-cu-members.ll
> +++ b/llvm/test/tools/llvm-dwarfdump/X86/stats-multiple-cu-members.ll
> @@ -16,8 +16,8 @@
>  ; #include "test.h"
>  ; s S2;
>
> -; CHECK:      "source variables":4
> -; CHECK-SAME: "variables with location":4
> +; CHECK:      "#source variables":4
> +; CHECK-SAME: "#source variables with location":4
>
>  source_filename = "llvm-link"
>  target datalayout =
> "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
>
> diff  --git
> a/llvm/test/tools/llvm-dwarfdump/X86/stats-multiple-cu-same-name.ll
> b/llvm/test/tools/llvm-dwarfdump/X86/stats-multiple-cu-same-name.ll
> index bfcc1b8bdfe7..6edda0512212 100644
> --- a/llvm/test/tools/llvm-dwarfdump/X86/stats-multiple-cu-same-name.ll
> +++ b/llvm/test/tools/llvm-dwarfdump/X86/stats-multiple-cu-same-name.ll
> @@ -3,9 +3,9 @@
>
>  ; Test that statistics distinguish functions with the same name.
>
> -; CHECK:      "source functions":4,
> -; CHECK-SAME: "unique source variables":2
> -; CHECK-SAME: "source variables":2
> +; CHECK:      "#functions":4,
> +; CHECK-SAME: "#unique source variables":2
> +; CHECK-SAME: "#source variables":2
>
>  ; $ cat test1.cpp
>  ; static int foo(int a) {
>
> diff  --git a/llvm/tools/llvm-dwarfdump/Statistics.cpp
> b/llvm/tools/llvm-dwarfdump/Statistics.cpp
> index b4f4d97b4e12..f1f37c9ec6ea 100644
> --- a/llvm/tools/llvm-dwarfdump/Statistics.cpp
> +++ b/llvm/tools/llvm-dwarfdump/Statistics.cpp
> @@ -58,14 +58,14 @@ struct PerFunctionStats {
>    unsigned NumParamTypes = 0;
>    /// Number of function parameters with a DW_AT_location.
>    unsigned NumParamLocations = 0;
> -  /// Number of variables.
> -  unsigned NumVars = 0;
> -  /// Number of variables with source location.
> -  unsigned NumVarSourceLocations = 0;
> -  /// Number of variables with type.
> -  unsigned NumVarTypes = 0;
> -  /// Number of variables with DW_AT_location.
> -  unsigned NumVarLocations = 0;
> +  /// Number of local variables.
> +  unsigned NumLocalVars = 0;
> +  /// Number of local variables with source location.
> +  unsigned NumLocalVarSourceLocations = 0;
> +  /// Number of local variables with type.
> +  unsigned NumLocalVarTypes = 0;
> +  /// Number of local variables with DW_AT_location.
> +  unsigned NumLocalVarLocations = 0;
>  };
>
>  /// Holds accumulated global statistics about DIEs.
> @@ -80,21 +80,19 @@ struct GlobalStats {
>    /// Total number of PC range bytes covered by DW_AT_locations of
>    /// formal parameters.
>    unsigned ParamScopeBytesCovered = 0;
> -  /// Total number of PC range bytes in each variable's enclosing scope
> -  /// (only for parameters).
> +  /// Total number of PC range bytes in each parameter's enclosing scope.
>    unsigned ParamScopeBytes = 0;
>    /// Total number of PC range bytes covered by DW_AT_locations with
>    /// the debug entry values (DW_OP_entry_value) (only for parameters).
>    unsigned ParamScopeEntryValueBytesCovered = 0;
>    /// Total number of PC range bytes covered by DW_AT_locations (only for
> local
>    /// variables).
> -  unsigned VarScopeBytesCovered = 0;
> -  /// Total number of PC range bytes in each variable's enclosing scope
> -  /// (only for local variables).
> -  unsigned VarScopeBytes = 0;
> +  unsigned LocalVarScopeBytesCovered = 0;
> +  /// Total number of PC range bytes in each local variable's enclosing
> scope.
> +  unsigned LocalVarScopeBytes = 0;
>    /// Total number of PC range bytes covered by DW_AT_locations with
>    /// the debug entry values (DW_OP_entry_value) (only for local
> variables).
> -  unsigned VarScopeEntryValueBytesCovered = 0;
> +  unsigned LocalVarScopeEntryValueBytesCovered = 0;
>    /// Total number of call site entries (DW_AT_call_file &
> DW_AT_call_line).
>    unsigned CallSiteEntries = 0;
>    /// Total number of call site DIEs (DW_TAG_call_site).
> @@ -130,10 +128,10 @@ struct LocationStats {
>    std::vector<unsigned> ParamNonEntryValLocStats{
>        std::vector<unsigned>(NumOfCoverageCategories, 0)};
>    /// The debug location statistics for local variables.
> -  std::vector<unsigned> VarLocStats{
> +  std::vector<unsigned> LocalVarLocStats{
>        std::vector<unsigned>(NumOfCoverageCategories, 0)};
>    /// Map non debug entry values coverage for local variables.
> -  std::vector<unsigned> VarNonEntryValLocStats{
> +  std::vector<unsigned> LocalVarNonEntryValLocStats{
>        std::vector<unsigned>(NumOfCoverageCategories, 0)};
>    /// Total number of local variables and function parameters processed.
>    unsigned NumVarParam = 0;
> @@ -148,8 +146,8 @@ struct LocationStats {
>  static void collectLocStats(uint64_t BytesCovered, uint64_t BytesInScope,
>                              std::vector<unsigned> &VarParamLocStats,
>                              std::vector<unsigned> &ParamLocStats,
> -                            std::vector<unsigned> &VarLocStats, bool
> IsParam,
> -                            bool IsLocalVar) {
> +                            std::vector<unsigned> &LocalVarLocStats,
> +                            bool IsParam, bool IsLocalVar) {
>    auto getCoverageBucket = [BytesCovered, BytesInScope]() -> unsigned {
>      // No debug location at all for the variable.
>      if (BytesCovered == 0)
> @@ -168,7 +166,7 @@ static void collectLocStats(uint64_t BytesCovered,
> uint64_t BytesInScope,
>    if (IsParam)
>      ParamLocStats[CoverageBucket]++;
>    else if (IsLocalVar)
> -    VarLocStats[CoverageBucket]++;
> +    LocalVarLocStats[CoverageBucket]++;
>  }
>  /// Construct an identifier for a given DIE from its Prefix, Name,
> DeclFileName
>  /// and DeclLine. The identifier aims to be unique for any unique
> entities,
> @@ -214,7 +212,7 @@ static void collectStatsForDie(DWARFDie Die,
> std::string FnPrefix,
>    uint64_t BytesEntryValuesCovered = 0;
>    auto &FnStats = FnStatMap[FnPrefix];
>    bool IsParam = Die.getTag() == dwarf::DW_TAG_formal_parameter;
> -  bool IsVariable = Die.getTag() == dwarf::DW_TAG_variable;
> +  bool IsLocalVar = Die.getTag() == dwarf::DW_TAG_variable;
>    bool IsConstantMember = Die.getTag() == dwarf::DW_TAG_member &&
>                            Die.find(dwarf::DW_AT_const_value);
>
> @@ -230,13 +228,13 @@ static void collectStatsForDie(DWARFDie Die,
> std::string FnPrefix,
>      return;
>    }
>
> -  if (!IsParam && !IsVariable && !IsConstantMember) {
> +  if (!IsParam && !IsLocalVar && !IsConstantMember) {
>      // Not a variable or constant member.
>      return;
>    }
>
>    // Ignore declarations of global variables.
> -  if (IsVariable && Die.find(dwarf::DW_AT_declaration))
> +  if (IsLocalVar && Die.find(dwarf::DW_AT_declaration))
>      return;
>
>    if (Die.findRecursively(dwarf::DW_AT_decl_file) &&
> @@ -293,17 +291,17 @@ static void collectStatsForDie(DWARFDie Die,
> std::string FnPrefix,
>      LocStats.NumVarParam++;
>      if (IsParam)
>        LocStats.NumParam++;
> -    else if (IsVariable)
> +    else if (IsLocalVar)
>        LocStats.NumVar++;
>
>      collectLocStats(BytesCovered, BytesInScope, LocStats.VarParamLocStats,
> -                    LocStats.ParamLocStats, LocStats.VarLocStats, IsParam,
> -                    IsVariable);
> +                    LocStats.ParamLocStats, LocStats.LocalVarLocStats,
> IsParam,
> +                    IsLocalVar);
>      // Non debug entry values coverage statistics.
>      collectLocStats(BytesCovered - BytesEntryValuesCovered, BytesInScope,
>                      LocStats.VarParamNonEntryValLocStats,
>                      LocStats.ParamNonEntryValLocStats,
> -                    LocStats.VarNonEntryValLocStats, IsParam, IsVariable);
> +                    LocStats.LocalVarNonEntryValLocStats, IsParam,
> IsLocalVar);
>    }
>
>    // Collect PC range coverage data.
> @@ -324,10 +322,12 @@ static void collectStatsForDie(DWARFDie Die,
> std::string FnPrefix,
>            std::min(BytesInScope, BytesCovered);
>        GlobalStats.ParamScopeBytes += BytesInScope;
>        GlobalStats.ParamScopeEntryValueBytesCovered +=
> BytesEntryValuesCovered;
> -    } else if (IsVariable) {
> -      GlobalStats.VarScopeBytesCovered += std::min(BytesInScope,
> BytesCovered);
> -      GlobalStats.VarScopeBytes += BytesInScope;
> -      GlobalStats.VarScopeEntryValueBytesCovered +=
> BytesEntryValuesCovered;
> +    } else if (IsLocalVar) {
> +      GlobalStats.LocalVarScopeBytesCovered +=
> +          std::min(BytesInScope, BytesCovered);
> +      GlobalStats.LocalVarScopeBytes += BytesInScope;
> +      GlobalStats.LocalVarScopeEntryValueBytesCovered +=
> +          BytesEntryValuesCovered;
>      }
>      assert(GlobalStats.ScopeBytesCovered <= GlobalStats.ScopeBytes);
>    }
> @@ -352,14 +352,14 @@ static void collectStatsForDie(DWARFDie Die,
> std::string FnPrefix,
>        FnStats.NumParamSourceLocations++;
>      if (HasLoc)
>        FnStats.NumParamLocations++;
> -  } else if (IsVariable) {
> -    FnStats.NumVars++;
> +  } else if (IsLocalVar) {
> +    FnStats.NumLocalVars++;
>      if (HasType)
> -      FnStats.NumVarTypes++;
> +      FnStats.NumLocalVarTypes++;
>      if (HasSrcLoc)
> -      FnStats.NumVarSourceLocations++;
> +      FnStats.NumLocalVarSourceLocations++;
>      if (HasLoc)
> -      FnStats.NumVarLocations++;
> +      FnStats.NumLocalVarLocations++;
>    }
>  }
>
> @@ -473,33 +473,41 @@ static void printDatum(raw_ostream &OS, const char
> *Key, json::Value Value) {
>    LLVM_DEBUG(llvm::dbgs() << Key << ": " << Value << '\n');
>  }
>
> -static void printLocationStats(raw_ostream &OS,
> -                               const char *Key,
> +static void printLocationStats(raw_ostream &OS, const char *Key,
>                                 std::vector<unsigned> &LocationStats) {
> -  OS << ",\"" << Key << " with 0% of its scope covered\":"
> +  OS << ",\"" << Key << " with 0% of parent scope covered by
> DW_AT_location\":"
>       << LocationStats[0];
> -  LLVM_DEBUG(llvm::dbgs() << Key << " with 0% of its scope covered: "
> -                          << LocationStats[0] << '\n');
> -  OS << ",\"" << Key << " with (0%,10%) of its scope covered\":"
> +  LLVM_DEBUG(
> +      llvm::dbgs() << Key
> +                   << " with 0% of parent scope covered by
> DW_AT_location: \\"
> +                   << LocationStats[0] << '\n');
> +  OS << ",\"" << Key
> +     << " with (0%,10%) of parent scope covered by DW_AT_location\":"
>       << LocationStats[1];
> -  LLVM_DEBUG(llvm::dbgs() << Key << " with (0%,10%) of its scope covered:
> "
> -                          << LocationStats[1] << '\n');
> +  LLVM_DEBUG(llvm::dbgs()
> +             << Key
> +             << " with (0%,10%) of parent scope covered by
> DW_AT_location: "
> +             << LocationStats[1] << '\n');
>    for (unsigned i = 2; i < NumOfCoverageCategories - 1; ++i) {
>      OS << ",\"" << Key << " with [" << (i - 1) * 10 << "%," << i * 10
> -       << "%) of its scope covered\":" << LocationStats[i];
> +       << "%) of parent scope covered by DW_AT_location\":" <<
> LocationStats[i];
>      LLVM_DEBUG(llvm::dbgs()
>                 << Key << " with [" << (i - 1) * 10 << "%," << i * 10
> -               << "%) of its scope covered: " << LocationStats[i]);
> +               << "%) of parent scope covered by DW_AT_location: "
> +               << LocationStats[i]);
>    }
> -  OS << ",\"" << Key << " with 100% of its scope covered\":"
> +  OS << ",\"" << Key
> +     << " with 100% of parent scope covered by DW_AT_location\":"
>       << LocationStats[NumOfCoverageCategories - 1];
> -  LLVM_DEBUG(llvm::dbgs() << Key << " with 100% of its scope covered: "
> -                          << LocationStats[NumOfCoverageCategories - 1]);
> +  LLVM_DEBUG(
> +      llvm::dbgs() << Key
> +                   << " with 100% of parent scope covered by
> DW_AT_location: "
> +                   << LocationStats[NumOfCoverageCategories - 1]);
>  }
>
>  static void printSectionSizes(raw_ostream &OS, const SectionSizes &Sizes)
> {
>    for (const auto &DebugSec : Sizes.DebugSectionSizes)
> -    OS << ",\"size of " << DebugSec.getKey() << "\":" <<
> DebugSec.getValue();
> +    OS << ",\"#bytes in " << DebugSec.getKey() << "\":" <<
> DebugSec.getValue();
>  }
>
>  /// \}
> @@ -531,7 +539,7 @@ bool dwarfdump::collectStatsForObjectFile(ObjectFile
> &Obj, DWARFContext &DICtx,
>    /// The version number should be increased every time the algorithm is
> changed
>    /// (including bug fixes). New metrics may be added without increasing
> the
>    /// version.
> -  unsigned Version = 4;
> +  unsigned Version = 5;
>    unsigned VarParamTotal = 0;
>    unsigned VarParamUnique = 0;
>    unsigned VarParamWithLoc = 0;
> @@ -543,17 +551,18 @@ bool dwarfdump::collectStatsForObjectFile(ObjectFile
> &Obj, DWARFContext &DICtx,
>    unsigned ParamWithType = 0;
>    unsigned ParamWithLoc = 0;
>    unsigned ParamWithSrcLoc = 0;
> -  unsigned VarTotal = 0;
> -  unsigned VarWithType = 0;
> -  unsigned VarWithSrcLoc = 0;
> -  unsigned VarWithLoc = 0;
> +  unsigned LocalVarTotal = 0;
> +  unsigned LocalVarWithType = 0;
> +  unsigned LocalVarWithSrcLoc = 0;
> +  unsigned LocalVarWithLoc = 0;
>    for (auto &Entry : Statistics) {
>      PerFunctionStats &Stats = Entry.getValue();
>      unsigned TotalVars = Stats.VarsInFunction.size() *
>                           (Stats.NumFnInlined + Stats.NumFnOutOfLine);
>      // Count variables in global scope.
>      if (!Stats.IsFunction)
> -      TotalVars = Stats.NumVars + Stats.ConstantMembers +
> Stats.NumArtificial;
> +      TotalVars =
> +          Stats.NumLocalVars + Stats.ConstantMembers +
> Stats.NumArtificial;
>      unsigned Constants = Stats.ConstantMembers;
>      VarParamWithLoc += Stats.TotalVarWithLoc + Constants;
>      VarParamTotal += TotalVars;
> @@ -569,10 +578,10 @@ bool dwarfdump::collectStatsForObjectFile(ObjectFile
> &Obj, DWARFContext &DICtx,
>      ParamWithType += Stats.NumParamTypes;
>      ParamWithLoc += Stats.NumParamLocations;
>      ParamWithSrcLoc += Stats.NumParamSourceLocations;
> -    VarTotal += Stats.NumVars;
> -    VarWithType += Stats.NumVarTypes;
> -    VarWithLoc += Stats.NumVarLocations;
> -    VarWithSrcLoc += Stats.NumVarSourceLocations;
> +    LocalVarTotal += Stats.NumLocalVars;
> +    LocalVarWithType += Stats.NumLocalVarTypes;
> +    LocalVarWithLoc += Stats.NumLocalVarLocations;
> +    LocalVarWithSrcLoc += Stats.NumLocalVarSourceLocations;
>    }
>
>    // Print summary.
> @@ -580,57 +589,97 @@ bool dwarfdump::collectStatsForObjectFile(ObjectFile
> &Obj, DWARFContext &DICtx,
>    OS << "{\"version\":" << Version;
>    LLVM_DEBUG(llvm::dbgs() << "Variable location quality metrics\n";
>               llvm::dbgs() << "---------------------------------\n");
> +
>    printDatum(OS, "file", Filename.str());
>    printDatum(OS, "format", FormatName);
> -  printDatum(OS, "source functions", NumFunctions);
> -  printDatum(OS, "source functions with location", NumFuncsWithSrcLoc);
> -  printDatum(OS, "inlined functions", NumInlinedFunctions);
> -  printDatum(OS, "inlined funcs with abstract origins",
> NumAbstractOrigins);
> -  printDatum(OS, "unique source variables", VarParamUnique);
> -  printDatum(OS, "source variables", VarParamTotal);
> -  printDatum(OS, "variables with location", VarParamWithLoc);
> -  printDatum(OS, "call site entries", GlobalStats.CallSiteEntries);
> -  printDatum(OS, "call site DIEs", GlobalStats.CallSiteDIEs);
> -  printDatum(OS, "call site parameter DIEs",
> GlobalStats.CallSiteParamDIEs);
> -  printDatum(OS, "scope bytes total", GlobalStats.ScopeBytes);
> -  printDatum(OS, "scope bytes covered", GlobalStats.ScopeBytesCovered);
> -  printDatum(OS, "entry value scope bytes covered",
> +
> +  printDatum(OS, "#functions", NumFunctions);
> +  printDatum(OS, "#functions with location", NumFuncsWithSrcLoc);
> +  printDatum(OS, "#inlined functions", NumInlinedFunctions);
> +  printDatum(OS, "#inlined functions with abstract origins",
> +             NumAbstractOrigins);
> +
> +  // This includes local variables and formal parameters.
> +  printDatum(OS, "#unique source variables", VarParamUnique);
> +  printDatum(OS, "#source variables", VarParamTotal);
> +  printDatum(OS, "#source variables with location", VarParamWithLoc);
> +
> +  printDatum(OS, "#call site entries", GlobalStats.CallSiteEntries);
> +  printDatum(OS, "#call site DIEs", GlobalStats.CallSiteDIEs);
> +  printDatum(OS, "#call site parameter DIEs",
> GlobalStats.CallSiteParamDIEs);
> +
> +  printDatum(OS, "sum_all_variables(#bytes in parent scope)",
> +             GlobalStats.ScopeBytes);
> +  printDatum(OS,
> +             "sum_all_variables(#bytes in parent scope covered by "
> +             "DW_AT_location)",
> +             GlobalStats.ScopeBytesCovered);
> +  printDatum(OS,
> +             "sum_all_variables(#bytes in parent scope covered by "
> +             "DW_OP_entry_value)",
>               GlobalStats.ScopeEntryValueBytesCovered);
> -  printDatum(OS, "formal params scope bytes total",
> +
> +  printDatum(OS, "sum_all_params(#bytes in parent scope)",
>               GlobalStats.ParamScopeBytes);
> -  printDatum(OS, "formal params scope bytes covered",
> -             GlobalStats.ParamScopeBytesCovered);
> -  printDatum(OS, "formal params entry value scope bytes covered",
> +  printDatum(
> +      OS,
> +      "sum_all_params(#bytes in parent scope covered by DW_AT_location)",
> +      GlobalStats.ParamScopeBytesCovered);
> +  printDatum(OS,
> +             "sum_all_params(#bytes in parent scope covered by "
> +             "DW_OP_entry_value)",
>               GlobalStats.ParamScopeEntryValueBytesCovered);
> -  printDatum(OS, "vars scope bytes total", GlobalStats.VarScopeBytes);
> -  printDatum(OS, "vars scope bytes covered",
> GlobalStats.VarScopeBytesCovered);
> -  printDatum(OS, "vars entry value scope bytes covered",
> -             GlobalStats.VarScopeEntryValueBytesCovered);
> -  printDatum(OS, "total function size", GlobalStats.FunctionSize);
> -  printDatum(OS, "total inlined function size",
> GlobalStats.InlineFunctionSize);
> -  printDatum(OS, "total formal params", ParamTotal);
> -  printDatum(OS, "formal params with source location", ParamWithSrcLoc);
> -  printDatum(OS, "formal params with type", ParamWithType);
> -  printDatum(OS, "formal params with binary location", ParamWithLoc);
> -  printDatum(OS, "total vars", VarTotal);
> -  printDatum(OS, "vars with source location", VarWithSrcLoc);
> -  printDatum(OS, "vars with type", VarWithType);
> -  printDatum(OS, "vars with binary location", VarWithLoc);
> -  printDatum(OS, "total variables procesed by location statistics",
> -             LocStats.NumVarParam);
> +
> +  printDatum(OS, "sum_all_local_vars(#bytes in parent scope)",
> +             GlobalStats.LocalVarScopeBytes);
> +  printDatum(OS,
> +             "sum_all_local_vars(#bytes in parent scope covered by "
> +             "DW_AT_location)",
> +             GlobalStats.LocalVarScopeBytesCovered);
> +  printDatum(OS,
> +             "sum_all_local_vars(#bytes in parent scope covered by "
> +             "DW_OP_entry_value)",
> +             GlobalStats.LocalVarScopeEntryValueBytesCovered);
> +
> +  printDatum(OS, "#bytes witin functions", GlobalStats.FunctionSize);
> +  printDatum(OS, "#bytes witin inlined functions",
> +             GlobalStats.InlineFunctionSize);
> +
> +  // Print the summary for formal parameters.
> +  printDatum(OS, "#params", ParamTotal);
> +  printDatum(OS, "#params with source location", ParamWithSrcLoc);
> +  printDatum(OS, "#params with type", ParamWithType);
> +  printDatum(OS, "#params with binary location", ParamWithLoc);
> +
> +  // Print the summary for local variables.
> +  printDatum(OS, "#local vars", LocalVarTotal);
> +  printDatum(OS, "#local vars with source location", LocalVarWithSrcLoc);
> +  printDatum(OS, "#local vars with type", LocalVarWithType);
> +  printDatum(OS, "#local vars with binary location", LocalVarWithLoc);
> +
> +  // Print the debug section sizes.
>    printSectionSizes(OS, Sizes);
> -  printLocationStats(OS, "variables", LocStats.VarParamLocStats);
> -  printLocationStats(OS, "variables (excluding the debug entry values)",
> +
> +  // Print the location statistics for variables (includes local variables
> +  // and formal parameters).
> +  printDatum(OS, "#variables processed by location statistics",
> +             LocStats.NumVarParam);
> +  printLocationStats(OS, "#variables", LocStats.VarParamLocStats);
> +  printLocationStats(OS, "#variables - entry values",
>                       LocStats.VarParamNonEntryValLocStats);
> -  printDatum(OS, "total params procesed by location statistics",
> -             LocStats.NumParam);
> -  printLocationStats(OS, "params", LocStats.ParamLocStats);
> -  printLocationStats(OS, "params (excluding the debug entry values)",
> +
> +  // Print the location statistics for formal parameters.
> +  printDatum(OS, "#params processed by location statistics",
> LocStats.NumParam);
> +  printLocationStats(OS, "#params", LocStats.ParamLocStats);
> +  printLocationStats(OS, "#params - entry values",
>                       LocStats.ParamNonEntryValLocStats);
> -  printDatum(OS, "total vars procesed by location statistics",
> LocStats.NumVar);
> -  printLocationStats(OS, "vars", LocStats.VarLocStats);
> -  printLocationStats(OS, "vars (excluding the debug entry values)",
> -                     LocStats.VarNonEntryValLocStats);
> +
> +  // Print the location statistics for local variables.
> +  printDatum(OS, "#local vars processed by location statistics",
> +             LocStats.NumVar);
> +  printLocationStats(OS, "#local vars", LocStats.LocalVarLocStats);
> +  printLocationStats(OS, "#local vars - entry values",
> +                     LocStats.LocalVarNonEntryValLocStats);
>    OS << "}\n";
>    LLVM_DEBUG(
>        llvm::dbgs() << "Total Availability: "
>
> diff  --git a/llvm/utils/llvm-locstats/llvm-locstats.py
> b/llvm/utils/llvm-locstats/llvm-locstats.py
> index dec87f9caf7d..7114661e70fe 100755
> --- a/llvm/utils/llvm-locstats/llvm-locstats.py
> +++ b/llvm/utils/llvm-locstats/llvm-locstats.py
> @@ -188,74 +188,85 @@ def parse_locstats(opts, binary):
>      print ('error: No valid llvm-dwarfdump statistics found.')
>      sys.exit(1)
>
> +  # TODO: Parse the statistics Version from JSON.
> +
>    if opts.only_variables:
>      # Read the JSON only for local variables.
>      variables_total_locstats = \
> -      json_parsed['total vars procesed by location statistics']
> +      json_parsed['#local vars processed by location statistics']
>      variables_scope_bytes_covered = \
> -      json_parsed['vars scope bytes covered']
> +      json_parsed['sum_all_local_vars(#bytes in parent scope covered' \
> +                  ' by DW_AT_location)']
>      variables_scope_bytes = \
> -      json_parsed['vars scope bytes total']
> +      json_parsed['sum_all_local_vars(#bytes in parent scope)']
>      if not opts.ignore_debug_entry_values:
>        for cov_bucket in coverage_buckets():
> -        cov_category = "vars with {} of its scope
> covered".format(cov_bucket)
> +        cov_category = "#local vars with {} of parent scope covered " \
> +                       "by DW_AT_location".format(cov_bucket)
>          variables_coverage_map[cov_bucket] = json_parsed[cov_category]
>      else:
>        variables_scope_bytes_entry_values = \
> -        json_parsed['vars entry value scope bytes covered']
> +        json_parsed['sum_all_local_vars(#bytes in parent scope ' \
> +                    'covered by DW_OP_entry_value)']
>        variables_scope_bytes_covered = variables_scope_bytes_covered \
>           - variables_scope_bytes_entry_values
>        for cov_bucket in coverage_buckets():
>          cov_category = \
> -          "vars (excluding the debug entry values) " \
> -          "with {} of its scope covered".format(cov_bucket)
> +          "#local vars - entry values with {} of parent scope " \
> +          "covered by DW_AT_location".format(cov_bucket)
>          variables_coverage_map[cov_bucket] = json_parsed[cov_category]
>    elif opts.only_formal_parameters:
>      # Read the JSON only for formal parameters.
>      variables_total_locstats = \
> -      json_parsed['total params procesed by location statistics']
> +      json_parsed['#params processed by location statistics']
>      variables_scope_bytes_covered = \
> -      json_parsed['formal params scope bytes covered']
> +      json_parsed['sum_all_params(#bytes in parent scope covered ' \
> +                  'by DW_AT_location)']
>      variables_scope_bytes = \
> -      json_parsed['formal params scope bytes total']
> +      json_parsed['sum_all_params(#bytes in parent scope)']
>      if not opts.ignore_debug_entry_values:
>        for cov_bucket in coverage_buckets():
> -        cov_category = "params with {} of its scope
> covered".format(cov_bucket)
> +        cov_category = "#params with {} of parent scope covered " \
> +                       "by DW_AT_location".format(cov_bucket)
>          variables_coverage_map[cov_bucket] = json_parsed[cov_category]
>      else:
>        variables_scope_bytes_entry_values = \
> -        json_parsed['formal params entry value scope bytes covered']
> +        json_parsed['sum_all_params(#bytes in parent scope covered ' \
> +                    'by DW_OP_entry_value)']
>        variables_scope_bytes_covered = variables_scope_bytes_covered \
>          - variables_scope_bytes_entry_values
>        for cov_bucket in coverage_buckets():
>          cov_category = \
> -          "params (excluding the debug entry values) " \
> -          "with {} of its scope covered".format(cov_bucket)
> +          "#params - entry values with {} of parent scope covered" \
> +          " by DW_AT_location".format(cov_bucket)
>          variables_coverage_map[cov_bucket] = json_parsed[cov_category]
>    else:
>      # Read the JSON for both local variables and formal parameters.
>      variables_total = \
> -      json_parsed['source variables']
> -    variables_with_loc = json_parsed['variables with location']
> +      json_parsed['#source variables']
> +    variables_with_loc = json_parsed['#source variables with location']
>      variables_total_locstats = \
> -      json_parsed['total variables procesed by location statistics']
> +      json_parsed['#variables processed by location statistics']
>      variables_scope_bytes_covered = \
> -      json_parsed['scope bytes covered']
> +      json_parsed['sum_all_variables(#bytes in parent scope covered ' \
> +                  'by DW_AT_location)']
>      variables_scope_bytes = \
> -      json_parsed['scope bytes total']
> +      json_parsed['sum_all_variables(#bytes in parent scope)']
>      if not opts.ignore_debug_entry_values:
>        for cov_bucket in coverage_buckets():
> -        cov_category = "variables with {} of its scope covered". \
> -                       format(cov_bucket)
> +        cov_category = "#variables with {} of parent scope covered " \
> +                       "by DW_AT_location".format(cov_bucket)
>          variables_coverage_map[cov_bucket] = json_parsed[cov_category]
>      else:
>        variables_scope_bytes_entry_values = \
> -        json_parsed['entry value scope bytes covered']
> +        json_parsed['sum_all_variables(#bytes in parent scope covered ' \
> +                    'by DW_OP_entry_value)']
>        variables_scope_bytes_covered = variables_scope_bytes_covered \
>          - variables_scope_bytes_entry_values
>        for cov_bucket in coverage_buckets():
> -        cov_category = "variables (excluding the debug entry values) " \
> -                       "with {} of its scope covered". format(cov_bucket)
> +        cov_category = \
> +          "#variables - entry values with {} of parent scope covered " \
> +          "by DW_AT_location".format(cov_bucket)
>          variables_coverage_map[cov_bucket] = json_parsed[cov_category]
>
>    return LocationStats(binary, variables_total, variables_total_locstats,
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200504/25ed1b05/attachment-0001.html>


More information about the llvm-commits mailing list