[AArch64, gas] Support ILP32 triplet aarch64*-linux-gnu_ilp32
authorJiong Wang <jiong.wang@arm.com>
Mon, 22 May 2017 08:50:19 +0000 (09:50 +0100)
committerJiong Wang <jiong.wang@arm.com>
Mon, 22 May 2017 12:27:11 +0000 (13:27 +0100)
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.

gas/ChangeLog
gas/config/tc-aarch64.c
gas/config/tc-aarch64.h
gas/configure
gas/configure.ac
gas/configure.tgt

index 8fff0e41c2673f729d0e3a88a6e91c74e241b4db..58a3ffaf05c0a1c1a95cd45758a4f56d5207741b 100644 (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',
index 72b98fd10bf6e4d7f443bb499d8bba7500be7501..cdb2903521b5d242d0ff2a9bdd4a9277a9a23ebc 100644 (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)
 {
index 5bf1399bfd610b15ab952900af79a4b984b22f46..4aa34949e4eadc3aee6d8638b44705b487538757 100644 (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
index d3ae96e76cbed2582e1604945bf277ee01ae335d..96fa7cbaae8eb65d7ee4b28cd05f91e56d8cb265 100755 (executable)
@@ -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
index cc70aa733efdb4496b9e2582c01addb2df08709c..da161b78d8b595b08582d181343189387cb7dfb5 100644 (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
index ca58b69d001e307269ce12adc562433357255dab..9d5e781366ea0278149a4ffb69e7d653ccf7725c 100644 (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 ;;