diff mbox series

bring netbsd/arm support up to speed. eabi, etc.

Message ID 20181020210514.GA13381@SDF.ORG
State New
Headers show
Series bring netbsd/arm support up to speed. eabi, etc. | expand

Commit Message

Maya Rashish Oct. 20, 2018, 9:05 p.m. UTC
---
 gcc/config.gcc                  |  33 +++++++++-
 gcc/config.host                 |   2 +-
 gcc/config/arm/netbsd-eabi.h    | 108 ++++++++++++++++++++++++++++++++
 gcc/config/arm/netbsd-elf.h     |  10 +++
 gcc/config/netbsd-elf.h         |  15 +++++
 libgcc/config.host              |  11 +++-
 libgcc/config/arm/t-netbsd      |  15 ++++-
 libgcc/config/arm/t-netbsd-eabi |  18 ++++++
 8 files changed, 205 insertions(+), 7 deletions(-)
 create mode 100644 gcc/config/arm/netbsd-eabi.h
 create mode 100644 libgcc/config/arm/t-netbsd-eabi

Comments

Richard Earnshaw (lists) Oct. 23, 2018, 1:36 p.m. UTC | #1
Thanks for posting this.  Before we can commit it, however, we need to
sort out the authorship and ensure that all the appropriate copyright
assignments are in place.  Are you the sole author, or are other NetBSD
developers involved?

Firstly, please provide a ChangeLog description for the patch.

Below are some initial comments, I might have more once I have a more
detailed look.

R.

On 20/10/2018 22:05, Maya Rashish wrote:
> ---
>  gcc/config.gcc                  |  33 +++++++++-
>  gcc/config.host                 |   2 +-
>  gcc/config/arm/netbsd-eabi.h    | 108 ++++++++++++++++++++++++++++++++
>  gcc/config/arm/netbsd-elf.h     |  10 +++
>  gcc/config/netbsd-elf.h         |  15 +++++
>  libgcc/config.host              |  11 +++-
>  libgcc/config/arm/t-netbsd      |  15 ++++-
>  libgcc/config/arm/t-netbsd-eabi |  18 ++++++
>  8 files changed, 205 insertions(+), 7 deletions(-)
>  create mode 100644 gcc/config/arm/netbsd-eabi.h
>  create mode 100644 libgcc/config/arm/t-netbsd-eabi
> 
> diff --git a/gcc/config.gcc b/gcc/config.gcc
> index 8521f7d556e..e749c61e75f 100644
> --- a/gcc/config.gcc
> +++ b/gcc/config.gcc
> @@ -1130,10 +1130,37 @@ arm*-*-freebsd*)                # ARM FreeBSD EABI
>  	with_tls=${with_tls:-gnu}
>  	;;
>  arm*-*-netbsdelf*)
> -	tm_file="dbxelf.h elfos.h ${nbsd_tm_file} arm/elf.h arm/aout.h ${tm_file} arm/netbsd-elf.h"
> -	extra_options="${extra_options} netbsd.opt netbsd-elf.opt"
>  	tmake_file="${tmake_file} arm/t-arm"
> -	target_cpu_cname="arm6"

See patch I posted this morning, a default here is probably still needed.

> +	tm_file="dbxelf.h elfos.h ${nbsd_tm_file} arm/elf.h"
> +	extra_options="${extra_options} netbsd.opt netbsd-elf.opt"
> +	case ${target} in
> +	arm*eb-*) tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1" ;;
> +	esac
> +	case ${target} in
> +	arm*-*-netbsdelf-*eabi*)
> +	    tm_file="$tm_file arm/bpabi.h arm/netbsd-elf.h arm/netbsd-eabi.h"
> +	    tmake_file="$tmake_file arm/t-bpabi arm/t-netbsdeabi"
> +	    # The BPABI long long divmod functions return a 128-bit value in
> +	    # registers r0-r3.  Correctly modeling that requires the use of
> +	    # TImode.
> +	    need_64bit_hwint=yes

need_64bit_hwint isn't needed any more (removed in 2014).

> +	    ;;
> +	*)
> +	    tm_file="$tm_file arm/netbsd-elf.h"
> +	    tmake_file="$tmake_file arm/t-netbsd"
> +	    ;;
> +	esac
> +	tm_file="${tm_file} arm/aout.h arm/arm.h"
> +	case ${target} in
> +	arm*-*-netbsdelf-*eabihf*)
> +	    tm_defines="${tm_defines} TARGET_DEFAULT_FLOAT_ABI=ARM_FLOAT_ABI_HARD"
> +	    ;;
> +	esac
> +	case ${target} in
> +	armv4*) target_cpu_cname="strongarm";;

You might want to filter out some bogus combinations here, such as armv4
+ eabihf which can't be supported.

> +	armv6*) target_cpu_cname="arm1176jzf-s";;
> +	armv7*) target_cpu_cname="cortex-a8";;

The list overall, seems somewhat incomplete.  What about armv4t, armv5
and armv8?

> +	esac
>  	;;
>  arm*-*-linux-*)			# ARM GNU/Linux with ELF
>  	tm_file="dbxelf.h elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h arm/elf.h arm/linux-gas.h arm/linux-elf.h"
> diff --git a/gcc/config.host b/gcc/config.host
> index c65569da2e9..59208d2508f 100644
> --- a/gcc/config.host
> +++ b/gcc/config.host
> @@ -107,7 +107,7 @@ case ${host} in
>  	;;
>      esac
>      ;;
> -  arm*-*-freebsd* | arm*-*-linux* | arm*-*-fuchsia*)
> +  arm*-*-freebsd* | arm*-*-netbsd* | arm*-*-linux* | arm*-*-fuchsia*)
>      case ${target} in
>        arm*-*-*)
>  	host_extra_gcc_objs="driver-arm.o"
> diff --git a/gcc/config/arm/netbsd-eabi.h b/gcc/config/arm/netbsd-eabi.h
> new file mode 100644
> index 00000000000..92f31b885f0
> --- /dev/null
> +++ b/gcc/config/arm/netbsd-eabi.h
> @@ -0,0 +1,108 @@
> +/* Definitions of target machine for GNU compiler, NetBSD/arm ELF version.
> +   Copyright (C) 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
> +   Contributed by Wasabi Systems, Inc.
> +
> +   This file is part of GCC.
> +
> +   GCC 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 3, or (at your
> +   option) any later version.
> +
> +   GCC 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 GCC; see the file COPYING3.  If not see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +/* Run-time Target Specification.  */
> +#undef MULTILIB_DEFAULTS
> +#define MULTILIB_DEFAULTS { "mabi=aapcs-linux" }
> +
> +#define TARGET_LINKER_EABI_SUFFIX \
> +    (TARGET_DEFAULT_FLOAT_ABI == ARM_FLOAT_ABI_SOFT \
> +     ? "%{!mabi=apcs-gnu:%{!mabi=atpcs:%{mfloat-abi=hard:_eabihf;:_eabi}}}" \
> +     : "%{!mabi=apcs-gnu:%{!mabi=atpcs:%{mfloat-abi=soft:_eabi;:_eabihf}}}")
> +#define TARGET_LINKER_BIG_EMULATION "armelfb_nbsd%(linker_eabi_suffix)"
> +#define TARGET_LINKER_LITTLE_EMULATION "armelf_nbsd%(linker_eabi_suffix)"
> +
> +/* TARGET_BIG_ENDIAN_DEFAULT is set in
> +   config.gcc for big endian configurations.  */
> +#undef  TARGET_LINKER_EMULATION
> +#if TARGET_BIG_ENDIAN_DEFAULT
> +#define TARGET_LINKER_EMULATION TARGET_LINKER_BIG_EMULATION
> +#undef BE8_LINK_SPEC
> +#define BE8_LINK_SPEC " %{!mlittle-endian:%{march=armv7-a|mcpu=cortex-a5|mcpu=cortex-a8|mcpu=cortex-a9:%{!r:--be8}}}" 

