MIPS/BFD: Move attribute check after ELF file header flag check
authorMaciej W. Rozycki <macro@imgtec.com>
Mon, 4 Jan 2016 23:30:00 +0000 (23:30 +0000)
committerMaciej W. Rozycki <macro@imgtec.com>
Mon, 4 Jan 2016 23:30:00 +0000 (23:30 +0000)
We have a problem in that in making compatibility checks while merging
private BFD data on the MIPS target we give priority to the attribute
check, which may fail and cause the function to abort early on.  The
problem with this is the ABI compatibility aspect recorded in the
attributes is relatively minor compared to aspects recorded in the ELF
file header.  However the premature exit causes any more important
compatibility aspect violated to be masked and not reported to the user
once a problem with attributes has been noticed.

So move the attribute check after the ELF file header flag check in
`_bfd_mips_elf_merge_private_bfd_data', and do not return prematurely
there.  Take advantage of the resulting grouping of ELF file header
handling together and remove the premature success return point for the
first input object being handled, letting the code later on figure out
output ABI flags even for this object.

Update LD test cases according to messages from ELF file header checks
now preceding ones from attribute checks.

bfd/
* elfxx-mips.c (_bfd_mips_elf_merge_private_bfd_data): Move
attribute check after ELF file header flag check.

ld/
* testsuite/ld-mips-elf/attr-gnu-4-14.d: Update the order of
messages expected according to MIPS BFD private data merge
changes.
* testsuite/ld-mips-elf/attr-gnu-4-24.d: Likewise.
* testsuite/ld-mips-elf/attr-gnu-4-34.d: Likewise.
* testsuite/ld-mips-elf/attr-gnu-4-41.d: Likewise.
* testsuite/ld-mips-elf/attr-gnu-4-42.d: Likewise.
* testsuite/ld-mips-elf/attr-gnu-4-43.d: Likewise.
* testsuite/ld-mips-elf/attr-gnu-4-45.d: Likewise.
* testsuite/ld-mips-elf/attr-gnu-4-46.d: Likewise.
* testsuite/ld-mips-elf/attr-gnu-4-47.d: Likewise.
* testsuite/ld-mips-elf/attr-gnu-4-48.d: Likewise.
* testsuite/ld-mips-elf/attr-gnu-4-49.d: Likewise.
* testsuite/ld-mips-elf/attr-gnu-4-54.d: Likewise.
* testsuite/ld-mips-elf/attr-gnu-4-64.d: Likewise.
* testsuite/ld-mips-elf/attr-gnu-4-74.d: Likewise.

17 files changed:
bfd/ChangeLog
bfd/elfxx-mips.c
ld/ChangeLog
ld/testsuite/ld-mips-elf/attr-gnu-4-14.d
ld/testsuite/ld-mips-elf/attr-gnu-4-24.d
ld/testsuite/ld-mips-elf/attr-gnu-4-34.d
ld/testsuite/ld-mips-elf/attr-gnu-4-41.d
ld/testsuite/ld-mips-elf/attr-gnu-4-42.d
ld/testsuite/ld-mips-elf/attr-gnu-4-43.d
ld/testsuite/ld-mips-elf/attr-gnu-4-45.d
ld/testsuite/ld-mips-elf/attr-gnu-4-46.d
ld/testsuite/ld-mips-elf/attr-gnu-4-47.d
ld/testsuite/ld-mips-elf/attr-gnu-4-48.d
ld/testsuite/ld-mips-elf/attr-gnu-4-49.d
ld/testsuite/ld-mips-elf/attr-gnu-4-54.d
ld/testsuite/ld-mips-elf/attr-gnu-4-64.d
ld/testsuite/ld-mips-elf/attr-gnu-4-74.d

index 85b56a3b624ed9d02687fd8901f83fd034337bf5..5a2c3bdb0980c162d8eeba8393a290bfc33d2a95 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): Move
+       attribute check after ELF file header flag check.
+
 2016-01-04  Maciej W. Rozycki  <macro@imgtec.com>
 
        * elfxx-mips.c (mips_elf_merge_obj_attributes): Propagate the
index a5d47d69e1ec505861673f7d4c535f6d0b675ad3..63c7d7ed5b2edbce8d059a38df8e52fea08a8c86 100644 (file)
@@ -15220,6 +15220,7 @@ _bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
   bfd_boolean null_input_bfd = TRUE;
   asection *sec;
   obj_attribute *out_attr;
+  bfd_boolean ok;
 
   /* Check if we have the same endianness.  */
   if (! _bfd_generic_verify_endian_match (ibfd, obfd))
@@ -15321,9 +15322,6 @@ _bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
       in_tdata->abiflags_valid = TRUE;
     }
 
-  if (!mips_elf_merge_obj_attributes (ibfd, obfd))
-    return FALSE;
-
   if (!out_tdata->abiflags_valid)
     {
       /* Copy input abiflags if output abiflags are not already valid.  */
@@ -15351,8 +15349,12 @@ _bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
          update_mips_abiflags_isa (obfd, &out_tdata->abiflags);
        }
 
-      return TRUE;
+      ok = TRUE;
     }
+  else
+    ok = mips_elf_merge_obj_e_flags (ibfd, obfd);
+
+  ok = mips_elf_merge_obj_attributes (ibfd, obfd) && ok;
 
   /* Update the output abiflags fp_abi using the computed fp_abi.  */
   out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
@@ -15374,7 +15376,7 @@ _bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
   out_tdata->abiflags.ases |= in_tdata->abiflags.ases;
   out_tdata->abiflags.flags1 |= in_tdata->abiflags.flags1;
 
-  if (!mips_elf_merge_obj_e_flags (ibfd, obfd))
+  if (!ok)
     {
       bfd_set_error (bfd_error_bad_value);
       return FALSE;
index 64eeded5f67c3a0a0b868b7e6ca401db5ae1a386..8a062e1f97ced6407ff6fbf2177ba542dc8cd46c 100644 (file)
@@ -1,3 +1,22 @@
+2016-01-04  Maciej W. Rozycki  <macro@imgtec.com>
+
+       * testsuite/ld-mips-elf/attr-gnu-4-14.d: Update the order of
+       messages expected according to MIPS BFD private data merge
+       changes.
+       * testsuite/ld-mips-elf/attr-gnu-4-24.d: Likewise.
+       * testsuite/ld-mips-elf/attr-gnu-4-34.d: Likewise.
+       * testsuite/ld-mips-elf/attr-gnu-4-41.d: Likewise.
+       * testsuite/ld-mips-elf/attr-gnu-4-42.d: Likewise.
+       * testsuite/ld-mips-elf/attr-gnu-4-43.d: Likewise.
+       * testsuite/ld-mips-elf/attr-gnu-4-45.d: Likewise.
+       * testsuite/ld-mips-elf/attr-gnu-4-46.d: Likewise.
+       * testsuite/ld-mips-elf/attr-gnu-4-47.d: Likewise.
+       * testsuite/ld-mips-elf/attr-gnu-4-48.d: Likewise.
+       * testsuite/ld-mips-elf/attr-gnu-4-49.d: Likewise.
+       * testsuite/ld-mips-elf/attr-gnu-4-54.d: Likewise.
+       * testsuite/ld-mips-elf/attr-gnu-4-64.d: Likewise.
+       * testsuite/ld-mips-elf/attr-gnu-4-74.d: Likewise.
+
 2016-01-01  Alan Modra  <amodra@gmail.com>
 
        Update year range in copyright notice of all files.
index 58cfd245b472ebf58d1e3b79179780dd3ac11017..417ad0a9f505b26a81f4fa420ded2ab9d30d92db 100644 (file)
@@ -1,6 +1,6 @@
 #source: attr-gnu-4-1.s
 #source: attr-gnu-4-4.s -W
 #ld: -r
-#error: \A[^\n]*: Warning: .* uses -mdouble-float \(set by .*\), .* uses -mips32r2 -mfp64 \(12 callee-saved\)\n
-#error:   [^\n]*: [^\n]* linking -mfp64 module with previous -mfp32 modules\n
+#error: \A[^\n]*: [^\n]* linking -mfp64 module with previous -mfp32 modules\n
+#error:   [^\n]*: Warning: .* uses -mdouble-float \(set by .*\), .* uses -mips32r2 -mfp64 \(12 callee-saved\)\n
 #error:   [^\n]*: failed to merge target specific data of file [^\n]*\.o\Z
index e48e5bbfad4f762ecf4d150725f9f123b12a0a51..608ef0e05f3763e9e291433cfc62e9b2ffed0342 100644 (file)
@@ -1,6 +1,6 @@
 #source: attr-gnu-4-2.s
 #source: attr-gnu-4-4.s -W
 #ld: -r
-#error: \A[^\n]*: Warning: .* uses -msingle-float \(set by .*\), .* uses -mips32r2 -mfp64 \(12 callee-saved\)\n
-#error:   [^\n]*: [^\n]* linking -mfp64 module with previous -mfp32 modules\n
+#error: \A[^\n]*: [^\n]* linking -mfp64 module with previous -mfp32 modules\n
+#error:   [^\n]*: Warning: .* uses -msingle-float \(set by .*\), .* uses -mips32r2 -mfp64 \(12 callee-saved\)\n
 #error:   [^\n]*: failed to merge target specific data of file [^\n]*\.o\Z
index 314515ab9e763805a6c75e23a60c4607d1fcb6a2..f8328b51e86a25601de34fde9b10cc545e5d0e42 100644 (file)
@@ -1,6 +1,6 @@
 #source: attr-gnu-4-3.s
 #source: attr-gnu-4-4.s -W
 #ld: -r
-#error: \A[^\n]*: Warning: .* uses -msoft-float \(set by .*\), .* uses -mhard-float\n
-#error:   [^\n]*: [^\n]* linking -mfp64 module with previous -mfp32 modules\n
+#error: \A[^\n]*: [^\n]* linking -mfp64 module with previous -mfp32 modules\n
+#error:   [^\n]*: Warning: .* uses -msoft-float \(set by .*\), .* uses -mhard-float\n
 #error:   [^\n]*: failed to merge target specific data of file [^\n]*\.o\Z
index 7c61365ad0242094f829dacc77f48a5954946bc6..ff6e6e4635f3409b4d53a9f207c43dc50c34073e 100644 (file)
@@ -1,6 +1,6 @@
 #source: attr-gnu-4-4.s -W
 #source: attr-gnu-4-1.s
 #ld: -r
-#error: \A[^\n]*: Warning: .* uses -mips32r2 -mfp64 \(12 callee-saved\) \(set by .*\), .* uses -mdouble-float\n
-#error:   [^\n]*: [^\n]* linking -mfp32 module with previous -mfp64 modules\n
+#error: \A[^\n]*: [^\n]* linking -mfp32 module with previous -mfp64 modules\n
+#error:   [^\n]*: Warning: .* uses -mips32r2 -mfp64 \(12 callee-saved\) \(set by .*\), .* uses -mdouble-float\n
 #error:   [^\n]*: failed to merge target specific data of file [^\n]*\.o\Z
index dad0421a0e8af64fab6a53282859b3836ad0eafa..aa17693832bca537dc46d796a322ea01703d44f6 100644 (file)
@@ -1,6 +1,6 @@
 #source: attr-gnu-4-4.s -W
 #source: attr-gnu-4-2.s
 #ld: -r
-#error: \A[^\n]*: Warning: .* uses -mips32r2 -mfp64 \(12 callee-saved\) \(set by .*\), .* uses -msingle-float\n
-#error:   [^\n]*: [^\n]* linking -mfp32 module with previous -mfp64 modules\n
+#error: \A[^\n]*: [^\n]* linking -mfp32 module with previous -mfp64 modules\n
+#error:   [^\n]*: Warning: .* uses -mips32r2 -mfp64 \(12 callee-saved\) \(set by .*\), .* uses -msingle-float\n
 #error:   [^\n]*: failed to merge target specific data of file [^\n]*\.o\Z
index f30c18eeb3f6bfb9f52fd41376573fc0705f8511..ddc01996fdb58640e98d42383c5baffec4977905 100644 (file)
@@ -1,6 +1,6 @@
 #source: attr-gnu-4-4.s -W
 #source: attr-gnu-4-3.s
 #ld: -r
-#error: \A[^\n]*: Warning: .* uses -mhard-float \(set by .*\), .* uses -msoft-float\n
-#error:   [^\n]*: [^\n]* linking -mfp32 module with previous -mfp64 modules\n
+#error: \A[^\n]*: [^\n]* linking -mfp32 module with previous -mfp64 modules\n
+#error:   [^\n]*: Warning: .* uses -mhard-float \(set by .*\), .* uses -msoft-float\n
 #error:   [^\n]*: failed to merge target specific data of file [^\n]*\.o\Z
index c8716e3b4361379764626b0a5f0af19a66d805cb..b60b9837df260be468c784739a715d677dd700a8 100644 (file)
@@ -1,6 +1,6 @@
 #source: attr-gnu-4-4.s -W -mips32r2
 #source: attr-gnu-4-5.s
 #ld: -r
-#error: \A[^\n]*: Warning: .* uses -mips32r2 -mfp64 \(12 callee-saved\) \(set by .*\), .* uses -mfpxx\n
-#error:   [^\n]*: [^\n]* linking -mfp32 module with previous -mfp64 modules\n
+#error: \A[^\n]*: [^\n]* linking -mfp32 module with previous -mfp64 modules\n
+#error:   [^\n]*: Warning: .* uses -mips32r2 -mfp64 \(12 callee-saved\) \(set by .*\), .* uses -mfpxx\n
 #error:   [^\n]*: failed to merge target specific data of file [^\n]*\.o\Z
index 9fa1b015419b7da9119a89d0f9afc01f94a40610..82dd22b4a3dffbfd92f383ca7b3151ad3ee65a07 100644 (file)
@@ -1,6 +1,6 @@
 #source: attr-gnu-4-4.s -W -mips32r2
 #source: attr-gnu-4-6.s
 #ld: -r
-#error: \A[^\n]*: Warning: .* uses -mips32r2 -mfp64 \(12 callee-saved\) \(set by .*\), .* uses -mgp32 -mfp64\n
-#error:   [^\n]*: [^\n]* linking -mfp32 module with previous -mfp64 modules\n
+#error: \A[^\n]*: [^\n]* linking -mfp32 module with previous -mfp64 modules\n
+#error:   [^\n]*: Warning: .* uses -mips32r2 -mfp64 \(12 callee-saved\) \(set by .*\), .* uses -mgp32 -mfp64\n
 #error:   [^\n]*: failed to merge target specific data of file [^\n]*\.o\Z
index acb736b567018eef6dec11adb1ddf4e28fd82d49..eda8a27f11f396dfdb4b12759dbd786415892d2a 100644 (file)
@@ -1,6 +1,6 @@
 #source: attr-gnu-4-4.s -W -mips32r2
 #source: attr-gnu-4-7.s
 #ld: -r
-#error: \A[^\n]*: Warning: .* uses -mips32r2 -mfp64 \(12 callee-saved\) \(set by .*\), .* uses -mgp32 -mfp64 -mno-odd-spreg\n
-#error:   [^\n]*: [^\n]* linking -mfp32 module with previous -mfp64 modules\n
+#error: \A[^\n]*: [^\n]* linking -mfp32 module with previous -mfp64 modules\n
+#error:   [^\n]*: Warning: .* uses -mips32r2 -mfp64 \(12 callee-saved\) \(set by .*\), .* uses -mgp32 -mfp64 -mno-odd-spreg\n
 #error:   [^\n]*: failed to merge target specific data of file [^\n]*\.o\Z
index cb4dcb6dd69a5db41363057250e554d6c0309745..084922b61f22a02067ca769cbb156d74c26798e3 100644 (file)
@@ -1,6 +1,6 @@
 #source: attr-gnu-4-4.s -W
 #source: attr-gnu-4-8.s -W
 #ld: -r
-#error: \A[^\n]*: Warning: .* uses -mips32r2 -mfp64 \(12 callee-saved\) \(set by .*\), .* uses unknown floating point ABI 8\n
-#error:   [^\n]*: [^\n]* linking -mfp32 module with previous -mfp64 modules\n
+#error: \A[^\n]*: [^\n]* linking -mfp32 module with previous -mfp64 modules\n
+#error:   [^\n]*: Warning: .* uses -mips32r2 -mfp64 \(12 callee-saved\) \(set by .*\), .* uses unknown floating point ABI 8\n
 #error:   [^\n]*: failed to merge target specific data of file [^\n]*\.o\Z
index d03074e02455600dee3a9b4da6dd050bb0eb117d..24e51453d22f24fd3cebc496ec63b5cb28c1449c 100644 (file)
@@ -1,6 +1,6 @@
 #source: attr-gnu-4-4.s -W
 #source: attr-gnu-4-9.s -W
 #ld: -r
-#error: \A[^\n]*: Warning: .* uses -mips32r2 -mfp64 \(12 callee-saved\) \(set by .*\), .* uses unknown floating point ABI 9\n
-#error:   [^\n]*: [^\n]* linking -mfp32 module with previous -mfp64 modules\n
+#error: \A[^\n]*: [^\n]* linking -mfp32 module with previous -mfp64 modules\n
+#error:   [^\n]*: Warning: .* uses -mips32r2 -mfp64 \(12 callee-saved\) \(set by .*\), .* uses unknown floating point ABI 9\n
 #error:   [^\n]*: failed to merge target specific data of file [^\n]*\.o\Z
index 04155af87cb17840ac5d73ac492e05ed785b13de..70d6b946da55947472fe48394c92096819412959 100644 (file)
@@ -1,6 +1,6 @@
 #source: attr-gnu-4-5.s
 #source: attr-gnu-4-4.s -W -mips32r2
 #ld: -r
-#error: \A[^\n]*: Warning: .* uses -mfpxx \(set by .*\), .* uses -mips32r2 -mfp64 \(12 callee-saved\)\n
-#error:   [^\n]*: [^\n]* linking -mfp64 module with previous -mfp32 modules\n
+#error: \A[^\n]*: [^\n]* linking -mfp64 module with previous -mfp32 modules\n
+#error:   [^\n]*: Warning: .* uses -mfpxx \(set by .*\), .* uses -mips32r2 -mfp64 \(12 callee-saved\)\n
 #error:   [^\n]*: failed to merge target specific data of file [^\n]*\.o\Z
index 98a3b34bb55cb53ed2ee6307e89313fb946f8e61..9b4fbd86bdc399bc0d6c62b163be3d3df1a25303 100644 (file)
@@ -1,6 +1,6 @@
 #source: attr-gnu-4-6.s
 #source: attr-gnu-4-4.s -W -mips32r2
 #ld: -r
-#error: \A[^\n]*: Warning: .* uses -mgp32 -mfp64 \(set by .*\), .* uses -mips32r2 -mfp64 \(12 callee-saved\)\n
-#error:   [^\n]*: [^\n]* linking -mfp64 module with previous -mfp32 modules\n
+#error: \A[^\n]*: [^\n]* linking -mfp64 module with previous -mfp32 modules\n
+#error:   [^\n]*: Warning: .* uses -mgp32 -mfp64 \(set by .*\), .* uses -mips32r2 -mfp64 \(12 callee-saved\)\n
 #error:   [^\n]*: failed to merge target specific data of file [^\n]*\.o\Z
index 90eeaff1a9e3d6825d916ca1c5addce294ee187f..e281ae5ce38922992b3ced9885f02f9c6ffab8b2 100644 (file)
@@ -1,6 +1,6 @@
 #source: attr-gnu-4-7.s
 #source: attr-gnu-4-4.s -W -mips32r2
 #ld: -r
-#error: \A[^\n]*: Warning: .* uses -mgp32 -mfp64 -mno-odd-spreg \(set by .*\), .* uses -mips32r2 -mfp64 \(12 callee-saved\)\n
-#error:   [^\n]*: [^\n]* linking -mfp64 module with previous -mfp32 modules\n
+#error: \A[^\n]*: [^\n]* linking -mfp64 module with previous -mfp32 modules\n
+#error:   [^\n]*: Warning: .* uses -mgp32 -mfp64 -mno-odd-spreg \(set by .*\), .* uses -mips32r2 -mfp64 \(12 callee-saved\)\n
 #error:   [^\n]*: failed to merge target specific data of file [^\n]*\.o\Z