This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch, AArch64] Add GAS target-specific command line option -mabi=<abi_name>


Hi,

This patch replaces the gas command line options -milp32 and -mlp64 with -mabi=ilp32 and -mabi=lp64 respectively. This will unify the ABI command line user interface with that of the compiler. Separate patch updating the compiler driver will be sent shortly.

OK for the trunk?

Thanks,
Yufeng


gas/

        * config/tc-aarch64.c (enum aarch64_abi_type): New enumeration tag.
        (AARCH64_ABI_LP64, AARCH64_ABI_ILP32): New enumerators.
        (aarch64_abi): New variable.
        (ilp32_p): Change to be a macro.
        (aarch64_opts): Remove the support for option -milp32 and -mlp64.
        (struct aarch64_option_abi_value_table): New struct.
        (aarch64_abis): New table.
        (aarch64_parse_abi): New function.
        (aarch64_long_opts): Add entry for -mabi=.
        * doc/as.texinfo (Target AArch64 options): Document -mabi.
        * doc/c-aarch64.texi: Likewise.

gas/testsuite/

        * gas/aarch64/ilp32-basic.d (#as): Update to use -mabi=ilp32.
diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c
index 7b21396..3978df2 100644
--- a/gas/config/tc-aarch64.c
+++ b/gas/config/tc-aarch64.c
@@ -61,11 +61,21 @@ static const aarch64_feature_set aarch64_arch_none = AARCH64_ARCH_NONE;
 /* Pre-defined "_GLOBAL_OFFSET_TABLE_"	*/
 static symbolS *GOT_symbol;
 
+/* Which ABI to use.  */
+enum aarch64_abi_type
+{
+  AARCH64_ABI_LP64 = 0,
+  AARCH64_ABI_ILP32 = 1
+};
+
+/* AArch64 ABI for the output file.  */
+static enum aarch64_abi_type aarch64_abi = AARCH64_ABI_LP64;
+
 /* 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
    64-bit model, in which the C int type is 32-bits but the C long type
    and all pointer types are 64-bit objects (LP64).  */
-static int ilp32_p = 0;
+#define ilp32_p		(aarch64_abi & AARCH64_ABI_ILP32)
 #endif
 
 enum neon_el_type
@@ -7090,10 +7100,6 @@ static struct aarch64_option_table aarch64_opts[] = {
   {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
   {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
    NULL},
-#ifdef OBJ_ELF
-  {"mlp64", N_("select the LP64 model"), &ilp32_p, 0, NULL},
-  {"milp32", N_("select the ILP32 model"), &ilp32_p, 1, NULL},
-#endif /* OBJ_ELF */
 #ifdef DEBUG_AARCH64
   {"mdebug-dump", N_("temporary switch for dumping"), &debug_dump, 1, NULL},
 #endif /* DEBUG_AARCH64 */
@@ -7312,7 +7318,47 @@ aarch64_parse_arch (char *str)
   return 0;
 }
 
+/* ABIs.  */
+struct aarch64_option_abi_value_table
+{
+  char *name;
+  enum aarch64_abi_type value;
+};
+
+static const struct aarch64_option_abi_value_table aarch64_abis[] = {
+  {"ilp32",		AARCH64_ABI_ILP32},
+  {"lp64",		AARCH64_ABI_LP64},
+  {NULL,		0}
+};
+
+static int
+aarch64_parse_abi (char *str)
+{
+  const struct aarch64_option_abi_value_table *opt;
+  size_t optlen = strlen (str);
+
+  if (optlen == 0)
+    {
+      as_bad (_("missing abi name `%s'"), str);
+      return 0;
+    }
+
+  for (opt = aarch64_abis; opt->name != NULL; opt++)
+    if (strlen (opt->name) == optlen && strncmp (str, opt->name, optlen) == 0)
+      {
+	aarch64_abi = opt->value;
+	return 1;
+      }
+
+  as_bad (_("unknown abi `%s'\n"), str);
+  return 0;
+}
+
 static struct aarch64_long_option_table aarch64_long_opts[] = {
+#ifdef OBJ_ELF
+  {"mabi=", N_("<abi name>\t  specify for ABI <abi name>"),
+   aarch64_parse_abi, NULL},
+#endif /* OBJ_ELF */
   {"mcpu=", N_("<cpu name>\t  assemble for CPU <cpu name>"),
    aarch64_parse_cpu, NULL},
   {"march=", N_("<arch name>\t  assemble for architecture <arch name>"),
diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo
index d1e397f..d0f8cb4 100644
--- a/gas/doc/as.texinfo
+++ b/gas/doc/as.texinfo
@@ -248,6 +248,7 @@ gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}.
 
 @emph{Target AArch64 options:}
    [@b{-EB}|@b{-EL}]
+   [@b{-mabi}=@var{ABI}]
 @end ifset
 @ifset ALPHA
 
diff --git a/gas/doc/c-aarch64.texi b/gas/doc/c-aarch64.texi
index 3939fee..2410dae 100644
--- a/gas/doc/c-aarch64.texi
+++ b/gas/doc/c-aarch64.texi
@@ -44,6 +44,12 @@ be marked as being encoded for a big-endian processor.
 This option specifies that the output generated by the assembler should
 be marked as being encoded for a little-endian processor.
 
+@cindex @code{-mabi=} command line option, AArch64
+@item -mabi=@var{abi}
+Specify which ABI the source code uses.  The recognized arguments
+are: @code{ilp32} and @code{lp64}, which decides the generated object
+file in ELF32 and ELF64 format respectively.  The default is @code{lp64}.
+
 @end table
 @c man end
 
diff --git a/gas/testsuite/gas/aarch64/ilp32-basic.d b/gas/testsuite/gas/aarch64/ilp32-basic.d
index b876c7a..2e5146a 100644
--- a/gas/testsuite/gas/aarch64/ilp32-basic.d
+++ b/gas/testsuite/gas/aarch64/ilp32-basic.d
@@ -1,4 +1,4 @@
-#as: -milp32
+#as: -mabi=ilp32
 #objdump: -dr
 
 .*:     file format elf32-.*aarch64

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]