testsuite: Port 'check-function-bodies' to nvptx
Checks
Commit Message
Hi!
On 2023-09-05T15:28:20+0100, Richard Sandiford via Gcc-patches <gcc-patches@gcc.gnu.org> wrote:
> Thomas Schwinge <thomas@codesourcery.com> writes:
>> On 2023-09-04T23:05:05+0200, I wrote:
>>> On 2019-07-16T15:04:49+0100, Richard Sandiford <richard.sandiford@arm.com> wrote:
>>>> This patch therefore adds a new check-function-bodies dg-final test
>>
>>>> The regexps in parse_function_bodies are fairly general, but might
>>>> still need to be extended in future for targets like Darwin or AIX.
>>>
>>> ..., or nvptx. [...]
>> Any comments before I push the attached
>> "testsuite: Port 'check-function-bodies' to nvptx"?
> LGTM. Just a minor comment:
>> --- a/gcc/doc/sourcebuild.texi
>> +++ b/gcc/doc/sourcebuild.texi
>> @@ -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{gcc/testsuite/lib/scanasm.exp:configure_check-function-bodies}),
>
> I can imagine such a long string wouldn't format well in the output.
> How about: @code{configure_check-function-bodies} in
> @filename{gcc/testsuite/lib/scanasm.exp}?
Thanks, good suggestion.
Also, I've backed out the 'gcc.target/nvptx/abort.c' change to use
'check-function-bodies', leaving that for a later commit to translate
more of 'gcc.target/nvptx/[...]'.
Pushed to master branch commit 50410234a3d2e1b85203d97fe6f65fd9d1f0e100
"testsuite: Port 'check-function-bodies' to nvptx", see attached.
Grüße
Thomas
-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
From 50410234a3d2e1b85203d97fe6f65fd9d1f0e100 Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <thomas@codesourcery.com>
Date: Mon, 4 Sep 2023 22:28:12 +0200
Subject: [PATCH] testsuite: Port 'check-function-bodies' to nvptx
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 | 9 +++--
gcc/testsuite/lib/scanasm.exp | 76 +++++++++++++++++++++++++++--------
2 files changed, 66 insertions(+), 19 deletions(-)
@@ -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:
@@ -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"] } {
--
2.34.1