[NetBSD] Add support for the Arm EABI.

This is a roll-up of a set of changes needed to support the Arm EABI on NetBSD.

2019-06-14  Matt Thomas  <matt@3am-software.com>
	    Matthew Green  <mrg@eterna.com.au>
	    Nick Hudson  <skrll@netbsd.org>
	    Maya Rashish  <coypu@sdf.org>
	    Richard Earnshaw  <rearnsha@arm.com>

gcc:

	* config.gcc (arm*-*-netbsdelf*) Add support for EABI configuration.
	* config.host (arm*-*-netbsd*): Use driver-arm.o on native NetBSD.
	* config/arm/netbsd-eabi.h: New file.
	* config/arm/netbsd-elf.h (TARGET_OS_CPP_BUILTINS): Undefine before
	redefining.
	(SUBTARGET_EXTRA_ASM_SPEC): Don't pass -matpcs to the assembler.
	* config/netbsd-elf.h (NETBSD_LINK_LD_ELF_SO_SPEC): New define.
	(NETBSD_SUBTARGET_EXTRA_SPECS): New define.
	(SUBTARGET_EXTRA_SPECS): Define to NETBSD_SUBTARGET_EXTRA_SPECS.

libatomic:
	* configure.tgt (arm*): Handle NetBSD in the same way as FreeBSD.

libgcc:
	* config.host (arm*-*-netbsdelf*): Add support for EABI configurations.
	* config/arm/t-netbsd (LIB1ASMFUNCS): Add some additional assembler
	functions to build.
	* config/arm/t-netbsd-eabi: New file.


Co-Authored-By: Matthew Green <mrg@eterna.com.au>
Co-Authored-By: Maya Rashish <coypu@sdf.org>
Co-Authored-By: Nick Hudson <skrll@netbsd.org>
Co-Authored-By: Richard Earnshaw <rearnsha@arm.com>

From-SVN: r272290
This commit is contained in:
Matt Thomas 2019-06-14 14:04:20 +00:00 committed by Richard Earnshaw
parent cc28d23496
commit b27c108234
12 changed files with 231 additions and 18 deletions

View File

@ -1,3 +1,19 @@
2019-06-14 Matt Thomas <matt@3am-software.com>
Matthew Green <mrg@eterna.com.au>
Nick Hudson <skrll@netbsd.org>
Maya Rashish <coypu@sdf.org>
Richard Earnshaw <rearnsha@arm.com>
* config.gcc (arm*-*-netbsdelf*) Add support for EABI configuration.
* config.host (arm*-*-netbsd*): Use driver-arm.o on native NetBSD.
* config/arm/netbsd-eabi.h: New file.
* config/arm/netbsd-elf.h (TARGET_OS_CPP_BUILTINS): Undefine before
redefining.
(SUBTARGET_EXTRA_ASM_SPEC): Don't pass -matpcs to the assembler.
* config/netbsd-elf.h (NETBSD_LINK_LD_ELF_SO_SPEC): New define.
(NETBSD_SUBTARGET_EXTRA_SPECS): New define.
(SUBTARGET_EXTRA_SPECS): Define to NETBSD_SUBTARGET_EXTRA_SPECS.
2019-06-14 Richard Biener <rguenther@suse.de>
* tree-loop-distribution.c (classify_partition): Return

View File

@ -1162,10 +1162,35 @@ 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*)
# Hard-float requires at least Arm v5te
target_cpu_cname="arm10e"
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"

View File

@ -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"

View File

@ -0,0 +1,105 @@
/* 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_SOFT \
"%{!mabi=apcs-gnu:%{!mabi=atpcs:%{mfloat-abi=hard:_eabihf;:_eabi}}}"
#define TARGET_LINKER_EABI_SUFFIX_HARD \
"%{!mabi=apcs-gnu:%{!mabi=atpcs:%{mfloat-abi=soft:_eabi;:_eabihf}}}"
#define TARGET_LINKER_EABI_SUFFIX \
(TARGET_DEFAULT_FLOAT_ABI == ARM_FLOAT_ABI_SOFT \
? TARGET_LINKER_EABI_SUFFIX_SOFT \
: TARGET_LINKER_EABI_SUFFIX_HARD)
#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 \
"%{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)"

View File

@ -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 \
{ \
@ -55,7 +56,7 @@
#undef SUBTARGET_EXTRA_ASM_SPEC
#define SUBTARGET_EXTRA_ASM_SPEC \
"-matpcs %{" FPIE_OR_FPIC_SPEC ":-k}"
"%{" FPIE_OR_FPIC_SPEC ":-k}"
/* Default to full VFP if -mfloat-abi=hard is specified. */
#undef SUBTARGET_ASM_FLOAT_SPEC

View File

@ -73,6 +73,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 +90,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

View File

@ -1,3 +1,10 @@
2019-06-14 Matt Thomas <matt@3am-software.com>
Matthew Green <mrg@eterna.com.au>
Nick Hudson <skrll@netbsd.org>
Maya Rashish <coypu@sdf.org>
* configure.tgt (arm*): Handle NetBSD in the same way as FreeBSD.
2019-01-01 Jakub Jelinek <jakub@redhat.com>
Update copyright years.

View File

@ -53,7 +53,7 @@ case "${target_cpu}" in
arm*)
ARCH=arm
case "${target}" in
arm*-*-freebsd*)
arm*-*-freebsd* | arm*-*-netbsd*)
;;
*)
# ??? Detect when -march=armv7 is already enabled.

View File

@ -1,3 +1,13 @@
2019-06-14 Matt Thomas <matt@3am-software.com>
Matthew Green <mrg@eterna.com.au>
Nick Hudson <skrll@netbsd.org>
Maya Rashish <coypu@sdf.org>
* config.host (arm*-*-netbsdelf*): Add support for EABI configurations.
* config/arm/t-netbsd (LIB1ASMFUNCS): Add some additional assembler
functions to build.
* config/arm/t-netbsd-eabi: New file.
2019-06-12 Dimitar Dimitrov <dimitar@dinux.eu>
* config.host: Add PRU target.

View File

@ -436,7 +436,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"

View File

@ -1,3 +1,11 @@
# 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

View File

@ -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