https://gcc.gnu.org/g:26df7b4684e201e66c09dd018603a248ddc5f437

commit r15-774-g26df7b4684e201e66c09dd018603a248ddc5f437
Author: Roger Sayle <ro...@nextmovesoftware.com>
Date:   Wed May 22 13:48:52 2024 +0100

    Avoid ICE in except.cc on targets that don't support exceptions.
    
    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.
    
    2024-05-22  Roger Sayle  <ro...@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.

Diff:
---
 gcc/except.cc | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/gcc/except.cc b/gcc/except.cc
index 2080fcc22e6..b5886e97be9 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);

Reply via email to