https://gcc.gnu.org/g:49926c2c657dd867f7329df6e250913fd1425475

commit r16-49-g49926c2c657dd867f7329df6e250913fd1425475
Author: Andrew Pinski <quic_apin...@quicinc.com>
Date:   Fri Mar 28 17:25:56 2025 -0700

    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_apin...@quicinc.com>

Diff:
---
 gcc/except.cc                      |  9 ++++++++-
 gcc/testsuite/g++.dg/eh/pr119507.C | 17 +++++++++++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/gcc/except.cc b/gcc/except.cc
index 205811c65673..0fe1e0934891 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 000000000000..50afa75a43f8
--- /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 } }

Reply via email to