mirror of
https://gitlab.postmarketos.org/postmarketOS/pmaports.git
synced 2025-07-23 23:05:10 +03:00
Part-of: https://gitlab.postmarketos.org/postmarketOS/pmaports/-/merge_requests/6689 [ci:skip-build]: already built successfully in CI
77 lines
2.8 KiB
Diff
77 lines
2.8 KiB
Diff
From 49926c2c657dd867f7329df6e250913fd1425475 Mon Sep 17 00:00:00 2001
|
|
From: Andrew Pinski <quic_apinski@quicinc.com>
|
|
Date: Fri, 28 Mar 2025 17:25:56 -0700
|
|
Subject: [PATCH] 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>
|
|
---
|
|
gcc/except.cc | 9 ++++++++-
|
|
gcc/testsuite/g++.dg/eh/pr119507.C | 17 +++++++++++++++++
|
|
2 files changed, 25 insertions(+), 1 deletion(-)
|
|
create mode 100644 gcc/testsuite/g++.dg/eh/pr119507.C
|
|
|
|
diff --git a/gcc/except.cc b/gcc/except.cc
|
|
index 205811c6567..0fe1e093489 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 00000000000..50afa75a43f
|
|
--- /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 } }
|
|
--
|
|
2.49.0
|
|
|