diff mbox series

Avoid ICE in except.cc on targets that don't support exceptions.

Message ID 001c01daac18$968e6d40$c3ab47c0$@nextmovesoftware.com
State New
Headers show
Series Avoid ICE in except.cc on targets that don't support exceptions. | expand

Commit Message

Roger Sayle May 22, 2024, 7:20 a.m. UTC
A number of testcases currently fail on nvptx with the ICE:

during RTL pass: final
openmp-simd-2.c: In function 'foo':
openmp-simd-2.c:28:1: internal compiler error: in get_personality_function,
at expr.cc:14037
   28 | }
      | ^
0x98a38f get_personality_function(tree_node*)
        /home/roger/GCC/nvptx-none/gcc/gcc/expr.cc:14037
0x969d3b output_function_exception_table(int)
        /home/roger/GCC/nvptx-none/gcc/gcc/except.cc:3226
0x9b760d rest_of_handle_final
        /home/roger/GCC/nvptx-none/gcc/gcc/final.cc:4252

The simple oversight in output_function_exception_table is that it calls
get_personality_function (immediately) before checking the target's
except_unwind_info hook (which on nvptx always returns UI_NONE).
The (perhaps obvious) fix is to move the assignments of fname and
personality after the tests that they are needed, and before their
first use.

This patch has been tested on nvptx-none hosted on x86_64-pc-linux-gnu
with no new failures in the testsuite, and ~220 fewer FAILs.
Ok for mainline?

2024-05-22  Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog
        * except.cc (output_function_exception_table): Move call to
        get_personality_function after targetm_common.except_unwind_info
        check, to avoid ICE on targets that don't support exceptions.


Thanks in advance,
Roger
--

Comments

Richard Biener May 22, 2024, 7:49 a.m. UTC | #1
On Wed, May 22, 2024 at 9:21 AM Roger Sayle <roger@nextmovesoftware.com> wrote:
>
>
> A number of testcases currently fail on nvptx with the ICE:
>
> during RTL pass: final
> openmp-simd-2.c: In function 'foo':
> openmp-simd-2.c:28:1: internal compiler error: in get_personality_function,
> at expr.cc:14037
>    28 | }
>       | ^
> 0x98a38f get_personality_function(tree_node*)
>         /home/roger/GCC/nvptx-none/gcc/gcc/expr.cc:14037
> 0x969d3b output_function_exception_table(int)
>         /home/roger/GCC/nvptx-none/gcc/gcc/except.cc:3226
> 0x9b760d rest_of_handle_final
>         /home/roger/GCC/nvptx-none/gcc/gcc/final.cc:4252
>
> The simple oversight in output_function_exception_table is that it calls
> get_personality_function (immediately) before checking the target's
> except_unwind_info hook (which on nvptx always returns UI_NONE).
> The (perhaps obvious) fix is to move the assignments of fname and
> personality after the tests that they are needed, and before their
> first use.
>
> This patch has been tested on nvptx-none hosted on x86_64-pc-linux-gnu
> with no new failures in the testsuite, and ~220 fewer FAILs.
> Ok for mainline?

OK.

Richard.

> 2024-05-22  Roger Sayle  <roger@nextmovesoftware.com>
>
> gcc/ChangeLog
>         * except.cc (output_function_exception_table): Move call to
>         get_personality_function after targetm_common.except_unwind_info
>         check, to avoid ICE on targets that don't support exceptions.
>
>
> Thanks in advance,
> Roger
> --
>
diff mbox series

Patch

diff --git a/gcc/except.cc b/gcc/except.cc
index 2080fcc..b5886e9 100644
--- a/gcc/except.cc
+++ b/gcc/except.cc
@@ -3222,9 +3222,6 @@  output_one_function_exception_table (int section)
 void
 output_function_exception_table (int section)
 {
-  const char *fnname = get_fnname_from_decl (current_function_decl);
-  rtx personality = get_personality_function (current_function_decl);
-
   /* Not all functions need anything.  */
   if (!crtl->uses_eh_lsda
       || targetm_common.except_unwind_info (&global_options) == UI_NONE)
@@ -3234,6 +3231,9 @@  output_function_exception_table (int section)
   if (section == 1 && !crtl->eh.call_site_record_v[1])
     return;
 
+  const char *fnname = get_fnname_from_decl (current_function_decl);
+  rtx personality = get_personality_function (current_function_decl);
+
   if (personality)
     {
       assemble_external_libcall (personality);