Use std::sort instead of qsort in minsyms.c

This has better typesafety and is also marginally faster (either
due to inlining or because it avoids indirection through a
function pointer).

Note that in this change:
-       return 1;               /* fn1 has no name, so it is "less".  */
+       return true;            /* fn1 has no name, so it is "less".  */
       else if (name1)          /* fn2 has no name, so it is "less".  */
-       return -1;
+       return false;
I am fairly sure the old code was wrong (ie. code didn't match the
comment and the comment seemed correct), so I fixed it.

gdb/ChangeLog:

2019-09-28  Christian Biesinger  <cbiesinger@google.com>

	* minsyms.c (compare_minimal_symbols): Rename to...
	(minimal_symbol_is_less_than): ...this, and adjust to STL
	conventions (return bool, take arguments as references)
	(minimal_symbol_reader::install): Call std::sort instead
	of qsort.
This commit is contained in:
Christian Biesinger 2019-09-28 19:45:20 -05:00
parent 4a56a52007
commit 6fb08628e0
2 changed files with 24 additions and 22 deletions

View File

@ -1,3 +1,11 @@
2019-09-28 Christian Biesinger <cbiesinger@google.com>
* minsyms.c (compare_minimal_symbols): Rename to...
(minimal_symbol_is_less_than): ...this, and adjust to STL
conventions (return bool, take arguments as references)
(minimal_symbol_reader::install): Call std::sort instead
of qsort.
2019-09-29 Christian Biesinger <cbiesinger@google.com> 2019-09-29 Christian Biesinger <cbiesinger@google.com>
* minsyms.h (msymbol_hash): Document that this is a case-insensitive * minsyms.h (msymbol_hash): Document that this is a case-insensitive

View File

@ -1124,41 +1124,36 @@ minimal_symbol_reader::record_full (const char *name, int name_len,
return msymbol; return msymbol;
} }
/* Compare two minimal symbols by address and return a signed result based /* Compare two minimal symbols by address and return true if FN1's address
on unsigned comparisons, so that we sort into unsigned numeric order. is less than FN2's, so that we sort into unsigned numeric order.
Within groups with the same address, sort by name. */ Within groups with the same address, sort by name. */
static int static inline bool
compare_minimal_symbols (const void *fn1p, const void *fn2p) minimal_symbol_is_less_than (const minimal_symbol &fn1,
const minimal_symbol &fn2)
{ {
const struct minimal_symbol *fn1; if (MSYMBOL_VALUE_RAW_ADDRESS (&fn1) < MSYMBOL_VALUE_RAW_ADDRESS (&fn2))
const struct minimal_symbol *fn2;
fn1 = (const struct minimal_symbol *) fn1p;
fn2 = (const struct minimal_symbol *) fn2p;
if (MSYMBOL_VALUE_RAW_ADDRESS (fn1) < MSYMBOL_VALUE_RAW_ADDRESS (fn2))
{ {
return (-1); /* addr 1 is less than addr 2. */ return true; /* addr 1 is less than addr 2. */
} }
else if (MSYMBOL_VALUE_RAW_ADDRESS (fn1) > MSYMBOL_VALUE_RAW_ADDRESS (fn2)) else if (MSYMBOL_VALUE_RAW_ADDRESS (&fn1) > MSYMBOL_VALUE_RAW_ADDRESS (&fn2))
{ {
return (1); /* addr 1 is greater than addr 2. */ return false; /* addr 1 is greater than addr 2. */
} }
else else
/* addrs are equal: sort by name */ /* addrs are equal: sort by name */
{ {
const char *name1 = MSYMBOL_LINKAGE_NAME (fn1); const char *name1 = MSYMBOL_LINKAGE_NAME (&fn1);
const char *name2 = MSYMBOL_LINKAGE_NAME (fn2); const char *name2 = MSYMBOL_LINKAGE_NAME (&fn2);
if (name1 && name2) /* both have names */ if (name1 && name2) /* both have names */
return strcmp (name1, name2); return strcmp (name1, name2) < 0;
else if (name2) else if (name2)
return 1; /* fn1 has no name, so it is "less". */ return true; /* fn1 has no name, so it is "less". */
else if (name1) /* fn2 has no name, so it is "less". */ else if (name1) /* fn2 has no name, so it is "less". */
return -1; return false;
else else
return (0); /* Neither has a name, so they're equal. */ return false; /* Neither has a name, so they're equal. */
} }
} }
@ -1315,8 +1310,7 @@ minimal_symbol_reader::install ()
/* Sort the minimal symbols by address. */ /* Sort the minimal symbols by address. */
qsort (msymbols, mcount, sizeof (struct minimal_symbol), std::sort (msymbols, msymbols + mcount, minimal_symbol_is_less_than);
compare_minimal_symbols);
/* Compact out any duplicates, and free up whatever space we are /* Compact out any duplicates, and free up whatever space we are
no longer using. */ no longer using. */