This adds ABI flags to MIPS/ELF object files.
authorGavin Romig-Koch <gavin@redhat.com>
Tue, 15 Dec 1998 14:10:46 +0000 (14:10 +0000)
committerGavin Romig-Koch <gavin@redhat.com>
Tue, 15 Dec 1998 14:10:46 +0000 (14:10 +0000)
For bfd:
* elf32-mips.c (elf_mips_abi_name): New.
(_bfd_mips_elf_merge_private_bfd_data): Compare EF_MIPS_ABI flags.

For gas:
* config/tc-mips.c (mips_abi_string): New.
(md_parse_option,md_longopts): Add mabi.
(mips_elf_final_processing): Set e_flags based on mabi flag.

For gcc:
* config/mips/mips.h (GAS_ASM_SPEC): Pass mabi to gas.
(ABI_GAS_ASM_SPEC,abi_gas_asm_spec): New.
(EXTRA_SPECS): Added ABI_GAS_ASM_SPEC,abi_gas_asm_spec.

For include/elf:

* mips.h (EF_MIPS_ABI,E_MIPS_ABI_O32,E_MIPS_ABI_O64,
E_MIPS_ABI_EABI32,E_MIPS_ABI_EABI64):

bfd/ChangeLog
bfd/elf32-mips.c
gas/ChangeLog
gas/config/tc-mips.c
include/elf/ChangeLog
include/elf/mips.h

index 4b4fabd484625163d36bd35ca002c5a2278b7fee..7a39879c70ee13fe449c45747be51455f143b5a4 100644 (file)
@@ -1,3 +1,8 @@
+1998-12-15  Gavin Romig-Koch  <gavin@cygnus.com>
+
+       * elf32-mips.c (elf_mips_abi_name): New.
+       (_bfd_mips_elf_merge_private_bfd_data): Compare EF_MIPS_ABI flags.
+
 start-sanitize-vr4xxx
 1998-12-13  Gavin Romig-Koch  <gavin@cygnus.com>
 
index 70d12a910006b478dcb371b802af027f7922d519..b9f90fdafe987613ccdeed805ccd7e0d2813ef0b 100644 (file)
@@ -60,6 +60,7 @@ static int mips_elf_additional_program_headers PARAMS ((bfd *));
 static boolean mips_elf_modify_segment_map PARAMS ((bfd *));
 static INLINE int elf_mips_isa PARAMS ((flagword));
 static INLINE int elf_mips_mach PARAMS ((flagword));
+static INLINE char* elf_mips_abi_name PARAMS ((flagword));
 static boolean mips_elf32_section_from_shdr
   PARAMS ((bfd *, Elf32_Internal_Shdr *, char *));
 static boolean mips_elf32_section_processing
@@ -1716,6 +1717,29 @@ elf_mips_mach (flags)
   return 0;
 }
 
+/* Return printable name for ABI from flagword. */
+
+static INLINE char*
+elf_mips_abi_name (flags)
+     flagword flags;
+{
+  switch (flags & EF_MIPS_ABI)
+    {
+    case 0:
+      return "none";
+    case E_MIPS_ABI_O32:
+      return "O32";
+    case E_MIPS_ABI_O64:
+      return "O64";
+    case E_MIPS_ABI_EABI32:
+      return "EABI32";
+    case E_MIPS_ABI_EABI64:
+      return "EABI64";
+    default:
+      return "unknown abi";
+    }
+}
+
 /* A mapping from BFD reloc types to MIPS ELF reloc types.  */
 
 struct elf_reloc_map {
@@ -2388,6 +2412,24 @@ _bfd_mips_elf_merge_private_bfd_data (ibfd, obfd)
       old_flags &= ~ (EF_MIPS_ARCH | EF_MIPS_MACH);
     }
 
