@@ -3530,7 +3530,7 @@ assembly output.
Passes if @var{symbol} is not defined as a hidden symbol in the test's
assembly output.
-@item check-function-bodies @var{prefix} @var{terminator} [@var{options} [@{ target/xfail @var{selector} @}]]
+@item check-function-bodies @var{prefix} @var{terminator} [@var{options} [@{ target/xfail @var{selector} @} [@var{matched}]]]
Looks through the source file for comments that give the expected assembly
output for selected functions. Each line of expected output starts with the
prefix string @var{prefix} and the expected output for a function as a whole
@@ -3557,8 +3557,11 @@ 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
+local label definitions such as @code{.LFB0}, and more. This behavior
+can be overridden using the optional @var{matched} argument, which
+specifies a regexp for lines that should not be discarded in this way.
+
+The test 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:
@@ -1,6 +1,20 @@
/* { dg-do compile { target *-*-linux* } } */
-/* { dg-options "-O2 -fcf-protection=branch" } */
+/* { dg-options "-O2 -g0 -fcf-protection=branch" } */
+/* Keep labels and directives ('.p2align', '.cfi_startproc').
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.} } } */
+/*
+**foo:
+**.LFB0:
+** .cfi_startproc
+** (
+** endbr64
+** .p2align 5
+** |
+** endbr32
+** )
+**...
+*/
char *
foo (char *dest, const char *src)
{
@@ -8,5 +22,3 @@ foo (char *dest, const char *src)
/* nothing */;
return --dest;
}
-
-/* { dg-final { scan-assembler "\t\.cfi_startproc\n\tendbr(32|64)\n" } } */
@@ -952,6 +952,9 @@ proc parse_function_bodies { config filename result } {
verbose "parse_function_bodies: $function_name:\n$function_body"
set up_result($function_name) $function_body
set in_function 0
+ } elseif { $up_config(matched) ne "" \
+ && [regexp $up_config(matched) $line] } {
+ append function_body $line "\n"
} elseif { [regexp $up_config(fluff) $line] } {
verbose "parse_function_bodies: $function_name: ignoring fluff line: $line"
} else {
@@ -982,7 +985,7 @@ proc check_function_body { functions name body_regexp } {
# Check the implementations of functions against expected output. Used as:
#
-# { dg-do { check-function-bodies PREFIX TERMINATOR[ OPTION[ SELECTOR]] } }
+# { dg-do { check-function-bodies PREFIX TERMINATOR[ OPTION[ SELECTOR [MATCHED]]] } }
#
# See sourcebuild.texi for details.
@@ -990,7 +993,7 @@ proc check-function-bodies { args } {
if { [llength $args] < 2 } {
error "too few arguments to check-function-bodies"
}
- if { [llength $args] > 4 } {
+ if { [llength $args] > 5 } {
error "too many arguments to check-function-bodies"
}
@@ -1029,6 +1032,11 @@ proc check-function-bodies { args } {
}
}
+ set matched ""
+ if { [llength $args] >= 5 } {
+ set matched [lindex $args 4]
+ }
+
set testcase [testname-for-summary]
# The name might include a list of options; extract the file name.
set filename [lindex $testcase 0]
@@ -1048,6 +1056,7 @@ proc check-function-bodies { args } {
# (name in \1). This may be different from '$config(start)'.
set start_expected {^(\S+):$}
+ set config(matched) $matched
configure_check-function-bodies config
set have_bodies 0
if { [is_remote host] } {
@@ -1090,6 +1099,8 @@ proc check-function-bodies { args } {
append function_regexp ")"
} elseif { [string equal $line "..."] } {
append function_regexp ".*"
+ } elseif { [regexp {^\.L} $line] } {
+ append function_regexp $line "\n"
} else {
append function_regexp $config(line_prefix) $line "\n"
}
As PR target/116174 shown, we may need to verify labels and the directive order. Extend check-function-bodies to support matched output lines to allow label and directives. gcc/ * doc/sourcebuild.texi (check-function-bodies): Add an optional argument for matched output lines. gcc/testsuite/ * gcc.target/i386/pr116174.c: Use check-function-bodies. * lib/scanasm.exp (parse_function_bodies): Append the line if $up_config(matched) matches the line. (check-function-bodies): Add an argument for matched. Set up_config(matched) to $matched. Append the expected line without $config(line_prefix) to function_regexp if it starts with ".L". Signed-off-by: H.J. Lu <hjl.tools@gmail.com> --- gcc/doc/sourcebuild.texi | 9 ++++++--- gcc/testsuite/gcc.target/i386/pr116174.c | 18 +++++++++++++++--- gcc/testsuite/lib/scanasm.exp | 15 +++++++++++++-- 3 files changed, 34 insertions(+), 8 deletions(-)