lang/gcc11: New port cloned from gcc11-devel

Welcome GCC 11.1, the first release of the GCC 11 series!

https://gcc.gnu.org/gcc-11/changes.html has a comprehensive overview
of many improvements and changes and
https://gcc.gnu.org/gcc-11/porting_to.html highlights issues you may
encounter porting to this version. This release series should not
prove too disruptive, mainly C++ defaulting to GNU++17 and some more
libstdc++ headers will need to be included explicitly.

To give a brief overview of some of the more noticable changes:

Some short options of the gcov tool have been renamed: -i to -j and
-j to -H.

Debugging information defaults to DWARF 5.

Vectorizer improvements, a new IPA-modref pass to track side effects
of function calls and improve precision of points-to-analysis, better
interprocedural constant propagation (IP-CP), smaller link-time
optimization (LTO) object files.

OpenMP 4.5 is now fully supported and OpenMP 5.0 support has been
extended.

A set of new warnings including -Wmismatched-dealloc, -Wsizeof-array-div,
-Wstringop-overread, and enhancements to existing warnings.

Several new features from the upcoming C2X revision of the ISO C
standard are supported with -std=c2x and -std=gnu2x.

Several C++20 features have been implemented and even some of the
upcoming C++23 draft features with the -std=c++23 and the like.

libstdc++ features improved C++17 support.

And, last but not least, loads of improvements for all of FreeBSD's
architectures.
This commit is contained in:
Gerald Pfeifer 2021-06-18 17:08:44 +00:00
parent d571716015
commit 8f52533f63
9 changed files with 443 additions and 0 deletions

View File

@ -92,6 +92,7 @@
SUBDIR += gcc-ecj45
SUBDIR += gcc10
SUBDIR += gcc10-devel
SUBDIR += gcc11
SUBDIR += gcc11-devel
SUBDIR += gcc12-devel
SUBDIR += gcc48

159
lang/gcc11/Makefile Normal file
View File

@ -0,0 +1,159 @@
# Created by: Gerald Pfeifer <gerald@FreeBSD.org>
PORTNAME= gcc
PORTVERSION= 11.1.0
CATEGORIES= lang
MASTER_SITES= GCC
PKGNAMESUFFIX= ${SUFFIX}
MAINTAINER= gerald@FreeBSD.org
COMMENT= GNU Compiler Collection 11
LICENSE= GPLv3 GPLv3RLE
LICENSE_COMB= multi
ONLY_FOR_ARCHS= aarch64 amd64 arm 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
CONFLICTS= gcc11-devel-11.*
CPE_VENDOR= gnu
GCC_VERSION= ${PORTVERSION}
SUFFIX= ${PORTVERSION:C/([0-9]+).*/\1/}
CFLAGS:= ${CFLAGS:N-mretpoline}
CXXFLAGS:= ${CXXFLAGS:N-mretpoline}
OPTIONS_DEFINE= BOOTSTRAP GRAPHITE
OPTIONS_DEFAULT= BOOTSTRAP
BOOTSTRAP_DESC= Build using a full bootstrap
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
MULTILIB_DESC= Build support for 32-bit and 64-bit targets
MULTILIB_CONFIGURE_ENABLE= multilib
.else
CONFIGURE_ARGS+= --disable-multilib
.endif
.include <bsd.port.pre.mk>
.if ${ARCH} == amd64
CONFIGURE_TARGET= x86_64-portbld-${OPSYS:tl}${OSREL}
.elif ${ARCH} == powerpc64
CONFIGURE_ENV+= UNAME_m="powerpc64"
. if defined(PPC_ABI) && ${PPC_ABI} == ELFv2
CONFIGURE_ARGS+= --with-abi=elfv2
. endif
USE_GCC= yes
.elif ${ARCH} == powerpc64le
USE_GCC= yes
.endif
LANGUAGES:= c,c++,objc,fortran,jit
TARGLIB= ${PREFIX}/lib/gcc${SUFFIX}
TARGLIB32= ${PREFIX}/lib32 # The version information is added later
LIBEXEC= ${PREFIX}/libexec/gcc${SUFFIX}
GNU_CONFIGURE= yes
CONFIGURE_OUTSOURCE= yes
.if empty(PORT_OPTIONS:MBOOTSTRAP)
CONFIGURE_ARGS+=--disable-bootstrap
.else
CONFIGURE_ARGS+=--with-build-config=bootstrap-debug
ALL_TARGET= bootstrap-lean
.endif
INSTALL_TARGET= install-strip
.if ${UID} != 0
BINMODE= 755
.endif
CONFIGURE_ARGS+=--disable-nls \
--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-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
# Release tarballs (as opposed to snapshots) always carry this.
INFO+= gcc${SUFFIX}/libquadmath \
gcc${SUFFIX}/libitm
SUB_FILES= pkg-message
SUB_LIST+= TARGLIB=${TARGLIB}
.if ${PORT_OPTIONS:MGRAPHITE}
LIB_DEPENDS+= libisl.so:devel/isl
CONFIGURE_ARGS+=--with-isl=${LOCALBASE}
.endif
CONFIGURE_ARGS+=--enable-languages=${LANGUAGES}
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}/man/man7/*
${RM} -r ${STAGEDIR}${TARGLIB}/gcc/*/${GCC_VERSION}/include-fixed/
# 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>

