On Tue, Sep 13 2022, Jeremie Courreges-Anglas <[email protected]> wrote:
> On Sun, Sep 11 2022, Jeremie Courreges-Anglas <[email protected]> wrote:
>> On Fri, Sep 09 2022, Pascal Stumpf <[email protected]> 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?
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