lang/gcc16-devel: Add port
GCC, the GNU Compiler Collection, supports a number of languages. This port installs the C, C++, and Fortran front ends as gcc16, g++16, and gfortran16, respectively. This is the first snapshot from trunk with the GCC 16 designation. It largely is a copy of lang/gcc15-devel. Note: files/patch-libgcc_unwind.inc will get obsolete once all supported FreeBSD releases include commit 22e564c74eb20e14bd93fd9fdde20e38a29cfcf1. [1] PR: 285711 [1]
This commit is contained in:
@@ -99,6 +99,7 @@
|
||||
SUBDIR += gcc14-devel
|
||||
SUBDIR += gcc15
|
||||
SUBDIR += gcc15-devel
|
||||
SUBDIR += gcc16-devel
|
||||
SUBDIR += gcc6-aux
|
||||
SUBDIR += gforth
|
||||
SUBDIR += ghc
|
||||
|
||||
@@ -0,0 +1,194 @@
|
||||
PORTNAME= gcc
|
||||
PORTVERSION= 16.0.1.s20250427
|
||||
CATEGORIES= lang
|
||||
MASTER_SITES= GCC/snapshots/${DIST_VERSION}
|
||||
PKGNAMESUFFIX= ${SUFFIX}-devel
|
||||
DISTNAME= gcc-${DIST_VERSION}
|
||||
|
||||
MAINTAINER= salvadore@FreeBSD.org
|
||||
COMMENT= GNU Compiler Collection 16
|
||||
WWW= https://gcc.gnu.org
|
||||
|
||||
LICENSE= GPLv3 GPLv3RLE
|
||||
LICENSE_COMB= multi
|
||||
|
||||
ONLY_FOR_ARCHS= aarch64 amd64 armv6 armv7 i386 powerpc powerpc64 powerpc64le
|
||||
|
||||
LIB_DEPENDS= libgmp.so:math/gmp \
|
||||
libmpfr.so:math/mpfr \
|
||||
libmpc.so:math/mpc
|
||||
BUILD_DEPENDS+= ${LOCALBASE}/bin/as:devel/binutils
|
||||
RUN_DEPENDS+= ${LOCALBASE}/bin/as:devel/binutils
|
||||
.if defined(MAINTAINER_MODE)
|
||||
BUILD_DEPENDS+= runtest:misc/dejagnu
|
||||
.endif
|
||||
|
||||
USES= compiler:c++11-lang cpe gmake iconv libtool makeinfo perl5 tar:xz
|
||||
USE_BINUTILS= yes
|
||||
USE_PERL5= build
|
||||
|
||||
CPE_VENDOR= gnu
|
||||
CPE_VERSION= ${GCC_VERSION}
|
||||
|
||||
# DIST_VERSION relates to downloads, GCC_VERSION and SUFFIX to names
|
||||
# of executables and directories once installed. A PORTVERSION of
|
||||
# Y.2.1.s20140817 results in values of Y-20140817, Y.2.1, and Y
|
||||
# for these three.
|
||||
DIST_VERSION= ${PORTVERSION:C/([0-9]+).*\.s([0-9]+)/\1-\2/}
|
||||
GCC_VERSION= ${PORTVERSION:C/(.+)\.s[0-9]{8}/\1/}
|
||||
SUFFIX= ${PORTVERSION:C/([0-9]+).*/\1/}
|
||||
CFLAGS:= ${CFLAGS:N-mretpoline} -D__USE_ISOC11
|
||||
CXXFLAGS:= ${CXXFLAGS:N-mretpoline}
|
||||
|
||||
OPTIONS_DEFINE= GRAPHITE
|
||||
OPTIONS_DEFAULT_aarch64=STANDARD_BOOTSTRAP
|
||||
OPTIONS_DEFAULT_armv6= STANDARD_BOOTSTRAP
|
||||
OPTIONS_DEFAULT_armv7= STANDARD_BOOTSTRAP
|
||||
OPTIONS_DEFAULT_amd64= STANDARD_BOOTSTRAP
|
||||
OPTIONS_DEFAULT_i386= STANDARD_BOOTSTRAP
|
||||
OPTIONS_DEFAULT_powerpc=LTO_BOOTSTRAP
|
||||
OPTIONS_DEFAULT_powerpc64=LTO_BOOTSTRAP
|
||||
OPTIONS_DEFAULT_powerpc64le=LTO_BOOTSTRAP
|
||||
OPTIONS_SINGLE= BOOTSTRAP
|
||||
OPTIONS_SINGLE_BOOTSTRAP= LTO_BOOTSTRAP STANDARD_BOOTSTRAP
|
||||
LTO_BOOTSTRAP_DESC= Build using a full LTO bootstrap
|
||||
STANDARD_BOOTSTRAP_DESC= Build using a full bootstrap without LTO
|
||||
GRAPHITE_DESC= Support for Graphite loop optimizations
|
||||
|
||||
.if exists(/usr/lib32/libc.so)
|
||||
OPTIONS_DEFINE_amd64+= MULTILIB
|
||||
OPTIONS_DEFAULT_amd64+= MULTILIB
|
||||
OPTIONS_DEFINE_powerpc64+= MULTILIB
|
||||
#OPTIONS_DEFAULT_powerpc64+= MULTILIB # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105010
|
||||
MULTILIB_DESC= Build support for 32-bit and 64-bit targets
|
||||
MULTILIB_CONFIGURE_ENABLE= multilib
|
||||
.else
|
||||
CONFIGURE_ARGS+= --disable-multilib
|
||||
.endif
|
||||
|
||||
.if defined(CPUTYPE) && ${CPUTYPE:Mg[3-5]}
|
||||
CFLAGS:= ${CFLAGS:S/mcpu=g/mcpu=G/}
|
||||
CXXFLAGS:= ${CFLAGS:S/mcpu=g/mcpu=G/}
|
||||
.endif
|
||||
|
||||
GRAPHITE_LIB_DEPENDS= libisl.so:devel/isl
|
||||
GRAPHITE_CONFIGURE_WITH+= isl
|
||||
|
||||
.include <bsd.port.pre.mk>
|
||||
|
||||
.if ${ARCH} == amd64
|
||||
CONFIGURE_TARGET= x86_64-portbld-${OPSYS:tl}${OSREL}
|
||||
|
||||
.elif ${ARCH} == powerpc64
|
||||
CONFIGURE_ARGS+= --with-abi=elfv2
|
||||
USE_GCC= yes
|
||||
|
||||
.elif ${ARCH} == powerpc64le
|
||||
USE_GCC= yes
|
||||
.endif
|
||||
|
||||
.if ${ARCH} == i386
|
||||
LANGUAGES:= c,c++,objc,fortran
|
||||
.else
|
||||
LANGUAGES:= c,c++,objc,fortran,jit
|
||||
.endif
|
||||
TARGLIB= ${PREFIX}/lib/gcc${SUFFIX}
|
||||
TARGLIB32= ${PREFIX}/lib32 # The version information is added later
|
||||
LIBEXEC= ${PREFIX}/libexec/gcc${SUFFIX}
|
||||
GNU_CONFIGURE= yes
|
||||
GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
|
||||
CONFIGURE_OUTSOURCE= yes
|
||||
.if ${PORT_OPTIONS:MLTO_BOOTSTRAP}
|
||||
CONFIGURE_ARGS+=--with-build-config=bootstrap-lto-noplugin
|
||||
ALL_TARGET= bootstrap-lean
|
||||
PIE_UNSAFE= yes
|
||||
.else
|
||||
CONFIGURE_ARGS+=--with-build-config=bootstrap-debug
|
||||
ALL_TARGET= bootstrap-lean
|
||||
PIE_UNSAFE= yes
|
||||
.endif
|
||||
INSTALL_TARGET= install-strip
|
||||
.if ${UID} != 0
|
||||
BINMODE= 755
|
||||
.endif
|
||||
CONFIGURE_ARGS+=--disable-nls \
|
||||
--disable-libssp \
|
||||
--enable-gnu-indirect-function \
|
||||
--enable-host-shared \
|
||||
--enable-plugin \
|
||||
--libdir=${TARGLIB} \
|
||||
--libexecdir=${LIBEXEC} \
|
||||
--program-suffix=${SUFFIX} \
|
||||
--with-as=${LOCALBASE}/bin/as \
|
||||
--with-gmp=${LOCALBASE} \
|
||||
--with-gxx-include-dir=${TARGLIB}/include/c++/ \
|
||||
--with-gxx-libcxx-include-dir=/usr/include/c++/v1 \
|
||||
--with-ld=${LOCALBASE}/bin/ld \
|
||||
${ICONV_CONFIGURE_ARG} \
|
||||
--with-pkgversion="FreeBSD Ports Collection" \
|
||||
--with-system-zlib \
|
||||
--without-zstd
|
||||
MAKE_ARGS+= MAKEINFOFLAGS="--no-split"
|
||||
USE_LDCONFIG= ${TARGLIB}
|
||||
PLIST_SUB+= GCC_VERSION=${GCC_VERSION} \
|
||||
GNU_HOST=${CONFIGURE_TARGET} \
|
||||
SUFFIX=${SUFFIX}
|
||||
INFO= gcc${SUFFIX}/cpp \
|
||||
gcc${SUFFIX}/cppinternals \
|
||||
gcc${SUFFIX}/gcc \
|
||||
gcc${SUFFIX}/gccinstall \
|
||||
gcc${SUFFIX}/gccint \
|
||||
gcc${SUFFIX}/gfortran \
|
||||
gcc${SUFFIX}/libgccjit \
|
||||
gcc${SUFFIX}/libgomp
|
||||
.if ${ARCH} == amd64 || ${ARCH} == i386
|
||||
INFO+= gcc${SUFFIX}/libquadmath
|
||||
.endif
|
||||
.if ${ARCH} == amd64 || ${ARCH} == i386 || ${ARCH} == aarch64 || ${ARCH:Marmv?}
|
||||
INFO+= gcc${SUFFIX}/libitm
|
||||
.endif
|
||||
SUB_FILES= pkg-message
|
||||
SUB_LIST+= TARGLIB=${TARGLIB}
|
||||
|
||||
CONFIGURE_ARGS+=--enable-languages=${LANGUAGES}
|
||||
|
||||
.if (${ARCH} == amd64 || ${ARCH} == powerpc64) && ${PORT_OPTIONS:MMULTILIB}
|
||||
USE_LDCONFIG32= ${TARGLIB32}/gcc${SUFFIX}
|
||||
.endif
|
||||
|
||||
pre-everything::
|
||||
@${ECHO_MSG} "Making GCC ${PORTVERSION} for ${CONFIGURE_TARGET} [${LANGUAGES}]"
|
||||
|
||||
pre-configure:
|
||||
cd ${WRKSRC} ; contrib/gcc_update --touch
|
||||
@${RM} ${WRKSRC}/gcc/*/*.info*
|
||||
|
||||
.if defined(MAINTAINER_MODE)
|
||||
full-regression-test: build
|
||||
cd ${TEST_WRKSRC}; ${MAKE_CMD} -sk check \
|
||||
; ${WRKSRC}/contrib/test_summary
|
||||
.endif
|
||||
|
||||
post-stage:
|
||||
${RM} ${STAGEDIR}${PREFIX}/share/man/man7/*
|
||||
${RM} -r ${STAGEDIR}${TARGLIB}/gcc/*/${GCC_VERSION}/include-fixed/
|
||||
# Install ISO_Fortran_binding.h in an easily findable directory
|
||||
${MKDIR} ${STAGEDIR}${PREFIX}/include/gcc${SUFFIX}
|
||||
${INSTALL_DATA} ${STAGEDIR}${PREFIX}/lib/gcc${SUFFIX}/gcc/${CONFIGURE_TARGET}/${GCC_VERSION}/include/ISO_Fortran_binding.h \
|
||||
${STAGEDIR}${PREFIX}/include/gcc${SUFFIX}
|
||||
# Add target libraries and include files to packaging list.
|
||||
${RM} ${WRKDIR}/PLIST.lib
|
||||
|
||||
.if (${ARCH} == amd64 || ${ARCH} == powerpc64) && ${PORT_OPTIONS:MMULTILIB}
|
||||
${MKDIR} ${STAGEDIR}${TARGLIB32}
|
||||
${MV} ${STAGEDIR}${PREFIX}/lib/lib32 ${STAGEDIR}${TARGLIB32}/gcc${SUFFIX}
|
||||
.endif
|
||||
|
||||
.for d in ${TARGLIB:S/^${PREFIX}\///} ${TARGLIB32:S/^${PREFIX}\///} ${LIBEXEC:S/^${PREFIX}\///}
|
||||
cd ${STAGEDIR}${PREFIX} ; if [ -d $d ]; then \
|
||||
${FIND} $d -type f -o -type l >>${WRKDIR}/PLIST.lib ;\
|
||||
fi
|
||||
.endfor
|
||||
cd ${WRKDIR} ; ${SED} -i -e "/PLIST.lib/ r PLIST.lib" ${TMPPLIST}
|
||||
|
||||
.include <bsd.port.post.mk>
|
||||
@@ -0,0 +1,3 @@
|
||||
TIMESTAMP = 1745932552
|
||||
SHA256 (gcc-16-20250427.tar.xz) = 545b46c123dcc303c2bcd319ceda174733c30cd4574f8ed732f582c3aba7af5e
|
||||
SIZE (gcc-16-20250427.tar.xz) = 92158556
|
||||
@@ -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,
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -0,0 +1,15 @@
|
||||
--- libgcc/enable-execute-stack-mprotect.c.orig 2024-11-23 12:39:04 UTC
|
||||
+++ libgcc/enable-execute-stack-mprotect.c
|
||||
@@ -30,10 +30,11 @@ static int need_enable_exec_stack;
|
||||
|
||||
static int need_enable_exec_stack;
|
||||
|
||||
-static void check_enabling (void) __attribute__ ((unused));
|
||||
extern void __enable_execute_stack (void *);
|
||||
|
||||
#if defined __sun__ && defined __svr4__
|
||||
+static void check_enabling (void) __attribute__ ((unused));
|
||||
+
|
||||
static void __attribute__ ((constructor))
|
||||
check_enabling (void)
|
||||
{
|
||||
@@ -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)
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,3 @@
|
||||
GCC, the GNU Compiler Collection, supports a number of languages.
|
||||
This port installs the C, C++, and Fortran front ends as gcc16, g++16,
|
||||
and gfortran16, respectively.
|
||||
@@ -0,0 +1,3 @@
|
||||
Building this port with LTO_BOOTSTRAP enabled requires significant amounts of
|
||||
memory and time. Consider disabling LTO_BOOTSTRAP in favor of STANDARD_BOOTSTRAP
|
||||
(or disabling BOOTSTRAP altogether) in case that is a problem.
|
||||
@@ -0,0 +1,36 @@
|
||||
bin/%%GNU_HOST%%-c++%%SUFFIX%%
|
||||
bin/%%GNU_HOST%%-g++%%SUFFIX%%
|
||||
bin/%%GNU_HOST%%-gcc%%SUFFIX%%
|
||||
bin/%%GNU_HOST%%-gcc-%%GCC_VERSION%%
|
||||
bin/%%GNU_HOST%%-gcc-ar%%SUFFIX%%
|
||||
bin/%%GNU_HOST%%-gcc-nm%%SUFFIX%%
|
||||
bin/%%GNU_HOST%%-gcc-ranlib%%SUFFIX%%
|
||||
bin/%%GNU_HOST%%-gfortran%%SUFFIX%%
|
||||
bin/c++%%SUFFIX%%
|
||||
bin/cpp%%SUFFIX%%
|
||||
bin/g++%%SUFFIX%%
|
||||
bin/gcc%%SUFFIX%%
|
||||
bin/gcc-ar%%SUFFIX%%
|
||||
bin/gcc-nm%%SUFFIX%%
|
||||
bin/gcc-ranlib%%SUFFIX%%
|
||||
bin/gcov%%SUFFIX%%
|
||||
bin/gcov-dump%%SUFFIX%%
|
||||
bin/gcov-tool%%SUFFIX%%
|
||||
bin/gfortran%%SUFFIX%%
|
||||
bin/lto-dump%%SUFFIX%%
|
||||
include/gcc%%SUFFIX%%/ISO_Fortran_binding.h
|
||||
share/man/man1/cpp%%SUFFIX%%.1.gz
|
||||
share/man/man1/g++%%SUFFIX%%.1.gz
|
||||
share/man/man1/gcc%%SUFFIX%%.1.gz
|
||||
share/man/man1/gcov%%SUFFIX%%.1.gz
|
||||
share/man/man1/gcov-dump%%SUFFIX%%.1.gz
|
||||
share/man/man1/gcov-tool%%SUFFIX%%.1.gz
|
||||
share/man/man1/gfortran%%SUFFIX%%.1.gz
|
||||
share/man/man1/lto-dump%%SUFFIX%%.1.gz
|
||||
share/gcc-%%GCC_VERSION%%/python/libstdcxx/__init__.py
|
||||
share/gcc-%%GCC_VERSION%%/python/libstdcxx/v6/__init__.py
|
||||
share/gcc-%%GCC_VERSION%%/python/libstdcxx/v6/printers.py
|
||||
share/gcc-%%GCC_VERSION%%/python/libstdcxx/v6/xmethods.py
|
||||
@postexec if type ccache-update-links >/dev/null 2>&1; then ccache-update-links -v; fi
|
||||
@postunexec if type ccache-update-links >/dev/null 2>&1; then ccache-update-links -v; fi
|
||||
@comment Insert PLIST.lib here
|
||||
Reference in New Issue
Block a user