Replace some more qsort calls with std::sort

This has better typesafety, avoids a function pointer indirection,
and can benefit from inlining.

gdb/ChangeLog:

2019-10-19  Christian Biesinger  <cbiesinger@google.com>

	* bcache.c (bcache::print_statistics): Use std::sort instead of qsort.
	* breakpoint.c (bp_locations_compare): Rename to...
	(bp_location_is_less_than): ...this, and change to std::sort semantics.
	(update_global_location_list): Use std::sort instead of qsort.
	* buildsym.c (compare_line_numbers): Rename to...
	(lte_is_less_than): ...this, and change to std::sort semantics.
	(buildsym_compunit::end_symtab_with_blockvector): Use std::sort
	instead of qsort.
	* disasm.c (compare_lines): Rename to...
	(line_is_less_than): ...this, and change to std::sort semantics.
	(do_mixed_source_and_assembly_deprecated): Call std::sort instead
	of qsort.
	* dwarf2-frame.c (qsort_fde_cmp): Rename to...
	(fde_is_less_than): ...this, and change to std::sort semantics.
	(dwarf2_build_frame_info): Call std::sort instead of qsort.
	* mdebugread.c (compare_blocks):
	(block_is_less_than): ...this, and change to std::sort semantics.
	(sort_blocks): Call std::sort instead of qsort.
	* objfiles.c (qsort_cmp): Rename to...
	(sort_cmp): ...this, and change to std::sort semantics.
	(update_section_map): Call std::sort instead of qsort.
	* remote.c (compare_pnums): Remove.
	(map_regcache_remote_table): Call std::sort instead of qsort.
	* utils.c (compare_positive_ints): Remove.
	* utils.h (compare_positive_ints): Remove.
	* xcoffread.c (compare_lte): Remove.
	(arrange_linetable): Call std::sort instead of qsort.

Change-Id: Ibcddce12a3d07448701e731b7150fa23611d86de
This commit is contained in:
Christian Biesinger 2019-10-03 00:36:35 -05:00
parent 18338fcee6
commit 39ef2f6256
12 changed files with 113 additions and 133 deletions

View File

@ -1,3 +1,33 @@
2019-10-19 Christian Biesinger <cbiesinger@google.com>
* bcache.c (bcache::print_statistics): Use std::sort instead of qsort.
* breakpoint.c (bp_locations_compare): Rename to...
(bp_location_is_less_than): ...this, and change to std::sort semantics.
(update_global_location_list): Use std::sort instead of qsort.
* buildsym.c (compare_line_numbers): Rename to...
(lte_is_less_than): ...this, and change to std::sort semantics.
(buildsym_compunit::end_symtab_with_blockvector): Use std::sort
instead of qsort.
* disasm.c (compare_lines): Rename to...
(line_is_less_than): ...this, and change to std::sort semantics.
(do_mixed_source_and_assembly_deprecated): Call std::sort instead
of qsort.
* dwarf2-frame.c (qsort_fde_cmp): Rename to...
(fde_is_less_than): ...this, and change to std::sort semantics.
(dwarf2_build_frame_info): Call std::sort instead of qsort.
* mdebugread.c (compare_blocks):
(block_is_less_than): ...this, and change to std::sort semantics.
(sort_blocks): Call std::sort instead of qsort.
* objfiles.c (qsort_cmp): Rename to...
(sort_cmp): ...this, and change to std::sort semantics.
(update_section_map): Call std::sort instead of qsort.
* remote.c (compare_pnums): Remove.
(map_regcache_remote_table): Call std::sort instead of qsort.
* utils.c (compare_positive_ints): Remove.
* utils.h (compare_positive_ints): Remove.
* xcoffread.c (compare_lte): Remove.
(arrange_linetable): Call std::sort instead of qsort.
2019-10-19 Sergio Durigan Junior <sergiodj@redhat.com> 2019-10-19 Sergio Durigan Junior <sergiodj@redhat.com>
* symfile.c (init_entry_point_info): Fix typo. * symfile.c (init_entry_point_info): Fix typo.

View File

