MIPS/BFD: Fold the handling of input MIPS ABI flags together
authorMaciej W. Rozycki <macro@imgtec.com>
Mon, 4 Jan 2016 23:13:10 +0000 (23:13 +0000)
committerMaciej W. Rozycki <macro@imgtec.com>
Mon, 4 Jan 2016 23:13:10 +0000 (23:13 +0000)
Fold the handling of input MIPS ABI flags in private BFD data merging
together, moving the attribute check afterwards, and consequently making
input vs output compatibility checks only start once all input ABI flag
data has been gathered, checked for inconsistencies and put in order.

Consequently also address the issue of input ABI flag inconsistencies
being masked by a failing attribute check, which currently makes
`_bfd_mips_elf_merge_private_bfd_data' exit prematurely and therefore
prevent input ABI flag inconsistencies from being reported.  Such
inconsistencies need to be reported as they may be the very cause of an
attribute check failure.

bfd/
* elfxx-mips.c (_bfd_mips_elf_merge_private_bfd_data): Fold the
handling of input MIPS ABI flags together.

bfd/ChangeLog
bfd/elfxx-mips.c

index 06dc3b3d7e8edb3a4250d69c083ad21b7b14d216..cd9e1b1b61658be92be2b2105538c2a8419969b1 100644 (file)
@@ -1,3 +1,8 @@
+2016-01-04  Maciej W. Rozycki  <macro@imgtec.com>
+
+       * elfxx-mips.c (_bfd_mips_elf_merge_private_bfd_data): Fold the
+       handling of input MIPS ABI flags together.
+
 2016-01-04  Maciej W. Rozycki  <macro@imgtec.com>
 
        * elfxx-mips.c (_bfd_mips_elf_merge_private_bfd_data): Suppress
index e502f73c797b46216909976d854c34766599fe47..89d4409b097ed1b014bea0b637aa67da3aeb2afc 100644 (file)
@@ -15080,28 +15080,18 @@ _bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
   if (null_input_bfd)
     return TRUE;
 
-  /* Set up the FP ABI attribute from the abiflags if it is not already
-     set.  */
+  /* Populate abiflags using existing information.  */
   if (in_tdata->abiflags_valid)
     {
       obj_attribute *in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
+      Elf_Internal_ABIFlags_v0 in_abiflags;
+      Elf_Internal_ABIFlags_v0 abiflags;
+
+      /* Set up the FP ABI attribute from the abiflags if it is not already
+         set.  */
       if (in_attr[Tag_GNU_MIPS_ABI_FP].i == Val_GNU_MIPS_ABI_FP_ANY)
         in_attr[Tag_GNU_MIPS_ABI_FP].i = in_tdata->abiflags.fp_abi;
-    }
 
-  if (!mips_elf_merge_obj_attributes (ibfd, obfd))
-    return FALSE;
-
-  /* Populate abiflags using existing information.  */
-  if (!in_tdata->abiflags_valid)
-    {
-      infer_mips_abiflags (ibfd, &in_tdata->abiflags);
-      in_tdata->abiflags_valid = TRUE;
-    }
-  else
-    {
-      Elf_Internal_ABIFlags_v0 abiflags;
-      Elf_Internal_ABIFlags_v0 in_abiflags;
       infer_mips_abiflags (ibfd, &abiflags);
       in_abiflags = in_tdata->abiflags;
 
@@ -15137,6 +15127,14 @@ _bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
             ".MIPS.abiflags (0x%lx)"), ibfd,
           (unsigned long) in_abiflags.flags2);
     }
+  else
+    {
+      infer_mips_abiflags (ibfd, &in_tdata->abiflags);
+      in_tdata->abiflags_valid = TRUE;
+    }
+
+  if (!mips_elf_merge_obj_attributes (ibfd, obfd))
+    return FALSE;
 
   if (!out_tdata->abiflags_valid)
     {