Change how complex types are printed in C
[deliverable/binutils-gdb.git] / gdb / buildsym.c
index 5b2a92c75ae149acc0f787da8b8cdc417a4c7220..7155db34b085c36ea3c4d599be8a2151c8bfa889 100644 (file)
@@ -120,7 +120,7 @@ buildsym_compunit::get_macro_table ()
 {
   if (m_pending_macros == nullptr)
     m_pending_macros = new_macro_table (&m_objfile->per_bfd->storage_obstack,
-                                       &m_objfile->per_bfd->macro_cache,
+                                       &m_objfile->per_bfd->string_cache,
                                        m_compunit_symtab);
   return m_pending_macros;
 }
@@ -666,7 +666,7 @@ buildsym_compunit::pop_subfile ()
 
 void
 buildsym_compunit::record_line (struct subfile *subfile, int line,
-                               CORE_ADDR pc)
+                               CORE_ADDR pc, bool is_stmt)
 {
   struct linetable_entry *e;
 
@@ -681,6 +681,20 @@ buildsym_compunit::record_line (struct subfile *subfile, int line,
       m_have_line_numbers = true;
     }
 
+  if (subfile->line_vector->nitems > 0)
+    {
+      /* If we have a duplicate for the previous entry then ignore the new
+        entry, except, if the new entry is setting the is_stmt flag, then
+        ensure the previous entry respects the new setting.  */
+      e = subfile->line_vector->item + subfile->line_vector->nitems - 1;
+      if (e->line == line && e->pc == pc)
+       {
+         if (is_stmt && !e->is_stmt)
+           e->is_stmt = 1;
+         return;
+       }
+    }
+
   if (subfile->line_vector->nitems + 1 >= subfile->line_vector_length)
     {
       subfile->line_vector_length *= 2;
@@ -716,26 +730,10 @@ buildsym_compunit::record_line (struct subfile *subfile, int line,
 
   e = subfile->line_vector->item + subfile->line_vector->nitems++;
   e->line = line;
+  e->is_stmt = is_stmt ? 1 : 0;
   e->pc = pc;
 }
 
-/* Needed in order to sort line tables from IBM xcoff files.  Sigh!  */
-
-static bool
-lte_is_less_than (const linetable_entry &ln1, const linetable_entry &ln2)
-{
-  /* Note: this code does not assume that CORE_ADDRs can fit in ints.
-     Please keep it that way.  */
-  if (ln1.pc < ln2.pc)
-    return true;
-
-  if (ln1.pc > ln2.pc)
-    return false;
-
-  /* If pc equal, sort by line.  I'm not sure whether this is optimum
-     behavior (see comment at struct linetable in symtab.h).  */
-  return ln1.line < ln2.line;
-}
 \f
 /* Subroutine of end_symtab to simplify it.  Look for a subfile that
    matches the main source file's basename.  If there is only one, and
@@ -953,14 +951,23 @@ buildsym_compunit::end_symtab_with_blockvector (struct block *static_block,
          linetablesize = sizeof (struct linetable) +
            subfile->line_vector->nitems * sizeof (struct linetable_entry);
 
-         /* Like the pending blocks, the line table may be
-            scrambled in reordered executables.  Sort it if
-            OBJF_REORDERED is true.  */
+         const auto lte_is_less_than
+           = [] (const linetable_entry &ln1,
+                 const linetable_entry &ln2) -> bool
+             {
+               return (ln1.pc < ln2.pc);
+             };
+
+         /* Like the pending blocks, the line table may be scrambled in
+            reordered executables.  Sort it if OBJF_REORDERED is true.  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.  */
          if (m_objfile->flags & OBJF_REORDERED)
-           std::sort (subfile->line_vector->item,
-                      subfile->line_vector->item
-                        + subfile->line_vector->nitems,
-                      lte_is_less_than);
+           std::stable_sort (subfile->line_vector->item,
+                             subfile->line_vector->item
+                             + subfile->line_vector->nitems,
+                             lte_is_less_than);
        }
 
       /* Allocate a symbol table if necessary.  */
This page took 0.024725 seconds and 4 git commands to generate.