testsuite: add dg-enable-nn-line-numbers (v6)

Message ID 20200110024052.1091-1-dmalcolm@redhat.com
State New
Headers show
Series
  • testsuite: add dg-enable-nn-line-numbers (v6)
Related show

Commit Message

David Malcolm Jan. 10, 2020, 2:40 a.m.
On Wed, 2020-01-08 at 17:07 -0500, David Malcolm wrote:
[...]
> Here's an alterative patch to the above that replaces the

> "-fdiagnostics-nn-line-numbers" option in earlier versions of the

> analyzer patch kit, by doing it at the DejaGnu level instead.

[...]

> I'm testing this now (but it seems to be a working, drop-in

> replacement

> for the option in the parts of the patch kit I've tested with it).


I spoke too soon; it didn't work with the non-gcc parts of the
testsuite that use prune.exp due to load_lib vs load_gcc_lib Tcl
lib path issues.

Given that this is meant to be used in conjunction with multiline.exp
the simplest fix was to move the code into multiline.exp.

Here's an updated version of the patch which does work;
successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.

OK for trunk?

Thanks
Dave


> Examples of use can be seen in the analyzer test suite:

>   https://gcc.gnu.org/ml/gcc-patches/2020-01/msg00320.html

> (search for -fdiagnostics-nn-line-numbers and dg-begin-multiline-

> output

> there to get the idea)




Changed in v6:
- moved to multiline.exp to avoid having to add a new .exp file (which
  would have to be loaded manually via load_gcc_lib in various places
  before prune.exp due to lack of lib path support in tcl; one of these
  places is libgo.exp which we only mirror)
- clarify a comment to indicate that it doesn't have to be at the start
  of a line

Changed in v5:
- added, replacing the "-fdiagnostics-nn-line-numbers" option