3
lang/gcc11/distinfo Normal file
View File

@ -0,0 +1,3 @@
TIMESTAMP = 1623859481
SHA256 (gcc-11.1.0.tar.xz) = 4c4a6fb8a8396059241c2e674b85b351c26a5d678274007f076957afa1cc9ddf
SIZE (gcc-11.1.0.tar.xz) = 78877216

View File

@ -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,

View File

@ -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@

View File

@ -0,0 +1,70 @@
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.c.orig 2015-06-26 17:47:23 UTC
+++ gcc/fortran/gfortranspec.c
@@ -404,7 +404,7 @@ For more information about these matters
}
}
-#ifdef ENABLE_SHARED_LIBGCC
+#if 0
if (library)
{
unsigned int i;
--- libgfortran/Makefile.in.orig 2019-02-22 14:22:13.000000000 +0000
+++ libgfortran/Makefile.in 2019-02-27 16:27:08.856408000 +0000
@@ -625,7 +625,7 @@
$(LTLDFLAGS) $(LIBQUADLIB) ../libbacktrace/libbacktrace.la \
$(HWCAP_LDFLAGS) \
-lm $(extra_ldflags_libgfortran) \
- $(version_arg) -Wc,-shared-libgcc
+ $(version_arg)
libgfortran_la_DEPENDENCIES = $(version_dep) libgfortran.spec $(LIBQUADLIB_DEP)
cafexeclib_LTLIBRARIES = libcaf_single.la

View File

@ -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
}
]

7
lang/gcc11/pkg-descr Normal file
View File

@ -0,0 +1,7 @@
GCC, the GNU Compiler Collection, supports a number of languages.
This port installs the C, C++, and Fortran front ends as gcc11, g++11,
and gfortran11, respectively.
WWW: https://gcc.gnu.org
Gerald Pfeifer <gerald@FreeBSD.org>

37
lang/gcc11/pkg-plist Normal file
View File

@ -0,0 +1,37 @@
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/libgccjit++.h
include/libgccjit.h
man/man1/cpp%%SUFFIX%%.1.gz
man/man1/g++%%SUFFIX%%.1.gz
man/man1/gcc%%SUFFIX%%.1.gz
man/man1/gcov%%SUFFIX%%.1.gz
man/man1/gcov-dump%%SUFFIX%%.1.gz
man/man1/gcov-tool%%SUFFIX%%.1.gz
man/man1/gfortran%%SUFFIX%%.1.gz
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