Re: Patches to fix building m68k with CPUFLAGS
Jake Hamby <[email protected]> Sun, 19 Jul 2020 10:38:24 -0700
| Newsgroups | gmane.os.netbsd.ports.amiga,gmane.os.netbsd.ports.m68k |
|---|---|
| Message-ID | <CABfdNnTXnLVA37WVa7wrHZrMC9tfh3bM8h6J+WjZ8d+ZxUdgpg@mail.gmail.com> |
Oops, I meant "changes to *not* add CPUFLAGS to AFLAGS (for m68k). At least it looks like Gmail didn't word wrap my patches, but it did word wrap the text I put at the top (because I tried to add my own line breaks, something I won't do this time). BTW, here's the GitHub repo where I'm keeping my local fork of the src. I didn't want to deal with CVS, and this is a nice way to avoid doing so. https://github.com/jhamby/netbsd-src Best regards, Jake On Sun, Jul 19, 2020 at 10:35 AM Jake Hamby <[email protected]> wrote: > > Hi all, > > I've been spending some time getting reacquainted with NetBSD/amiga, thanks to > emulation, and I just fixed some annoying bugs that were preventing anyone from > setting CPUFLAGS in their NetBSD build (e.g. to optimize for m68060 or m68040. > I also switched my build to use GCC 8.4.0 and binutils 2.34. > > The biggest problem with CPUFLAGS had to do with a whitespace bug in > external/gpl3/gcc/dist/gcc/config/m68k/m68k.h (and in "gcc.old"), > which is the last > patch in the email. The bug is still in GCC, so the fix can be > upstreamed right away. > The changes to now add CPUFLAGS to AFLAGS are because GAS doesn't > recognize, e.g. "-m68020-60", so we can't ever pass CPUFLAGS directly (on m68k). > > The patch to libgcc/config/m68k/lb1sf68.S (in gcc and gcc.old) is > because otherwise > the linker fails trying to handle unsupported 16-bit relocations. I'm > not sure if wrapping > the unworking code with !defined("__ELF__") is the correct fix, or if > this is a bug > that's specific to NetBSD. Either way, it got me past the build break. > > As for switching to the new GCC and binutils, I'm still testing that. > I'm seeing some > kernel panics in UVM, but I think they may be related to instability > in NetBSD-current. > I'll have to build a kernel with GCC 7 and compare, and also with the > older binutils. > I wanted to email the list with the patches I have so far, since I > know a lot of people > are blocked from making builds for their 68060 or 68040 because CPUFLAGS > has been broken on m68k. If the mailing list breaks any of the patches, I also > put a PR at: https://github.com/NetBSD/src/pull/13 > > I'll delete the GitHub PR after the patches get merged. Thanks for reviewing! > > Subject: [PATCH 1/2] Switch m68k to new GCC and binutils, fix CPUFLAGS. > > - Change m68k build to use GCC 8.4.0 and binutils 2.34. > - Update binutils config files to define TARGET_BYTES_BIG_ENDIAN. > - Fix libgcc/config/m68k/lb1sf68.S to work around linker error > when using CPUFLAGS (normally masked by default CPU options). > - Don't add CPUFLAGS to AFLAGS, to fix several build failures: > - Amiga kernel locore.s uses opcodes not present in 68040/060 > - Amiga bootblocks use custom make rule that calls gas directly, > and gas doesn't understand all m68k CPUFLAGS recognized by GCC. > - m68060 kernel support package also doesn't like CPUFLAGS. > --- > external/gpl3/binutils.old/usr.bin/gas/arch/m68k/config.h | 2 +- > external/gpl3/binutils/usr.bin/gas/arch/m68k/config.h | 2 +- > external/gpl3/gcc.old/dist/libgcc/config/m68k/lb1sf68.S | 4 ++-- > external/gpl3/gcc/dist/libgcc/config/m68k/lb1sf68.S | 4 ++-- > share/mk/bsd.own.mk | 5 +---- > share/mk/bsd.sys.mk | 4 ++++ > 6 files changed, 11 insertions(+), 10 deletions(-) > > diff --git a/external/gpl3/binutils.old/usr.bin/gas/arch/m68k/config.h > b/external/gpl3/binutils.old/usr.bin/gas/arch/m68k/config.h > index 63afe83d1be4..181f0bbe08fc 100644 > --- a/external/gpl3/binutils.old/usr.bin/gas/arch/m68k/config.h > +++ b/external/gpl3/binutils.old/usr.bin/gas/arch/m68k/config.h > @@ -298,7 +298,7 @@ > #define TARGET_ALIAS "m68k--netbsdelf" > > /* Define as 1 if big endian. */ > -/* #undef TARGET_BYTES_BIG_ENDIAN */ > +#define TARGET_BYTES_BIG_ENDIAN 1 > > /* Canonical target. */ > #define TARGET_CANONICAL "m68k--netbsdelf" > diff --git a/external/gpl3/binutils/usr.bin/gas/arch/m68k/config.h > b/external/gpl3/binutils/usr.bin/gas/arch/m68k/config.h > index eddab29535cb..c4087fdff09c 100644 > --- a/external/gpl3/binutils/usr.bin/gas/arch/m68k/config.h > +++ b/external/gpl3/binutils/usr.bin/gas/arch/m68k/config.h > @@ -317,7 +317,7 @@ > #define TARGET_ALIAS "m68k--netbsdelf" > > /* Define as 1 if big endian. */ > -/* #undef TARGET_BYTES_BIG_ENDIAN */ > +#define TARGET_BYTES_BIG_ENDIAN 1 > > /* Canonical target. */ > #define TARGET_CANONICAL "m68k--netbsdelf" > diff --git a/external/gpl3/gcc.old/dist/libgcc/config/m68k/lb1sf68.S > b/external/gpl3/gcc.old/dist/libgcc/config/m68k/lb1sf68.S > index 0c367428ceff..472f4d94a9da 100644 > --- a/external/gpl3/gcc.old/dist/libgcc/config/m68k/lb1sf68.S > +++ b/external/gpl3/gcc.old/dist/libgcc/config/m68k/lb1sf68.S > @@ -172,7 +172,7 @@ see the files COPYING3 and COPYING.RUNTIME > respectively. If not, see > /* ISA C has no bra.l instruction, and since this assembly file > gets assembled into multiple object files, we avoid the > bra instruction entirely. */ > -#if defined (__mcoldfire__) && !defined (__mcfisab__) > +#if defined (__ELF__) || (defined (__mcoldfire__) && !defined (__mcfisab__)) > lea \addr-.-8,a0 > jmp pc@(a0) > #else > @@ -211,7 +211,7 @@ see the files COPYING3 and COPYING.RUNTIME > respectively. If not, see > /* ISA C has no bra.l instruction, and since this assembly file > gets assembled into multiple object files, we avoid the > bra instruction entirely. */ > -#if defined (__mcoldfire__) && !defined (__mcfisab__) > +#if defined (__ELF__) || (defined (__mcoldfire__) && !defined (__mcfisab__)) > lea \addr-.-8,a0 > jmp pc@(a0) > #else > diff --git a/external/gpl3/gcc/dist/libgcc/config/m68k/lb1sf68.S > b/external/gpl3/gcc/dist/libgcc/config/m68k/lb1sf68.S > index 3784f4323961..2b3ff490a2a1 100644 > --- a/external/gpl3/gcc/dist/libgcc/config/m68k/lb1sf68.S > +++ b/external/gpl3/gcc/dist/libgcc/config/m68k/lb1sf68.S > @@ -172,7 +172,7 @@ see the files COPYING3 and COPYING.RUNTIME > respectively. If not, see > /* ISA C has no bra.l instruction, and since this assembly file > gets assembled into multiple object files, we avoid the > bra instruction entirely. */ > -#if defined (__mcoldfire__) && !defined (__mcfisab__) > +#if defined (__ELF__) || (defined (__mcoldfire__) && !defined (__mcfisab__)) > lea \addr-.-8,a0 > jmp pc@(a0) > #else > @@ -211,7 +211,7 @@ see the files COPYING3 and COPYING.RUNTIME > respectively. If not, see > /* ISA C has no bra.l instruction, and since this assembly file > gets assembled into multiple object files, we avoid the > bra instruction entirely. */ > -#if defined (__mcoldfire__) && !defined (__mcfisab__) > +#if defined (__ELF__) || (defined (__mcoldfire__) && !defined (__mcfisab__)) > lea \addr-.-8,a0 > jmp pc@(a0) > #else > diff --git a/share/mk/bsd.own.mk b/share/mk/bsd.own.mk > index 3d4850e22e52..efaadde72aaa 100644 > --- a/share/mk/bsd.own.mk > +++ b/share/mk/bsd.own.mk > @@ -63,9 +63,6 @@ TOOLCHAIN_MISSING?= no > # > # What GCC is used? > # > -.if ${MACHINE_CPU} == "m68k" > -HAVE_GCC?= 7 > -.endif > HAVE_GCC?= 8 > > # > @@ -163,7 +160,7 @@ EXTERNAL_GDB_SUBDIR= /does/not/exist > ${MACHINE_ARCH} == "powerpc64" || ${MACHINE_ARCH} == "powerpc" || \ > ${MACHINE_CPU} == "aarch64" || ${MACHINE_CPU} == "arm" || \ > ${MACHINE_ARCH} == "hppa" || ${MACHINE_ARCH} == "sparc64" || \ > - ${MACHINE} == "sun2" || ${MACHINE} == "alpha" > + ${MACHINE_CPU} == "m68k" || ${MACHINE} == "alpha" > HAVE_BINUTILS?= 234 > .else > HAVE_BINUTILS?= 231 > diff --git a/share/mk/bsd.sys.mk b/share/mk/bsd.sys.mk > index 758ab3485d4a..ba7f0f4d3cbc 100644 > --- a/share/mk/bsd.sys.mk > +++ b/share/mk/bsd.sys.mk > @@ -234,7 +234,11 @@ CPUFLAGS+= -Wa,--fatal-warnings > #CPUFLAGS+= -mno-abicalls -fno-PIC > #.endif > CFLAGS+= ${CPUFLAGS} > + > +# GNU assembler doesn't like some m68k flags, esp. for kernel locore.s, etc. > +.if ${MACHINE_CPU} != "m68k" > AFLAGS+= ${CPUFLAGS} > +.endif > > .if ${KCOV:U0} > 0 > KCOVFLAGS= -fsanitize-coverage=trace-pc,trace-cmp > > Subject: [PATCH 2/2] Insert missing whitespace for assembler flag rules. > > Fixes assembler errors like "unrecognized option -m68040-mcpu=68040". > --- > external/gpl3/gcc/dist/gcc/config/m68k/m68k.h | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/external/gpl3/gcc/dist/gcc/config/m68k/m68k.h > b/external/gpl3/gcc/dist/gcc/config/m68k/m68k.h > index 506fa4e50e76..8c688a4156cc 100644 > --- a/external/gpl3/gcc/dist/gcc/config/m68k/m68k.h > +++ b/external/gpl3/gcc/dist/gcc/config/m68k/m68k.h > @@ -36,9 +36,9 @@ along with GCC; see the file COPYING3. If not see > and .arch directives. */ > > #define ASM_CPU_SPEC "\ > -%{m68851}%{mno-68851} %{m68881}%{mno-68881} %{msoft-float:-mno-float} \ > -%{m68020-40:-m68040}%{m68020-60:-m68040}\ > -%{mcpu=*:-mcpu=%*}%{march=*:-march=%*}\ > + %{m68851} %{mno-68851} %{m68881} %{mno-68881} %{msoft-float:-mno-float}\ > + %{m68020-40:-m68040} %{m68020-60:-m68040}\ > + %{mcpu=*:-mcpu=%*} %{march=*:-march=%*}\ > " > #define ASM_PCREL_SPEC "%{" FPIE_OR_FPIC_SPEC ":--pcrel} \ > %{mpcrel:%{" NO_FPIE_AND_FPIC_SPEC ":--pcrel}} \