This patch adds support for obscuring the line numbers printed in the
left-hand margin when printing the source code, converting them to "NN",
e.g from:

  7111 |   if (!(flags & 0x0001)) {
       |      ^
       |      |
       |      (1) following 'true' branch...
  7112 |

to:

   NN  |   if (!(flags & 0x0001)) {
       |      ^
       |      |
       |      (1) following 'true' branch...
   NN  |

This is useful in followup patches e.g. when testing how interprocedural
paths are printed using multiline.exp, to avoid depending on precise line
numbers.

This replaces the "-fdiagnostics-nn-line-numbers" option in earlier
versions of the analyzer patch kit, by doing it at the DejaGnu level
instead.

gcc/testsuite/ChangeLog:
	* lib/gcc-dg.exp (cleanup-after-saved-dg-test): Reset global
	nn_line_numbers_enabled.
	* lib/multiline.exp (nn_line_numbers_enabled): New global.
	(dg-enable-nn-line-numbers): New proc.
	(maybe-handle-nn-line-numbers): New proc.
	* lib/prune.exp (prune_gcc_output): Call maybe-handle-nn-line-numbers.
---
 gcc/testsuite/lib/gcc-dg.exp    |  2 +
 gcc/testsuite/lib/multiline.exp | 88 +++++++++++++++++++++++++++++++++
 gcc/testsuite/lib/prune.exp     |  4 ++
 3 files changed, 94 insertions(+)

-- 
2.21.0

Patch

diff --git a/gcc/testsuite/lib/gcc-dg.exp b/gcc/testsuite/lib/gcc-dg.exp
index e6875de2383..cccd3ce4742 100644
--- a/gcc/testsuite/lib/gcc-dg.exp
+++ b/gcc/testsuite/lib/gcc-dg.exp
@@ -940,6 +940,7 @@  if { [info procs saved-dg-test] == [list] } {
 	global set_compiler_env_var
 	global saved_compiler_env_var
 	global keep_saved_temps_suffixes
+	global nn_line_numbers_enabled
 	global multiline_expected_outputs
 	global freeform_regexps
 	global save_linenr_varnames
@@ -967,6 +968,7 @@  if { [info procs saved-dg-test] == [list] } {
 	if [info exists testname_with_flags] {
 	    unset testname_with_flags
 	}
+	set nn_line_numbers_enabled 0
 	set multiline_expected_outputs []
 	set freeform_regexps []
 
diff --git a/gcc/testsuite/lib/multiline.exp b/gcc/testsuite/lib/multiline.exp
index e965d8946f7..627ad68817f 100644
--- a/gcc/testsuite/lib/multiline.exp
+++ b/gcc/testsuite/lib/multiline.exp
@@ -60,6 +60,9 @@  set _multiline_last_beginning_line -1
 # This is cleared at the end of each test by gcc-dg.exp's wrapper for dg-test.
 set multiline_expected_outputs []
 
+# Was dg-enable-nn-line-numbers called?
+set nn_line_numbers_enabled 0
+
 ############################################################################
 # Exported functions.
 ############################################################################
@@ -177,6 +180,91 @@  proc handle-multiline-outputs { text } {
     return $text
 }
 
+# DejaGnu directive to enable post-processing the line numbers printed in
+# the left-hand margin when printing the source code, converting them to
+# "NN", e.g from:
+#
+#    100 |   if (flag)
+#        |      ^
+#        |      |
+#        |      (1) following 'true' branch...
+#    101 |     {
+#    102 |       foo ();
+#        |       ^
+#        |       |
+#        |       (2) ...to here
+#
+# to:
+#
+#     NN |   if (flag)
+#        |      ^
+#        |      |
+#        |      (1) following 'true' branch...
+#     NN |     {
+#     NN |       foo ();
+#        |       ^
+#        |       |
+#        |       (2) ...to here
+#
+# This is useful e.g. when testing how interprocedural paths are printed
+# via dg-begin/end-multiline-output, to avoid depending on precise line
+# numbers.
+
+proc dg-enable-nn-line-numbers { args } {
+    verbose "dg-nn-line-numbers: args: $args" 2
+    global nn_line_numbers_enabled
+    set nn_line_numbers_enabled 1
+}
+
+# Hook to be called by prune.exp's prune_gcc_output to convert such line
+# numbers to "NN" form.
+#
+# Match substrings of the form:
+#  "   25 |"
+# and convert them to:
+#  "   NN |"
+#
+# It returns a copy of its input, with the above changes.
+
+proc maybe-handle-nn-line-numbers { text } {
+    global testname_with_flags
+
+    verbose "maybe-handle-nn-line-numbers" 3
+
+    global nn_line_numbers_enabled
+    if { [expr {!$nn_line_numbers_enabled}] } {
+	verbose "nn_line_numbers_enabled false; bailing out" 3
+	return $text
+    }
+    
+    verbose "maybe-handle-nn-line-numbers: text before: ${text}" 4
+
+    # dg.exp's dg-test trims leading whitespace from the output
+    # in this line:
+    #   set comp_output [string trimleft $comp_output]
+    # so we can't rely on the exact leading whitespace for the
+    # first line in the output.
+    # Match initial input lines that start like:
+    #  "25 |"
+    # and convert them to:
+    #  "   NN |"
+    set rexp2 {(^[0-9]+ \|)}
+    set count_a [regsub -all $rexp2 $text "   NN |" text]
+    verbose "maybe-handle-nn-line-numbers: count_a: $count_a" 4
+    
+    # Match lines that start like:
+    #  "   25 |"
+    # and convert them to:
+    #  "   NN |"
+    set rexp {([ ]+[0-9]+ \|)}
+    set count_b [regsub -all $rexp $text "   NN |" text]
+    verbose "maybe-handle-nn-line-numbers: count_b: $count_b" 4
+
+    verbose "maybe-handle-nn-line-numbers: text after: ${text}" 4
+
+    return $text
+}
+
 ############################################################################
 # Internal functions
 ############################################################################
diff --git a/gcc/testsuite/lib/prune.exp b/gcc/testsuite/lib/prune.exp
index 6e2e84ba171..60402208c37 100644
--- a/gcc/testsuite/lib/prune.exp
+++ b/gcc/testsuite/lib/prune.exp
@@ -74,6 +74,10 @@  proc prune_gcc_output { text } {
     # Ignore harmless warnings from Xcode 4.0.
     regsub -all "(^|\n)\[^\n\]*ld: warning: could not create compact unwind for\[^\n\]*" $text "" text
 
+    # If dg-enable-nn-line-numbers was provided, then obscure source-margin
+    # line numbers by converting them to "NN" form.
+    set text [maybe-handle-nn-line-numbers $text]
+    
     # Call into multiline.exp to handle any multiline output directives.
     set text [handle-multiline-outputs $text]