BE8_LINK_SPEC shouldn't be needed any more.  This is handled through
generic arm code.

> +#else
> +#define TARGET_LINKER_EMULATION TARGET_LINKER_LITTLE_EMULATION
> +#endif
> +
> +#undef ARM_DEFAULT_ABI
> +#define ARM_DEFAULT_ABI ARM_ABI_AAPCS_LINUX
> +
> +#undef ARM_UNWIND_INFO
> +#define ARM_UNWIND_INFO 0
> +#undef DWARF2_UNWIND_INFO
> +#define DWARF2_UNWIND_INFO 1
> +
> +#undef TARGET_OS_CPP_BUILTINS
> +#define TARGET_OS_CPP_BUILTINS()		\
> +  do						\
> +    {						\
> +      if (TARGET_AAPCS_BASED)			\
> +	TARGET_BPABI_CPP_BUILTINS();		\
> +      NETBSD_OS_CPP_BUILTINS_ELF();		\
> +      if (DWARF2_UNWIND_INFO)			\
> +	builtin_define ("__ARM_DWARF_EH__");	\
> +    }						\
> +  while (0)
> +
> +#undef SUBTARGET_CPP_SPEC
> +#define SUBTARGET_CPP_SPEC NETBSD_CPP_SPEC
> +
> +/*
> + * Override AAPCS types to remain compatible the existing NetBSD types.
> + */
> +#undef WCHAR_TYPE
> +#define WCHAR_TYPE "int"
> +
> +#undef SIZE_TYPE
> +#define SIZE_TYPE "long unsigned int"
> + 
> +#undef PTRDIFF_TYPE
> +#define PTRDIFF_TYPE "long int"
> +
> +#undef SUBTARGET_EXTRA_ASM_SPEC
> +#define SUBTARGET_EXTRA_ASM_SPEC	\
> +  "-matpcs %{mabi=apcs-gnu|mabi=atpcs:-meabi=gnu} %{fpic|fpie:-k} %{fPIC|fPIE:-k}"
> +
> +/* Default to full VFP if -mhard-float is specified.  */
> +#undef SUBTARGET_ASM_FLOAT_SPEC
> +#define SUBTARGET_ASM_FLOAT_SPEC	\
> +  "%{mhard-float:%{!mfpu=*:-mfpu=vfp}}   \
> +   %{mfloat-abi=hard:%{!mfpu=*:-mfpu=vfp}}"

Please rework this to use -mfpu=auto.  -mfpu=vfp is very rarely the
right setting to use.

