RFC: Monitoring old PRs, new dg directives [v2]

Thomas Schwinge thomas@codesourcery.com
Tue Nov 10 14:15:00 GMT 2020


Hi!

On 2020-08-10T17:30:21-0400, Marek Polacek via Gcc-patches <gcc-patches@gcc.gnu.org> wrote:
> This patch adds a new DejaGNU directive, dg-ice, as outlined in the
> proposal here:
> https://gcc.gnu.org/pipermail/gcc-patches/2020-July/550913.html
>
> It means that it's expected that the compiler crashes with an internal
> compiler error when compiling test with such a directive.

Thanks, I find this useful.


So I have a testcase that currently ICEs...  ;-)

    spawn -ignore SIGHUP [xgcc]
    during GIMPLE pass: omplower
    In file included from [...]:4:
    [...]: In function 'f_data':
    [...]:41:10: internal compiler error: in lower_omp_target, at omp-low.c:11890
    [backtrace]
    Please submit a full bug report,
    with preprocessed source if appropriate.
    Please include the complete backtrace with any bug report.
    See <https://gcc.gnu.org/bugs/> for instructions.
    compiler exited with status 1

I put '{ dg-ice }' into it, and do get the expected:

    XFAIL: [...] (internal compiler error)'

But I also get an unexpected:

    FAIL: [...] (test for excess errors)'

That's because of:

    Excess errors:
    during GIMPLE pass: omplower

I can easily '{ dg-prune-output "during GIMPLE pass: omplower" }', of
course, or should this lead-in be pruned internally, automatically?


And then, this is a '{ dg-do run }' testcase, I see:

    UNRESOLVED: libgomp.oacc-c/../libgomp.oacc-c-c++-common/declare-vla-kernels-decompose.c -DACC_DEVICE_TYPE_nvidia=1 -DACC_MEM_SHARED=0 -foffload=nvptx-none  -O0  compilation failed to produce executable

Given '{ dg-ice }', it's obvious that we don't get an executable to run.
I thought that maybe '{ dg-ice }' testcases should automatically be
demoted into '{ dg-do compile }', but that would be wrong for link-time
ICEs.  But can we "expect" the UNRESOLVED, and turn that into another
XFAIL?  Aha, actually I see that for '{ dg-do link }', this seems to
behave as expected (no UNRESOLVED), so we might demote all '{ dg-ice }'
testcases from '{ dg-do run }' to '{ dg-do link }', if that makes sense?


Grüße
 Thomas


> diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi
> index 63216a0daba..967cb135cb4 100644
> --- a/gcc/doc/sourcebuild.texi
> +++ b/gcc/doc/sourcebuild.texi
> @@ -1172,6 +1172,16 @@ Expect the execute step of a test to fail if the conditions (which are
>  the same as for @code{dg-skip-if}) are met.
>  @end table
>
> +@subsubsection Expect the compiler to crash
> +
> +@table @code
> +@item  @{ dg-ice @var{comment} [@{ @var{selector} @} [@{ @var{include-opts} @} [@{ @var{exclude-opts} @}]]] @}
> +Expect the compiler to crash with an internal compiler error and return
> +a nonzero exit status if the conditions (which are the same as for
> +@code{dg-skip-if}) are met.  Used for tests that test bugs that have not been
> +fixed yet.
> +@end table
> +
>  @subsubsection Expect the test executable to fail
>
>  @table @code
> diff --git a/gcc/testsuite/lib/gcc-dg.exp b/gcc/testsuite/lib/gcc-dg.exp
> index 45d97024883..e8ad3052657 100644
> --- a/gcc/testsuite/lib/gcc-dg.exp
> +++ b/gcc/testsuite/lib/gcc-dg.exp
> @@ -308,13 +308,27 @@ proc gcc-dg-test-1 { target_compile prog do_what extra_tool_flags } {
>      verbose "$target_compile $prog $output_file $compile_type $options" 4
>      set comp_output [$target_compile "$prog" "$output_file" "$compile_type" $options]
>
> +    global expect_ice
>      # Look for an internal compiler error, which sometimes masks the fact
>      # that we didn't get an expected error message.  XFAIL an ICE via
>      # dg-xfail-if and use { dg-prune-output ".*internal compiler error.*" }
>      # to avoid a second failure for excess errors.
> -    if [string match "*internal compiler error*" $comp_output] {
> +    # "Error reporting routines re-entered" ICE says "Internal" rather than
> +    # "internal", so match that too.
> +    if [string match {*[Ii]nternal compiler error*} $comp_output] {
>       upvar 2 name name
> -     fail "$name (internal compiler error)"
> +     if { $expect_ice == 0 } {
> +       fail "$name (internal compiler error)"
> +     } else {
> +       # We expected an ICE and we got it.
> +       xfail "$name (internal compiler error)"
> +       # Prune the ICE from the output.
> +       set comp_output [prune_ices $comp_output]
> +     }
> +    } elseif { $expect_ice == 1 } {
> +     upvar 2 name name
> +     # We expected an ICE but we didn't get it.
> +     xpass "$name (internal compiler error)"
>      }
>
>      if { $do_what == "repo" } {
> @@ -939,6 +953,7 @@ if { [info procs saved-dg-test] == [list] } {
>       global additional_prunes
>       global compiler_conditional_xfail_data
>       global shouldfail
> +     global expect_ice
>       global testname_with_flags
>       global set_target_env_var
>       global set_compiler_env_var
> @@ -954,6 +969,7 @@ if { [info procs saved-dg-test] == [list] } {
>       set additional_sources_used ""
>       set additional_prunes ""
>       set shouldfail 0
> +     set expect_ice 0
>       if [info exists set_target_env_var] {
>           unset set_target_env_var
>       }
> diff --git a/gcc/testsuite/lib/prune.exp b/gcc/testsuite/lib/prune.exp
> index 1c776249f1a..58a739684a5 100644
> --- a/gcc/testsuite/lib/prune.exp
> +++ b/gcc/testsuite/lib/prune.exp
> @@ -118,6 +118,15 @@ proc prune_file_path { text } {
>      return $text
>  }
>
> +# Prune internal compiler error messages, including the "Please submit..."
> +# footnote.
> +
> +proc prune_ices { text } {
> +  regsub -all "(^|\n)\[^\n\]*: internal compiler error:.*for instructions\[^\n\]*" $text "" text
> +  regsub -all "(^|\n|')*Internal compiler error:.*for instructions\[^\n\]*" $text "" text
> +  return $text
> +}
> +
>  # Provide a definition of this if missing (delete after next dejagnu release).
>
>  if { [info procs prune_warnings] == "" } then {
> diff --git a/gcc/testsuite/lib/target-supports-dg.exp b/gcc/testsuite/lib/target-supports-dg.exp
> index 2a21424b890..5bb99f4e8f9 100644
> --- a/gcc/testsuite/lib/target-supports-dg.exp
> +++ b/gcc/testsuite/lib/target-supports-dg.exp
> @@ -495,6 +495,34 @@ proc dg-shouldfail { args } {
>      }
>  }
>
> +# Record whether the compiler is expected (at the moment) to ICE.
> +# Used for tests that test bugs that have not been fixed yet.
> +
> +set expect_ice 0
> +
> +proc dg-ice { args } {
> +    # Don't bother if we're already skipping the test.
> +    upvar dg-do-what dg-do-what
> +    if { [lindex ${dg-do-what} 1] == "N" } {
> +      return
> +    }
> +
> +    global expect_ice
> +
> +    set args [lreplace $args 0 0]
> +    if { [llength $args] > 1 } {
> +     set selector [list target [lindex $args 1]]
> +     if { [dg-process-target-1 $selector] == "S" } {
> +         # The target matches, now check the flags.
> +         if [check-flags $args] {
> +             set expect_ice 1
> +         }
> +     }
> +    } else {
> +     set expect_ice 1
> +    }
> +}
> +
>  # Intercept the call to the DejaGnu version of dg-process-target to
>  # support use of an effective-target keyword in place of a list of
>  # target triplets to xfail or skip a test.
>
> base-commit: e4ced0b60ccb4c944970304cf74f1ee9086e5553
> --
> 2.26.2
-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander Walter


More information about the Gcc-patches mailing list