* elf64-ppc.c: Use %T to print symbols names and remove redundant
[deliverable/binutils-gdb.git] / bfd / elfxx-mips.c
index cf1baa865e414a1187d8152e3299a10dfb6e4eb3..61bd4bcbd68d0bf16635d83dad2d3661023b3dae 100644 (file)
@@ -1,6 +1,6 @@
 /* MIPS-specific support for ELF
    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-   2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+   2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
    Free Software Foundation, Inc.
 
    Most of the information added by Ian Lance Taylor, Cygnus Support,
@@ -306,12 +306,12 @@ struct mips_elf_la25_stub {
 #define LA25_LUI(VAL) (0x3c190000 | (VAL))     /* lui t9,VAL */
 #define LA25_J(VAL) (0x08000000 | (((VAL) >> 2) & 0x3ffffff)) /* j VAL */
 #define LA25_ADDIU(VAL) (0x27390000 | (VAL))   /* addiu t9,t9,VAL */
-#define LA25_LUI_MICROMIPS_1(VAL) (0x41b9)     /* lui t9,VAL */
-#define LA25_LUI_MICROMIPS_2(VAL) (VAL)
-#define LA25_J_MICROMIPS_1(VAL) (0xd400 | (((VAL) >> 17) & 0x3ff)) /* j VAL */
-#define LA25_J_MICROMIPS_2(VAL) ((VAL) >> 1)
-#define LA25_ADDIU_MICROMIPS_1(VAL) (0x3339)   /* addiu t9,t9,VAL */
-#define LA25_ADDIU_MICROMIPS_2(VAL) (VAL)
+#define LA25_LUI_MICROMIPS(VAL)                                                \
+  (0x41b90000 | (VAL))                         /* lui t9,VAL */
+#define LA25_J_MICROMIPS(VAL)                                          \
+  (0xd4000000 | (((VAL) >> 1) & 0x3ffffff))    /* j VAL */
+#define LA25_ADDIU_MICROMIPS(VAL)                                      \
+  (0x33390000 | (VAL))                         /* addiu t9,t9,VAL */
 
 /* This structure is passed to mips_elf_sort_hash_table_f when sorting
    the dynamic symbols.  */
@@ -432,8 +432,8 @@ struct mips_elf_link_hash_table
   /* The size of the .compact_rel section (if SGI_COMPAT).  */
   bfd_size_type compact_rel_size;
 
-  /* This flag indicates that the value of DT_MIPS_RLD_MAP dynamic
-     entry is set to the address of __rld_obj_head as in IRIX5.  */
+  /* This flag indicates that the value of DT_MIPS_RLD_MAP dynamic entry
+     is set to the address of __rld_obj_head as in IRIX5 and IRIX6.  */
   bfd_boolean use_rld_obj_head;
 
   /* The  __rld_map or __rld_obj_head symbol. */
@@ -515,6 +515,22 @@ struct mips_htab_traverse_info
   bfd_boolean error;
 };
 
+/* MIPS ELF private object data.  */
+
+struct mips_elf_obj_tdata
+{
+  /* Generic ELF private object data.  */
+  struct elf_obj_tdata root;
+
+  /* Input BFD providing Tag_GNU_MIPS_ABI_FP attribute for output.  */
+  bfd *abi_fp_bfd;
+};
+
+/* Get MIPS ELF private object data from BFD's tdata.  */
+
+#define mips_elf_tdata(bfd) \
+  ((struct mips_elf_obj_tdata *) (bfd)->tdata.any)
+
 #define TLS_RELOC_P(r_type) \
   (r_type == R_MIPS_TLS_DTPMOD32               \
    || r_type == R_MIPS_TLS_DTPMOD64            \
@@ -1013,6 +1029,23 @@ static const bfd_vma mips_vxworks_shared_plt_entry[] =
   0x24180000   /* li t8, <pltindex>    */
 };
 \f