> +
> +#undef SUBTARGET_EXTRA_SPECS
> +#define SUBTARGET_EXTRA_SPECS				\
> +  { "subtarget_extra_asm_spec",	SUBTARGET_EXTRA_ASM_SPEC }, \
> +  { "subtarget_asm_float_spec", SUBTARGET_ASM_FLOAT_SPEC }, \
> +  { "linker_eabi_suffix",	TARGET_LINKER_EABI_SUFFIX }, \
> +  { "linker_emulation",		TARGET_LINKER_EMULATION }, \
> +  { "linker_big_emulation",	TARGET_LINKER_BIG_EMULATION }, \
> +  { "linker_little_emulation",	TARGET_LINKER_LITTLE_EMULATION }, \
> +  { "be8_link_spec",		BE8_LINK_SPEC }, \
> +  { "target_fix_v4bx_spec",	TARGET_FIX_V4BX_SPEC }, \
> +  NETBSD_SUBTARGET_EXTRA_SPECS
> +
> +#define NETBSD_ENTRY_POINT "__start"
> +
> +#undef LINK_SPEC
> +#define LINK_SPEC \
> +  "-X %{mbig-endian:-EB -m %(linker_big_emulation)} \
> +   %{mlittle-endian:-EL -m %(linker_liitle_emulation)} \
> +   %{!mbig-endian:%{!mlittle-endian:-m %(linker_emulation)}} \
> +   %(be8_link_spec) %(target_fix_v4bx_spec) \
> +   %(netbsd_link_spec)"
> diff --git a/gcc/config/arm/netbsd-elf.h b/gcc/config/arm/netbsd-elf.h
> index 11247716cc4..c29ed3f5c2b 100644
> --- a/gcc/config/arm/netbsd-elf.h
> +++ b/gcc/config/arm/netbsd-elf.h
> @@ -43,6 +43,7 @@
>  #undef ARM_DEFAULT_ABI
>  #define ARM_DEFAULT_ABI ARM_ABI_ATPCS
>  
> +#undef TARGET_OS_CPP_BUILTINS
>  #define TARGET_OS_CPP_BUILTINS()	\
>    do					\
>      {					\
> @@ -153,3 +154,12 @@ do									\
>      (void) sysarch (0, &s);						\
>    }									\
>  while (0)
> +
> +/* Ensure that libgcc does not attempt to define __[CD]TOR_LIST__[] for APCS,
> + *    which belongs in crtbegin on NetBSD.  */
> +#ifndef __ARM_EABI__
> +#define CTOR_LISTS_DEFINED_EXTERNALLY
> +#endif
> +
> +#undef FPUTYPE_DEFAULT
> +#define FPUTYPE_DEFAULT "vfp"
> diff --git a/gcc/config/netbsd-elf.h b/gcc/config/netbsd-elf.h
> index 4dc2aa7579f..33677b126ca 100644
> --- a/gcc/config/netbsd-elf.h
> +++ b/gcc/config/netbsd-elf.h
> @@ -1,4 +1,5 @@
>  /* Common configuration file for NetBSD ELF targets.
> +
>     Copyright (C) 2002-2018 Free Software Foundation, Inc.
>     Contributed by Wasabi Systems, Inc.
>  
> @@ -67,6 +68,9 @@ along with GCC; see the file COPYING3.  If not see
>  
>     Target-specific code must provide the %(netbsd_entry_point) spec.  */
>  
> +#define NETBSD_LINK_LD_ELF_SO_SPEC \
> +  "%{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}"
> +
>  #define NETBSD_LINK_SPEC_ELF \
>    "%{assert*} %{R*} %{rpath*} \
>     %{shared:-shared} \
> @@ -81,6 +85,17 @@ along with GCC; see the file COPYING3.  If not see
>         -dynamic-linker /usr/libexec/ld.elf_so} \
>       %{static:-static}}"
>  
> +/* Provide the standard list of subtarget extra specs for NetBSD targets.  */
> +#define NETBSD_SUBTARGET_EXTRA_SPECS \
> +  { "netbsd_link_ld_elf_so",    NETBSD_LINK_LD_ELF_SO_SPEC }, \
> +  { "netbsd_cpp_spec",          NETBSD_CPP_SPEC }, \
> +  { "netbsd_link_spec",         NETBSD_LINK_SPEC_ELF }, \
> +  { "netbsd_entry_point",       NETBSD_ENTRY_POINT }, \
> +  { "netbsd_endfile_spec",      NETBSD_ENDFILE_SPEC },
> +
> +#undef SUBTARGET_EXTRA_SPECS
> +#define SUBTARGET_EXTRA_SPECS   NETBSD_SUBTARGET_EXTRA_SPECS
> +
>  /* Use --as-needed -lgcc_s for eh support.  */
>  #ifdef HAVE_LD_AS_NEEDED
>  #define USE_LD_AS_NEEDED 1
> diff --git a/libgcc/config.host b/libgcc/config.host
> index 029f6569caf..bcc754269ca 100644
> --- a/libgcc/config.host
> +++ b/libgcc/config.host
> @@ -422,7 +422,16 @@ arm*-*-fuchsia*)
>  	unwind_header=config/arm/unwind-arm.h
>  	;;
>  arm*-*-netbsdelf*)
> -	tmake_file="$tmake_file arm/t-arm arm/t-netbsd t-slibgcc-gld-nover"
> +	tmake_file="$tmake_file arm/t-arm"
> +	case ${host} in
> +	  arm*-*-netbsdelf-*eabi*)
> +	    tmake_file="${tmake_file} arm/t-netbsd-eabi"
> +	    unwind_header=config/arm/unwind-arm.h
> +	    ;;
> +	  *)
> +	    tmake_file="${tmake_file} arm/t-netbsd t-slibgcc-gld-nover"
> +	    ;;
> +	esac
>  	;;
>  arm*-*-linux*)			# ARM GNU/Linux with ELF
>  	tmake_file="${tmake_file} arm/t-arm t-fixedpoint-gnu-prefix t-crtfm"
> diff --git a/libgcc/config/arm/t-netbsd b/libgcc/config/arm/t-netbsd
> index 95358f931ba..36ca3e6ea37 100644
> --- a/libgcc/config/arm/t-netbsd
> +++ b/libgcc/config/arm/t-netbsd
> @@ -1,7 +1,18 @@
> +# This list is from t-elf, but with some things removed.
> +LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func \
> +	_call_via_rX _interwork_call_via_rX \
> +	_arm_fixunsdfsi _arm_fixunssfsi \
> +	_arm_floatdidf _arm_floatdisf _arm_floatundidf _arm_floatundisf \
> +	_lshrdi3 _ashrdi3 _ashldi3 \
> +	_clzsi2 _clzdi2 _ctzsi2
> +
>  # Just for these, we omit the frame pointer since it makes such a big
>  # difference.  It is then pointless adding debugging.
>  HOST_LIBGCC2_CFLAGS += -fomit-frame-pointer
>  
> -LIBGCC2_DEBUG_CFLAGS = -g0
> -
>  LIB2ADD += $(srcdir)/floatunsidf.c $(srcdir)/floatunsisf.c
> +
> +# Currently there is a bug somewhere in GCC's alias analysis
> +# or scheduling code that is breaking _fpmul_parts in fp-bit.c.
> +# Disabling function inlining is a workaround for this problem.
> +HOST_LIBGCC2_CFLAGS += -fno-inline
> diff --git a/libgcc/config/arm/t-netbsd-eabi b/libgcc/config/arm/t-netbsd-eabi
> new file mode 100644
> index 00000000000..ae08ea43ef7
> --- /dev/null
> +++ b/libgcc/config/arm/t-netbsd-eabi
> @@ -0,0 +1,18 @@
> +# This list is from t-elf, but with lots removed.
> +LIB1ASMFUNCS += _dvmd_tls _bb_init_func _call_via_rX _interwork_call_via_rX \
> +        _clzsi2 _clzdi2 _ctzsi2
> +
> +# Derived from t-bpabi
> +# Add the BPABI C functions.
> +LIB2ADD +=    $(srcdir)/config/arm/unaligned-funcs.c
> +
> +# Not using libgcc for EH.
> +LIB2ADDEH =
> +
> +# Add the BPABI names.
> +SHLIB_MAPFILES += $(srcdir)/config/arm/libgcc-bpabi.ver
> +
> +# On ARM, specifying -fnon-call-exceptions will needlessly pull in
> +# the unwinder in simple programs which use 64-bit division.  Omitting
> +# the option is safe.
> +LIB2_DIVMOD_EXCEPTION_FLAGS := -fexceptions
>
Maya Rashish Oct. 24, 2018, 11:29 a.m. UTC | #2
Thanks for the detailed response.
Sorry to give only a partial reply.

On Tue, Oct 23, 2018 at 02:36:57PM +0100, Richard Earnshaw (lists) wrote:
> Thanks for posting this.  Before we can commit it, however, we need to
> sort out the authorship and ensure that all the appropriate copyright
> assignments are in place.  Are you the sole author, or are other NetBSD
> developers involved?

The authors of these patches to netbsd are:
- matt thomas
- nick hudson
- matthew green

They are all listed in MAINTAINERS files in FSF projects so I think they
have a copyright assignment on file.
Matt Thomas is unresponsive lately but I can ask someone to bug him in
person.

> > +/* Default to full VFP if -mhard-float is specified.  */
> > +#undef SUBTARGET_ASM_FLOAT_SPEC
> > +#define SUBTARGET_ASM_FLOAT_SPEC	\
> > +  "%{mhard-float:%{!mfpu=*:-mfpu=vfp}}   \
> > +   %{mfloat-abi=hard:%{!mfpu=*:-mfpu=vfp}}"
> 
> Please rework this to use -mfpu=auto.  -mfpu=vfp is very rarely the
> right setting to use.

This change seems scary. Going over my default CPUs, I guess the
problematic one might cortex-a8.
I'm worried it might have negative repercussions for VFPv3-d16.
Is that a valid concern?
I see generic-armv7-a is a more popular default CPU, but I am not sure
from reading the code that it avoids this problem.

Thanks.
Richard Earnshaw (lists) Oct. 24, 2018, 12:50 p.m. UTC | #3
On 24/10/2018 12:29, coypu@sdf.org wrote:

>>> +/* Default to full VFP if -mhard-float is specified.  */
>>> +#undef SUBTARGET_ASM_FLOAT_SPEC
>>> +#define SUBTARGET_ASM_FLOAT_SPEC	\
>>> +  "%{mhard-float:%{!mfpu=*:-mfpu=vfp}}   \
>>> +   %{mfloat-abi=hard:%{!mfpu=*:-mfpu=vfp}}"
>>
>> Please rework this to use -mfpu=auto.  -mfpu=vfp is very rarely the
>> right setting to use.
> 
> This change seems scary. Going over my default CPUs, I guess the
> problematic one might cortex-a8.
> I'm worried it might have negative repercussions for VFPv3-d16.
> Is that a valid concern?
> I see generic-armv7-a is a more popular default CPU, but I am not sure
> from reading the code that it avoids this problem.

Well, auto should be the default anyway, unless overridden during configure.

You're right that cortex-a8 has Advanced SIMD enabled by default.  But
generic-armv7-a should be fine (the architecture there is armv7-a+fp and
+fp in this context means VFPv3-d16, which is exactly what you want in
this case).

For armv6 arm1176jzf-s is fine too, that enables FP automatically.  Only
armv4 from your current list is incompatible with FP (armv5t is as well,
but armv5te is fine).  ARMv8-a never has FP without SIMD so any CPU with
SIMD will be fine.

Note that -mfpu=vfp means VFPv2, so you really don't want that on ARMv7
or later devices as it will restrict the ISA unnecessarily.

R.
Ramana Radhakrishnan Oct. 24, 2018, 4:02 p.m. UTC | #4
On Wed, Oct 24, 2018 at 12:30 PM <coypu@sdf.org> wrote:
>
> Thanks for the detailed response.
> Sorry to give only a partial reply.
>
> On Tue, Oct 23, 2018 at 02:36:57PM +0100, Richard Earnshaw (lists) wrote:
> > Thanks for posting this.  Before we can commit it, however, we need to
> > sort out the authorship and ensure that all the appropriate copyright
> > assignments are in place.  Are you the sole author, or are other NetBSD
> > developers involved?
>
> The authors of these patches to netbsd are:
> - matt thomas
> - nick hudson

I see assignments for the following people for past and future changes
on fencepost for GCC :

Matthew Thomas (matt at 3am-software dot com) and Nicholas Hudson
(with a nick at nthcliff dot demon dot co dot uk email address).  Not
sure if Nick Hudson is the same as the person in the copyright
assignment as I don't have an email address to check this against.

I see nothing for Matthew Green for GCC .

regards
Ramana

> - matthew green
>
> They are all listed in MAINTAINERS files in FSF projects so I think they
> have a copyright assignment on file.
> Matt Thomas is unresponsive lately but I can ask someone to bug him in
> person.
>
> > > +/* Default to full VFP if -mhard-float is specified.  */
> > > +#undef SUBTARGET_ASM_FLOAT_SPEC
> > > +#define SUBTARGET_ASM_FLOAT_SPEC   \
> > > +  "%{mhard-float:%{!mfpu=*:-mfpu=vfp}}   \
> > > +   %{mfloat-abi=hard:%{!mfpu=*:-mfpu=vfp}}"
> >
> > Please rework this to use -mfpu=auto.  -mfpu=vfp is very rarely the
> > right setting to use.
>
> This change seems scary. Going over my default CPUs, I guess the
> problematic one might cortex-a8.
> I'm worried it might have negative repercussions for VFPv3-d16.
> Is that a valid concern?
> I see generic-armv7-a is a more popular default CPU, but I am not sure
> from reading the code that it avoids this problem.
>
> Thanks.
Maya Rashish Feb. 24, 2019, 4:06 p.m. UTC | #5
Pinging with updated patch.
I removed a conflict with copyright year change. No longer using
unwind-arm (we use dwarf on eabi).

I re-tested cross compilation and resulting C and C++ works (caveat:
with text relocations, i tested small programs)
I believe matt #2 (green) has sent a copyright assignment.

Changelog:
gcc:

config.gcc (arm*-*-netbsdelf*) Add support for EABI configuration
config.host (arm*-*-netbsd*): Build driver-arm.o
config/arm/netbsd-eabi.h: New file.
config/arm/netbsd-elf.h
config/netbsd-elf.h: Define SUBTARGET_EXTRA_SPECS.

libgcc:

config.host (arm*-*-netbsdelf*): Add support for EABI configuration
config/arm/t-netbsd: LIB1ASMFUNCS: Append to existing set.
		     HOST_LIBGCC2_CFLAGS: workaround possible bug
config/arm/t-netbsd-eabi: New file.
From c138b94b036e1485ed71c57966894e80f84fea1a Mon Sep 17 00:00:00 2001
From: coypu <coypu@sdf.org>
Date: Wed, 31 Oct 2018 00:33:06 +0200
Subject: [PATCH 1/1] netbsd eabi

Now with:
armv4 isn't needed as a separate case, because strongarm is the
default for all netbsd. it makes no difference otherwise.

-mfpu=auto

cleaned up things as requested by richard earnshaw.

tested: armv6,7 hf.
---
 gcc/config.gcc                  | 29 +++++++++-
 gcc/config.host                 |  2 +-
 gcc/config/arm/netbsd-eabi.h    | 97 +++++++++++++++++++++++++++++++++
 gcc/config/arm/netbsd-elf.h     | 10 ++++
 gcc/config/netbsd-elf.h         | 15 +++++
 libgcc/config.host              | 10 +++-
 libgcc/config/arm/t-netbsd      | 10 +++-
 libgcc/config/arm/t-netbsd-eabi | 18 ++++++
 8 files changed, 184 insertions(+), 7 deletions(-)
 create mode 100644 gcc/config/arm/netbsd-eabi.h
 create mode 100644 libgcc/config/arm/t-netbsd-eabi

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 3ee31c5993d..736b2163a24 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1161,10 +1161,33 @@ arm*-*-freebsd*)                # ARM FreeBSD EABI
 	with_tls=${with_tls:-gnu}
 	;;
 arm*-*-netbsdelf*)
-	tm_file="dbxelf.h elfos.h ${nbsd_tm_file} arm/elf.h arm/aout.h ${tm_file} arm/netbsd-elf.h"
-	extra_options="${extra_options} netbsd.opt netbsd-elf.opt"
-	tmake_file="${tmake_file} arm/t-arm"
 	target_cpu_cname="strongarm"
+ 	tmake_file="${tmake_file} arm/t-arm"
+	tm_file="dbxelf.h elfos.h ${nbsd_tm_file} arm/elf.h"
+	extra_options="${extra_options} netbsd.opt netbsd-elf.opt"
+	case ${target} in
+	arm*eb-*) tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1" ;;
+	esac
+	case ${target} in
+	arm*-*-netbsdelf-*eabi*)
+	    tm_file="$tm_file arm/bpabi.h arm/netbsd-elf.h arm/netbsd-eabi.h"
+	    tmake_file="$tmake_file arm/t-bpabi arm/t-netbsdeabi"
+	    ;;
+	*)
+	    tm_file="$tm_file arm/netbsd-elf.h"
+	    tmake_file="$tmake_file arm/t-netbsd"
+	    ;;
+	esac
+	tm_file="${tm_file} arm/aout.h arm/arm.h"
+	case ${target} in
+	arm*-*-netbsdelf-*eabihf*)
+	    tm_defines="${tm_defines} TARGET_DEFAULT_FLOAT_ABI=ARM_FLOAT_ABI_HARD"
+	    ;;
+	esac
+	case ${target} in
+	armv6*) target_cpu_cname="arm1176jzf-s";;
+	armv7*) target_cpu_cname="generic-armv7-a";;
+	esac
 	;;
 arm*-*-linux-*)			# ARM GNU/Linux with ELF
 	tm_file="dbxelf.h elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h arm/elf.h arm/linux-gas.h arm/linux-elf.h"
