diff options
-rw-r--r-- | gas/ChangeLog | 7 | ||||
-rw-r--r-- | gas/config/tc-xtensa.c | 48 |
2 files changed, 33 insertions, 22 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 33cc6ff..ac2e3d7 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2019-10-16 Alan Modra <amodra@gmail.com> + + * config/tc-xtensa.c (xg_order_trampoline_chain_entry): Don't + call S_GET_VALUE multiple times for a symbol. Rearrange code + so it is obvious what is the primary sort key. + (xg_order_trampoline_chain): Similarly. + 2019-10-15 Alan Modra <amodra@gmail.com> * config/tc-nds32.c (nds32_set_section_relocs): Use relocs and n diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c index c68128e..60f9563 100644 --- a/gas/config/tc-xtensa.c +++ b/gas/config/tc-xtensa.c @@ -7584,14 +7584,17 @@ static int xg_order_trampoline_chain_entry (const void *a, const void *b) const struct trampoline_chain_entry *pa = a; const struct trampoline_chain_entry *pb = b; - if (pa->sym == pb->sym || - S_GET_VALUE (pa->sym) == S_GET_VALUE (pb->sym)) - if (pa->offset == pb->offset) - return 0; - else - return pa->offset < pb->offset ? -1 : 1; - else - return S_GET_VALUE (pa->sym) < S_GET_VALUE (pb->sym) ? -1 : 1; + if (pa->sym != pb->sym) + { + valueT aval = S_GET_VALUE (pa->sym); + valueT bval = S_GET_VALUE (pb->sym); + + if (aval != bval) + return aval < bval ? -1 : 1; + } + if (pa->offset != pb->offset) + return pa->offset < pb->offset ? -1 : 1; + return 0; } static void xg_sort_trampoline_chain (struct trampoline_chain *tc) @@ -7674,23 +7677,24 @@ static int xg_order_trampoline_chain (const void *a, const void *b) const struct trampoline_chain_entry *pb = &_pb->target; symbolS *s1 = pa->sym; symbolS *s2 = pb->sym; - symbolS *tmp; - tmp = symbol_symbolS (s1); - if (tmp) - s1 = tmp; + if (s1 != s2) + { + symbolS *tmp = symbol_symbolS (s1); + if (tmp) + s1 = tmp; - tmp = symbol_symbolS (s2); - if (tmp) - s2 = tmp; + tmp = symbol_symbolS (s2); + if (tmp) + s2 = tmp; - if (s1 == s2) - if (pa->offset == pb->offset) - return 0; - else - return pa->offset < pb->offset ? -1 : 1; - else - return s1 < s2 ? -1 : 1; + if (s1 != s2) + return s1 < s2 ? -1 : 1; + } + + if (pa->offset != pb->offset) + return pa->offset < pb->offset ? -1 : 1; + return 0; } static struct trampoline_chain * |