]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
testsuite: Port 'check-function-bodies' to nvptx
authorThomas Schwinge <thomas@codesourcery.com>
Mon, 4 Sep 2023 20:28:12 +0000 (22:28 +0200)
committerThomas Schwinge <thomas@codesourcery.com>
Tue, 12 Sep 2023 08:37:41 +0000 (10:37 +0200)
This extends commit 4d706ff86ea86868615558e92407674a4f4b4af9
"Add dg test for matching function bodies" for nvptx.

gcc/testsuite/
* lib/scanasm.exp (configure_check-function-bodies): New proc.
(parse_function_bodies, check-function-bodies): Use it.
gcc/
* doc/sourcebuild.texi (check-function-bodies): Update.

gcc/doc/sourcebuild.texi
gcc/testsuite/lib/scanasm.exp

index 1a78b3c1abb4ec0539437718c3ffe7ec7ef96f72..de1aa8c2dbabd8c53634c98f4658d8ec59b0b5cd 100644 (file)
@@ -3327,9 +3327,12 @@ The first line of the expected output for a function @var{fn} has the form:
 Subsequent lines of the expected output also start with @var{prefix}.
 In both cases, whitespace after @var{prefix} is not significant.
 
-The test discards assembly directives such as @code{.cfi_startproc}
-and local label definitions such as @code{.LFB0} from the compiler's
-assembly output.  It then matches the result against the expected
+Depending on the configuration (see
+@code{configure_check-function-bodies} in
+@file{gcc/testsuite/lib/scanasm.exp}), the test may discard from the
+compiler's assembly output directives such as @code{.cfi_startproc},
+local label definitions such as @code{.LFB0}, and more.
+It then matches the result against the expected
 output for a function as a single regular expression.  This means that
 later lines can use backslashes to refer back to @samp{(@dots{})}
 captures on earlier lines.  For example:
index 0685de1d64176655db873c87a0c09ce66f1688ea..5df80325dff37c1bd8c2e51234c370520fffe725 100644 (file)
@@ -777,33 +777,73 @@ proc scan-lto-assembler { args } {
     dg-scan "scan-lto-assembler" 1 $testcase $output_file $args
 }
 
-# Read assembly file FILENAME and store a mapping from function names
-# to function bodies in array RESULT.  FILENAME has already been uploaded
-# locally where necessary and is known to exist.
 
-proc parse_function_bodies { filename result } {
-    upvar $result up_result
+# Set up CONFIG for check-function-bodies.
+
+proc configure_check-function-bodies { config } {
+    upvar $config up_config
 
     # Regexp for the start of a function definition (name in \1).
-    set label {^([a-zA-Z_]\S+):$}
+    if { [istarget nvptx*-*-*] } {
+       set up_config(start) {^// BEGIN(?: GLOBAL|) FUNCTION DEF: ([a-zA-Z_]\S+)$}
+    } else {
+       set up_config(start) {^([a-zA-Z_]\S+):$}
+    }
 
     # Regexp for the end of a function definition.
-    set terminator {^\s*\.size}
-
+    if { [istarget nvptx*-*-*] } {
+       set up_config(end) {^\}$}
+    } else {
+       set up_config(end) {^\s*\.size}
+    }
     # Regexp for lines that aren't interesting.
-    set fluff {^\s*(?:\.|//|@|$)}
+    if { [istarget nvptx*-*-*] } {
+       # Skip lines beginning with '//' comments ('-fverbose-asm', for
+       # example).
+       set up_config(fluff) {^\s*(?://)}
+    } else {
+       # Skip lines beginning with labels ('.L[...]:') or other directives
+       # ('.align', '.cfi_startproc', '.quad [...]', '.text', etc.), '//' or
+       # '@' comments ('-fverbose-asm' or ARM-style, for example), or empty
+       # lines.
+       set up_config(fluff) {^\s*(?:\.|//|@|$)}
+    }
+
+    # Regexp for expected output lines prefix.
+    if { [istarget nvptx*-*-*] } {
+       # Certain instructions (such as predicable ones) are emitted with
+       # additional whitespace prefixed.  On the other hand, labels don't get
+       # any whitespace prefixed, and we'd like to be able to match these,
+       # too.  We thereare expect any amount of whitespace here.
+       set up_config(line_prefix) {\t*}
+    } else {
+       set up_config(line_prefix) {\t}
+    }
+}
+
+# Per CONFIG, read assembly file FILENAME and store a mapping from function
+# names to function bodies in array RESULT.  FILENAME has already been uploaded
+# locally where necessary and is known to exist.
+
+proc parse_function_bodies { config filename result } {
+    upvar $config up_config
+    upvar $result up_result
 
     set fd [open $filename r]
     set in_function 0
     while { [gets $fd line] >= 0 } {
-       if { [regexp $label $line dummy function_name] } {
+       if { [regexp $up_config(start) $line dummy function_name] } {
            set in_function 1
            set function_body ""
        } elseif { $in_function } {
-           if { [regexp $terminator $line] } {
+           if { [regexp $up_config(end) $line] } {
+               verbose "parse_function_bodies: $function_name:\n$function_body"
                set up_result($function_name) $function_body
                set in_function 0
-           } elseif { ![regexp $fluff $line] } {
+           } elseif { [regexp $up_config(fluff) $line] } {
+               verbose "parse_function_bodies: $function_name: ignoring fluff line: $line"
+           } else {
                append function_body $line "\n"
            }
        }
@@ -893,13 +933,18 @@ proc check-function-bodies { args } {
        set terminator "*/"
     }
     set terminator_len [string length $terminator]
+    # Regexp for the start of a function definition in expected output lines
+    # (name in \1).  This may be different from '$config(start)'.
+    set start_expected {^(\S+):$}
+
+    configure_check-function-bodies config
 
     set have_bodies 0
     if { [is_remote host] } {
        remote_upload host "$filename"
     }
     if { [file exists $output_filename] } {
-       parse_function_bodies $output_filename functions
+       parse_function_bodies config $output_filename functions
        set have_bodies 1
     } else {
        verbose -log "$testcase: output file does not exist"
@@ -907,7 +952,6 @@ proc check-function-bodies { args } {
 
     set count 0
     set function_regexp ""
-    set label {^(\S+):$}
 
     set lineno 1
     set fd [open $input_filename r]
@@ -922,7 +966,7 @@ proc check-function-bodies { args } {
                } else {
                    set selector "P"
                }
-               if { ![regexp $label $line dummy function_name] } {
+               if { ![regexp $start_expected $line dummy function_name] } {
                    close $fd
                    error "check-function-bodies: line $lineno does not have a function label"
                }
@@ -937,7 +981,7 @@ proc check-function-bodies { args } {
            } elseif { [string equal $line "..."] } {
                append function_regexp ".*"
            } else {
-               append function_regexp "\t" $line "\n"
+               append function_regexp $config(line_prefix) $line "\n"
            }
        } elseif { [string equal -length $terminator_len $line $terminator] } {
            if { ![string equal $selector "N"] } {