diff --git a/gcc/config.host b/gcc/config.host
index 816a0f06cb7..5077c0ee33a 100644
--- a/gcc/config.host
+++ b/gcc/config.host
@@ -107,7 +107,7 @@ case ${host} in
 	;;
     esac
     ;;
-  arm*-*-freebsd* | arm*-*-linux* | arm*-*-fuchsia*)
+  arm*-*-freebsd* | arm*-*-netbsd* | arm*-*-linux* | arm*-*-fuchsia*)
     case ${target} in
       arm*-*-*)
 	host_extra_gcc_objs="driver-arm.o"
diff --git a/gcc/config/arm/netbsd-eabi.h b/gcc/config/arm/netbsd-eabi.h
new file mode 100644
index 00000000000..13bc274175d
--- /dev/null
+++ b/gcc/config/arm/netbsd-eabi.h
@@ -0,0 +1,97 @@
+/* Definitions of target machine for GNU compiler, NetBSD/arm ELF version.
+   Copyright (C) 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
+   Contributed by Wasabi Systems, Inc.
+
+   This file is part of GCC.
+
+   GCC 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 3, or (at your
+   option) any later version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+/* Run-time Target Specification.  */
+#undef MULTILIB_DEFAULTS
+#define MULTILIB_DEFAULTS { "mabi=aapcs-linux" }
+
+#define TARGET_LINKER_EABI_SUFFIX \
+    (TARGET_DEFAULT_FLOAT_ABI == ARM_FLOAT_ABI_SOFT \
+     ? "%{!mabi=apcs-gnu:%{!mabi=atpcs:%{mfloat-abi=hard:_eabihf;:_eabi}}}" \
+     : "%{!mabi=apcs-gnu:%{!mabi=atpcs:%{mfloat-abi=soft:_eabi;:_eabihf}}}")
+#define TARGET_LINKER_BIG_EMULATION "armelfb_nbsd%(linker_eabi_suffix)"
+#define TARGET_LINKER_LITTLE_EMULATION "armelf_nbsd%(linker_eabi_suffix)"
+
+/* TARGET_BIG_ENDIAN_DEFAULT is set in
+   config.gcc for big endian configurations.  */
+#undef  TARGET_LINKER_EMULATION
+#if TARGET_BIG_ENDIAN_DEFAULT
+#define TARGET_LINKER_EMULATION TARGET_LINKER_BIG_EMULATION
+#else
+#define TARGET_LINKER_EMULATION TARGET_LINKER_LITTLE_EMULATION
+#endif
+
+#undef ARM_DEFAULT_ABI
+#define ARM_DEFAULT_ABI ARM_ABI_AAPCS_LINUX
+
+#undef ARM_UNWIND_INFO
+#define ARM_UNWIND_INFO 0
+#undef DWARF2_UNWIND_INFO
+#define DWARF2_UNWIND_INFO 1
+
+#undef TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS()		\
+  do						\
+    {						\
+      if (TARGET_AAPCS_BASED)			\
+	TARGET_BPABI_CPP_BUILTINS();		\
+      NETBSD_OS_CPP_BUILTINS_ELF();		\
+      if (DWARF2_UNWIND_INFO)			\
+	builtin_define ("__ARM_DWARF_EH__");	\
+    }						\
+  while (0)
+
+#undef SUBTARGET_CPP_SPEC
+#define SUBTARGET_CPP_SPEC NETBSD_CPP_SPEC
+
+/*
+ * Override AAPCS types to remain compatible the existing NetBSD types.
+ */
+#undef WCHAR_TYPE
+#define WCHAR_TYPE "int"
+
+#undef SIZE_TYPE
+#define SIZE_TYPE "long unsigned int"
+ 
+#undef PTRDIFF_TYPE
+#define PTRDIFF_TYPE "long int"
+
+#undef SUBTARGET_EXTRA_ASM_SPEC
+#define SUBTARGET_EXTRA_ASM_SPEC	\
+  "-matpcs %{mabi=apcs-gnu|mabi=atpcs:-meabi=gnu} %{fpic|fpie:-k} %{fPIC|fPIE:-k}"
+
+#undef SUBTARGET_EXTRA_SPECS
+#define SUBTARGET_EXTRA_SPECS				\
+  { "subtarget_extra_asm_spec",	SUBTARGET_EXTRA_ASM_SPEC }, \
+  { "linker_eabi_suffix",	TARGET_LINKER_EABI_SUFFIX }, \
+  { "linker_emulation",		TARGET_LINKER_EMULATION }, \
+  { "linker_big_emulation",	TARGET_LINKER_BIG_EMULATION }, \
+  { "linker_little_emulation",	TARGET_LINKER_LITTLE_EMULATION }, \
+  { "target_fix_v4bx_spec",	TARGET_FIX_V4BX_SPEC }, \
+  NETBSD_SUBTARGET_EXTRA_SPECS
+
+#define NETBSD_ENTRY_POINT "__start"
+
+#undef LINK_SPEC
+#define LINK_SPEC \
+  "-X %{mbig-endian:-EB -m %(linker_big_emulation)} \
+   %{mlittle-endian:-EL -m %(linker_liitle_emulation)} \
+   %{!mbig-endian:%{!mlittle-endian:-m %(linker_emulation)}} \
+   %(target_fix_v4bx_spec) %(netbsd_link_spec)"
diff --git a/gcc/config/arm/netbsd-elf.h b/gcc/config/arm/netbsd-elf.h
index 5fcb543ed5f..0721ebd6a39 100644
--- a/gcc/config/arm/netbsd-elf.h
+++ b/gcc/config/arm/netbsd-elf.h
@@ -43,6 +43,7 @@
 #undef ARM_DEFAULT_ABI
 #define ARM_DEFAULT_ABI ARM_ABI_ATPCS
 
+#undef TARGET_OS_CPP_BUILTINS
 #define TARGET_OS_CPP_BUILTINS()	\
   do					\
     {					\
@@ -153,3 +154,12 @@ do									\
     (void) sysarch (0, &s);						\
   }									\
 while (0)
