summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleg Sidorkin <osidorkin@gmail.com>2025-04-23 10:13:01 +0200
committerLorenzo Salvadore <salvadore@FreeBSD.org>2025-05-03 11:46:25 +0200
commit6a4bfe6146890a6f28e794bf8c602ec8afd74fd0 (patch)
treee594a69ba9e6b3d256b51fb493afd10d9423fcbe
parentlang/gcc12: Add comment to existing patch (diff)
lang/gcc13: 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 and will get obsolete once all supported FreeBSD releases include commit 22e564c74eb20e14bd93fd9fdde20e38a29cfcf1. PR: 285711 Reported by: cracauer Tested by: cracauer, jbo
-rw-r--r--lang/gcc13/Makefile2
-rw-r--r--lang/gcc13/files/patch-libgcc_unwind.inc31
2 files changed, 32 insertions, 1 deletions
diff --git a/lang/gcc13/Makefile b/lang/gcc13/Makefile
index fe54d1ef7c13..87a94678dcd1 100644
--- a/lang/gcc13/Makefile
+++ b/lang/gcc13/Makefile
@@ -1,6 +1,6 @@
PORTNAME= gcc
PORTVERSION= 13.3.0
-PORTREVISION= 2
+PORTREVISION= 3
CATEGORIES= lang
MASTER_SITES= GCC
PKGNAMESUFFIX= ${SUFFIX}
diff --git a/lang/gcc13/files/patch-libgcc_unwind.inc b/lang/gcc13/files/patch-libgcc_unwind.inc
new file mode 100644
index 000000000000..94fb7f65d5fb
--- /dev/null
+++ b/lang/gcc13/files/patch-libgcc_unwind.inc
@@ -0,0 +1,31 @@
+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.
+
+This patch will become obsolete once all supported FreeBSD releases
+include commit 22e564c74eb20e14bd93fd9fdde20e38a29cfcf1.
+
+--- 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)