+/* microMIPS 32-bit opcode helper installer.  */
+
+static void
+bfd_put_micromips_32 (const bfd *abfd, bfd_vma opcode, bfd_byte *ptr)
+{
+  bfd_put_16 (abfd, (opcode >> 16) & 0xffff, ptr);
+  bfd_put_16 (abfd,  opcode        & 0xffff, ptr + 2);
+}
+
+/* microMIPS 32-bit opcode helper retriever.  */
+
+static bfd_vma
+bfd_get_micromips_32 (const bfd *abfd, const bfd_byte *ptr)
+{
+  return (bfd_get_16 (abfd, ptr) << 16) | bfd_get_16 (abfd, ptr + 2);
+}
+\f
 /* Look up an entry in a MIPS ELF linker hash table.  */
 
 #define mips_elf_link_hash_lookup(table, string, create, copy, follow) \
@@ -1098,6 +1131,15 @@ mips_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
   return (struct bfd_hash_entry *) ret;
 }
 
+/* Allocate MIPS ELF private object data.  */
+
+bfd_boolean
+_bfd_mips_elf_mkobject (bfd *abfd)
+{
+  return bfd_elf_allocate_object (abfd, sizeof (struct mips_elf_obj_tdata),
+                                 MIPS_ELF_DATA);
+}
+
 bfd_boolean
 _bfd_mips_elf_new_section_hook (bfd *abfd, asection *sec)
 {
@@ -5288,7 +5330,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
          if (h->call_stub != NULL && h->call_fp_stub != NULL)
            {
              asection *o;
-             
+
              sec = NULL;
              for (o = input_bfd->sections; o != NULL; o = o->next)
                {
@@ -5343,7 +5385,10 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
                                && (target_is_16_bit_code_p
                                    || target_is_micromips_code_p))));
 
-  local_p = h == NULL || SYMBOL_REFERENCES_LOCAL (info, &h->root);
+  local_p = (h == NULL
+            || (h->got_only_for_calls
+                ? SYMBOL_CALLS_LOCAL (info, &h->root)
+                : SYMBOL_REFERENCES_LOCAL (info, &h->root)));
 
   gp0 = _bfd_get_gp_value (input_bfd);
   gp = _bfd_get_gp_value (abfd);
