Fix sparc prologue skipping
authorTom Tromey <tromey@adacore.com>
Mon, 21 Sep 2020 13:09:10 +0000 (07:09 -0600)
committerTom Tromey <tromey@adacore.com>
Mon, 21 Sep 2020 13:09:10 +0000 (07:09 -0600)
sparc can fail at inline prologue skipping.  Andrew Burgess tracked
this down to sparc32_skip_prologue, which should use
skip_prologue_using_sal rather than its hand-rolled variant.

I don't have a good way to test this with the gdb test suite (is there
a board file for using qemu?  That would help), but it fixes a
regression in the internal AdaCore test suite.  We've had this patch
internally at AdaCore for a while, but I just now finally got around
to making sure that backing it out reintroduces the problem.

gdb/ChangeLog
2020-09-21  Tom Tromey  <tromey@adacore.com>

* sparc-tdep.c (sparc32_skip_prologue): Use
skip_prologue_using_sal.

gdb/ChangeLog
gdb/sparc-tdep.c

index 131ec931708c58b1a85def02079f297c6cd7dfe9..ce9cef5f516976b778823ee1f1426743b64cb5ee 100644 (file)
@@ -1,3 +1,8 @@
+2020-09-21  Tom Tromey  <tromey@adacore.com>
+
+       * sparc-tdep.c (sparc32_skip_prologue): Use
+       skip_prologue_using_sal.
+
 2020-09-19  Tom Tromey  <tom@tromey.com>
 
        * symfile.c (add_section_size_callback): Remove.
index e9636cd8a74ffb86f5dbfea99816f6b24a42487e..8417a47855fa6c05d2b9ba3af6562c7a885d84d7 100644 (file)
@@ -1127,18 +1127,19 @@ static CORE_ADDR
 sparc32_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
 {
   struct symtab_and_line sal;
-  CORE_ADDR func_start, func_end;
+  CORE_ADDR func_addr;
   struct sparc_frame_cache cache;
 
   /* This is the preferred method, find the end of the prologue by
      using the debugging information.  */
-  if (find_pc_partial_function (start_pc, NULL, &func_start, &func_end))
+
+  if (find_pc_partial_function (start_pc, NULL, &func_addr, NULL))
     {
-      sal = find_pc_line (func_start, 0);
+      CORE_ADDR post_prologue_pc
+       = skip_prologue_using_sal (gdbarch, func_addr);
 
-      if (sal.end < func_end
-         && start_pc <= sal.end)
-       return sal.end;
+      if (post_prologue_pc != 0)
+       return std::max (start_pc, post_prologue_pc);
     }
 
   start_pc = sparc_analyze_prologue (gdbarch, start_pc, 0xffffffffUL, &cache);