On Tue, 15 Apr 2025, H.J. Lu wrote:

> Hi,
> 
> I'd like to backport this testsuite enhancement to GCC 14 so that
> 
> https://gcc.gnu.org/pipermail/gcc-patches/2025-April/680896.html
> 
> can be backported to GCC 14 with testcases unchanged.

OK.

> 
> H.J.
> ---
> 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>
> (cherry picked from commit d6bb1e257fc414d21bc31faa7ddecbc93a197e3c)
> ---
>  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 23dedef4161..c8130dc1ba9 100644
> --- a/gcc/doc/sourcebuild.texi
> +++ b/gcc/doc/sourcebuild.texi
> @@ -3440,7 +3440,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
> @@ -3467,8 +3467,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 6cf9997240d..d1c8e3b5079 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"
>           }
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to