@@ -5874,7 +5919,7 @@ mips_elf_obtain_contents (reloc_howto_type *howto,
 /* It has been determined that the result of the RELOCATION is the
    VALUE.  Use HOWTO to place VALUE into the output file at the
    appropriate position.  The SECTION is the section to which the
-   relocation applies.  
+   relocation applies.
    CROSS_MODE_JUMP_P is true if the relocation field
    is a MIPS16 or microMIPS jump to standard MIPS code, or vice versa.
 
@@ -5930,11 +5975,12 @@ mips_elf_perform_relocation (struct bfd_link_info *info,
          jalx_opcode = 0x1d;
        }
 
-      /* If the opcode is not JAL or JALX, there's a problem.  */
+      /* If the opcode is not JAL or JALX, there's a problem.  We cannot
+         convert J or JALS to JALX.  */
       if (!ok)
        {
          (*_bfd_error_handler)
-           (_("%B: %A+0x%lx: Direct jumps between ISA modes are not allowed; consider recompiling with interlinking enabled."),
+           (_("%B: %A+0x%lx: Unsupported jump between ISA modes; consider recompiling with interlinking enabled."),
             input_bfd,
             input_section,
             (unsigned long) relocation->r_offset);
@@ -6248,6 +6294,9 @@ _bfd_elf_mips_mach (flagword flags)
     case E_MIPS_MACH_5500:
       return bfd_mach_mips5500;
 
+    case E_MIPS_MACH_5900:
+      return bfd_mach_mips5900;
+
     case E_MIPS_MACH_9000:
       return bfd_mach_mips9000;
 
@@ -7247,7 +7296,7 @@ _bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
     return FALSE;
   htab->sstubs = s;
 
-  if ((IRIX_COMPAT (abfd) == ict_irix5 || IRIX_COMPAT (abfd) == ict_none)
+  if (!mips_elf_hash_table (info)->use_rld_obj_head
       && !info->shared
       && bfd_get_linker_section (abfd, ".rld_map") == NULL)
     {
@@ -7791,14 +7840,14 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
        {
          h = ((struct mips_elf_link_hash_entry *)
               sym_hashes[r_symndx - extsymoff]);
-         
+
          /* H is the symbol this stub is for.  */
-         
+
          if (CALL_FP_STUB_P (name))
            loc = &h->call_fp_stub;
          else
            loc = &h->call_stub;
-         
+
          /* If we already have an appropriate stub for this function, we
             don't need another one, so we can discard this one.  Since
             this function is called before the linker maps input sections
@@ -8522,7 +8571,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
   if (! info->relocatable
       && hmips->possibly_dynamic_relocs != 0
       && (h->root.type == bfd_link_hash_defweak
-         || !h->def_regular
+         || (!h->def_regular && !ELF_COMMON_DEF_P (h))
          || info->shared))
     {
       bfd_boolean do_copy = TRUE;
@@ -9261,7 +9310,7 @@ _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
 
          if (IRIX_COMPAT (dynobj) == ict_irix6
              && (bfd_get_section_by_name
-                 (dynobj, MIPS_ELF_OPTIONS_SECTION_NAME (dynobj)))
+                 (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (dynobj)))
              && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_OPTIONS, 0))
            return FALSE;
        }
@@ -9776,14 +9825,12 @@ mips_elf_create_la25_stub (void **slot, void *data)
       loc += offset;
       if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
        {
-         bfd_put_16 (hti->output_bfd, LA25_LUI_MICROMIPS_1 (target_high),
-                     loc);
-         bfd_put_16 (hti->output_bfd, LA25_LUI_MICROMIPS_2 (target_high),
-                     loc + 2);
-         bfd_put_16 (hti->output_bfd, LA25_ADDIU_MICROMIPS_1 (target_low),
-                     loc + 4);
-         bfd_put_16 (hti->output_bfd, LA25_ADDIU_MICROMIPS_2 (target_low),
-                     loc + 6);
+         bfd_put_micromips_32 (hti->output_bfd,
+                               LA25_LUI_MICROMIPS (target_high),
+                               loc);
+         bfd_put_micromips_32 (hti->output_bfd,
+                               LA25_ADDIU_MICROMIPS (target_low),
+                               loc + 4);
        }
       else
        {
@@ -9797,16 +9844,12 @@ mips_elf_create_la25_stub (void **slot, void *data)
       loc += offset;
       if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
        {
-         bfd_put_16 (hti->output_bfd, LA25_LUI_MICROMIPS_1 (target_high),
-                     loc);
-         bfd_put_16 (hti->output_bfd, LA25_LUI_MICROMIPS_2 (target_high),
-                     loc + 2);
-         bfd_put_16 (hti->output_bfd, LA25_J_MICROMIPS_1 (target), loc + 4);
-         bfd_put_16 (hti->output_bfd, LA25_J_MICROMIPS_2 (target), loc + 6);
-         bfd_put_16 (hti->output_bfd, LA25_ADDIU_MICROMIPS_1 (target_low),
-                     loc + 8);
-         bfd_put_16 (hti->output_bfd, LA25_ADDIU_MICROMIPS_2 (target_low),
-                     loc + 10);
+         bfd_put_micromips_32 (hti->output_bfd,
+                               LA25_LUI_MICROMIPS (target_high), loc);
+         bfd_put_micromips_32 (hti->output_bfd,
+                               LA25_J_MICROMIPS (target), loc + 4);
+         bfd_put_micromips_32 (hti->output_bfd,
+                               LA25_ADDIU_MICROMIPS (target_low), loc + 8);
          bfd_put_32 (hti->output_bfd, 0, loc + 12);
        }
       else
@@ -10114,7 +10157,7 @@ _bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
 
   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
   name = h->root.root.string;
-  if (strcmp (name, "_DYNAMIC") == 0
+  if (h == elf_hash_table (info)->hdynamic
       || h == elf_hash_table (info)->hgot)
     sym->st_shndx = SHN_ABS;
   else if (strcmp (name, "_DYNAMIC_LINK") == 0
@@ -10986,6 +11029,10 @@ mips_set_isa_flags (bfd *abfd)
       val = E_MIPS_ARCH_4 | E_MIPS_MACH_5500;
       break;
 
+    case bfd_mach_mips5900:
+      val = E_MIPS_ARCH_3 | E_MIPS_MACH_5900;
+      break;
+
     case bfd_mach_mips9000:
       val = E_MIPS_ARCH_4 | E_MIPS_MACH_9000;
       break;
@@ -12339,7 +12386,7 @@ check_br32_dslot (bfd *abfd, bfd_byte *ptr)
   unsigned long opcode;
   int bdsize;
 
-  opcode = (bfd_get_16 (abfd, ptr) << 16) | bfd_get_16 (abfd, ptr + 2);
+  opcode = bfd_get_micromips_32 (abfd, ptr);
   if (find_match (opcode, ds_insns_32_bd32) >= 0)
     /* 32-bit branch/jump with a 32-bit delay slot.  */
     bdsize = 4;
@@ -12384,7 +12431,7 @@ check_br32 (bfd *abfd, bfd_byte *ptr, unsigned long reg)
 {
   unsigned long opcode;
 
-  opcode = (bfd_get_16 (abfd, ptr) << 16) | bfd_get_16 (abfd, ptr + 2);
+  opcode = bfd_get_micromips_32 (abfd, ptr);
   if (MATCH (opcode, j_insn_32)
                                                /* J  */
       || MATCH (opcode, bc_insn_32)
@@ -12416,9 +12463,7 @@ check_relocated_bzc (bfd *abfd, const bfd_byte *ptr, bfd_vma offset,
   const Elf_Internal_Rela *irel;
   unsigned long opcode;
 
-  opcode   = bfd_get_16 (abfd, ptr);
-  opcode <<= 16;
-  opcode  |= bfd_get_16 (abfd, ptr + 2);
+  opcode = bfd_get_micromips_32 (abfd, ptr);
   if (find_match (opcode, bzc_insns_32) < 0)
     return FALSE;
 
@@ -12576,8 +12621,7 @@ _bfd_mips_elf_relax_section (bfd *abfd, asection *sec,
       if (irel->r_offset + 4 > sec->size)
        continue;
 
-      opcode  = bfd_get_16 (abfd, ptr    ) << 16;
-      opcode |= bfd_get_16 (abfd, ptr + 2);
+      opcode = bfd_get_micromips_32 (abfd, ptr);
 
       /* This is the pc-relative distance from the instruction the
          relocation is applied to, to the symbol referred.  */
@@ -12659,8 +12703,7 @@ _bfd_mips_elf_relax_section (bfd *abfd, asection *sec,
              continue;
            }
 
-         nextopc  = bfd_get_16 (abfd, contents + irel[1].r_offset    ) << 16;
-         nextopc |= bfd_get_16 (abfd, contents + irel[1].r_offset + 2);
+         nextopc = bfd_get_micromips_32 (abfd, contents + irel[1].r_offset);
 
          /* Give up unless the same register is used with both
             relocations.  */
@@ -12701,10 +12744,8 @@ _bfd_mips_elf_relax_section (bfd *abfd, asection *sec,
              nextopc = (addiupc_insn.match
                         | ADDIUPC_REG_FIELD (OP32_TREG (nextopc)));
 
-             bfd_put_16 (abfd, (nextopc >> 16) & 0xffff,
-                         contents + irel[1].r_offset);
-             bfd_put_16 (abfd,  nextopc        & 0xffff,
-                         contents + irel[1].r_offset + 2);
+             bfd_put_micromips_32 (abfd, nextopc,
+                                   contents + irel[1].r_offset);
            }
 
          /* Can't do anything, give up, sigh...  */
@@ -12738,8 +12779,7 @@ _bfd_mips_elf_relax_section (bfd *abfd, asection *sec,
                    | BZC32_REG_FIELD (reg)
                    | (opcode & 0xffff));               /* Addend value.  */
 
-         bfd_put_16 (abfd, (opcode >> 16) & 0xffff, ptr);
-         bfd_put_16 (abfd,  opcode        & 0xffff, ptr + 2);
+         bfd_put_micromips_32 (abfd, opcode, ptr);
 
          /* Delete the 16-bit delay slot NOP: two bytes from
             irel->offset + 4.  */
@@ -12756,7 +12796,7 @@ _bfd_mips_elf_relax_section (bfd *abfd, asection *sec,
          /* Fix the relocation's type.  */
          irel->r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC10_S1);
 
-         /* Replace the the 32-bit opcode with a 16-bit opcode.  */
+         /* Replace the 32-bit opcode with a 16-bit opcode.  */
          bfd_put_16 (abfd,
                      (b_insn_16.match
                       | (opcode & 0x3ff)),             /* Addend value.  */
@@ -12783,7 +12823,7 @@ _bfd_mips_elf_relax_section (bfd *abfd, asection *sec,
          /* Fix the relocation's type.  */
          irel->r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC7_S1);
 
-         /* Replace the the 32-bit opcode with a 16-bit opcode.  */
+         /* Replace the 32-bit opcode with a 16-bit opcode.  */
          bfd_put_16 (abfd,
                      (bz_insns_16[fndopc].match
                       | BZ16_REG_FIELD (reg)
@@ -12804,8 +12844,7 @@ _bfd_mips_elf_relax_section (bfd *abfd, asection *sec,
          unsigned long n32opc;
          bfd_boolean relaxed = FALSE;
 
-         n32opc  = bfd_get_16 (abfd, ptr + 4) << 16;
-         n32opc |= bfd_get_16 (abfd, ptr + 6);
+         n32opc = bfd_get_micromips_32 (abfd, ptr + 4);
 
          if (MATCH (n32opc, nop_insn_32))
            {
@@ -12832,10 +12871,7 @@ _bfd_mips_elf_relax_section (bfd *abfd, asection *sec,
            {
              /* JAL with 32-bit delay slot that is changed to a JALS
                 with 16-bit delay slot.  */
-             bfd_put_16 (abfd, (jal_insn_32_bd16.match >> 16) & 0xffff,
-                         ptr);
-             bfd_put_16 (abfd,  jal_insn_32_bd16.match        & 0xffff,
-                         ptr + 2);
+             bfd_put_micromips_32 (abfd, jal_insn_32_bd16.match, ptr);
 
              /* Delete 2 bytes from irel->r_offset + 6.  */
              delcnt = 2;
@@ -13679,6 +13715,7 @@ static const struct mips_mach_extension mips_mach_extensions[] = {
   { bfd_mach_mips4300, bfd_mach_mips4000 },
   { bfd_mach_mips4100, bfd_mach_mips4000 },
   { bfd_mach_mips4010, bfd_mach_mips4000 },
+  { bfd_mach_mips5900, bfd_mach_mips4000 },
 
   /* MIPS32 extensions.  */
   { bfd_mach_mipsisa32r2, bfd_mach_mipsisa32 },
@@ -13745,6 +13782,12 @@ mips_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
 {
   obj_attribute *in_attr;
   obj_attribute *out_attr;
+  bfd *abi_fp_bfd;
+
+  abi_fp_bfd = mips_elf_tdata (obfd)->abi_fp_bfd;
+  in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
+  if (!abi_fp_bfd && in_attr[Tag_GNU_MIPS_ABI_FP].i != 0)
+    mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
 
   if (!elf_known_obj_attributes_proc (obfd)[0].i)
     {
@@ -13760,24 +13803,13 @@ mips_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
 
   /* Check for conflicting Tag_GNU_MIPS_ABI_FP attributes and merge
      non-conflicting ones.  */
-  in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
   out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
   if (in_attr[Tag_GNU_MIPS_ABI_FP].i != out_attr[Tag_GNU_MIPS_ABI_FP].i)
     {
       out_attr[Tag_GNU_MIPS_ABI_FP].type = 1;
       if (out_attr[Tag_GNU_MIPS_ABI_FP].i == 0)
        out_attr[Tag_GNU_MIPS_ABI_FP].i = in_attr[Tag_GNU_MIPS_ABI_FP].i;
-      else if (in_attr[Tag_GNU_MIPS_ABI_FP].i == 0)
-       ;
-      else if (in_attr[Tag_GNU_MIPS_ABI_FP].i > 4)
-       _bfd_error_handler
-         (_("Warning: %B uses unknown floating point ABI %d"), ibfd,
-          in_attr[Tag_GNU_MIPS_ABI_FP].i);
-      else if (out_attr[Tag_GNU_MIPS_ABI_FP].i > 4)
-       _bfd_error_handler
-         (_("Warning: %B uses unknown floating point ABI %d"), obfd,
-          out_attr[Tag_GNU_MIPS_ABI_FP].i);
-      else
+      else if (in_attr[Tag_GNU_MIPS_ABI_FP].i != 0)
        switch (out_attr[Tag_GNU_MIPS_ABI_FP].i)
          {
          case 1:
@@ -13785,24 +13817,30 @@ mips_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
              {
              case 2:
                _bfd_error_handler
-                 (_("Warning: %B uses -msingle-float, %B uses -mdouble-float"),
-                  obfd, ibfd);
+                 (_("Warning: %B uses %s (set by %B), %B uses %s"),
+                  obfd, abi_fp_bfd, ibfd, "-mdouble-float", "-msingle-float");
                break;
 
              case 3:
                _bfd_error_handler
-                 (_("Warning: %B uses hard float, %B uses soft float"),
-                  obfd, ibfd);
+                 (_("Warning: %B uses %s (set by %B), %B uses %s"),
+                  obfd, abi_fp_bfd, ibfd, "-mhard-float", "-msoft-float");
                break;
 
              case 4:
                _bfd_error_handler
-                 (_("Warning: %B uses -msingle-float, %B uses -mips32r2 -mfp64"),
-                  obfd, ibfd);
+                 (_("Warning: %B uses %s (set by %B), %B uses %s"),
+                  obfd, abi_fp_bfd, ibfd,
+                  "-mdouble-float", "-mips32r2 -mfp64");
                break;
 
              default:
-               abort ();
+               _bfd_error_handler
+                 (_("Warning: %B uses %s (set by %B), "
+                    "%B uses unknown floating point ABI %d"),
+                  obfd, abi_fp_bfd, ibfd,
+                  "-mdouble-float", in_attr[Tag_GNU_MIPS_ABI_FP].i);
+               break;
              }
            break;
 
@@ -13811,24 +13849,30 @@ mips_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
              {
              case 1:
                _bfd_error_handler
-                 (_("Warning: %B uses -msingle-float, %B uses -mdouble-float"),
-                  ibfd, obfd);
+                 (_("Warning: %B uses %s (set by %B), %B uses %s"),
+                  obfd, abi_fp_bfd, ibfd, "-msingle-float", "-mdouble-float");
                break;
 
              case 3:
                _bfd_error_handler
-                 (_("Warning: %B uses hard float, %B uses soft float"),
-                  obfd, ibfd);
+                 (_("Warning: %B uses %s (set by %B), %B uses %s"),
+                  obfd, abi_fp_bfd, ibfd, "-mhard-float", "-msoft-float");
                break;
 
              case 4:
                _bfd_error_handler
-                 (_("Warning: %B uses -mdouble-float, %B uses -mips32r2 -mfp64"),
-                  obfd, ibfd);
+                 (_("Warning: %B uses %s (set by %B), %B uses %s"),
+                  obfd, abi_fp_bfd, ibfd,
+                  "-msingle-float", "-mips32r2 -mfp64");
                break;
 
              default:
-               abort ();
+               _bfd_error_handler
+                 (_("Warning: %B uses %s (set by %B), "
+                    "%B uses unknown floating point ABI %d"),
+                  obfd, abi_fp_bfd, ibfd,
+                  "-msingle-float", in_attr[Tag_GNU_MIPS_ABI_FP].i);
+               break;
              }
            break;
 
@@ -13839,12 +13883,17 @@ mips_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
              case 2:
              case 4:
                _bfd_error_handler
-                 (_("Warning: %B uses hard float, %B uses soft float"),
-                  ibfd, obfd);
+                 (_("Warning: %B uses %s (set by %B), %B uses %s"),
+                  obfd, abi_fp_bfd, ibfd, "-msoft-float", "-mhard-float");
                break;
 
              default:
-               abort ();
+               _bfd_error_handler
+                 (_("Warning: %B uses %s (set by %B), "
+                    "%B uses unknown floating point ABI %d"),
+                  obfd, abi_fp_bfd, ibfd,
+                  "-msoft-float", in_attr[Tag_GNU_MIPS_ABI_FP].i);
+               break;
              }
            break;
 
@@ -13853,29 +13902,79 @@ mips_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
              {
              case 1:
                _bfd_error_handler
-                 (_("Warning: %B uses -msingle-float, %B uses -mips32r2 -mfp64"),
-                  ibfd, obfd);
+                 (_("Warning: %B uses %s (set by %B), %B uses %s"),
+                  obfd, abi_fp_bfd, ibfd,
+                  "-mips32r2 -mfp64", "-mdouble-float");
                break;
 
              case 2:
                _bfd_error_handler
-                 (_("Warning: %B uses -mdouble-float, %B uses -mips32r2 -mfp64"),
-                  ibfd, obfd);
+                 (_("Warning: %B uses %s (set by %B), %B uses %s"),
+                  obfd, abi_fp_bfd, ibfd,
+                  "-mips32r2 -mfp64", "-msingle-float");
                break;
 
              case 3:
                _bfd_error_handler
-                 (_("Warning: %B uses hard float, %B uses soft float"),
-                  obfd, ibfd);
+                 (_("Warning: %B uses %s (set by %B), %B uses %s"),
+                  obfd, abi_fp_bfd, ibfd, "-mhard-float", "-msoft-float");
                break;
 
              default:
-               abort ();
+               _bfd_error_handler
+                 (_("Warning: %B uses %s (set by %B), "
+                    "%B uses unknown floating point ABI %d"),
+                  obfd, abi_fp_bfd, ibfd,
+                  "-mips32r2 -mfp64", in_attr[Tag_GNU_MIPS_ABI_FP].i);
+               break;
              }
            break;
 
          default:
-           abort ();
+           switch (in_attr[Tag_GNU_MIPS_ABI_FP].i)
+             {
+             case 1:
+               _bfd_error_handler
+                 (_("Warning: %B uses unknown floating point ABI %d "
+                    "(set by %B), %B uses %s"),
+                  obfd, abi_fp_bfd, ibfd,
+                  out_attr[Tag_GNU_MIPS_ABI_FP].i, "-mdouble-float");
+               break;
+
+             case 2:
+               _bfd_error_handler
+                 (_("Warning: %B uses unknown floating point ABI %d "
+                    "(set by %B), %B uses %s"),
+                  obfd, abi_fp_bfd, ibfd,
+                  out_attr[Tag_GNU_MIPS_ABI_FP].i, "-msingle-float");
+               break;
+
+             case 3:
+               _bfd_error_handler
+                 (_("Warning: %B uses unknown floating point ABI %d "
+                    "(set by %B), %B uses %s"),
+                  obfd, abi_fp_bfd, ibfd,
+                  out_attr[Tag_GNU_MIPS_ABI_FP].i, "-msoft-float");
+               break;
+
+             case 4:
+               _bfd_error_handler
+                 (_("Warning: %B uses unknown floating point ABI %d "
+                    "(set by %B), %B uses %s"),
+                  obfd, abi_fp_bfd, ibfd,
+                  out_attr[Tag_GNU_MIPS_ABI_FP].i, "-mips32r2 -mfp64");
+               break;
+
+             default:
+               _bfd_error_handler
+                 (_("Warning: %B uses unknown floating point ABI %d "
+                    "(set by %B), %B uses unknown floating point ABI %d"),
+                  obfd, abi_fp_bfd, ibfd,
+                  out_attr[Tag_GNU_MIPS_ABI_FP].i,
+                  in_attr[Tag_GNU_MIPS_ABI_FP].i);
+               break;
+             }
+           break;
          }
     }
 
@@ -13933,7 +14032,7 @@ _bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
 
       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
          && (bfd_get_arch_info (obfd)->the_default
-             || mips_mach_extends_p (bfd_get_mach (obfd), 
+             || mips_mach_extends_p (bfd_get_mach (obfd),
                                      bfd_get_mach (ibfd))))
        {
          if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
This page took 0.034586 seconds and 4 git commands to generate.