Add operator< and operator== to linetable_entry
authorTom Tromey <tom@tromey.com>
Wed, 8 Mar 2023 01:24:14 +0000 (18:24 -0700)
committerTom Tromey <tom@tromey.com>
Sat, 11 Mar 2023 15:39:51 +0000 (08:39 -0700)
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>
gdb/buildsym.c
gdb/disasm.c
gdb/symtab.h
gdb/xcoffread.c

index 712ca4bbd7a79b2878f653f720c332cceb18d278..459bc848c67b46ff4fee57fa5d56218d44c0cd44 100644 (file)
@@ -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.  */
index a0406377acc81f1a316c5e31e32f9a97ef30ac24..49053dcfbad2edbff459f15c7144c3c1fec5bbae 100644 (file)
@@ -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.  */
index c565bc8eac4035117dec429284893283df44c548..69f0eaa0f888548ee6dff9f46f420d24a44452dd 100644 (file)
@@ -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;
 
index 78aa9539d78fd9c88f51240039403d01d807a30a..819735d62db78e68d9aa085ccd647819a7094e38 100644 (file)
@@ -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;