]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
except: Don't use the cached value of the gcc_except_table section for comdat functio...
authorAndrew Pinski <quic_apinski@quicinc.com>
Sat, 29 Mar 2025 00:25:56 +0000 (17:25 -0700)
committerAndrew Pinski <quic_apinski@quicinc.com>
Mon, 21 Apr 2025 15:44:32 +0000 (08:44 -0700)
This has been broken since GCC started to put the comdat functions' gcc_except_table into their
own section; r0-118218-g3e6011cfebedfb. What would happen is after a non-comdat function is processed,
the cached value would always be used even for comdat function. Instead we should create a new
section for comdat functions.

OK? Bootstrapped and tested on x86_64-linux-gnu.

PR middle-end/119507

gcc/ChangeLog:

* except.cc (switch_to_exception_section): Don't use the cached section if
the current function is in comdat.

gcc/testsuite/ChangeLog:

* g++.dg/eh/pr119507.C: New test.

Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
gcc/except.cc
gcc/testsuite/g++.dg/eh/pr119507.C [new file with mode: 0644]

index 205811c65673928274e90260e6c6c013ac5b21d1..0fe1e0934891b0ab5319fe25e0e351dc2ca2ac1c 100644 (file)
@@ -2949,7 +2949,14 @@ switch_to_exception_section (const char * ARG_UNUSED (fnname))
 {
   section *s;
 
-  if (exception_section)
+  if (exception_section
+  /* Don't use the cached section for comdat if it will be different. */
+#ifdef HAVE_LD_EH_GC_SECTIONS
+      && !(targetm_common.have_named_sections
+          && DECL_COMDAT_GROUP (current_function_decl)
+          && HAVE_COMDAT_GROUP)
+#endif
+     )
     s = exception_section;
   else
     {
diff --git a/gcc/testsuite/g++.dg/eh/pr119507.C b/gcc/testsuite/g++.dg/eh/pr119507.C
new file mode 100644 (file)
index 0000000..50afa75
--- /dev/null
@@ -0,0 +1,17 @@
+// { dg-do compile { target comdat_group } }
+// Force off function sections
+// Force on exceptions
+// { dg-options "-fno-function-sections -fexceptions" }
+// PR middle-end/119507
+
+
+inline int comdat() { try { throw 1; } catch (int) { return 1; } return 0; }
+int another_func_with_exception() { try { throw 1; } catch (int) { return 1; } return 0; }
+inline int comdat1() { try { throw 1; } catch (int) { return 1; } return 0; }
+int foo() { return comdat() + comdat1(); }
+
+// Make sure the gcc puts the exception table for both comdat and comdat1 in their own section
+// { dg-final { scan-assembler-times ".section\[\t \]\[^\n\]*.gcc_except_table._Z6comdatv" 1 } }
+// { dg-final { scan-assembler-times ".section\[\t \]\[^\n\]*.gcc_except_table._Z7comdat1v" 1 } }
+// There should be 3 exception tables, 
+// { dg-final { scan-assembler-times ".section\[\t \]\[^\n\]*.gcc_except_table" 3 } }