On Wed, 14 Sep 2022 22:29:15 +0200, Jeremie Courreges-Anglas wrote: > On Tue, Sep 13 2022, Jeremie Courreges-Anglas <j...@wxcvbn.org> wrote: > > On Sun, Sep 11 2022, Jeremie Courreges-Anglas <j...@wxcvbn.org> wrote: > >> On Fri, Sep 09 2022, Pascal Stumpf <pas...@stumpf.co> wrote: > >>> OK as soon as the lld patch is in. Great work! > >> > >> This involved a fair amount of headdesks, thanks for your kind words. :) > >> > >> It might be doable to work around the lld problem within the gcc ports. > >> Thay may be sufficient given that not many C++ ports will be built with > >> ports-gcc on riscv64. I'm gonna work on this next. > > > > The diff below (for lang/gcc/8 only this time) includes the workaround > > for the ld.lld error. > > > >> Meanwhile, I fixed the lang/gcc/11 build with what I learnt from > >> lang/gcc/8, diff below. > >> > >>> On Fri, 09 Sep 2022 00:34:21 +0200, Jeremie Courreges-Anglas wrote: > >>>> > >>>> With the diff below I can build ports-gcc on riscv64. PIE is disabled > >>>> by default because I hit crashes at build time. Since not many ports > >>>> require ports-gcc for for C or C++ code I believe that's okay for now. > >>>> Trying to forcefully disable PIE led to some dubious patches, I'm not > >>>> sure yet why they are actually needed (see the comments). The rest of > >>>> the patches are as riscv64-specific as possible. > >>>> > >>>> One patch which isn't included here is for ld.lld in base, which I have > >>>> yet to submit. > >>>> > >>>> With this I can build blas, lapack, numpy with fortran support... more > >>>> to come. > >>>> > >>>> Thoughts? oks? > >>>> > >>>> PS: I have yet to backport my recent fixes to lang/gcc/11, crossing > >>>> fingers... > >>>> > >>>> PPS: the ONLY_FOR_ARCHS and GCC49_ARCHS changes aren't included for now > >>>> but they're trivial > >> > >> (This time with riscv64 added to ONLY_FOR_ARCHS.) > > > > Updated diff for lang/gcc/8. I only have dim memories and don't have > > notes about the errors I hit when hacking on this during k2k21 and > > h2k21. But it seems that only ssp is currently a problem, and I can > > enable PIE by default. Since ld.lld in base actually defaults to PIE, > > this lets me drop most initial patches and hacks, and build eg math/hdf5 > > without hitting errors. > > > > lang/gcc/11 is still building with a similarly simplified diff. > > I intend to commit the lang/gcc/8 part this evening, review/ok still > > welcome. > > I have committed the tweaked version of lang/gcc/8 along with a missing > PFRAG (sorry about that). A bulk is running and gfortran has already > been used to build a few ports. > > Here's an updated diff for lang/gcc/11. > > ok?
If this builds fine, OK. > Index: Makefile > =================================================================== > RCS file: /cvs/ports/lang/gcc/11/Makefile,v > retrieving revision 1.14 > diff -u -p -r1.14 Makefile > --- Makefile 24 Jul 2022 09:52:45 -0000 1.14 > +++ Makefile 13 Sep 2022 12:05:16 -0000 > @@ -6,7 +6,7 @@ BROKEN-sparc64 = ICE during selftests > > # tested: aarch64 amd64 arm hppa i386 powerpc > ONLY_FOR_ARCHS = aarch64 alpha amd64 arm hppa i386 mips64 mips64el \ > - powerpc powerpc64 sparc64 > + powerpc powerpc64 riscv64 sparc64 > > ONLY_FOR_ARCHS-ada = amd64 i386 mips64 powerpc > ONLY_FOR_ARCHS-dlang = aarch64 amd64 arm i386 powerpc powerpc64 > @@ -68,7 +68,8 @@ EXTRACT_ONLY = ${DISTNAME}.tar.xz > BUILD_DEPENDS += devel/bison > > .if ${MACHINE_ARCH} == "aarch64" || ${MACHINE_ARCH} == "arm" || \ > - ${MACHINE_ARCH} == "powerpc" || ${MACHINE_ARCH} == "powerpc64" > + ${MACHINE_ARCH} == "powerpc" || ${MACHINE_ARCH} == "powerpc64" || \ > + ${MACHINE_ARCH} == "riscv64" > # would be helpful on i386/amd64 too, but some ports also need the old > # ld.bfd in base which can't cope with new gas. > BUILD_DEPENDS += devel/gas > @@ -153,10 +154,15 @@ CONFIGURE_ARGS += \ > --with-gmp="${LOCALBASE}" \ > --enable-languages=${LANGS} \ > --disable-libstdcxx-pch \ > - --enable-default-ssp \ > --enable-default-pie \ > --without-isl > > +# Enable the stack protector by default where supported > +.if ${MACHINE_ARCH} != "riscv64" > +CONFIGURE_ARGS += \ > + --enable-default-ssp > +.endif > + > # This is needed, as internal cpp is no longer compatible with the > # visible beast > CONFIGURE_ARGS += --enable-cpp > @@ -231,6 +237,13 @@ LIB_DEPENDS-libs = > > .if ${MACHINE_ARCH:Mamd64} > CONFIG = x86_64-unknown-openbsd${OSREV} > +.endif > + > +.if ${MACHINE_ARCH} == "riscv64" > +# lld complains about .gcc_except_table referencing > +# symbols in discarded sections. Tell gcc to split .gcc_except_table > +# so that its unused parts can also be discarded. > +EXTRA_ENV += PORTS_FORCE_SPLIT_SECTIONS="-ffunction-sections -fdata-sections" > .endif > > post-extract: > Index: patches/patch-gcc_config_gcc > =================================================================== > RCS file: /cvs/ports/lang/gcc/11/patches/patch-gcc_config_gcc,v > retrieving revision 1.3 > diff -u -p -r1.3 patch-gcc_config_gcc > --- patches/patch-gcc_config_gcc 11 Mar 2022 19:28:58 -0000 1.3 > +++ patches/patch-gcc_config_gcc 12 Sep 2022 07:30:26 -0000 > @@ -109,7 +109,27 @@ Index: gcc/config.gcc > i[34567]86-*-linux* | i[34567]86-*-kfreebsd*-gnu | i[34567]86-*-gnu* | > i[34567]86-*-kopensolaris*-gnu) > # Intel 80386's running GNU/* > # with ELF format using glibc 2 > -@@ -2891,6 +2929,18 @@ pdp11-*-*) > +@@ -2532,6 +2570,19 @@ mips*-*-netbsd*) # NetBSD/mips, > either endian. > + tm_file="elfos.h ${tm_file} mips/elf.h ${nbsd_tm_file} mips/netbsd.h" > + extra_options="${extra_options} netbsd.opt netbsd-elf.opt" > + ;; > ++riscv64-*-openbsd*) > ++ tm_file="${tm_file} dbxelf.h elfos.h" > ++ tm_file="${tm_file} openbsd-stdint.h" > ++ tm_file="${tm_file} openbsd.h riscv/openbsd.h openbsd-libpthread.h" > ++ tmake_file="${tmake_file} riscv/t-riscv" > ++ extra_options="${extra_options} openbsd.opt" > ++ # Force .init_array support. The configure script cannot always > ++ # automatically detect that GAS supports it, yet we require it. > ++ gcc_cv_initfini_array=yes > ++ # Also force this, shouldn't hurt... > ++ gnu_ld=yes > ++ gas=yes > ++ ;; > + mips*-img-linux*) > + tm_file="dbxelf.h elfos.h gnu-user.h linux.h linux-android.h > glibc-stdint.h ${tm_file} mips/gnu-user.h mips/linux.h mips/linux-common.h > mips/mti-linux.h" > + extra_options="${extra_options} linux-android.opt" > +@@ -2891,6 +2942,18 @@ pdp11-*-*) > # tmake_file="${tmake_file} rs6000/t-fprules" > # extra_headers= > # ;; > @@ -128,7 +148,7 @@ Index: gcc/config.gcc > powerpc-*-darwin*) > extra_options="${extra_options} ${cpu_type}/darwin.opt" > case ${target} in > -@@ -3452,10 +3502,10 @@ sparc64-*-netbsd*) > +@@ -3452,10 +3515,10 @@ sparc64-*-netbsd*) > tmake_file="${tmake_file} sparc/t-sparc sparc/t-netbsd64" > ;; > sparc64-*-openbsd*) > @@ -140,7 +160,7 @@ Index: gcc/config.gcc > gas=yes gnu_ld=yes > with_cpu=ultrasparc > tmake_file="${tmake_file} sparc/t-sparc" > -@@ -3682,6 +3732,12 @@ case ${target} in > +@@ -3682,6 +3745,12 @@ case ${target} in > else > arch=i386 > fi > Index: patches/patch-gcc_config_riscv_openbsd_h > =================================================================== > RCS file: patches/patch-gcc_config_riscv_openbsd_h > diff -N patches/patch-gcc_config_riscv_openbsd_h > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ patches/patch-gcc_config_riscv_openbsd_h 13 Sep 2022 12:07:42 -0000 > @@ -0,0 +1,125 @@ > +Index: gcc/config/riscv/openbsd.h > +--- gcc/config/riscv/openbsd.h.orig > ++++ gcc/config/riscv/openbsd.h > +@@ -0,0 +1,121 @@ > ++/* Definitions of target machine for GNU compiler, OpenBSD/riscv64 ELF > version. > ++ Copyright (C) 2002 Free Software Foundation, Inc. > ++ > ++This file is part of GNU CC. > ++ > ++GNU CC is free software; you can redistribute it and/or modify > ++it under the terms of the GNU General Public License as published by > ++the Free Software Foundation; either version 2, or (at your option) > ++any later version. > ++ > ++GNU CC is distributed in the hope that it will be useful, > ++but WITHOUT ANY WARRANTY; without even the implied warranty of > ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > ++GNU General Public License for more details. > ++ > ++You should have received a copy of the GNU General Public License > ++along with GNU CC; see the file COPYING. If not, write to > ++the Free Software Foundation, 59 Temple Place - Suite 330, > ++Boston, MA 02111-1307, USA. */ > ++ > ++/* This defaults us to little-endian. */ > ++#ifndef TARGET_ENDIAN_DEFAULT > ++#define TARGET_ENDIAN_DEFAULT 0 > ++#endif > ++ > ++#undef MULTILIB_DEFAULTS > ++/* The default STARTFILE_PREFIX_SPEC for riscv adds some multilib-aware > ++ paths that we don't provide, instead of /usr/local/lib which is > ++ needed to get at various files shipped by this port (libatomic.so, > ++ libgfortran.spec, etc). > ++*/ > ++#undef STARTFILE_PREFIX_SPEC > ++ > ++/* > ++ * Without linker relaxation in lld(1) we have to use the most generic > ++ * code model. XXX check lld 15.0 support for relaxation. > ++ */ > ++#undef TARGET_DEFAULT_CMODEL > ++#define TARGET_DEFAULT_CMODEL CM_MEDANY > ++ > ++#define TARGET_OS_CPP_BUILTINS() \ > ++ do \ > ++ { \ > ++ builtin_define ("__GXX_MERGED_TYPEINFO_NAMES=0"); \ > ++ OPENBSD_OS_CPP_BUILTINS_ELF(); \ > ++ } \ > ++ while (0) > ++ > ++#undef SUBTARGET_CPP_SPEC > ++#define SUBTARGET_CPP_SPEC OBSD_CPP_SPEC > ++ > ++#define LINK_SPEC \ > ++ "%{!shared:%{!nostdlib:%{!r:%{!e*:-e __start}}}} \ > ++ %{shared:-shared} %{R*} \ > ++ %{static:-Bstatic} \ > ++ %{!static:-Bdynamic} \ > ++ %{rdynamic:-export-dynamic} \ > ++ %{assert*} \ > ++ %{!static:-dynamic-linker /usr/libexec/ld.so} \ > ++ %{!nostdlib:-L/usr/lib}" > ++ > ++#define OPENBSD_ENTRY_POINT "__start" > ++ > ++/* Make GCC agree with <machine/_types.h>. */ > ++ > ++#undef SIZE_TYPE > ++#define SIZE_TYPE "long unsigned int" > ++ > ++#undef PTRDIFF_TYPE > ++#define PTRDIFF_TYPE "long int" > ++ > ++#undef INTMAX_TYPE > ++#define INTMAX_TYPE "long long int" > ++ > ++#undef UINTMAX_TYPE > ++#define UINTMAX_TYPE "long long unsigned int" > ++ > ++#undef WCHAR_TYPE > ++#define WCHAR_TYPE "int" > ++ > ++#undef WCHAR_TYPE_SIZE > ++#define WCHAR_TYPE_SIZE 32 > ++ > ++/* Provide a STARTFILE_SPEC appropriate for OpenBSD ELF. Here we > ++ provide support for the special GCC option -static. On ELF > ++ targets, we also add the crtbegin.o file, which provides part > ++ of the support for getting C++ file-scope static objects > ++ constructed before entering "main". */ > ++ > ++#define OPENBSD_STARTFILE_SPEC \ > ++ "%{!shared: \ > ++ %{pg:gcrt0%O%s} \ > ++ %{!pg: \ > ++ %{p:gcrt0%O%s} \ > ++ %{!p:%{!static:crt0%O%s} %{static:%{nopie:crt0%O%s} \ > ++ %{!nopie:rcrt0%O%s}}}}} \ > ++ %:if-exists(crti%O%s) \ > ++ %{static:%:if-exists-else(crtbeginT%O%s crtbegin%O%s)} \ > ++ %{!static: \ > ++ %{!shared:crtbegin%O%s} %{shared:crtbeginS%O%s}}" > ++ > ++#undef STARTFILE_SPEC > ++#define STARTFILE_SPEC OPENBSD_STARTFILE_SPEC > ++ > ++/* Provide an ENDFILE_SPEC appropriate for OpenBSD ELF. Here we > ++add crtend.o, which provides part of the support for getting > ++C++ file-scope static objects deconstructed after exiting "main". */ > ++ > ++#define OPENBSD_ENDFILE_SPEC \ > ++ "%{!shared:crtend%O%s} %{shared:crtendS%O%s} \ > ++ %:if-exists(crtn%O%s)" > ++ > ++#undef ENDFILE_SPEC > ++#define ENDFILE_SPEC OPENBSD_ENDFILE_SPEC > ++ > ++/* Remove -mcpu=native handling which is Linux specific */ > ++#undef DRIVER_SELF_SPECS > ++#define DRIVER_SELF_SPECS "" > ++ > ++/* dito */ > ++#undef EXTRA_SPEC_FUNCTIONS > Index: patches/patch-gcc_config_riscv_riscv_opt > =================================================================== > RCS file: patches/patch-gcc_config_riscv_riscv_opt > diff -N patches/patch-gcc_config_riscv_riscv_opt > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ patches/patch-gcc_config_riscv_riscv_opt 9 Sep 2022 01:02:45 -0000 > @@ -0,0 +1,15 @@ > +lld doesn't support -mrelax. > +XXX check lld 15 > + > +Index: gcc/config/riscv/riscv.opt > +--- gcc/config/riscv/riscv.opt.orig > ++++ gcc/config/riscv/riscv.opt > +@@ -128,7 +128,7 @@ Target Mask(EXPLICIT_RELOCS) > + Use %reloc() operators, rather than assembly macros, to load addresses. > + > + mrelax > +-Target Bool Var(riscv_mrelax) Init(1) > ++Target Bool Var(riscv_mrelax) Init(0) > + Take advantage of linker relaxations to reduce the number of instructions > + required to materialize symbol addresses. > + > Index: patches/patch-libcc1_Makefile_in > =================================================================== > RCS file: /cvs/ports/lang/gcc/11/patches/patch-libcc1_Makefile_in,v > retrieving revision 1.2 > diff -u -p -r1.2 patch-libcc1_Makefile_in > --- patches/patch-libcc1_Makefile_in 11 Mar 2022 19:28:58 -0000 1.2 > +++ patches/patch-libcc1_Makefile_in 12 Sep 2022 07:16:07 -0000 > @@ -1,6 +1,19 @@ > +First hunk: lld complains about .gcc_except_table referencing > +symbols in discarded sections. Tell gcc to split .gcc_except_table > +so that its unused parts can also be discarded. > + > Index: libcc1/Makefile.in > --- libcc1/Makefile.in.orig > +++ libcc1/Makefile.in > +@@ -387,7 +387,7 @@ CPPFLAGS_FOR_C_FAMILY = -I $(srcdir)/../gcc/c-family \ > + CPPFLAGS_FOR_C = $(CPPFLAGS_FOR_C_FAMILY) -I $(srcdir)/../gcc/c > + CPPFLAGS_FOR_CXX = $(CPPFLAGS_FOR_C_FAMILY) -I $(srcdir)/../gcc/cp > + AM_CXXFLAGS = $(WARN_FLAGS) $(WERROR) $(visibility) $(CET_HOST_FLAGS) \ > +- $(am__append_1) > ++ $(am__append_1) $(PORTS_FORCE_SPLIT_SECTIONS) > + # Can be simplified when libiberty becomes a normal convenience library. > + libiberty_normal = ../libiberty/libiberty.a > + libiberty_noasan = ../libiberty/noasan/libiberty.a > @@ -405,6 +405,8 @@ cc1libdir = $(libdir)/$(libsuffix) > shared_source = callbacks.cc callbacks.hh connection.cc connection.hh \ > marshall.cc marshall.hh rpc.hh status.hh > Index: patches/patch-libgcc_config_host > =================================================================== > RCS file: /cvs/ports/lang/gcc/11/patches/patch-libgcc_config_host,v > retrieving revision 1.2 > diff -u -p -r1.2 patch-libgcc_config_host > --- patches/patch-libgcc_config_host 11 Mar 2022 19:28:58 -0000 1.2 > +++ patches/patch-libgcc_config_host 10 Sep 2022 00:38:17 -0000 > @@ -44,13 +44,23 @@ Index: libgcc/config.host > mips*-*-linux*) # Linux MIPS, either endian. > extra_parts="$extra_parts crtfastmath.o" > tmake_file="${tmake_file} t-crtfm" > -@@ -1159,6 +1177,9 @@ powerpc*-*-freebsd*) > - ;; > +@@ -1160,6 +1178,9 @@ powerpc*-*-freebsd*) > powerpc-*-netbsd*) > tmake_file="$tmake_file rs6000/t-netbsd rs6000/t-crtstuff" > -+ ;; > + ;; > +powerpc*-*-openbsd*) > + tmake_file="${tmake_file} rs6000/t-ppccomm rs6000/t-crtstuff > rs6000/t-openbsd" > - ;; > ++ ;; > powerpc-*-eabispe*) > tmake_file="${tmake_file} rs6000/t-ppccomm rs6000/t-savresfgpr > rs6000/t-crtstuff t-crtstuff-pic t-fdpbit" > + extra_parts="$extra_parts crtbegin.o crtend.o crtbeginS.o crtendS.o > crtbeginT.o ecrti.o ecrtn.o ncrti.o ncrtn.o" > +@@ -1279,6 +1300,9 @@ riscv*-*-linux*) > + riscv*-*-freebsd*) > + tmake_file="${tmake_file} riscv/t-softfp${host_address} t-softfp > riscv/t-elf riscv/t-elf${host_address} t-slibgcc-libgcc" > + extra_parts="$extra_parts crtbegin.o crtend.o crti.o crtn.o crtendS.o > crtbeginT.o" > ++ ;; > ++riscv64-*-openbsd*) > ++ tmake_file="${tmake_file} riscv/t-softfp${host_address} t-softfp > riscv/t-elf riscv/t-elf${host_address}" > + ;; > + riscv*-*-*) > + tmake_file="${tmake_file} riscv/t-softfp${host_address} t-softfp > riscv/t-elf riscv/t-elf${host_address}" > Index: pkg/PFRAG.riscv64-main > =================================================================== > RCS file: pkg/PFRAG.riscv64-main > diff -N pkg/PFRAG.riscv64-main > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ pkg/PFRAG.riscv64-main 14 Sep 2022 20:24:00 -0000 > @@ -0,0 +1,13 @@ > +lib/gcc/${CONFIG}/${V}/include/tgmath.h > +lib/gcc/${CONFIG}/${V}/include/unwind.h > +lib/gcc/${CONFIG}/${V}/plugin/include/config/dbxelf.h > +lib/gcc/${CONFIG}/${V}/plugin/include/config/elfos.h > +lib/gcc/${CONFIG}/${V}/plugin/include/config/initfini-array.h > +lib/gcc/${CONFIG}/${V}/plugin/include/config/openbsd-libpthread.h > +lib/gcc/${CONFIG}/${V}/plugin/include/config/openbsd-stdint.h > +lib/gcc/${CONFIG}/${V}/plugin/include/config/openbsd.h > +lib/gcc/${CONFIG}/${V}/plugin/include/config/riscv/ > +lib/gcc/${CONFIG}/${V}/plugin/include/config/riscv/openbsd.h > +lib/gcc/${CONFIG}/${V}/plugin/include/config/riscv/riscv-opts.h > +lib/gcc/${CONFIG}/${V}/plugin/include/config/riscv/riscv-protos.h > +lib/gcc/${CONFIG}/${V}/plugin/include/config/riscv/riscv.h > > -- > jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE