diff options
author | Lorenzo Salvadore <salvadore@FreeBSD.org> | 2024-04-29 13:24:08 +0000 |
---|---|---|
committer | Lorenzo Salvadore <salvadore@FreeBSD.org> | 2024-04-29 20:21:09 +0000 |
commit | 220cbe07cb52ec8d847ac9035e51cccfd37860e0 (patch) | |
tree | 5777c2ab0c5c4fba9703affe526f2d897b20a41d /lang/gcc15-devel/files | |
parent | lang/lfortran: upgrade to v0.35.0 (diff) |
lang/gcc15-devel: Add port
GCC, the GNU Compiler Collection, supports a number of languages.
This port installs the C, C++, and Fortran front ends as gcc15, g++15,
and gfortran15, respectively.
This is the first snapshot from trunk with the GCC 15 designation. It
largely is a copy of lang/gcc14-devel.
Diffstat (limited to 'lang/gcc15-devel/files')
-rw-r--r-- | lang/gcc15-devel/files/patch-arm-unwind-cxx-support | 106 | ||||
-rw-r--r-- | lang/gcc15-devel/files/patch-gcc_Makefile.in | 19 | ||||
-rw-r--r-- | lang/gcc15-devel/files/patch-gcc_configure | 22 | ||||
-rw-r--r-- | lang/gcc15-devel/files/patch-gcc_jit_Make-lang.in | 14 | ||||
-rw-r--r-- | lang/gcc15-devel/files/patch-gfortran-libgcc | 69 | ||||
-rw-r--r-- | lang/gcc15-devel/files/patch-libcxxrt | 18 | ||||
-rw-r--r-- | lang/gcc15-devel/files/patch-libsanitizer_asan_asan__linux.cpp | 23 | ||||
-rw-r--r-- | lang/gcc15-devel/files/patch-libsanitizer_asan_asan__thread.cpp | 13 | ||||
-rw-r--r-- | lang/gcc15-devel/files/pkg-message.in | 13 |
9 files changed, 297 insertions, 0 deletions
diff --git a/lang/gcc15-devel/files/patch-arm-unwind-cxx-support b/lang/gcc15-devel/files/patch-arm-unwind-cxx-support new file mode 100644 index 000000000000..ec6959b9655c --- /dev/null +++ b/lang/gcc15-devel/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/gcc15-devel/files/patch-gcc_Makefile.in b/lang/gcc15-devel/files/patch-gcc_Makefile.in new file mode 100644 index 000000000000..127c87b1af79 --- /dev/null +++ b/lang/gcc15-devel/files/patch-gcc_Makefile.in @@ -0,0 +1,19 @@ +--- gcc/Makefile.in.orig 2024-02-25 22:32:27 UTC ++++ gcc/Makefile.in +@@ -671,6 +671,8 @@ libsubdir = $(libdir)/gcc/$(real_target_noncanonical)/ + + # Directory in which the compiler finds libraries etc. + libsubdir = $(libdir)/gcc/$(real_target_noncanonical)/$(version)$(accel_dir_suffix) ++# Directory in which the compiler finds headers. ++libsubincludedir = $(libdir)/gcc/$(target_alias)/$(version)/include + # Directory in which the compiler finds executables + libexecsubdir = $(libexecdir)/gcc/$(real_target_noncanonical)/$(version)$(accel_dir_suffix) + # Directory in which all plugin resources are installed +@@ -3821,6 +3823,7 @@ installdirs: + # $(libdir)/gcc/include isn't currently searched by cpp. + installdirs: + $(mkinstalldirs) $(DESTDIR)$(libsubdir) ++ $(mkinstalldirs) $(DESTDIR)$(libsubincludedir) + $(mkinstalldirs) $(DESTDIR)$(libexecsubdir) + $(mkinstalldirs) $(DESTDIR)$(bindir) + $(mkinstalldirs) $(DESTDIR)$(includedir) diff --git a/lang/gcc15-devel/files/patch-gcc_configure b/lang/gcc15-devel/files/patch-gcc_configure new file mode 100644 index 000000000000..cc60593ba6f7 --- /dev/null +++ b/lang/gcc15-devel/files/patch-gcc_configure @@ -0,0 +1,22 @@ +Enable support for .init_array and .fini_array, which FreeBSD supports +since commit 83aa9cc00c2d83d05a0efe7a1496d8aab4a153bb in the src +repository. + +There __FreeBSD_version is 1000009, so we start enabling the support +from __FreeBSD_version == 1000010. +--- gcc/configure.orig 2023-05-11 22:33:34 UTC ++++ gcc/configure +@@ -24214,6 +24214,13 @@ EOF + #else + # if defined __sun__ && defined __svr4__ + /* Solaris ld.so.1 supports .init_array/.fini_array since Solaris 8. */ ++# elif defined __FreeBSD__ ++# include <sys/param.h> ++# if __FreeBSD_version >= 1000010 ++ /* FreeBSD supports .init_array/.fini_array since FreeBSD 10. */ ++# else ++# error The C library not known to support .init_array/.fini_array ++# endif + # else + # error The C library not known to support .init_array/.fini_array + # endif diff --git a/lang/gcc15-devel/files/patch-gcc_jit_Make-lang.in b/lang/gcc15-devel/files/patch-gcc_jit_Make-lang.in new file mode 100644 index 000000000000..d5fdd6103146 --- /dev/null +++ b/lang/gcc15-devel/files/patch-gcc_jit_Make-lang.in @@ -0,0 +1,14 @@ +--- gcc/jit/Make-lang.in.orig 2024-02-25 22:32:31 UTC ++++ gcc/jit/Make-lang.in +@@ -360,9 +360,9 @@ jit.install-headers: installdirs + # Install hooks: + jit.install-headers: installdirs + $(INSTALL_DATA) $(srcdir)/jit/libgccjit.h \ +- $(DESTDIR)$(includedir)/libgccjit.h ++ $(DESTDIR)$(libsubincludedir)/libgccjit.h + $(INSTALL_DATA) $(srcdir)/jit/libgccjit++.h \ +- $(DESTDIR)$(includedir)/libgccjit++.h ++ $(DESTDIR)$(libsubincludedir)/libgccjit++.h + + ifneq (,$(findstring mingw,$(target))) + jit.install-common: installdirs jit.install-headers diff --git a/lang/gcc15-devel/files/patch-gfortran-libgcc b/lang/gcc15-devel/files/patch-gfortran-libgcc new file mode 100644 index 000000000000..4363c2e11f36 --- /dev/null +++ b/lang/gcc15-devel/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 +@@ -759,7 +759,7 @@ + $(LTLDFLAGS) $(LIBQUADLIB) ../libbacktrace/libbacktrace.la \ + $(HWCAP_LDFLAGS) \ + $(LIBM) $(extra_darwin_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/gcc15-devel/files/patch-libcxxrt b/lang/gcc15-devel/files/patch-libcxxrt new file mode 100644 index 000000000000..4225df7aad1e --- /dev/null +++ b/lang/gcc15-devel/files/patch-libcxxrt @@ -0,0 +1,18 @@ +libc++ on FreeBSD always uses PathScale libcxxrt and cannot change to +LLVM libc++abi without breaking backward compatibility. Besides, mixing +different C++ ABIs is not supported unless subset via DT_FILTER. + +https://github.com/llvm/llvm-project/commit/35479ffb1251 +https://github.com/freebsd/freebsd-src/commit/cf56074e5271 + +--- gcc/cp/g++spec.cc.orig 2022-07-31 22:32:16 UTC ++++ gcc/cp/g++spec.cc +@@ -60,7 +60,7 @@ along with GCC; see the file COPYING3. If not see + #endif + + #ifndef LIBCXXABI +-#define LIBCXXABI "c++abi" ++#define LIBCXXABI "cxxrt" + #endif + #ifndef LIBCXXABI_PROFILE + #define LIBCXXABI_PROFILE LIBCXXABI diff --git a/lang/gcc15-devel/files/patch-libsanitizer_asan_asan__linux.cpp b/lang/gcc15-devel/files/patch-libsanitizer_asan_asan__linux.cpp new file mode 100644 index 000000000000..f6c16d8730ee --- /dev/null +++ b/lang/gcc15-devel/files/patch-libsanitizer_asan_asan__linux.cpp @@ -0,0 +1,23 @@ +Since the vDSO shared librares on Linux and FreeBSD are called +differently, the initialization order check fails on FreeBSD. +This patch fixes it by ignoring [vdso] instead of linux-vdso.so. + +GCC gets the original file from the LLVM Project, so this patch should +probably be upstreamed directly to the LLVM Project rather than to GCC. + + +--- libsanitizer/asan/asan_linux.cpp.orig 2022-11-23 11:22:41 UTC ++++ libsanitizer/asan/asan_linux.cpp +@@ -148,6 +148,12 @@ static int FindFirstDSOCallback(struct dl_phdr_info *i + return 0; + # endif + ++# if SANITIZER_FREEBSD ++ // Ignore vDSO ++ if (internal_strncmp(info->dlpi_name, "[vdso]", sizeof("[vdso]") - 1) == 0) ++ return 0; ++# endif ++ + *name = info->dlpi_name; + return 1; + } diff --git a/lang/gcc15-devel/files/patch-libsanitizer_asan_asan__thread.cpp b/lang/gcc15-devel/files/patch-libsanitizer_asan_asan__thread.cpp new file mode 100644 index 000000000000..61c0ccf1cd89 --- /dev/null +++ b/lang/gcc15-devel/files/patch-libsanitizer_asan_asan__thread.cpp @@ -0,0 +1,13 @@ +--- libsanitizer/asan/asan_thread.cpp.orig 2024-01-12 13:45:52 UTC ++++ libsanitizer/asan/asan_thread.cpp +@@ -323,7 +323,9 @@ void AsanThread::ClearShadowForThreadStackAndTLS() { + if (tls_begin_ != tls_end_) { + uptr tls_begin_aligned = RoundDownTo(tls_begin_, ASAN_SHADOW_GRANULARITY); + uptr tls_end_aligned = RoundUpTo(tls_end_, ASAN_SHADOW_GRANULARITY); +- FastPoisonShadow(tls_begin_aligned, tls_end_aligned - tls_begin_aligned, 0); ++ FastPoisonShadowPartialRightRedzone(tls_begin_aligned, ++ tls_end_ - tls_begin_aligned, ++ tls_end_aligned - tls_end_, 0); + } + } + diff --git a/lang/gcc15-devel/files/pkg-message.in b/lang/gcc15-devel/files/pkg-message.in new file mode 100644 index 000000000000..df3ea725ce59 --- /dev/null +++ b/lang/gcc15-devel/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 +} +] |