@ -23,6 +23,8 @@
#include "gdb_obstack.h" #include "gdb_obstack.h"
#include "bcache.h" #include "bcache.h"
#include <algorithm>
/* The type used to hold a single bcache string. The user data is /* The type used to hold a single bcache string. The user data is
stored in d.data. Since it can be any type, it needs to have the stored in d.data. Since it can be any type, it needs to have the
same alignment as the most strict alignment of any type on the host same alignment as the most strict alignment of any type on the host
@ -311,10 +313,8 @@ bcache::print_statistics (const char *type)
/* To compute the median, we need the set of chain lengths /* To compute the median, we need the set of chain lengths
sorted. */ sorted. */
qsort (chain_length, m_num_buckets, sizeof (chain_length[0]), std::sort (chain_length, chain_length + m_num_buckets);
compare_positive_ints); std::sort (entry_size, entry_size + m_unique_count);
qsort (entry_size, m_unique_count, sizeof (entry_size[0]),
compare_positive_ints);
if (m_num_buckets > 0) if (m_num_buckets > 0)
{ {

View File

@ -519,7 +519,7 @@ bool target_exact_watchpoints = false;
static struct breakpoint *breakpoint_chain; static struct breakpoint *breakpoint_chain;
/* Array is sorted by bp_locations_compare - primarily by the ADDRESS. */ /* Array is sorted by bp_location_is_less_than - primarily by the ADDRESS. */
static struct bp_location **bp_locations; static struct bp_location **bp_locations;
@ -773,7 +773,7 @@ show_condition_evaluation_mode (struct ui_file *file, int from_tty,
/* A comparison function for bp_location AP and BP that is used by /* A comparison function for bp_location AP and BP that is used by
bsearch. This comparison function only cares about addresses, unlike bsearch. This comparison function only cares about addresses, unlike
the more general bp_locations_compare function. */ the more general bp_location_is_less_than function. */
static int static int
bp_locations_compare_addrs (const void *ap, const void *bp) bp_locations_compare_addrs (const void *ap, const void *bp)
@ -11428,41 +11428,36 @@ breakpoint_auto_delete (bpstat bs)
} }
/* A comparison function for bp_location AP and BP being interfaced to /* A comparison function for bp_location AP and BP being interfaced to
qsort. Sort elements primarily by their ADDRESS (no matter what std::sort. Sort elements primarily by their ADDRESS (no matter what
bl_address_is_meaningful says), secondarily by ordering first bl_address_is_meaningful says), secondarily by ordering first
permanent elements and terciarily just ensuring the array is sorted permanent elements and terciarily just ensuring the array is sorted
stable way despite qsort being an unstable algorithm. */ stable way despite std::sort being an unstable algorithm. */
static int static int
bp_locations_compare (const void *ap, const void *bp) bp_location_is_less_than (const bp_location *a, const bp_location *b)
{ {
const struct bp_location *a = *(const struct bp_location **) ap;
const struct bp_location *b = *(const struct bp_location **) bp;
if (a->address != b->address) if (a->address != b->address)
return (a->address > b->address) - (a->address < b->address); return a->address < b->address;
/* Sort locations at the same address by their pspace number, keeping /* Sort locations at the same address by their pspace number, keeping
locations of the same inferior (in a multi-inferior environment) locations of the same inferior (in a multi-inferior environment)
grouped. */ grouped. */
if (a->pspace->num != b->pspace->num) if (a->pspace->num != b->pspace->num)
return ((a->pspace->num > b->pspace->num) return a->pspace->num < b->pspace->num;
- (a->pspace->num < b->pspace->num));
/* Sort permanent breakpoints first. */ /* Sort permanent breakpoints first. */
if (a->permanent != b->permanent) if (a->permanent != b->permanent)
return (a->permanent < b->permanent) - (a->permanent > b->permanent); return a->permanent > b->permanent;
/* Make the internal GDB representation stable across GDB runs /* Make the internal GDB representation stable across GDB runs
where A and B memory inside GDB can differ. Breakpoint locations of where A and B memory inside GDB can differ. Breakpoint locations of
the same type at the same address can be sorted in arbitrary order. */ the same type at the same address can be sorted in arbitrary order. */
if (a->owner->number != b->owner->number) if (a->owner->number != b->owner->number)
return ((a->owner->number > b->owner->number) return a->owner->number < b->owner->number;
- (a->owner->number < b->owner->number));
return (a > b) - (a < b); return a < b;
} }
/* Set bp_locations_placed_address_before_address_max and /* Set bp_locations_placed_address_before_address_max and
@ -11677,8 +11672,8 @@ update_global_location_list (enum ugll_insert_mode insert_mode)
ALL_BREAKPOINTS (b) ALL_BREAKPOINTS (b)
for (loc = b->loc; loc; loc = loc->next) for (loc = b->loc; loc; loc = loc->next)
*locp++ = loc; *locp++ = loc;
qsort (bp_locations, bp_locations_count, sizeof (*bp_locations), std::sort (bp_locations, bp_locations + bp_locations_count,
bp_locations_compare); bp_location_is_less_than);
bp_locations_target_extensions_update (); bp_locations_target_extensions_update ();

View File

@ -49,8 +49,6 @@ struct pending_block
struct block *block; struct block *block;
}; };
static int compare_line_numbers (const void *ln1p, const void *ln2p);
/* Initial sizes of data structures. These are realloc'd larger if /* Initial sizes of data structures. These are realloc'd larger if
needed, and realloc'd down to the size actually used, when needed, and realloc'd down to the size actually used, when
completed. */ completed. */
@ -729,23 +727,20 @@ buildsym_compunit::record_line (struct subfile *subfile, int line,
/* Needed in order to sort line tables from IBM xcoff files. Sigh! */ /* Needed in order to sort line tables from IBM xcoff files. Sigh! */
static int static bool
compare_line_numbers (const void *ln1p, const void *ln2p) lte_is_less_than (const linetable_entry &ln1, const linetable_entry &ln2)
{ {
struct linetable_entry *ln1 = (struct linetable_entry *) ln1p;
struct linetable_entry *ln2 = (struct linetable_entry *) ln2p;
/* Note: this code does not assume that CORE_ADDRs can fit in ints. /* Note: this code does not assume that CORE_ADDRs can fit in ints.
Please keep it that way. */ Please keep it that way. */
if (ln1->pc < ln2->pc) if (ln1.pc < ln2.pc)
return -1; return true;
if (ln1->pc > ln2->pc) if (ln1.pc > ln2.pc)
return 1; return false;
/* If pc equal, sort by line. I'm not sure whether this is optimum /* If pc equal, sort by line. I'm not sure whether this is optimum
behavior (see comment at struct linetable in symtab.h). */ behavior (see comment at struct linetable in symtab.h). */
return ln1->line - ln2->line; return ln1.line < ln2.line;
} }
/* Subroutine of end_symtab to simplify it. Look for a subfile that /* Subroutine of end_symtab to simplify it. Look for a subfile that
@ -968,9 +963,10 @@ buildsym_compunit::end_symtab_with_blockvector (struct block *static_block,
scrambled in reordered executables. Sort it if scrambled in reordered executables. Sort it if
OBJF_REORDERED is true. */ OBJF_REORDERED is true. */
if (m_objfile->flags & OBJF_REORDERED) if (m_objfile->flags & OBJF_REORDERED)
qsort (subfile->line_vector->item, std::sort (subfile->line_vector->item,
subfile->line_vector->nitems, subfile->line_vector->item
sizeof (struct linetable_entry), compare_line_numbers); + subfile->line_vector->nitems,
lte_is_less_than);
} }
/* Allocate a symbol table if necessary. */ /* Allocate a symbol table if necessary. */