+
+/* Ensure that libgcc does not attempt to define __[CD]TOR_LIST__[] for APCS,
+ *    which belongs in crtbegin on NetBSD.  */
+#ifndef __ARM_EABI__
+#define CTOR_LISTS_DEFINED_EXTERNALLY
+#endif
+
+#undef FPUTYPE_DEFAULT
+#define FPUTYPE_DEFAULT "vfp"
diff --git a/gcc/config/netbsd-elf.h b/gcc/config/netbsd-elf.h
index e35758b9abc..ff722de0d53 100644
--- a/gcc/config/netbsd-elf.h
+++ b/gcc/config/netbsd-elf.h
@@ -1,4 +1,5 @@
 /* Common configuration file for NetBSD ELF targets.
+
    Copyright (C) 2002-2019 Free Software Foundation, Inc.
    Contributed by Wasabi Systems, Inc.
 
@@ -73,6 +74,9 @@ along with GCC; see the file COPYING3.  If not see
 
    Target-specific code must provide the %(netbsd_entry_point) spec.  */
 
+#define NETBSD_LINK_LD_ELF_SO_SPEC \
+  "%{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}"
+
 #define NETBSD_LINK_SPEC_ELF \
   "%{assert*} %{R*} %{rpath*} \
    %{shared:-shared} \
@@ -87,6 +91,17 @@ along with GCC; see the file COPYING3.  If not see
        -dynamic-linker /usr/libexec/ld.elf_so} \
      %{static:-static}}"
 
+/* Provide the standard list of subtarget extra specs for NetBSD targets.  */
+#define NETBSD_SUBTARGET_EXTRA_SPECS \
+  { "netbsd_link_ld_elf_so",    NETBSD_LINK_LD_ELF_SO_SPEC }, \
+  { "netbsd_cpp_spec",          NETBSD_CPP_SPEC }, \
+  { "netbsd_link_spec",         NETBSD_LINK_SPEC_ELF }, \
+  { "netbsd_entry_point",       NETBSD_ENTRY_POINT }, \
+  { "netbsd_endfile_spec",      NETBSD_ENDFILE_SPEC },
+
+#undef SUBTARGET_EXTRA_SPECS
+#define SUBTARGET_EXTRA_SPECS   NETBSD_SUBTARGET_EXTRA_SPECS
+
 /* Use --as-needed -lgcc_s for eh support.  */
 #ifdef HAVE_LD_AS_NEEDED
 #define USE_LD_AS_NEEDED 1
diff --git a/libgcc/config.host b/libgcc/config.host
index 91abc84da03..ccf85bf900a 100644
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -433,7 +433,15 @@ arm*-*-fuchsia*)
 	unwind_header=config/arm/unwind-arm.h
 	;;
 arm*-*-netbsdelf*)
-	tmake_file="$tmake_file arm/t-arm arm/t-netbsd t-slibgcc-gld-nover"
+	tmake_file="$tmake_file arm/t-arm"
+	case ${host} in
+	  arm*-*-netbsdelf-*eabi*)
+	    tmake_file="${tmake_file} arm/t-netbsd-eabi"
+	    ;;
+	  *)
+	    tmake_file="${tmake_file} arm/t-netbsd t-slibgcc-gld-nover"
+	    ;;
+	esac
 	;;
 arm*-*-linux*)			# ARM GNU/Linux with ELF
 	tmake_file="${tmake_file} arm/t-arm t-fixedpoint-gnu-prefix t-crtfm"
diff --git a/libgcc/config/arm/t-netbsd b/libgcc/config/arm/t-netbsd
index 95358f931ba..eef6926c20d 100644
--- a/libgcc/config/arm/t-netbsd
+++ b/libgcc/config/arm/t-netbsd
@@ -1,7 +1,13 @@
+# This list is from t-elf, but with some things removed.
+LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func \
+	_call_via_rX _interwork_call_via_rX \
+	_arm_fixunsdfsi _arm_fixunssfsi \
+	_arm_floatdidf _arm_floatdisf _arm_floatundidf _arm_floatundisf \
+	_lshrdi3 _ashrdi3 _ashldi3 \
+	_clzsi2 _clzdi2 _ctzsi2
+
 # Just for these, we omit the frame pointer since it makes such a big
 # difference.  It is then pointless adding debugging.
 HOST_LIBGCC2_CFLAGS += -fomit-frame-pointer
 
-LIBGCC2_DEBUG_CFLAGS = -g0
-
 LIB2ADD += $(srcdir)/floatunsidf.c $(srcdir)/floatunsisf.c
diff --git a/libgcc/config/arm/t-netbsd-eabi b/libgcc/config/arm/t-netbsd-eabi
new file mode 100644
index 00000000000..ae08ea43ef7
--- /dev/null
+++ b/libgcc/config/arm/t-netbsd-eabi
@@ -0,0 +1,18 @@
+# This list is from t-elf, but with lots removed.
+LIB1ASMFUNCS += _dvmd_tls _bb_init_func _call_via_rX _interwork_call_via_rX \
+        _clzsi2 _clzdi2 _ctzsi2
+
+# Derived from t-bpabi
+# Add the BPABI C functions.
+LIB2ADD +=    $(srcdir)/config/arm/unaligned-funcs.c
+
+# Not using libgcc for EH.
+LIB2ADDEH =
+
+# Add the BPABI names.
+SHLIB_MAPFILES += $(srcdir)/config/arm/libgcc-bpabi.ver
+
+# On ARM, specifying -fnon-call-exceptions will needlessly pull in
+# the unwinder in simple programs which use 64-bit division.  Omitting
+# the option is safe.
+LIB2_DIVMOD_EXCEPTION_FLAGS := -fexceptions
Maya Rashish March 8, 2019, 9:56 a.m. UTC | #6
Ping.

Link for possible convenience :-)
https://gcc.gnu.org/ml/gcc-patches/2019-02/msg01899.html
Maya Rashish March 21, 2019, 12:43 a.m. UTC | #7
More pings!

On Fri, Mar 08, 2019 at 09:56:05AM +0000, coypu@sdf.org wrote:
> Ping.
> 
> Link for possible convenience :-)
> https://gcc.gnu.org/ml/gcc-patches/2019-02/msg01899.html
diff mbox series

Patch

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 8521f7d556e..e749c61e75f 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1130,10 +1130,37 @@  arm*-*-freebsd*)                # ARM FreeBSD EABI
 	with_tls=${with_tls:-gnu}
 	;;
 arm*-*-netbsdelf*)
-	tm_file="dbxelf.h elfos.h ${nbsd_tm_file} arm/elf.h arm/aout.h ${tm_file} arm/netbsd-elf.h"
-	extra_options="${extra_options} netbsd.opt netbsd-elf.opt"
 	tmake_file="${tmake_file} arm/t-arm"
