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

Djordje Todorovic via llvm-commits llvm-commits at lists.llvm.org
Mon May 4 00:35:57 PDT 2020


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,


        


More information about the llvm-commits mailing list