[AArch64, gas] Support ILP32 triplet aarch64*-linux-gnu_ilp32

This patch allows AArch64 GAS defaulting to ILP32 if it is configured with
aarch64*-linux-gnu_ilp32.

"md_after_parse_args" is implemented to update ABI into ILP32 if DEFAULT_ARCH is
"aarch64:32".

gas/
	* configure.tgt: Set "arch" to "aarch64" if ${cpu} equals "aarch64".
	Recognize the new triplet name aarch64*-linux-gnu_ilp32.
	* configure.ac: Output DEFAULT_ARCH macro for AArch64.
	* configure: Regenerate.
	* config/tc-aarch64.h (aarch64_after_parse_args): New declaration.
	(md_after_parse_args): New define.
	* config/tc-aarch64.c (aarch64_abi_type): New enumeration
	AARCH64_ABI_NONE.
	(DEFAULT_ARCH): New define.
	(aarch64_abi): Set default value to AARCH64_ABI_NONE.
	(aarch64_after_parse_args): New function.
This commit is contained in:
Jiong Wang 2017-05-22 09:50:19 +01:00
parent e11b3cdc56
commit 3c0367d0e2
6 changed files with 52 additions and 8 deletions

View File

@ -1,3 +1,17 @@
2017-05-22 Jiong Wang <jiong.wang@arm.com>
* configure.tgt: Set "arch" to "aarch64" if ${cpu} equals "aarch64".
Recognize the new triplet name aarch64*-linux-gnu_ilp32.
* configure.ac: Output DEFAULT_ARCH macro for AArch64.
* configure: Regenerate.
* config/tc-aarch64.h (aarch64_after_parse_args): New declaration.
(md_after_parse_args): New define.
* config/tc-aarch64.c (aarch64_abi_type): New enumeration
AARCH64_ABI_NONE.
(DEFAULT_ARCH): New define.
(aarch64_abi): Set default value to AARCH64_ABI_NONE.
(aarch64_after_parse_args): New function.
2017-05-19 Jose E. Marchesi <jose.marchesi@oracle.com>
* config/tc-sparc.c (sparc_arch_table): Entries for `sparc6',

View File

@ -62,12 +62,20 @@ static symbolS *GOT_symbol;
/* Which ABI to use. */
enum aarch64_abi_type
{
AARCH64_ABI_LP64 = 0,
AARCH64_ABI_ILP32 = 1
AARCH64_ABI_NONE = 0,
AARCH64_ABI_LP64 = 1,
AARCH64_ABI_ILP32 = 2
};
#ifndef DEFAULT_ARCH
#define DEFAULT_ARCH "aarch64"
#endif
/* DEFAULT_ARCH is initialized in gas/configure.tgt. */
static const char *default_arch = DEFAULT_ARCH;
/* AArch64 ABI for the output file. */
static enum aarch64_abi_type aarch64_abi = AARCH64_ABI_LP64;
static enum aarch64_abi_type aarch64_abi = AARCH64_ABI_NONE;
/* When non-zero, program to a 32-bit model, in which the C data types
int, long and all pointer types are 32-bit objects (ILP32); or to a
@ -7975,6 +7983,22 @@ aarch64_force_relocation (struct fix *fixp)
#ifdef OBJ_ELF
/* Implement md_after_parse_args. This is the earliest time we need to decide
ABI. If no -mabi specified, the ABI will be decided by target triplet. */
void
aarch64_after_parse_args (void)
{
if (aarch64_abi != AARCH64_ABI_NONE)
return;
/* DEFAULT_ARCH will have ":32" extension if it's configured for ILP32. */
if (strlen (default_arch) > 7 && strcmp (default_arch + 7, ":32") == 0)
aarch64_abi = AARCH64_ABI_ILP32;
else
aarch64_abi = AARCH64_ABI_LP64;
}
const char *
elf64_aarch64_target_format (void)
{

View File

@ -192,6 +192,9 @@ struct aarch64_segment_info_type
#define tc_regname_to_dw2regnum tc_aarch64_regname_to_dw2regnum
#define tc_cfi_frame_initial_instructions tc_aarch64_frame_initial_instructions
extern void aarch64_after_parse_args (void);
#define md_after_parse_args() aarch64_after_parse_args ()
#else /* Not OBJ_ELF. */
#define GLOBAL_OFFSET_TABLE_NAME "__GLOBAL_OFFSET_TABLE_"
#endif

2
gas/configure vendored
View File

@ -12583,7 +12583,7 @@ $as_echo "#define NDS32_DEFAULT_AUDIO_EXT 1" >>confdefs.h
$as_echo "$enable_audio_ext" >&6; }
;;
i386 | riscv | s390 | sparc)
aarch64 | i386 | riscv | s390 | sparc)
if test $this_target = $target ; then
cat >>confdefs.h <<_ACEOF

View File

@ -511,7 +511,7 @@ changequote([,])dnl
AC_MSG_RESULT($enable_audio_ext)
;;
i386 | riscv | s390 | sparc)
aarch64 | i386 | riscv | s390 | sparc)
if test $this_target = $target ; then
AC_DEFINE_UNQUOTED(DEFAULT_ARCH, "${arch}", [Default architecture.])
fi

View File

@ -46,8 +46,8 @@ eval `echo $targ | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/cpu=\1 vendor=\2 os=\3/'`
# endian and arch.
# Note: This table is alpha-sorted, please try to keep it that way.
case ${cpu} in
aarch64) cpu_type=aarch64 endian=little ;;
aarch64_be) cpu_type=aarch64 endian=big ;;
aarch64) cpu_type=aarch64 endian=little arch=aarch64;;
aarch64_be) cpu_type=aarch64 endian=big arch=aarch64;;
alpha*) cpu_type=alpha ;;
am33_2.0) cpu_type=mn10300 endian=little ;;
arc*eb) cpu_type=arc endian=big ;;
@ -126,7 +126,10 @@ generic_target=${cpu_type}-$vendor-$os
case ${generic_target} in
aarch64*-*-elf*) fmt=elf;;
aarch64*-*-fuchsia*) fmt=elf;;
aarch64*-*-linux*) fmt=elf em=linux ;;
aarch64*-*-linux*) fmt=elf em=linux
case ${cpu}-${os} in
aarch64*-linux-gnu_ilp32) arch=aarch64:32 ;;
esac ;;
alpha-*-*vms*) fmt=evax ;;
alpha-*-osf*) fmt=ecoff ;;