ports/lang/gcc14-devel/files/patch-libgcc_unwind.inc
Lorenzo Salvadore e796abb574
lang/gcc14-devel: Update to 14.2.1.s20250425
Also add a comment to files/patch-libgcc_unwind.inc to remember when it
will get obsolete, i.e. once all supported FreeBSD releases include commit
22e564c74eb20e14bd93fd9fdde20e38a29cfcf1.

PR: 285711
2025-05-03 11:46:24 +02:00

32 lines
1.3 KiB
HTML

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)