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
Index: Makefile
===================================================================
RCS file: /cvs/ports/lang/gcc/8/Makefile,v
retrieving revision 1.56
diff -u -p -r1.56 Makefile
--- Makefile 24 Jul 2022 09:52:45 -0000 1.56
+++ Makefile 8 Sep 2022 22:28:25 -0000
@@ -64,7 +64,7 @@ EXTRACT_ONLY = ${DISTNAME}.tar.xz
BUILD_DEPENDS += devel/bison
.if ${MACHINE_ARCH} == "aarch64" || ${MACHINE_ARCH} == "arm" || \
- ${MACHINE_ARCH} == "powerpc64"
+ ${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
@@ -133,9 +133,14 @@ CONFIGURE_ARGS += \
--with-gmp="${LOCALBASE}" \
--enable-languages=${LANGS} \
--disable-libstdcxx-pch \
- --enable-default-ssp \
- --enable-default-pie \
--without-isl
+.if ${MACHINE_ARCH} != "riscv64"
+CONFIGURE_ARGS += \
+ --enable-default-ssp \
+ --enable-default-pie
+.else
+EXTRA_ENV += PORTS_FORCE_DISABLE_PIE="-nopie"
+.endif
# This is needed, as internal cpp is no longer compatible with the
# visible beast
Index: patches/patch-fixincludes_Makefile_in
===================================================================
RCS file: patches/patch-fixincludes_Makefile_in
diff -N patches/patch-fixincludes_Makefile_in
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-fixincludes_Makefile_in 8 Sep 2022 21:58:03 -0000
@@ -0,0 +1,25 @@
+Add a knob to force-disable PIE to unbreak compilation where PIE isn't
+properly supported.
+
+Index: fixincludes/Makefile.in
+--- fixincludes/Makefile.in.orig
++++ fixincludes/Makefile.in
+@@ -107,15 +107,15 @@ oneprocess : full-stamp
+ twoprocess : test-stamp $(AF)
+
+ full-stamp : $(ALLOBJ) $(LIBIBERTY)
+- $(CC) $(CFLAGS) $(LDFLAGS) -o $(FI) $(ALLOBJ) $(LIBIBERTY)
++ $(CC) $(CFLAGS) $(PORTS_FORCE_DISABLE_PIE) $(LDFLAGS) -o $(FI) $(ALLOBJ) $(LIBIBERTY)
+ $(STAMP) $@
+
+ test-stamp : $(TESTOBJ) $(LIBIBERTY)
+- $(CC) $(CFLAGS) $(LDFLAGS) -o $(FI) $(TESTOBJ) $(LIBIBERTY)
++ $(CC) $(CFLAGS) $(PORTS_FORCE_DISABLE_PIE) $(LDFLAGS) -o $(FI) $(TESTOBJ) $(LIBIBERTY)
+ $(STAMP) $@
+
+ $(AF): $(FIXOBJ) $(LIBIBERTY)
+- $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(FIXOBJ) $(LIBIBERTY)
++ $(CC) $(CFLAGS) $(PORTS_FORCE_DISABLE_PIE) $(LDFLAGS) -o $@ $(FIXOBJ) $(LIBIBERTY)
+
+ $(ALLOBJ) : $(HDR)
+ fixincl.o : fixincl.c $(srcdir)/fixincl.x
Index: patches/patch-gcc_config_gcc
===================================================================
RCS file: /cvs/ports/lang/gcc/8/patches/patch-gcc_config_gcc,v
retrieving revision 1.6
diff -u -p -r1.6 patch-gcc_config_gcc
--- patches/patch-gcc_config_gcc 11 Mar 2022 19:28:59 -0000 1.6
+++ patches/patch-gcc_config_gcc 5 Apr 2022 14:38:47 -0000
@@ -96,7 +96,28 @@ 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
-@@ -2394,6 +2432,18 @@ pdp11-*-*)
+@@ -2113,6 +2151,20 @@ riscv*-*-freebsd*)
+ # automatically detect that GAS supports it, yet we require it.
+ gcc_cv_initfini_array=yes
+ ;;
++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, can't hurt...
++ cpu_is_64bit=yes
++ gnu_ld=yes
++ gas=yes
++ ;;
+ mips*-*-netbsd*) # NetBSD/mips, either endian.
+ target_cpu_default="MASK_ABICALLS"
+ tm_file="elfos.h ${tm_file} mips/elf.h ${nbsd_tm_file} mips/netbsd.h"
+@@ -2394,6 +2446,18 @@ pdp11-*-*)
# tmake_file="${tmake_file} rs6000/t-fprules"
# extra_headers=
# ;;
@@ -115,7 +136,7 @@ Index: gcc/config.gcc
powerpc-*-darwin*)
extra_options="${extra_options} ${cpu_type}/darwin.opt"
case ${target} in
-@@ -2994,10 +3044,10 @@ sparc64-*-netbsd*)
+@@ -2994,10 +3058,10 @@ sparc64-*-netbsd*)
tmake_file="${tmake_file} sparc/t-sparc sparc/t-netbsd64"
;;
sparc64-*-openbsd*)
@@ -127,7 +148,7 @@ Index: gcc/config.gcc
gas=yes gnu_ld=yes
with_cpu=ultrasparc
tmake_file="${tmake_file} sparc/t-sparc"
-@@ -3226,6 +3276,12 @@ case ${target} in
+@@ -3226,6 +3290,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 8 Sep 2022 22:17:23 -0000
@@ -0,0 +1,133 @@
+Index: gcc/config/riscv/openbsd.h
+--- gcc/config/riscv/openbsd.h.orig
++++ gcc/config/riscv/openbsd.h
+@@ -0,0 +1,129 @@
++/* 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. */
++
++/* Run-time Target Specification. */
++//#undef TARGET_VERSION
++//#define TARGET_VERSION fputs (" (OpenBSD/arm)", stderr);
++
++/* This is used in ASM_FILE_START. */
++//#undef ARM_OS_NAME
++//#define ARM_OS_NAME "OpenBSD"
++
++/* This defaults us to little-endian. */
++#ifndef TARGET_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT 0
++
No comments:
Post a Comment