* format.c (bfd_check_format_matches): Don't match a target in
authorAlan Modra <amodra@gmail.com>
Thu, 23 May 2013 03:35:59 +0000 (03:35 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 23 May 2013 03:35:59 +0000 (03:35 +0000)
targ_selvecs if some other target is a better match.  If
targets implement match priority, fall back to the first of
the best matches.

bfd/ChangeLog
bfd/format.c

index e4c87be..d01e687 100644 (file)
@@ -1,3 +1,10 @@
+2013-05-23  Alan Modra  <amodra@gmail.com>
+
+       * format.c (bfd_check_format_matches): Don't match a target in
+       targ_selvecs if some other target is a better match.  If
+       targets implement match priority, fall back to the first of
+       the best matches.
+
 2013-05-22  Eric Herman  <eric@freesa.org>
 
        PR binutils/15462
index e2afa3b..b8f39ca 100644 (file)
@@ -376,6 +376,9 @@ bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching)
        }
     }
 
+  /* We have more than one equally good match.  If any of the best
+     matches is a target in config.bfd targ_defvec or targ_selvecs,
+     choose it.  */
   if (match_count > 1)
     {
       const bfd_target * const *assoc = bfd_associated_vector;
@@ -385,7 +388,8 @@ bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching)
          int i = match_count;
 
          while (--i >= 0)
-           if (matching_vector[i] == right_targ)
+           if (matching_vector[i] == right_targ
+               && right_targ->match_priority <= best_match)
              break;
 
          if (i >= 0)
@@ -396,6 +400,22 @@ bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching)
        }
     }
 
+  /* We still have more than one equally good match, and at least some
+     of the targets support match priority.  Choose the first of the
+     best matches.  */
+  if (match_count > 1 && best_count != match_count)
+    {
+      int i;
+
+      for (i = 0; i < match_count; i++)
+       {
+         right_targ = matching_vector[i];
+         if (right_targ->match_priority <= best_match)
+           break;
+       }
+      match_count = 1;
+    }
+
   /* There is way too much undoing of half-known state here.  We
      really shouldn't iterate on live bfd's.  Note that saving the
      whole bfd and restoring it would be even worse; the first thing