-	target_cpu_cname="arm6"
+	tm_file="dbxelf.h elfos.h ${nbsd_tm_file} arm/elf.h"
+	extra_options="${extra_options} netbsd.opt netbsd-elf.opt"
+	case ${target} in
+	arm*eb-*) tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1" ;;
+	esac
+	case ${target} in
+	arm*-*-netbsdelf-*eabi*)
+	    tm_file="$tm_file arm/bpabi.h arm/netbsd-elf.h arm/netbsd-eabi.h"
+	    tmake_file="$tmake_file arm/t-bpabi arm/t-netbsdeabi"
+	    # The BPABI long long divmod functions return a 128-bit value in
+	    # registers r0-r3.  Correctly modeling that requires the use of
+	    # TImode.
+	    need_64bit_hwint=yes
+	    ;;
+	*)
+	    tm_file="$tm_file arm/netbsd-elf.h"
+	    tmake_file="$tmake_file arm/t-netbsd"
+	    ;;
+	esac
+	tm_file="${tm_file} arm/aout.h arm/arm.h"
+	case ${target} in
+	arm*-*-netbsdelf-*eabihf*)
+	    tm_defines="${tm_defines} TARGET_DEFAULT_FLOAT_ABI=ARM_FLOAT_ABI_HARD"
+	    ;;
+	esac
+	case ${target} in
+	armv4*) target_cpu_cname="strongarm";;
+	armv6*) target_cpu_cname="arm1176jzf-s";;
+	armv7*) target_cpu_cname="cortex-a8";;
+	esac
 	;;
 arm*-*-linux-*)			# ARM GNU/Linux with ELF
 	tm_file="dbxelf.h elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h arm/elf.h arm/linux-gas.h arm/linux-elf.h"
diff --git a/gcc/config.host b/gcc/config.host
index c65569da2e9..59208d2508f 100644
--- a/gcc/config.host
+++ b/gcc/config.host
@@ -107,7 +107,7 @@  case ${host} in
 	;;
     esac
     ;;
-  arm*-*-freebsd* | arm*-*-linux* | arm*-*-fuchsia*)
+  arm*-*-freebsd* | arm*-*-netbsd* | arm*-*-linux* | arm*-*-fuchsia*)
     case ${target} in
       arm*-*-*)
 	host_extra_gcc_objs="driver-arm.o"
diff --git a/gcc/config/arm/netbsd-eabi.h b/gcc/config/arm/netbsd-eabi.h
new file mode 100644
index 00000000000..92f31b885f0
--- /dev/null
+++ b/gcc/config/arm/netbsd-eabi.h
@@ -0,0 +1,108 @@ 
+/* Definitions of target machine for GNU compiler, NetBSD/arm ELF version.
+   Copyright (C) 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
+   Contributed by Wasabi Systems, Inc.
+
+   This file is part of GCC.
+
+   GCC 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 3, or (at your
+   option) any later version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+/* Run-time Target Specification.  */
+#undef MULTILIB_DEFAULTS
+#define MULTILIB_DEFAULTS { "mabi=aapcs-linux" }
+
+#define TARGET_LINKER_EABI_SUFFIX \
+    (TARGET_DEFAULT_FLOAT_ABI == ARM_FLOAT_ABI_SOFT \
+     ? "%{!mabi=apcs-gnu:%{!mabi=atpcs:%{mfloat-abi=hard:_eabihf;:_eabi}}}" \
+     : "%{!mabi=apcs-gnu:%{!mabi=atpcs:%{mfloat-abi=soft:_eabi;:_eabihf}}}")
+#define TARGET_LINKER_BIG_EMULATION "armelfb_nbsd%(linker_eabi_suffix)"
+#define TARGET_LINKER_LITTLE_EMULATION "armelf_nbsd%(linker_eabi_suffix)"
+
+/* TARGET_BIG_ENDIAN_DEFAULT is set in
+   config.gcc for big endian configurations.  */
+#undef  TARGET_LINKER_EMULATION
+#if TARGET_BIG_ENDIAN_DEFAULT
+#define TARGET_LINKER_EMULATION TARGET_LINKER_BIG_EMULATION
+#undef BE8_LINK_SPEC
+#define BE8_LINK_SPEC " %{!mlittle-endian:%{march=armv7-a|mcpu=cortex-a5|mcpu=cortex-a8|mcpu=cortex-a9:%{!r:--be8}}}" 
+#else
+#define TARGET_LINKER_EMULATION TARGET_LINKER_LITTLE_EMULATION
+#endif
+
+#undef ARM_DEFAULT_ABI
+#define ARM_DEFAULT_ABI ARM_ABI_AAPCS_LINUX
+
+#undef ARM_UNWIND_INFO
+#define ARM_UNWIND_INFO 0
+#undef DWARF2_UNWIND_INFO
+#define DWARF2_UNWIND_INFO 1
+
+#undef TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS()		\
+  do						\
+    {						\
+      if (TARGET_AAPCS_BASED)			\
+	TARGET_BPABI_CPP_BUILTINS();		\
+      NETBSD_OS_CPP_BUILTINS_ELF();		\
+      if (DWARF2_UNWIND_INFO)			\
+	builtin_define ("__ARM_DWARF_EH__");	\
+    }						\
+  while (0)
+
+#undef SUBTARGET_CPP_SPEC
+#define SUBTARGET_CPP_SPEC NETBSD_CPP_SPEC
+
+/*
+ * Override AAPCS types to remain compatible the existing NetBSD types.
+ */
+#undef WCHAR_TYPE
+#define WCHAR_TYPE "int"
+
+#undef SIZE_TYPE
+#define SIZE_TYPE "long unsigned int"
+ 
+#undef PTRDIFF_TYPE
+#define PTRDIFF_TYPE "long int"
+
+#undef SUBTARGET_EXTRA_ASM_SPEC
+#define SUBTARGET_EXTRA_ASM_SPEC	\
+  "-matpcs %{mabi=apcs-gnu|mabi=atpcs:-meabi=gnu} %{fpic|fpie:-k} %{fPIC|fPIE:-k}"
+
+/* Default to full VFP if -mhard-float is specified.  */
+#undef SUBTARGET_ASM_FLOAT_SPEC
+#define SUBTARGET_ASM_FLOAT_SPEC	\
+  "%{mhard-float:%{!mfpu=*:-mfpu=vfp}}   \
+   %{mfloat-abi=hard:%{!mfpu=*:-mfpu=vfp}}"
+
+#undef SUBTARGET_EXTRA_SPECS
+#define SUBTARGET_EXTRA_SPECS				\
+  { "subtarget_extra_asm_spec",	SUBTARGET_EXTRA_ASM_SPEC }, \
+  { "subtarget_asm_float_spec", SUBTARGET_ASM_FLOAT_SPEC }, \
+  { "linker_eabi_suffix",	TARGET_LINKER_EABI_SUFFIX }, \
+  { "linker_emulation",		TARGET_LINKER_EMULATION }, \
+  { "linker_big_emulation",	TARGET_LINKER_BIG_EMULATION }, \
+  { "linker_little_emulation",	TARGET_LINKER_LITTLE_EMULATION }, \
+  { "be8_link_spec",		BE8_LINK_SPEC }, \
+  { "target_fix_v4bx_spec",	TARGET_FIX_V4BX_SPEC }, \
+  NETBSD_SUBTARGET_EXTRA_SPECS
+
+#define NETBSD_ENTRY_POINT "__start"
+
+#undef LINK_SPEC
+#define LINK_SPEC \
+  "-X %{mbig-endian:-EB -m %(linker_big_emulation)} \
+   %{mlittle-endian:-EL -m %(linker_liitle_emulation)} \
+   %{!mbig-endian:%{!mlittle-endian:-m %(linker_emulation)}} \
+   %(be8_link_spec) %(target_fix_v4bx_spec) \
+   %(netbsd_link_spec)"
diff --git a/gcc/config/arm/netbsd-elf.h b/gcc/config/arm/netbsd-elf.h
index 11247716cc4..c29ed3f5c2b 100644
--- a/gcc/config/arm/netbsd-elf.h
+++ b/gcc/config/arm/netbsd-elf.h
@@ -43,6 +43,7 @@ 
 #undef ARM_DEFAULT_ABI
 #define ARM_DEFAULT_ABI ARM_ABI_ATPCS
 