+  /* Compare ABI's */
+  if ((new_flags & EF_MIPS_ABI) != (old_flags & EF_MIPS_ABI))
+    {
+      /* Only error if both are set (to different values). */
+      if ((new_flags & EF_MIPS_ABI)
+         && (old_flags & EF_MIPS_ABI))
+       {
+         (*_bfd_error_handler)
+           (_("%s: ABI mismatch: linking %s module with previous %s modules"),
+            bfd_get_filename (ibfd),
+            elf_mips_abi_name (new_flags),
+            elf_mips_abi_name (old_flags));
+         ok = false;
+       }
+      new_flags &= ~EF_MIPS_ABI;
+      old_flags &= ~EF_MIPS_ABI;
+    }
+
   /* Warn about any other mismatches */
   if (new_flags != old_flags)
     {
index 3a6a5ecef65a63a9fd78b87356e2f0c1653bfaa7..253c06137c84e981a607c3895ea57ad6739c0bdd 100644 (file)
@@ -1,3 +1,9 @@
+1998-12-15  Gavin Romig-Koch  <gavin@cygnus.com>
+
+       * config/tc-mips.c (mips_abi_string): New.
+       (md_parse_option,md_longopts): Add mabi.
+       (mips_elf_final_processing): Set e_flags based on mabi flag.
+
 start-sanitize-vr4xxx
 1998-12-15  Gavin Romig-Koch  <gavin@cygnus.com>
 
index 674464e509e5284bed04cc5337c4a136f1d2d394..3de536d86e345ba495b54f56f35ffb405a49151a 100644 (file)
@@ -198,6 +198,9 @@ static int file_mips_isa;
 /* The CPU type as a number: 2000, 3000, 4000, 4400, etc.  */
 static int mips_cpu = -1;
 
+/* The argument of the -mabi= flag. */
+static char* mips_abi_string = 0;
+
 /* Whether the 4650 instructions (mad/madu) are permitted.  */
 static int mips_4650 = -1;
 
@@ -9449,8 +9452,8 @@ struct option md_longopts[] = {
   {"fix-4011-branch-bug", no_argument, NULL, OPTION_FIX_4011_BRANCH_BUG},
 #define OPTION_NO_FIX_4011_BRANCH_BUG (OPTION_MD_BASE + 35)
   {"no-fix-4011-branch-bug", no_argument, NULL, OPTION_NO_FIX_4011_BRANCH_BUG},
-  /* end-sanitize-branchbug4011 */
 
+  /* end-sanitize-branchbug4011 */
   /* start-sanitize-vr4xxx */
 #define OPTION_M4121 (OPTION_MD_BASE + 36)
   {"m4121", no_argument, NULL, OPTION_M4121},
@@ -9458,6 +9461,9 @@ struct option md_longopts[] = {
   {"no-m4121", no_argument, NULL, OPTION_NO_M4121},
 
   /* end-sanitize-vr4xxx */
+#define OPTION_MABI (OPTION_MD_BASE + 38)
+  {"mabi", required_argument, NULL, OPTION_MABI},
+
 #define OPTION_CALL_SHARED (OPTION_MD_BASE + 7)
 #define OPTION_NON_SHARED (OPTION_MD_BASE + 8)
 #define OPTION_XGOT (OPTION_MD_BASE + 19)
@@ -9868,6 +9874,16 @@ md_parse_option (c, arg)
       break;
 
       /* end-sanitize-branchbug4011 */
+
+    case OPTION_MABI:
+      if (strcmp (arg,"32") == 0
+         || strcmp (arg,"n32") == 0
+         || strcmp (arg,"64") == 0
+         || strcmp (arg,"o64") == 0
+         || strcmp (arg,"eabi") == 0)
+       mips_abi_string = arg;
+      break;
+
     default:
       return 0;
     }
@@ -12066,6 +12082,21 @@ mips_elf_final_processing ()
     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
   if (mips_pic != NO_PIC)
     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
+
+  /* Set the MIPS ELF ABI flags. */
+  if (mips_abi_string == 0)
+    ;
+  else if (strcmp (mips_abi_string,"32") == 0)
+    elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
+  else if (strcmp (mips_abi_string,"o64") == 0)
+    elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
+  else if (strcmp (mips_abi_string,"eabi") == 0)
+    {
+      if (mips_opts.isa > 2)
+       elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
+      else
+       elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
+    }
 }
 
 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
index d00a8eeed0adc7736364ea55a9e2e7b33347489c..8501c7920d518bcc0c6f1603b53d664b0b57e6fd 100644 (file)
@@ -1,3 +1,8 @@
+1998-12-15  Gavin Romig-Koch  <gavin@cygnus.com>
+
+       * mips.h (EF_MIPS_ABI,E_MIPS_ABI_O32,E_MIPS_ABI_O64,
+       E_MIPS_ABI_EABI32,E_MIPS_ABI_EABI64): 
+
 start-sanitize-vr4xxx
 1998-12-13  Gavin Romig-Koch  <gavin@cygnus.com>
 
index a895d597f33dc826b5e88600e38af19164e07f00..6d3816e7ca8e709969771b01d0cbcb91d5d10df8 100644 (file)
@@ -121,6 +121,22 @@ END_RELOC_NUMBERS
 /* -mips4 code.  */
 #define E_MIPS_ARCH_4          0x30000000
 
+/* The ABI of the file.  Also see EF_MIPS_ABI2 above. */
+#define EF_MIPS_ABI            0x0000F000
+
+/* The original o32 abi. */
+#define E_MIPS_ABI_O32          0x00001000
+
+/* O32 extended to work on 64 bit architectures */
+#define E_MIPS_ABI_O64          0x00002000
+
+/* EABI in 32 bit mode */
+#define E_MIPS_ABI_EABI32       0x00003000
+
+/* EABI in 64 bit mode */
+#define E_MIPS_ABI_EABI64       0x00004000
+
+
 /* Machine variant if we know it.  This field was invented at Cygnus,
    but it is hoped that other vendors will adopt it.  If some standard
    is developed, this code should be changed to follow it. */