Saturday, September 10, 2022

lang/gcc/8 and lang/gcc/11 diff for riscv64

On Fri, Sep 09 2022, Pascal Stumpf <pascal@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.

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.)


Index: 8/Makefile
===================================================================
RCS file: /cvs/ports/lang/gcc/8/Makefile,v
retrieving revision 1.56
diff -u -p -r1.56 Makefile
--- 8/Makefile 24 Jul 2022 09:52:45 -0000 1.56
+++ 8/Makefile 9 Sep 2022 00:14:41 -0000
@@ -1,5 +1,5 @@
ONLY_FOR_ARCHS = aarch64 alpha amd64 arm hppa i386 mips64 mips64el \
- powerpc powerpc64 sparc64
+ powerpc powerpc64 riscv64 sparc64

# XXX: sparc64
ONLY_FOR_ARCHS-ada = amd64 hppa i386 mips64 powerpc
@@ -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,15 @@ 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: 8/patches/patch-fixincludes_Makefile_in
===================================================================
RCS file: 8/patches/patch-fixincludes_Makefile_in
diff -N 8/patches/patch-fixincludes_Makefile_in
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ 8/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: 8/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
--- 8/patches/patch-gcc_config_gcc 11 Mar 2022 19:28:59 -0000 1.6
+++ 8/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: 8/patches/patch-gcc_config_riscv_openbsd_h
===================================================================
RCS file: 8/patches/patch-gcc_config_riscv_openbsd_h
diff -N 8/patches/patch-gcc_config_riscv_openbsd_h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ 8/patches/patch-gcc_config_riscv_openbsd_h 8 Sep 2022 23:36:00 -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
++

No comments:

Post a Comment