This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] ld: Add file based error/warning regexp for run_dump_test.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=bb57e4c7bd1d27c45195efd0b7a612bac831d2df

commit bb57e4c7bd1d27c45195efd0b7a612bac831d2df
Author: Andrew Burgess <andrew.burgess@embecosm.com>
Date:   Tue Jul 28 16:20:41 2015 +0100

    ld: Add file based error/warning regexp for run_dump_test.
    
    The run_dump_test mechanism supports options error and warning, which
    allow regexp to be specified within the test file, these regexp are
    matched against the stderr output from the linker.
    
    Similar dump test style functions for gas and gdb also support file
    based matching versions of these options; the patterns are placed into a
    file which the test driver then references.  It is sometimes clearer,
    when the pattern to be matched spans multiple lines if the patterns can
    be placed into a separate file.
    
    This patch adds new options error_output and warning_output for the
    linker run_dump_test function.  These new options take a filename
    parameter, this file is then used (with regexp_diff) to compare against
    the linker output.
    
    ld/testsuite/ChangeLog:
    
    	* ld/ld-lib.exp (run_dump_test): Add error_output and
    	warning_output options.

Diff:
---
 ld/testsuite/ChangeLog      |  5 +++
 ld/testsuite/lib/ld-lib.exp | 90 ++++++++++++++++++++++++++++++++++++---------
 2 files changed, 78 insertions(+), 17 deletions(-)

diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 512abc3..aaecbeb 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,5 +1,10 @@
 2015-08-04  Andrew Burgess  <andrew.burgess@embecosm.com>
 
+	* ld/ld-lib.exp (run_dump_test): Add error_output and
+	warning_output options.
+
+2015-08-04  Andrew Burgess  <andrew.burgess@embecosm.com>
+
 	* ld-undefined/require-defined-1.d: New file.
 	* ld-undefined/require-defined-2.d: New file.
 	* ld-undefined/require-defined-3.d: New file.
