Skip to content

Commit

Permalink
Testsuite: add dg-{begin|end}-multiline-output commands
Browse files Browse the repository at this point in the history
This patch adds an easy way to write tests for expected multiline
output.  For example we can test carets and underlines for
a particular diagnostic with:

/* { dg-begin-multiline-output "" }
 typedef struct _GMutex GMutex;
                ^~~~~~~
   { dg-end-multiline-output "" } */

multiline.exp is used by prune.exp; hence we need to load it before
prune.exp via *load_gcc_lib* for the testsuites of the various
non-"gcc" support libraries (e.g. boehm-gc).

gcc/testsuite/ChangeLog:
	* lib/multiline.exp: New file.
	* lib/prune.exp: Load multiline.exp.
	(prune_gcc_output): Call into multiline.exp to handle any
	multiline output directives.
	* lib/libgo.exp: Load multiline.exp before prune.exp, using
	load_gcc_lib.

boehm-gc/ChangeLog:
	* testsuite/lib/boehm-gc.exp: Load multiline.exp before
	prune.exp, using load_gcc_lib.

libatomic/ChangeLog:
	* testsuite/lib/libatomic.exp: Load multiline.exp before
	prune.exp, using load_gcc_lib.

libgomp/ChangeLog:
	* testsuite/lib/libgomp.exp: Load multiline.exp before prune.exp,
	using load_gcc_lib.

libitm/ChangeLog:
	* testsuite/lib/libitm.exp: Load multiline.exp before prune.exp,
	using load_gcc_lib.

libvtv/ChangeLog:
	* testsuite/lib/libvtv.exp: Load multiline.exp before prune.exp,
	using load_gcc_lib.



git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@228655 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
dmalcolm committed Oct 9, 2015
1 parent e2c313e commit 71c8cbf
Show file tree
Hide file tree
Showing 14 changed files with 286 additions and 0 deletions.
5 changes: 5 additions & 0 deletions boehm-gc/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2015-10-09 David Malcolm <dmalcolm@redhat.com>

* testsuite/lib/boehm-gc.exp: Load multiline.exp before
prune.exp, using load_gcc_lib.

2015-08-27 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>

* os_dep.c [GC_SOLARIS_THREADS] (GC_dirty_init): Use
Expand Down
1 change: 1 addition & 0 deletions boehm-gc/testsuite/lib/boehm-gc.exp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ load_gcc_lib target-utils.exp
# For ${tool}_exit.
load_gcc_lib gcc-defs.exp
# For prune_gcc_output.
load_gcc_lib multiline.exp
load_gcc_lib prune.exp

set dg-do-what-default run
Expand Down
9 changes: 9 additions & 0 deletions gcc/testsuite/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
2015-10-09 David Malcolm <dmalcolm@redhat.com>

* lib/multiline.exp: New file.
* lib/prune.exp: Load multiline.exp.
(prune_gcc_output): Call into multiline.exp to handle any
multiline output directives.
* lib/libgo.exp: Load multiline.exp before prune.exp, using
load_gcc_lib.

2015-10-09 Martin Jambor <mjambor@suse.cz>

tree-optimization/67794
Expand Down
241 changes: 241 additions & 0 deletions gcc/testsuite/lib/multiline.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@
# Copyright (C) 2015 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.

# Testing of multiline output

# We have pre-existing testcases like this:
# |typedef struct _GMutex GMutex; // { dg-message "previously declared here"}
# (using "|" here to indicate the start of a line),
# generating output like this:
# |gcc/testsuite/g++.dg/diagnostic/wrong-tag-1.C:4:16: note: 'struct _GMutex' was previously declared here
# where the location of the dg-message determines the expected line at
# which the error should be reported.
#
# To handle rich error-reporting, we want to be able to verify that we
# get output like this:
# |gcc/testsuite/g++.dg/diagnostic/wrong-tag-1.C:4:16: note: 'struct _GMutex' was previously declared here
# | typedef struct _GMutex GMutex; // { dg-message "previously declared here"}
# | ^~~~~~~
# where the compiler's first line of output is as before, but in
# which it then echoes the source lines, adding annotations.
#
# We want to be able to write testcases that verify that the
# emitted source-and-annotations are sane.
#
# A complication here is that the source lines contain comments
# containing DejaGnu directives (such as the "dg-message" above).
#
# We punt this somewhat by only matching the beginnings of lines.
# so that we can write e.g.
# |/* { dg-begin-multiline-output "" }
# | typedef struct _GMutex GMutex;
# | ^~~~~~~
# | { dg-end-multiline-output "" } */
# to have the testsuite verify the expected output.

