aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2023-03-07 18:24:14 -0700
committerTom Tromey <tom@tromey.com>2023-03-11 08:39:51 -0700
commit6e6ac32dde61fd3019b05adaeec372eb16c12bff (patch)
treee2d571fa24a342eeaac29d8eec2600535d7b2248
parent1afdbb1e986157a73a7bf1cf4fa03b9426e824e8 (diff)
downloadgdb-6e6ac32dde61fd3019b05adaeec372eb16c12bff.zip
gdb-6e6ac32dde61fd3019b05adaeec372eb16c12bff.tar.gz
gdb-6e6ac32dde61fd3019b05adaeec372eb16c12bff.tar.bz2
Add operator< and operator== to linetable_entry
This adds a couple of comparison operators to linetable_entry, and simplifies both the calls to sort and one other spot that checks for equality. Approved-By: Simon Marchi <simon.marchi@efficios.com>
-rw-r--r--gdb/buildsym.c14
-rw-r--r--gdb/disasm.c2
-rw-r--r--gdb/symtab.h13
-rw-r--r--gdb/xcoffread.c4
4 files changed, 16 insertions, 17 deletions
diff --git a/gdb/buildsym.c b/gdb/buildsym.c
index 712ca4b..459bc84 100644
--- a/gdb/buildsym.c
+++ b/gdb/buildsym.c
@@ -891,25 +891,13 @@ buildsym_compunit::end_compunit_symtab_with_blockvector
{
if (!subfile->line_vector_entries.empty ())
{
- const auto lte_is_less_than
- = [] (const linetable_entry &ln1,
- const linetable_entry &ln2) -> bool
- {
- if (ln1.pc == ln2.pc
- && ((ln1.line == 0) != (ln2.line == 0)))
- return ln1.line == 0;
-
- return (ln1.pc < ln2.pc);
- };
-
/* Like the pending blocks, the line table may be scrambled
in reordered executables. Sort it. It is important to
preserve the order of lines at the same address, as this
maintains the inline function caller/callee
relationships, this is why std::stable_sort is used. */
std::stable_sort (subfile->line_vector_entries.begin (),
- subfile->line_vector_entries.end (),
- lte_is_less_than);
+ subfile->line_vector_entries.end ());
}
/* Allocate a symbol table if necessary. */
diff --git a/gdb/disasm.c b/gdb/disasm.c
index a040637..49053dc 100644
--- a/gdb/disasm.c
+++ b/gdb/disasm.c
@@ -604,7 +604,7 @@ do_mixed_source_and_assembly_deprecated
for (; i < nlines - 1 && le[i].pc < high; i++)
{
- if (le[i].line == le[i + 1].line && le[i].pc == le[i + 1].pc)
+ if (le[i] == le[i + 1])
continue; /* Ignore duplicates. */
/* Skip any end-of-function markers. */
diff --git a/gdb/symtab.h b/gdb/symtab.h
index c565bc8..69f0eaa 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -1547,6 +1547,19 @@ struct rust_vtable_symbol : public symbol
struct linetable_entry
{
+ bool operator< (const linetable_entry &other) const
+ {
+ if (pc == other.pc
+ && (line != 0) != (other.line != 0))
+ return line == 0;
+ return pc < other.pc;
+ }
+
+ /* Two entries are equal if they have the same line and PC. The
+ other members are ignored. */
+ bool operator== (const linetable_entry &other) const
+ { return line == other.line && pc == other.pc; }
+
/* The line number for this entry. */
int line;
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index 78aa953..819735d 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -439,9 +439,7 @@ arrange_linetable (std::vector<linetable_entry> &old_linetable)
if (fentries.empty ())
return;
- std::sort (fentries.begin (), fentries.end (),
- [] (const linetable_entry &lte1, const linetable_entry& lte2)
- { return lte1.pc < lte2.pc; });
+ std::sort (fentries.begin (), fentries.end ());
/* Allocate a new line table. */
std::vector<linetable_entry> new_linetable;