aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Sayle <roger@nextmovesoftware.com>2024-05-22 13:48:52 +0100
committerRoger Sayle <roger@nextmovesoftware.com>2024-05-22 13:48:52 +0100
commit26df7b4684e201e66c09dd018603a248ddc5f437 (patch)
tree8a79c1bcc3d1c975318a9dc0e23662232f678aa8
parent3507ab1b018a68500e49fa9f1de7caa0f1b53dda (diff)
downloadgcc-26df7b4684e201e66c09dd018603a248ddc5f437.zip
gcc-26df7b4684e201e66c09dd018603a248ddc5f437.tar.gz
gcc-26df7b4684e201e66c09dd018603a248ddc5f437.tar.bz2
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 <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.
-rw-r--r--gcc/except.cc6
1 files changed, 3 insertions, 3 deletions
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);