summaryrefslogtreecommitdiff
path: root/lang/gcc12/files
diff options
context:
space:
mode:
Diffstat (limited to 'lang/gcc12/files')
-rw-r--r--lang/gcc12/files/patch-arm-unwind-cxx-support106
-rw-r--r--lang/gcc12/files/patch-clang-vec_step21
-rw-r--r--lang/gcc12/files/patch-gets-no-more47
-rw-r--r--lang/gcc12/files/patch-gfortran-libgcc69
-rw-r--r--lang/gcc12/files/pkg-message.in13
5 files changed, 256 insertions, 0 deletions
diff --git a/lang/gcc12/files/patch-arm-unwind-cxx-support b/lang/gcc12/files/patch-arm-unwind-cxx-support
new file mode 100644
index 000000000000..ec6959b9655c
--- /dev/null
+++ b/lang/gcc12/files/patch-arm-unwind-cxx-support
@@ -0,0 +1,106 @@
+--- UTC
+Index: gcc/ginclude/unwind-arm-common.h
+===================================================================
+--- gcc/ginclude/unwind-arm-common.h (revision 219113)
++++ gcc/ginclude/unwind-arm-common.h (working copy)
+@@ -82,7 +82,11 @@
+
+ struct _Unwind_Control_Block
+ {
++#ifdef __FreeBSD__
++ unsigned exception_class __attribute__((__mode__(__DI__)));
++#else
+ char exception_class[8];
++#endif
+ void (*exception_cleanup)(_Unwind_Reason_Code, _Unwind_Control_Block *);
+ /* Unwinder cache, private fields for the unwinder's use */
+ struct
+@@ -181,7 +185,11 @@
+
+ /* Support functions for the PR. */
+ #define _Unwind_Exception _Unwind_Control_Block
++#ifdef __FreeBSD__
++ typedef unsigned _Unwind_Exception_Class __attribute__((__mode__(__DI__)));
++#else
+ typedef char _Unwind_Exception_Class[8];
++#endif
+
+ void * _Unwind_GetLanguageSpecificData (_Unwind_Context *);
+ _Unwind_Ptr _Unwind_GetRegionStart (_Unwind_Context *);
+Index: libstdc++-v3/libsupc++/unwind-cxx.h
+===================================================================
+--- libstdc++-v3/libsupc++/unwind-cxx.h (revision 219147)
++++ libstdc++-v3/libsupc++/unwind-cxx.h (working copy)
+@@ -235,7 +235,7 @@
+ return reinterpret_cast<__cxa_dependent_exception *>(exc + 1) - 1;
+ }
+
+-#ifdef __ARM_EABI_UNWINDER__
++#if defined(__ARM_EABI_UNWINDER__) && !defined(__FreeBSD__)
+ static inline bool
+ __is_gxx_exception_class(_Unwind_Exception_Class c)
+ {
+@@ -309,13 +309,7 @@
+ c[6] = 'R';
+ c[7] = '\0';
+ }
+-
+-static inline void*
+-__gxx_caught_object(_Unwind_Exception* eo)
+-{
+- return (void*)eo->barrier_cache.bitpattern[0];
+-}
+-#else // !__ARM_EABI_UNWINDER__
++#else // !__ARM_EABI_UNWINDER__ || __FreeBSD__
+ // This is the primary exception class we report -- "GNUCC++\0".
+ const _Unwind_Exception_Class __gxx_primary_exception_class
+ = ((((((((_Unwind_Exception_Class) 'G'
+@@ -339,6 +333,16 @@
+ << 8 | (_Unwind_Exception_Class) '+')
+ << 8 | (_Unwind_Exception_Class) '\x01');
+
++const _Unwind_Exception_Class __gxx_forced_unwind_class
++= ((((((((_Unwind_Exception_Class) 'G'
++ << 8 | (_Unwind_Exception_Class) 'N')
++ << 8 | (_Unwind_Exception_Class) 'U')
++ << 8 | (_Unwind_Exception_Class) 'C')
++ << 8 | (_Unwind_Exception_Class) 'F')
++ << 8 | (_Unwind_Exception_Class) 'O')
++ << 8 | (_Unwind_Exception_Class) 'R')
++ << 8 | (_Unwind_Exception_Class) '\0');
++
+ static inline bool
+ __is_gxx_exception_class(_Unwind_Exception_Class c)
+ {
+@@ -346,6 +350,12 @@
+ || c == __gxx_dependent_exception_class;
+ }
+
++static inline bool
++__is_gxx_forced_unwind_class(_Unwind_Exception_Class c)
++{
++ return c == __gxx_forced_unwind_class;
++}
++
+ // Only checks for primary or dependent, but not that it is a C++ exception at
+ // all.
+ static inline bool
+@@ -357,7 +367,18 @@
+ #define __GXX_INIT_PRIMARY_EXCEPTION_CLASS(c) c = __gxx_primary_exception_class
+ #define __GXX_INIT_DEPENDENT_EXCEPTION_CLASS(c) \
+ c = __gxx_dependent_exception_class
++#define __GXX_INIT_FORCED_UNWIND_CLASS(c) c = __gxx_forced_unwind_class
++#endif // __ARM_EABI_UNWINDER__ && !__FreeBSD__
+
++#ifdef __ARM_EABI_UNWINDER__
++static inline void*
++__gxx_caught_object(_Unwind_Exception* eo)
++{
++ return (void*)eo->barrier_cache.bitpattern[0];
++}
++
++#else // !__ARM_EABI_UNWINDER__
++
+ // GNU C++ personality routine, Version 0.
+ extern "C" _Unwind_Reason_Code __gxx_personality_v0
+ (int, _Unwind_Action, _Unwind_Exception_Class,
diff --git a/lang/gcc12/files/patch-clang-vec_step b/lang/gcc12/files/patch-clang-vec_step
new file mode 100644
index 000000000000..00607540eb2a
--- /dev/null
+++ b/lang/gcc12/files/patch-clang-vec_step
@@ -0,0 +1,21 @@
+https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=239266 reports how
+clang unfortunately poisons user namespace by default (without any
+special options).
+
+Until that changes (or GCC changes) we need to avoid using vec_step
+as a variable.
+
+--- UTC
+Index: gcc/tree-vect-loop.cc
+===================================================================
+--- gcc/tree-vect-loop.cc (revision 273856)
++++ gcc/tree-vect-loop.cc (working copy)
+@@ -55,6 +55,8 @@ along with GCC; see the file COPYING3. If not see
+ #include "vec-perm-indices.h"
+ #include "tree-eh.h"
+
++#define vec_step vec_step_
++
+ /* Loop Vectorization Pass.
+
+ This pass tries to vectorize loops.
diff --git a/lang/gcc12/files/patch-gets-no-more b/lang/gcc12/files/patch-gets-no-more
new file mode 100644
index 000000000000..4b49aba3ca28
--- /dev/null
+++ b/lang/gcc12/files/patch-gets-no-more
@@ -0,0 +1,47 @@
+Disable the build/use of libssp/gets-chk since FreeBSD 12 and later
+do not feature gets() any longer.
+
+--- UTC
+Index: libssp/Makefile.am
+===================================================================
+--- libssp/Makefile.am (revision 263319)
++++ libssp/Makefile.am (working copy)
+@@ -42,7 +42,7 @@
+ nobase_libsubinclude_HEADERS = ssp/ssp.h ssp/string.h ssp/stdio.h ssp/unistd.h
+
+ libssp_la_SOURCES = \
+- ssp.c gets-chk.c memcpy-chk.c memmove-chk.c mempcpy-chk.c \
++ ssp.c memcpy-chk.c memmove-chk.c mempcpy-chk.c \
+ memset-chk.c snprintf-chk.c sprintf-chk.c stpcpy-chk.c \
+ strcat-chk.c strcpy-chk.c strncat-chk.c strncpy-chk.c \
+ vsnprintf-chk.c vsprintf-chk.c
+Index: libssp/Makefile.in
+===================================================================
+--- libssp/Makefile.in (revision 263319)
++++ libssp/Makefile.in (working copy)
+@@ -108,7 +108,7 @@
+ am__installdirs = "$(DESTDIR)$(toolexeclibdir)" \
+ "$(DESTDIR)$(libsubincludedir)"
+ LTLIBRARIES = $(toolexeclib_LTLIBRARIES)
+-am_libssp_la_OBJECTS = ssp.lo gets-chk.lo memcpy-chk.lo memmove-chk.lo \
++am_libssp_la_OBJECTS = ssp.lo memcpy-chk.lo memmove-chk.lo \
+ mempcpy-chk.lo memset-chk.lo snprintf-chk.lo sprintf-chk.lo \
+ stpcpy-chk.lo strcat-chk.lo strcpy-chk.lo strncat-chk.lo \
+ strncpy-chk.lo vsnprintf-chk.lo vsprintf-chk.lo
+@@ -291,7 +291,7 @@
+ libsubincludedir = $(libdir)/gcc/$(target_noncanonical)/$(gcc_version)/include
+ nobase_libsubinclude_HEADERS = ssp/ssp.h ssp/string.h ssp/stdio.h ssp/unistd.h
+ libssp_la_SOURCES = \
+- ssp.c gets-chk.c memcpy-chk.c memmove-chk.c mempcpy-chk.c \
++ ssp.c memcpy-chk.c memmove-chk.c mempcpy-chk.c \
+ memset-chk.c snprintf-chk.c sprintf-chk.c stpcpy-chk.c \
+ strcat-chk.c strcpy-chk.c strncat-chk.c strncpy-chk.c \
+ vsnprintf-chk.c vsprintf-chk.c
+@@ -452,7 +452,6 @@
+ distclean-compile:
+ -rm -f *.tab.c
+
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gets-chk.Plo@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libssp_nonshared_la-ssp-local.Plo@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memcpy-chk.Plo@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memmove-chk.Plo@am__quote@
diff --git a/lang/gcc12/files/patch-gfortran-libgcc b/lang/gcc12/files/patch-gfortran-libgcc
new file mode 100644
index 000000000000..fb7b66814f9c
--- /dev/null
+++ b/lang/gcc12/files/patch-gfortran-libgcc
@@ -0,0 +1,69 @@
+GCC has two runtime libraries: The static library libgcc.a (-lgcc) and
+the shared library libgcc_s.so (-lgcc_s). Both implement many of the
+same functions but they also each have their unique functions. When
+gcc links programs and libraries there are three possibilities:
+
+1. gcc -static-libgcc or gcc -static: -lgcc
+ => Just use libgcc.a.
+
+2. gcc -shared-libgcc: -lgcc_s -lgcc
+ => Link with libgcc_s first, so libgcc.a is only used for its unique
+ functions.
+
+3. gcc: -lgcc -Wl,--as-needed -lgcc_s -Wl,--no-as-needed
+ => Link with libgcc.a first so libgcc_s is only used for its unique
+ functions (_Unwind_* functions).
+
+Approach 3 is the default for gcc and it's also what clang and clang++ use;
+approach 2 is the default for gfortran, g++ and probably other front ends.
+
+This patch makes 3 the default for gfortran. It significantly reduces
+the use of libgcc_s. The _Unwind_* functions are also available in the
+old base system libgcc_s which means this reduces the need for
+-rpath /usr/local/lib/gccN in ports that depend on libraries built with
+gfortran. Consider a dependency tree like this:
+
+ prog -> libA -> libgcc_s (old base system libgcc_s is fine)
+ -> libB -> libgcc_s (libB built with gfortran, needs new libgcc_s)
+
+Here prog needs to be linked with -rpath /usr/local/lib/gccN even if it's
+a normal C program compiled with clang. Without -rpath it will fail to
+start because it loads old libgcc_s first as a dependency of libA and then
+it fails to load libB. With this patch libB works with old base system
+libgcc_s or may not need libgcc_s at all, so prog does not need to be
+linked with -rpath.
+
+Upstream is unlikely accept a patch like this because libgfortran calls
+some _Unwind_* functions and so always needs libgcc_s. Also because
+every Fortran program and library links to libgfortran it makes sense
+that option 2 above is the default. On FreeBSD where clang and GCC
+compiled code can be mixed and where multiple libgcc_s may be installed,
+option 3 is just a lot easier to deal with.
+
+The bug that sparked this is PR 208120 (but note there's a lot of
+misleading information in that bug. CMake is not actually doing
+anything wrong.)
+
+--- UTC
+--- gcc/fortran/gfortranspec.cc.orig 2022-01-23 22:32:06.000000000 +0000
++++ gcc/fortran/gfortranspec.cc 2022-02-06 08:56:31.018286000 +0000
+@@ -406,7 +406,7 @@
+ }
+ }
+
+-#ifdef ENABLE_SHARED_LIBGCC
++#if 0
+ if (library)
+ {
+ unsigned int i;
+--- libgfortran/Makefile.in.orig
++++ libgfortran/Makefile.in
+@@ -736,7 +736,7 @@
+ $(LTLDFLAGS) $(LIBQUADLIB) ../libbacktrace/libbacktrace.la \
+ $(HWCAP_LDFLAGS) \
+ $(LIBM) $(extra_ldflags_libgfortran) \
+- $(version_arg) -Wc,-shared-libgcc
++ $(version_arg)
+
+ libgfortran_la_DEPENDENCIES = $(version_dep) libgfortran.spec $(LIBQUADLIB_DEP)
+ cafexeclib_LTLIBRARIES = libcaf_single.la
diff --git a/lang/gcc12/files/pkg-message.in b/lang/gcc12/files/pkg-message.in
new file mode 100644
index 000000000000..df3ea725ce59
--- /dev/null
+++ b/lang/gcc12/files/pkg-message.in
@@ -0,0 +1,13 @@
+[
+{ type: install
+ message: <<EOD
+To ensure binaries built with this toolchain find appropriate versions
+of the necessary run-time libraries, you may want to link using
+
+ -Wl,-rpath=%%TARGLIB%%
+
+For ports leveraging USE_GCC, USES=compiler, or USES=fortran this happens
+transparently.
+EOD
+}
+]