[binutils-gdb] qsort: tc-xtensa.c tidy

Alan Modra amodra@sourceware.org
Wed Oct 16 00:34:00 GMT 2019


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=8ef6decbc1f3a5965fff70289e2bdccae3f9aa3c

commit 8ef6decbc1f3a5965fff70289e2bdccae3f9aa3c
Author: Alan Modra <amodra@gmail.com>
Date:   Tue Oct 15 23:04:14 2019 +1030

    qsort: tc-xtensa.c tidy
    
    Not much to see here, just reduce the number of calls to S_GET_VALUE
    and symbol_symbolS in the comparison functions.
    
    	* 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.

Diff:
---
 gas/ChangeLog          |  7 +++++++
 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 *



More information about the Binutils-cvs mailing list