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

Reply via email to