diff --git a/ld/testsuite/lib/ld-lib.exp b/ld/testsuite/lib/ld-lib.exp
index 6f71e97..8bb06ff 100644
--- a/ld/testsuite/lib/ld-lib.exp
+++ b/ld/testsuite/lib/ld-lib.exp
@@ -554,11 +554,19 @@ proc ld_simple_link_defsyms {} {
 #	no meaning and need not be supplied if this is present.  Multiple
 #	"error" directives append to the expected linker error message.
 #
+#   error_output: FILE
+#       Means the same as 'error', except the regular expression lines
+#       are contains in FILE.
+#
 #   warning: REGEX
 #	Expect a linker warning matching REGEX.  It is an error to issue
 #	both "error" and "warning".  Multiple "warning" directives
 #	append to the expected linker warning message.
 #
+#   warning_output: FILE
+#       Means the same as 'warning', except the regular expression
+#       lines are contains in FILE.
+#
 #   map: FILE
 #       Adding this option will cause the linker to generate a linker
 #       map file, using the -Map=MAPFILE command line option.  If
@@ -617,6 +625,8 @@ proc run_dump_test { name {extra_options {}} } {
     set opts(dump) {}
     set opts(error) {}
     set opts(warning) {}
+    set opts(error_output) {}
+    set opts(warning_output) {}
     set opts(objcopy_linked_file) {}
     set opts(objcopy_objects) {}
     set opts(map) {}
@@ -724,7 +734,7 @@ proc run_dump_test { name {extra_options {}} } {
     set program ""
     # It's meaningless to require an output-testing method when we
     # expect an error.
-    if { $opts(error) == "" } {
+    if { $opts(error) == "" && $opts(error_output) == "" } {
 	if {$opts(PROG) != ""} {
 	    switch -- $opts(PROG) {
 		objdump	{ set program objdump }
@@ -750,7 +760,11 @@ proc run_dump_test { name {extra_options {}} } {
 		}
 	    }
 	}
-	if { $program == "" && $opts(warning) == "" } {
+	if { $program == "" \
+                 && $opts(warning) == "" \
+                 && $opts(warning_output) == "" \
+                 && $opts(error) == "" \
+                 && $opts(error_output) == "" } {
 	    perror "dump program unspecified in $file.d"
 	    unresolved $subdir/$name
 	    return
@@ -848,13 +862,44 @@ proc run_dump_test { name {extra_options {}} } {
 	}
     }
 
-    set expmsg $opts(error)
-    if { $opts(warning) != "" } {
-	if { $expmsg != "" } {
-	    perror "$testname: mixing error and warning test-directives"
-	    return
-	}
-	set expmsg $opts(warning)
+    if { (($opts(warning) != "") && ($opts(error) != "")) \
+	 || (($opts(warning) != "") && ($opts(error_output) != "")) \
+	 || (($opts(warning) != "") && ($opts(warning_output) != "")) \
+	 || (($opts(error) != "") && ($opts(warning_output) != "")) \
+	 || (($opts(error) != "") && ($opts(error_output) != "")) \
+	 || (($opts(warning_output) != "") && ($opts(error_output) != "")) } {
+	perror "$testname: bad mix of warning, error, warning_output, and error_output test-directives"
+	unresolved $testname
+	return
+    }
+
+    set check_ld(source) ""
+    if { $opts(error) != "" \
+         || $opts(warning) != "" \
+         || $opts(error_output) != "" \
+         || $opts(warning_output) != "" } {
+
+        if { $opts(error) != "" || $opts(error_output) != "" } {
+            set check_ld(terminal) 1
+        } else {
+            set check_ld(terminal) 0
+        }
+
+        if { $opts(error) != "" || $opts(warning) != "" } {
+            set check_ld(source) "regex"
+            if { $opts(error) != "" } {
+                set check_ld(regex) $opts(error)
+            } else {
+                set check_ld(regex) $opts(warning)
+            }
+        } else {
+            set check_ld(source) "file"
+            if { $opts(error_output) != "" } {
+                set check_ld(file) $opts(error_output)
+            } else {
+                set check_ld(file) $opts(warning_output)
+            }
+        }
     }
 
     # Perhaps link the file(s).
@@ -908,23 +953,34 @@ proc run_dump_test { name {extra_options {}} } {
 	}
 
 	regsub "\n$" $comp_output "" comp_output
-	if { $cmdret != 0 || $comp_output != "" || $expmsg != "" } then {
+	if { $cmdret != 0 || $comp_output != "" || $check_ld(source) != "" } then {
 	    set exitstat "succeeded"
 	    if { $cmdret != 0 } { set exitstat "failed" }
-	    verbose -log "$exitstat with: <$comp_output>, expected: <$expmsg>"
+
+            if { $check_ld(source) == "regexp" } {
+                verbose -log "$exitstat with: <$comp_output>, expected: <$check_ld(regex)>"
+            } elseif { $check_ld(source) == "file" } {
+                verbose -log "$exitstat with: <$comp_output>, expected in file $check_ld(file)"
+                set_file_contents "tmpdir/ld.messages" "$comp_output"
+            } else {
+                verbose -log "$exitstat with: <$comp_output>, no expected output"
+            }
 	    send_log "$comp_output\n"
 	    verbose "$comp_output" 3
 
-	    if { ($expmsg == "") == ($comp_output == "") \
-		    && [regexp $expmsg $comp_output] \
-		    && (($cmdret == 0) == ($opts(error) == "")) } {
-		# We have the expected output from ld.
-		if { $opts(error) != "" || $program == "" } {
+	    if { (($check_ld(source) == "") == ($comp_output == "")) \
+                 && (($cmdret == 0) == ($check_ld(terminal) == 0)) \
+                 && ((($check_ld(source) == "regex") \
+                      && ($check_ld(regex) == "") == ($comp_output == "") \
+                      && [regexp $check_ld(regex) $comp_output]) \
+                     || (($check_ld(source) == "file") \
+                         && ([regexp_diff "tmpdir/ld.messages" "$srcdir/$subdir/$check_ld(file)"]))) } {
+                # We have the expected output from ld.
+		if { $check_ld(terminal) || $program == "" } {
 		    pass $testname
 		    return
 		}
 	    } else {
-		verbose -log "$exitstat with: <$comp_output>, expected: <$expmsg>"
 		fail $testname
 		return
 	    }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]