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.to...@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(-) diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi index 1a31f00fb65..3c55f103795 100644 --- a/gcc/doc/sourcebuild.texi +++ b/gcc/doc/sourcebuild.texi @@ -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: diff --git a/gcc/testsuite/gcc.target/i386/pr116174.c b/gcc/testsuite/gcc.target/i386/pr116174.c index 8877d0b51af..686aeb9ff31 100644 --- a/gcc/testsuite/gcc.target/i386/pr116174.c +++ b/gcc/testsuite/gcc.target/i386/pr116174.c @@ -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" } } */ diff --git a/gcc/testsuite/lib/scanasm.exp b/gcc/testsuite/lib/scanasm.exp index 42c719c512c..737eefc655e 100644 --- a/gcc/testsuite/lib/scanasm.exp +++ b/gcc/testsuite/lib/scanasm.exp @@ -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" } -- 2.46.0