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 <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.
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)
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);