View File

@ -163,28 +163,27 @@ gdb_disassembler::dis_asm_print_address (bfd_vma addr,
print_address (self->arch (), addr, self->stream ()); print_address (self->arch (), addr, self->stream ());
} }
static int static bool
compare_lines (const void *mle1p, const void *mle2p) line_is_less_than (const deprecated_dis_line_entry &mle1,
const deprecated_dis_line_entry &mle2)
{ {
struct deprecated_dis_line_entry *mle1, *mle2; bool val;
int val;
mle1 = (struct deprecated_dis_line_entry *) mle1p;
mle2 = (struct deprecated_dis_line_entry *) mle2p;
/* End of sequence markers have a line number of 0 but don't want to /* End of sequence markers have a line number of 0 but don't want to
be sorted to the head of the list, instead sort by PC. */ be sorted to the head of the list, instead sort by PC. */
if (mle1->line == 0 || mle2->line == 0) if (mle1.line == 0 || mle2.line == 0)
{ {
val = mle1->start_pc - mle2->start_pc; if (mle1.start_pc != mle2.start_pc)
if (val == 0) val = mle1.start_pc < mle2.start_pc;
val = mle1->line - mle2->line; else
val = mle1.line < mle2.line;
} }
else else
{ {
val = mle1->line - mle2->line; if (mle1.line != mle2.line)
if (val == 0) val = mle1.line < mle2.line;
val = mle1->start_pc - mle2->start_pc; else
val = mle1.start_pc < mle2.start_pc;
} }
return val; return val;
} }
@ -404,8 +403,7 @@ do_mixed_source_and_assembly_deprecated
/* Now, sort mle by line #s (and, then by addresses within lines). */ /* Now, sort mle by line #s (and, then by addresses within lines). */
if (out_of_order) if (out_of_order)
qsort (mle, newlines, sizeof (struct deprecated_dis_line_entry), std::sort (mle, mle + newlines, line_is_less_than);
compare_lines);
/* Now, for each line entry, emit the specified lines (unless /* Now, for each line entry, emit the specified lines (unless
they have been emitted before), followed by the assembly code they have been emitted before), followed by the assembly code

View File

@ -44,6 +44,8 @@
#include "selftest-arch.h" #include "selftest-arch.h"
#endif #endif
#include <algorithm>
struct comp_unit; struct comp_unit;
/* Call Frame Information (CFI). */ /* Call Frame Information (CFI). */
@ -2181,25 +2183,22 @@ Corrupt data in %s:%s; align 8 workaround apparently succeeded"),
return ret; return ret;
} }
static int static bool
qsort_fde_cmp (const void *a, const void *b) fde_is_less_than (const dwarf2_fde *aa, const dwarf2_fde *bb)
{ {
struct dwarf2_fde *aa = *(struct dwarf2_fde **)a;
struct dwarf2_fde *bb = *(struct dwarf2_fde **)b;
if (aa->initial_location == bb->initial_location) if (aa->initial_location == bb->initial_location)
{ {
if (aa->address_range != bb->address_range if (aa->address_range != bb->address_range
&& aa->eh_frame_p == 0 && bb->eh_frame_p == 0) && aa->eh_frame_p == 0 && bb->eh_frame_p == 0)
/* Linker bug, e.g. gold/10400. /* Linker bug, e.g. gold/10400.
Work around it by keeping stable sort order. */ Work around it by keeping stable sort order. */
return (a < b) ? -1 : 1; return aa < bb;
else else
/* Put eh_frame entries after debug_frame ones. */ /* Put eh_frame entries after debug_frame ones. */
return aa->eh_frame_p - bb->eh_frame_p; return aa->eh_frame_p < bb->eh_frame_p;
} }
return (aa->initial_location < bb->initial_location) ? -1 : 1; return aa->initial_location < bb->initial_location;
} }
void void
@ -2347,8 +2346,8 @@ dwarf2_build_frame_info (struct objfile *objfile)
int i; int i;
/* Prepare FDE table for lookups. */ /* Prepare FDE table for lookups. */
qsort (fde_table.entries, fde_table.num_entries, std::sort (fde_table.entries, fde_table.entries + fde_table.num_entries,
sizeof (fde_table.entries[0]), qsort_fde_cmp); fde_is_less_than);
/* Check for leftovers from --gc-sections. The GNU linker sets /* Check for leftovers from --gc-sections. The GNU linker sets
the relevant symbols to zero, but doesn't zero the FDE *end* the relevant symbols to zero, but doesn't zero the FDE *end*

View File

@ -68,6 +68,8 @@
#include "expression.h" #include "expression.h"
#include <algorithm>
/* Provide a way to test if we have both ECOFF and ELF symbol tables. /* Provide a way to test if we have both ECOFF and ELF symbol tables.
We use this define in order to know whether we should override a We use this define in order to know whether we should override a
symbol's ECOFF section with its ELF section. This is necessary in symbol's ECOFF section with its ELF section. This is necessary in
@ -4560,17 +4562,16 @@ add_line (struct linetable *lt, int lineno, CORE_ADDR adr, int last)
/* Blocks with a smaller low bound should come first. */ /* Blocks with a smaller low bound should come first. */
static int static bool
compare_blocks (const void *arg1, const void *arg2) block_is_less_than (const struct block *b1, const struct block *b2)
{ {
LONGEST addr_diff; CORE_ADDR start1 = BLOCK_START (b1);
struct block **b1 = (struct block **) arg1; CORE_ADDR start2 = BLOCK_START (b2);
struct block **b2 = (struct block **) arg2;
addr_diff = (BLOCK_START ((*b1))) - (BLOCK_START ((*b2))); if (start1 != start2)
if (addr_diff == 0) return start1 < start2;
return (BLOCK_END ((*b2))) - (BLOCK_END ((*b1)));
return addr_diff; return (BLOCK_END (b2)) < (BLOCK_END (b1));
} }
/* Sort the blocks of a symtab S. /* Sort the blocks of a symtab S.
@ -4600,10 +4601,9 @@ sort_blocks (struct symtab *s)
* to detect -O3 images in advance. * to detect -O3 images in advance.
*/ */
if (BLOCKVECTOR_NBLOCKS (bv) > FIRST_LOCAL_BLOCK + 1) if (BLOCKVECTOR_NBLOCKS (bv) > FIRST_LOCAL_BLOCK + 1)
qsort (&BLOCKVECTOR_BLOCK (bv, FIRST_LOCAL_BLOCK), std::sort (&BLOCKVECTOR_BLOCK (bv, FIRST_LOCAL_BLOCK),
BLOCKVECTOR_NBLOCKS (bv) - FIRST_LOCAL_BLOCK, &BLOCKVECTOR_BLOCK (bv, BLOCKVECTOR_NBLOCKS (bv)),
sizeof (struct block *), block_is_less_than);
compare_blocks);
{ {
CORE_ADDR high = 0; CORE_ADDR high = 0;

View File

@ -1019,18 +1019,16 @@ have_minimal_symbols (void)
/* Qsort comparison function. */ /* Qsort comparison function. */
static int static bool
qsort_cmp (const void *a, const void *b) sort_cmp (const struct obj_section *sect1, const obj_section *sect2)
{ {
const struct obj_section *sect1 = *(const struct obj_section **) a;
const struct obj_section *sect2 = *(const struct obj_section **) b;
const CORE_ADDR sect1_addr = obj_section_addr (sect1); const CORE_ADDR sect1_addr = obj_section_addr (sect1);
const CORE_ADDR sect2_addr = obj_section_addr (sect2); const CORE_ADDR sect2_addr = obj_section_addr (sect2);
if (sect1_addr < sect2_addr) if (sect1_addr < sect2_addr)
return -1; return true;
else if (sect1_addr > sect2_addr) else if (sect1_addr > sect2_addr)
return 1; return false;
else else
{ {
/* Sections are at the same address. This could happen if /* Sections are at the same address. This could happen if
@ -1047,12 +1045,12 @@ qsort_cmp (const void *a, const void *b)
/* Case A. The ordering doesn't matter: separate debuginfo files /* Case A. The ordering doesn't matter: separate debuginfo files
will be filtered out later. */ will be filtered out later. */
return 0; return false;
} }
/* Case B. Maintain stable sort order, so bugs in GDB are easier to /* Case B. Maintain stable sort order, so bugs in GDB are easier to
triage. This section could be slow (since we iterate over all triage. This section could be slow (since we iterate over all
objfiles in each call to qsort_cmp), but this shouldn't happen objfiles in each call to sort_cmp), but this shouldn't happen
very often (GDB is already in a confused state; one hopes this very often (GDB is already in a confused state; one hopes this
doesn't happen at all). If you discover that significant time is doesn't happen at all). If you discover that significant time is
spent in the loops below, do 'set complaints 100' and examine the spent in the loops below, do 'set complaints 100' and examine the
@ -1067,9 +1065,9 @@ qsort_cmp (const void *a, const void *b)
ALL_OBJFILE_OSECTIONS (objfile1, osect) ALL_OBJFILE_OSECTIONS (objfile1, osect)
if (osect == sect1) if (osect == sect1)
return -1; return true;
else if (osect == sect2) else if (osect == sect2)
return 1; return false;
/* We should have found one of the sections before getting here. */ /* We should have found one of the sections before getting here. */
gdb_assert_not_reached ("section not found"); gdb_assert_not_reached ("section not found");
@ -1080,9 +1078,9 @@ qsort_cmp (const void *a, const void *b)
for (objfile *objfile : current_program_space->objfiles ()) for (objfile *objfile : current_program_space->objfiles ())
if (objfile == objfile1) if (objfile == objfile1)
return -1; return true;
else if (objfile == objfile2) else if (objfile == objfile2)
return 1; return false;
/* We should have found one of the objfiles before getting here. */ /* We should have found one of the objfiles before getting here. */
gdb_assert_not_reached ("objfile not found"); gdb_assert_not_reached ("objfile not found");
@ -1091,7 +1089,7 @@ qsort_cmp (const void *a, const void *b)
/* Unreachable. */ /* Unreachable. */
gdb_assert_not_reached ("unexpected code path"); gdb_assert_not_reached ("unexpected code path");
return 0; return false;
} }
/* Select "better" obj_section to keep. We prefer the one that came from /* Select "better" obj_section to keep. We prefer the one that came from
@ -1283,7 +1281,7 @@ update_section_map (struct program_space *pspace,
if (insert_section_p (objfile->obfd, s->the_bfd_section)) if (insert_section_p (objfile->obfd, s->the_bfd_section))
map[i++] = s; map[i++] = s;
qsort (map, alloc_size, sizeof (*map), qsort_cmp); std::sort (map, map + alloc_size, sort_cmp);
map_size = filter_debuginfo_sections(map, alloc_size); map_size = filter_debuginfo_sections(map, alloc_size);
map_size = filter_overlapping_sections(map, map_size); map_size = filter_overlapping_sections(map, map_size);

View File

@ -75,6 +75,7 @@
#include "gdbsupport/scoped_restore.h" #include "gdbsupport/scoped_restore.h"
#include "gdbsupport/environ.h" #include "gdbsupport/environ.h"
#include "gdbsupport/byte-vector.h" #include "gdbsupport/byte-vector.h"
#include <algorithm>
#include <unordered_map> #include <unordered_map>
/* The remote target. */ /* The remote target. */
@ -1275,22 +1276,6 @@ show_remote_exec_file (struct ui_file *file, int from_tty,
fprintf_filtered (file, "%s\n", remote_exec_file_var); fprintf_filtered (file, "%s\n", remote_exec_file_var);
} }
static int
compare_pnums (const void *lhs_, const void *rhs_)
{
const struct packet_reg * const *lhs
= (const struct packet_reg * const *) lhs_;
const struct packet_reg * const *rhs
= (const struct packet_reg * const *) rhs_;
if ((*lhs)->pnum < (*rhs)->pnum)
return -1;
else if ((*lhs)->pnum == (*rhs)->pnum)
return 0;
else
return 1;
}
static int static int
map_regcache_remote_table (struct gdbarch *gdbarch, struct packet_reg *regs) map_regcache_remote_table (struct gdbarch *gdbarch, struct packet_reg *regs)
{ {
@ -1321,8 +1306,9 @@ map_regcache_remote_table (struct gdbarch *gdbarch, struct packet_reg *regs)
if (regs[regnum].pnum != -1) if (regs[regnum].pnum != -1)
remote_regs[num_remote_regs++] = &regs[regnum]; remote_regs[num_remote_regs++] = &regs[regnum];
qsort (remote_regs, num_remote_regs, sizeof (struct packet_reg *), std::sort (remote_regs, remote_regs + num_remote_regs,
compare_pnums); [] (const packet_reg *a, const packet_reg *b)
{ return a->pnum < b->pnum; });
for (regnum = 0, offset = 0; regnum < num_remote_regs; regnum++) for (regnum = 0, offset = 0; regnum < num_remote_regs; regnum++)
{ {

View File

@ -3050,14 +3050,6 @@ gdb_argv::reset (const char *s)
m_argv = argv; m_argv = argv;
} }
int
compare_positive_ints (const void *ap, const void *bp)
{
/* Because we know we're comparing two ints which are positive,
there's no danger of overflow here. */
return * (int *) ap - * (int *) bp;
}
#define AMBIGUOUS_MESS1 ".\nMatching formats:" #define AMBIGUOUS_MESS1 ".\nMatching formats:"
#define AMBIGUOUS_MESS2 \ #define AMBIGUOUS_MESS2 \
".\nUse \"set gnutarget format-name\" to specify the format." ".\nUse \"set gnutarget format-name\" to specify the format."

View File

@ -101,8 +101,6 @@ extern int streq_hash (const void *, const void *);
extern int subset_compare (const char *, const char *); extern int subset_compare (const char *, const char *);
int compare_positive_ints (const void *ap, const void *bp);
/* Compare C strings for std::sort. */ /* Compare C strings for std::sort. */
static inline bool static inline bool

View File

@ -28,6 +28,7 @@
#include <sys/file.h> #include <sys/file.h>
#endif #endif
#include <sys/stat.h> #include <sys/stat.h>
#include <algorithm>
#include "coff/internal.h" #include "coff/internal.h"
#include "libcoff.h" /* FIXME, internal data from BFD */ #include "libcoff.h" /* FIXME, internal data from BFD */
@ -234,8 +235,6 @@ static void read_xcoff_symtab (struct objfile *, struct partial_symtab *);
static void add_stab_to_list (char *, struct pending_stabs **); static void add_stab_to_list (char *, struct pending_stabs **);
#endif #endif
static int compare_lte (const void *, const void *);
static struct linetable *arrange_linetable (struct linetable *); static struct linetable *arrange_linetable (struct linetable *);
static void record_include_end (struct coff_symbol *); static void record_include_end (struct coff_symbol *);
@ -407,18 +406,6 @@ add_stab_to_list (char *stabname, struct pending_stabs **stabvector)
/* *INDENT-ON* */ /* *INDENT-ON* */
/* compare line table entry addresses. */
static int
compare_lte (const void *lte1p, const void *lte2p)
{
struct linetable_entry *lte1 = (struct linetable_entry *) lte1p;
struct linetable_entry *lte2 = (struct linetable_entry *) lte2p;
return lte1->pc - lte2->pc;
}
/* Given a line table with function entries are marked, arrange its /* Given a line table with function entries are marked, arrange its
functions in ascending order and strip off function entry markers functions in ascending order and strip off function entry markers
and return it in a newly created table. If the old one is good and return it in a newly created table. If the old one is good
@ -471,8 +458,9 @@ arrange_linetable (struct linetable *oldLineTb)
return oldLineTb; return oldLineTb;
} }
else if (function_count > 1) else if (function_count > 1)
qsort (fentry, function_count, std::sort (fentry, fentry + function_count,
sizeof (struct linetable_entry), compare_lte); [] (const linetable_entry &lte1, const linetable_entry& lte2)
{ return lte1.pc < lte2.pc; });
/* Allocate a new line table. */ /* Allocate a new line table. */
newLineTb = (struct linetable *) newLineTb = (struct linetable *)