+#undef TARGET_OS_CPP_BUILTINS
 #define TARGET_OS_CPP_BUILTINS()	\
   do					\
     {					\
@@ -153,3 +154,12 @@  do									\
     (void) sysarch (0, &s);						\
   }									\
 while (0)
+
+/* Ensure that libgcc does not attempt to define __[CD]TOR_LIST__[] for APCS,
+ *    which belongs in crtbegin on NetBSD.  */
+#ifndef __ARM_EABI__
+#define CTOR_LISTS_DEFINED_EXTERNALLY
+#endif
+
+#undef FPUTYPE_DEFAULT
+#define FPUTYPE_DEFAULT "vfp"
diff --git a/gcc/config/netbsd-elf.h b/gcc/config/netbsd-elf.h
index 4dc2aa7579f..33677b126ca 100644
--- a/gcc/config/netbsd-elf.h
+++ b/gcc/config/netbsd-elf.h
@@ -1,4 +1,5 @@ 
 /* Common configuration file for NetBSD ELF targets.
+
    Copyright (C) 2002-2018 Free Software Foundation, Inc.
    Contributed by Wasabi Systems, Inc.
 
@@ -67,6 +68,9 @@  along with GCC; see the file COPYING3.  If not see
 
    Target-specific code must provide the %(netbsd_entry_point) spec.  */
 
+#define NETBSD_LINK_LD_ELF_SO_SPEC \
+  "%{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}"
+
 #define NETBSD_LINK_SPEC_ELF \
   "%{assert*} %{R*} %{rpath*} \
    %{shared:-shared} \
@@ -81,6 +85,17 @@  along with GCC; see the file COPYING3.  If not see
        -dynamic-linker /usr/libexec/ld.elf_so} \
      %{static:-static}}"
 
+/* Provide the standard list of subtarget extra specs for NetBSD targets.  */
+#define NETBSD_SUBTARGET_EXTRA_SPECS \
+  { "netbsd_link_ld_elf_so",    NETBSD_LINK_LD_ELF_SO_SPEC }, \
+  { "netbsd_cpp_spec",          NETBSD_CPP_SPEC }, \
+  { "netbsd_link_spec",         NETBSD_LINK_SPEC_ELF }, \
+  { "netbsd_entry_point",       NETBSD_ENTRY_POINT }, \
+  { "netbsd_endfile_spec",      NETBSD_ENDFILE_SPEC },
+
+#undef SUBTARGET_EXTRA_SPECS
+#define SUBTARGET_EXTRA_SPECS   NETBSD_SUBTARGET_EXTRA_SPECS
+
 /* Use --as-needed -lgcc_s for eh support.  */
 #ifdef HAVE_LD_AS_NEEDED
 #define USE_LD_AS_NEEDED 1
diff --git a/libgcc/config.host b/libgcc/config.host
index 029f6569caf..bcc754269ca 100644
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -422,7 +422,16 @@  arm*-*-fuchsia*)
 	unwind_header=config/arm/unwind-arm.h
 	;;
 arm*-*-netbsdelf*)
-	tmake_file="$tmake_file arm/t-arm arm/t-netbsd t-slibgcc-gld-nover"
+	tmake_file="$tmake_file arm/t-arm"
+	case ${host} in
+	  arm*-*-netbsdelf-*eabi*)
+	    tmake_file="${tmake_file} arm/t-netbsd-eabi"
+	    unwind_header=config/arm/unwind-arm.h
+	    ;;
+	  *)
+	    tmake_file="${tmake_file} arm/t-netbsd t-slibgcc-gld-nover"
+	    ;;
+	esac
 	;;
 arm*-*-linux*)			# ARM GNU/Linux with ELF
 	tmake_file="${tmake_file} arm/t-arm t-fixedpoint-gnu-prefix t-crtfm"
diff --git a/libgcc/config/arm/t-netbsd b/libgcc/config/arm/t-netbsd
index 95358f931ba..36ca3e6ea37 100644
--- a/libgcc/config/arm/t-netbsd
+++ b/libgcc/config/arm/t-netbsd
@@ -1,7 +1,18 @@ 
+# This list is from t-elf, but with some things removed.
+LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func \
+	_call_via_rX _interwork_call_via_rX \
+	_arm_fixunsdfsi _arm_fixunssfsi \
+	_arm_floatdidf _arm_floatdisf _arm_floatundidf _arm_floatundisf \
+	_lshrdi3 _ashrdi3 _ashldi3 \
+	_clzsi2 _clzdi2 _ctzsi2
+
 # Just for these, we omit the frame pointer since it makes such a big
 # difference.  It is then pointless adding debugging.
 HOST_LIBGCC2_CFLAGS += -fomit-frame-pointer
 
-LIBGCC2_DEBUG_CFLAGS = -g0
-
 LIB2ADD += $(srcdir)/floatunsidf.c $(srcdir)/floatunsisf.c
+
+# Currently there is a bug somewhere in GCC's alias analysis
+# or scheduling code that is breaking _fpmul_parts in fp-bit.c.
+# Disabling function inlining is a workaround for this problem.
+HOST_LIBGCC2_CFLAGS += -fno-inline
diff --git a/libgcc/config/arm/t-netbsd-eabi b/libgcc/config/arm/t-netbsd-eabi
new file mode 100644
index 00000000000..ae08ea43ef7
--- /dev/null
+++ b/libgcc/config/arm/t-netbsd-eabi
@@ -0,0 +1,18 @@ 
+# This list is from t-elf, but with lots removed.
+LIB1ASMFUNCS += _dvmd_tls _bb_init_func _call_via_rX _interwork_call_via_rX \
+        _clzsi2 _clzdi2 _ctzsi2
+
+# Derived from t-bpabi
+# Add the BPABI C functions.
+LIB2ADD +=    $(srcdir)/config/arm/unaligned-funcs.c
+
+# Not using libgcc for EH.
+LIB2ADDEH =
+
+# Add the BPABI names.
+SHLIB_MAPFILES += $(srcdir)/config/arm/libgcc-bpabi.ver
+
+# On ARM, specifying -fnon-call-exceptions will needlessly pull in
+# the unwinder in simple programs which use 64-bit division.  Omitting
+# the option is safe.
+LIB2_DIVMOD_EXCEPTION_FLAGS := -fexceptions