* 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.
This commit is contained in:
Alan Modra 2013-05-23 03:35:59 +00:00
parent 2c573464eb
commit 03ae2d5e4f
2 changed files with 28 additions and 1 deletions

View 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

View 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