############################################################################
# Global variables. Although global, these are intended to only be used from
# within multiline.exp.
############################################################################

# The line number of the last dg-begin-multiline-output directive.
set _multiline_last_beginning_line -1

# A list of lists of strings.
set _multiline_expected_outputs []

############################################################################
# Exported functions.
############################################################################

# Mark the beginning of an expected multiline output
# All lines between this and the next dg-end-multiline-output are
# expected to be seen.

proc dg-begin-multiline-output { args } {
global _multiline_last_beginning_line
verbose "dg-begin-multiline-output: args: $args" 3
set line [expr [lindex $args 0] + 1]
set _multiline_last_beginning_line $line
}

# Mark the end of an expected multiline output
# All lines up to here since the last dg-begin-multiline-output are
# expected to be seen.

proc dg-end-multiline-output { args } {
global _multiline_last_beginning_line
verbose "dg-end-multiline-output: args: $args" 3
set line [expr [lindex $args 0] - 1]
verbose "multiline output lines: $_multiline_last_beginning_line-$line" 3

upvar 1 prog prog
verbose "prog: $prog" 3
# "prog" now contains the filename
# Load it and split it into lines

set lines [_get_lines $prog $_multiline_last_beginning_line $line]
set _multiline_last_beginning_line -1

verbose "lines: $lines" 3
global _multiline_expected_outputs
lappend _multiline_expected_outputs $lines
verbose "within dg-end-multiline-output: _multiline_expected_outputs: $_multiline_expected_outputs" 3
}

# Hook to be called by prune.exp's prune_gcc_output to
# look for the expected multiline outputs, pruning them,
# reporting PASS for those that are found, and FAIL for
# those that weren't found.
#
# It returns a pruned version of its output.
#
# It also clears the list of expected multiline outputs.

proc handle-multiline-outputs { text } {
global _multiline_expected_outputs
set index 0
foreach multiline $_multiline_expected_outputs {
verbose " multiline: $multiline" 4
set rexp [_build_multiline_regex $multiline $index]
verbose "rexp: ${rexp}" 4
# Escape newlines in $rexp so that we can print them in
# pass/fail results.
set escaped_regex [string map {"\n" "\\n"} $rexp]
verbose "escaped_regex: ${escaped_regex}" 4

# Use "regsub" to attempt to prune the pattern from $text
if {[regsub -line $rexp $text "" text]} {
# Success; the multiline pattern was pruned.
pass "expected multiline pattern $index was found: \"$escaped_regex\""
} else {
fail "expected multiline pattern $index not found: \"$escaped_regex\""
}

set index [expr $index + 1]
}

# Clear the list of expected multiline outputs
set _multiline_expected_outputs []

return $text
}

############################################################################
# Internal functions
############################################################################

# Load FILENAME and extract the lines from FIRST_LINE
# to LAST_LINE (inclusive) as a list of strings.

proc _get_lines { filename first_line last_line } {
verbose "_get_lines" 3
verbose " filename: $filename" 3
verbose " first_line: $first_line" 3
verbose " last_line: $last_line" 3

set fp [open $filename r]
set file_data [read $fp]
close $fp
set data [split $file_data "\n"]
set linenum 1
set lines []
foreach line $data {
verbose "line $linenum: $line" 4
if { $linenum >= $first_line && $linenum <= $last_line } {
lappend lines $line
}
set linenum [expr $linenum + 1]
}

return $lines
}

# Convert $multiline from a list of strings to a multiline regex
# We need to support matching arbitrary followup text on each line,
# to deal with comments containing containing DejaGnu directives.

proc _build_multiline_regex { multiline index } {
verbose "_build_multiline_regex: $multiline $index" 4

set rexp ""
foreach line $multiline {
verbose " line: $line" 4

# We need to escape "^" and other regexp metacharacters.
set line [string map {"^" "\\^"
"(" "\\("
")" "\\)"
"[" "\\["
"]" "\\]"
"." "\\."
"\\" "\\\\"
"?" "\\?"
"+" "\\+"
"*" "\\*"
"|" "\\|"} $line]

append rexp $line
if {[string match "*^" $line] || [string match "*~" $line]} {
# Assume a line containing a caret/range. This must be
# an exact match.
} elseif {[string match "*\\|" $line]} {
# Assume a source line with a right-margin. Support
# arbitrary text in place of any whitespace before the
# right-margin, to deal with comments containing containing
# DejaGnu directives.

# Remove final "\|":
set rexp [string range $rexp 0 [expr [string length $rexp] - 3]]

# Trim off trailing whitespace:
set old_length [string length $rexp]
set rexp [string trimright $rexp]
set new_length [string length $rexp]

# Replace the trimmed whitespace with "." chars to match anything:
set ws [string repeat "." [expr $old_length - $new_length]]
set rexp "${rexp}${ws}"

# Add back the trailing '\|':
set rexp "${rexp}\\|"
} else {
# Assume that we have a quoted source line.
# Support arbitrary followup text on each line,
# to deal with comments containing containing DejaGnu
# directives.
append rexp ".*"
}
append rexp "\n"
}

# 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 *first* multiline regex.
#
# Trim leading whitespace from the regexp, replacing it with
# a "\s*", to match zero or more whitespace characters.
if { $index == 0 } {
set rexp [string trimleft $rexp]
set rexp "\\s*$rexp"
}

verbose "rexp: $rexp" 4

return $rexp
}
5 changes: 5 additions & 0 deletions gcc/testsuite/lib/prune.exp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

# Prune messages from gcc that aren't useful.

load_lib multiline.exp

if ![info exists TEST_ALWAYS_FLAGS] {
set TEST_ALWAYS_FLAGS ""
}
Expand Down Expand Up @@ -68,6 +70,9 @@ 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

# Call into multiline.exp to handle any multiline output directives.
set text [handle-multiline-outputs $text]

#send_user "After:$text\n"

return $text
Expand Down
5 changes: 5 additions & 0 deletions libatomic/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2015-10-09 David Malcolm <dmalcolm@redhat.com>

* testsuite/lib/libatomic.exp: Load multiline.exp before
prune.exp, using load_gcc_lib.

2015-07-14 John Marino <gnugcc@marino.st>

* configure.tgt: Add *-*-dragonfly to supported targets.
Expand Down
1 change: 1 addition & 0 deletions libatomic/testsuite/lib/libatomic.exp
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ load_gcc_lib scandump.exp
load_gcc_lib scanrtl.exp
load_gcc_lib scantree.exp
load_gcc_lib scanipa.exp
load_gcc_lib multiline.exp
load_gcc_lib prune.exp
load_gcc_lib target-libpath.exp
load_gcc_lib wrapper.exp
Expand Down
1 change: 1 addition & 0 deletions libgo/testsuite/lib/libgo.exp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ proc load_gcc_lib { filename } {
set loaded_libs($filename) ""
}

load_gcc_lib multiline.exp
load_gcc_lib prune.exp
load_gcc_lib target-libpath.exp
load_gcc_lib wrapper.exp
Expand Down
5 changes: 5 additions & 0 deletions libgomp/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2015-10-09 David Malcolm <dmalcolm@redhat.com>

* testsuite/lib/libgomp.exp: Load multiline.exp before prune.exp,
using load_gcc_lib.

2015-10-02 Thomas Schwinge <thomas@codesourcery.com>

* oacc-ptx.h: Remove file, moving its content into...
Expand Down
1 change: 1 addition & 0 deletions libgomp/testsuite/lib/libgomp.exp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ load_lib dg.exp
# loaded until ${tool}_target_compile is defined since it uses that
# to determine default LTO options.

load_gcc_lib multiline.exp
load_gcc_lib prune.exp
load_gcc_lib target-libpath.exp
load_gcc_lib wrapper.exp
Expand Down
5 changes: 5 additions & 0 deletions libitm/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2015-10-09 David Malcolm <dmalcolm@redhat.com>

* testsuite/lib/libitm.exp: Load multiline.exp before prune.exp,
using load_gcc_lib.

2015-08-20 Gleb Fotengauer-Malinovskiy <glebfm@altlinux.org> (tiny change)

PR libitm/61164
Expand Down
1 change: 1 addition & 0 deletions libitm/testsuite/lib/libitm.exp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ load_lib dg.exp
# loaded until ${tool}_target_compile is defined since it uses that
# to determine default LTO options.

load_gcc_lib multiline.exp
load_gcc_lib prune.exp
load_gcc_lib target-libpath.exp
load_gcc_lib wrapper.exp
Expand Down
5 changes: 5 additions & 0 deletions libvtv/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2015-10-09 David Malcolm <dmalcolm@redhat.com>

* testsuite/lib/libvtv.exp: Load multiline.exp before prune.exp,
using load_gcc_lib.

2015-08-27 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>

Update copyrights.
Expand Down
1 change: 1 addition & 0 deletions libvtv/testsuite/lib/libvtv.exp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ load_lib dg.exp
# loaded until ${tool}_target_compile is defined since it uses that
# to determine default LTO options.

load_gcc_lib multiline.exp
load_gcc_lib prune.exp
load_gcc_lib target-libpath.exp
load_gcc_lib wrapper.exp
Expand Down

0 comments on commit 71c8cbf

Please sign in to comment.