aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <quic_apinski@quicinc.com>2025-03-28 17:25:56 -0700
committerAndrew Pinski <quic_apinski@quicinc.com>2025-04-21 08:44:32 -0700
commit49926c2c657dd867f7329df6e250913fd1425475 (patch)
treea390a53dcc7d197d23274fa95c773f4dc67df228 /gcc
parentd508d24282c6a8172be2abcb2223232f452b667f (diff)
downloadgcc-49926c2c657dd867f7329df6e250913fd1425475.zip
gcc-49926c2c657dd867f7329df6e250913fd1425475.tar.gz
gcc-49926c2c657dd867f7329df6e250913fd1425475.tar.bz2
except: Don't use the cached value of the gcc_except_table section for comdat functions [PR119507]
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>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/except.cc9
-rw-r--r--gcc/testsuite/g++.dg/eh/pr119507.C17
2 files changed, 25 insertions, 1 deletions
diff --git a/gcc/except.cc b/gcc/except.cc
index 205811c..0fe1e09 100644
--- a/gcc/except.cc
+++ b/gcc/except.cc
@@ -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
index 0000000..50afa75
--- /dev/null
+++ b/gcc/testsuite/g++.dg/eh/pr119507.C
@@ -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 } }