gas: xtensa: fix comparison of trampoline chain symbols

Don't use address where symbol gets resolved, as during section
relaxation symbols will slide, instead canonicalize symbols and check
that they are are the same.
This fixes a bug when a relaxed jump goes into the wrong trampoline.

gas/
2017-12-07  Max Filippov  <jcmvbkbc@gmail.com>

	* config/tc-xtensa.c (xg_order_trampoline_chain): Replace
	xg_order_trampoline_chain_entry call with check for
	canonicalized symbol equality and offset equality.
This commit is contained in:
Max Filippov 2017-12-06 22:52:16 -08:00
parent 1cd9a73b42
commit 10af2a65c8
2 changed files with 27 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2017-12-07 Max Filippov <jcmvbkbc@gmail.com>
* config/tc-xtensa.c (xg_order_trampoline_chain): Replace
xg_order_trampoline_chain_entry call with check for
canonicalized symbol equality and offset equality.
2017-12-04 Alan Modra <amodra@gmail.com>
PR 22544

View File

@ -7646,10 +7646,28 @@ xg_get_best_chain_entry (struct trampoline_chain *tc, addressT source)
static int xg_order_trampoline_chain (const void *a, const void *b)
{
const struct trampoline_chain *pa = a;
const struct trampoline_chain *pb = b;
const struct trampoline_chain *_pa = a;
const struct trampoline_chain *_pb = b;
const struct trampoline_chain_entry *pa = &_pa->target;
const struct trampoline_chain_entry *pb = &_pb->target;
symbolS *s1 = pa->sym;
symbolS *s2 = pb->sym;
return xg_order_trampoline_chain_entry (&pa->target, &pb->target);
if (s1->sy_flags.sy_local_symbol
&& local_symbol_converted_p ((struct local_symbol *) s1))
s1 = local_symbol_get_real_symbol ((struct local_symbol *) s1);
if (s2->sy_flags.sy_local_symbol
&& local_symbol_converted_p ((struct local_symbol *) s2))
s2 = local_symbol_get_real_symbol ((struct local_symbol *) s2);
if (s1 == s2)
if (pa->offset == pb->offset)
return 0;
else
return pa->offset < pb->offset ? -1 : 1;
else
return s1 < s2 ? -1 : 1;
}
static struct trampoline_chain *