git: 231018e22818 - main - lang/gcc12: Fix SIGBUS depending on CPUTYPE
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 24 Apr 2025 12:55:59 UTC
The branch main has been updated by salvadore:
URL: https://cgit.FreeBSD.org/ports/commit/?id=231018e228187099b8fac7e55b1a662cdc81c1f8
commit 231018e228187099b8fac7e55b1a662cdc81c1f8
Author: Oleg Sidorkin <osidorkin@gmail.com>
AuthorDate: 2025-04-23 14:36:49 +0000
Commit: Lorenzo Salvadore <salvadore@FreeBSD.org>
CommitDate: 2025-04-24 12:55:47 +0000
lang/gcc12: Fix SIGBUS depending on CPUTYPE
Compiling GCC with some CPUTYPE values (e.g. broadwell) result in
breaking some applications (e.g. math/octave, cad/freecad), sending a
SIGBUS.
The issue is due to GCC generating instructions that require variables
to be aligned in memory on certain CPUs. Our libthr does not have the
required alignment so these CPUs fail to execute these instructions.
The patch disables the generation of such instructions.
PR: 285711
Reported by: cracauer
Tested by: cracauer, jbo
---
lang/gcc12/Makefile | 2 +-
lang/gcc12/files/patch-libgcc_unwind.inc | 28 ++++++++++++++++++++++++++++
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/lang/gcc12/Makefile b/lang/gcc12/Makefile
index 24e5ad3bb5ea..03aa59736457 100644
--- a/lang/gcc12/Makefile
+++ b/lang/gcc12/Makefile
@@ -1,6 +1,6 @@
PORTNAME= gcc
PORTVERSION= 12.4.0
-PORTREVISION= 2
+PORTREVISION= 3
CATEGORIES= lang
MASTER_SITES= GCC
PKGNAMESUFFIX= ${SUFFIX}
diff --git a/lang/gcc12/files/patch-libgcc_unwind.inc b/lang/gcc12/files/patch-libgcc_unwind.inc
new file mode 100644
index 000000000000..42155a9ba48e
--- /dev/null
+++ b/lang/gcc12/files/patch-libgcc_unwind.inc
@@ -0,0 +1,28 @@
+GCC generates instructions that require variables to be aligned in memory on
+certain CPUs. Our libthr does not have the required alignment so these CPUs fail
+to execute these instructions. The instructions generation is driven by CPUTYPE.
+Some CPUs are fine to execute these instructions on unaligned data.
+
+This patch explicitly forbids GCC to generate instructions that require
+alignment of the data.
+
+If the entire program is compiled by LLVM or GCC, there is no problem (with GCC
+everything is aligned, with LLVM vmovdqa is not used to assign both variables
+at once).
+
+Linux does not have libthr, so Linux is not affected. Moreover Linux is likely
+to build everything with GCC.
+
+--- libgcc/unwind.inc.orig 2025-04-12 08:18:17 UTC
++++ libgcc/unwind.inc
+@@ -212,8 +212,8 @@ _Unwind_ForcedUnwind (struct _Unwind_Exception *exc,
+ uw_init_context (&this_context);
+ cur_context = this_context;
+
+- exc->private_1 = (_Unwind_Ptr) stop;
+- exc->private_2 = (_Unwind_Ptr) stop_argument;
++ __builtin_memcpy(&exc->private_1, &stop, sizeof(_Unwind_Ptr));
++ __builtin_memcpy(&exc->private_2, &stop_argument, sizeof(_Unwind_Ptr));
+
+ code = _Unwind_ForcedUnwind_Phase2 (exc, &cur_context, &frames);
+ if (code != _URC_INSTALL_CONTEXT)