Thu Mar 19 11:32:15 1998 Michael Snyder (msnyder@cleaver.cygnus.com)
authorMichael Snyder <msnyder@vmware.com>
Thu, 19 Mar 1998 19:35:18 +0000 (19:35 +0000)
committerMichael Snyder <msnyder@vmware.com>
Thu, 19 Mar 1998 19:35:18 +0000 (19:35 +0000)
        * minsyms.c (compare_minimal_symbols): If addresses are identical,
        then compare on names.  Sorted list should have symbols with
        identical addresses AND names adjacent, so dups can be discarded.

gdb/ChangeLog
gdb/minsyms.c

index ba132cc619f6faf829d51d41a889928c7d771ada..36e0d08bcbe37b96616746a3283ead23284c38e2 100644 (file)
@@ -1,3 +1,9 @@
+Thu Mar 19 11:32:15 1998  Michael Snyder  (msnyder@cleaver.cygnus.com)
+
+       * minsyms.c (compare_minimal_symbols): If addresses are identical,
+       then compare on names.  Sorted list should have symbols with 
+       identical addresses AND names adjacent, so dups can be discarded.
+
 Wed Mar 18 12:50:17 1998  Jeff Law  (law@cygnus.com)
 
        * stabsread.c (define_symbol): Don't look for ',' as a LRS
index 9d6fd0478fa83e8e1c3d5a3c1d82185aa8a521f3..04257c6b99cdc665a9e79c4dd0606eeb152465dd 100644 (file)
@@ -585,7 +585,8 @@ prim_record_minimal_symbol_and_info (name, address, ms_type, info, section,
 }
 
 /* Compare two minimal symbols by address and return a signed result based
-   on unsigned comparisons, so that we sort into unsigned numeric order.  */
+   on unsigned comparisons, so that we sort into unsigned numeric order.  
+   Within groups with the same address, sort by name.  */
 
 static int
 compare_minimal_symbols (fn1p, fn2p)
@@ -600,15 +601,25 @@ compare_minimal_symbols (fn1p, fn2p)
 
   if (SYMBOL_VALUE_ADDRESS (fn1) < SYMBOL_VALUE_ADDRESS (fn2))
     {
-      return (-1);
+      return (-1);     /* addr 1 is less than addr 2 */
     }
   else if (SYMBOL_VALUE_ADDRESS (fn1) > SYMBOL_VALUE_ADDRESS (fn2))
     {
-      return (1);
+      return (1);      /* addr 1 is greater than addr 2 */
     }
-  else
+  else                 /* addrs are equal: sort by name */
     {
-      return (0);
+      char *name1 = SYMBOL_NAME (fn1);
+      char *name2 = SYMBOL_NAME (fn2);
+
+      if (name1 && name2)      /* both have names */
+       return strcmp (name1, name2);
+      else if (name2)
+       return 1;       /* fn1 has no name, so it is "less" */
+      else if (name1)  /* fn2 has no name, so it is "less" */
+       return -1;
+      else
+       return (0);     /* neither has a name, so they're equal. */
     }
 }