: Fix PR19061, gdb hangs/spins-on-cpu when debugging any program on Alpha

Message ID CAFULd4Z7z2cJESMErDhVX5RfKdmu6iBmrLi=MFEHRxdOy=da7Q@mail.gmail.com
State New, archived
Headers

Commit Message

Uros Bizjak Dec. 17, 2017, 6:11 p.m. UTC
  On Fri, Dec 15, 2017 at 7:21 PM, Pedro Alves <palves@redhat.com> wrote:
> On 12/15/2017 12:11 PM, Uros Bizjak wrote:
>>
>> Please note that I have no commit access, so if approved, please
>> commit the patch to the source repository for me.
>
> Merged.

Thanks!

Attached, please find a patch for gdb-8.0 branch. The patch is tested
in the same way as the patch for mainline, with native
alphaev68-linux-gnu build and tests and with gcc's guality.exp and
simulate-thread.exp testcases.

Uros.
  

Patch

--- alpha-tdep.c	2017-12-14 15:56:48.955960647 +0100
+++ alpha-tdep.c.ub	2017-12-14 15:56:33.751806965 +0100
@@ -766,10 +766,8 @@ 
    the sequence.  */
 
 static VEC (CORE_ADDR) *
-alpha_deal_with_atomic_sequence (struct regcache *regcache)
+alpha_deal_with_atomic_sequence (struct gdbarch *gdbarch, CORE_ADDR pc)
 {
-  struct gdbarch *gdbarch = get_regcache_arch (regcache);
-  CORE_ADDR pc = regcache_read_pc (regcache);
   CORE_ADDR breaks[2] = {-1, -1};
   CORE_ADDR loc = pc;
   CORE_ADDR closing_insn; /* Instruction that closes the atomic sequence.  */
@@ -1721,12 +1719,17 @@ 
 alpha_software_single_step (struct regcache *regcache)
 {
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
-  CORE_ADDR pc;
-  VEC (CORE_ADDR) *next_pcs = NULL;
+  CORE_ADDR pc, next_pc;
+  VEC (CORE_ADDR) *next_pcs;
 
   pc = regcache_read_pc (regcache);
+  next_pcs = alpha_deal_with_atomic_sequence (gdbarch, pc);
+  if (next_pcs != NULL)
+    return next_pcs;
+
+  next_pc = alpha_next_pc (regcache, pc);
 
-  VEC_safe_push (CORE_ADDR, next_pcs, alpha_next_pc (regcache, pc));
+  VEC_safe_push (CORE_ADDR, next_pcs, next_pc);
   return next_pcs;
 }
 
@@ -1826,7 +1829,7 @@ 
   set_gdbarch_cannot_step_breakpoint (gdbarch, 1);
 
   /* Handles single stepping of atomic sequences.  */
-  set_gdbarch_software_single_step (gdbarch, alpha_deal_with_atomic_sequence);
+  set_gdbarch_software_single_step (gdbarch, alpha_software_single_step);
 
   /* Hook in ABI-specific overrides, if they have been registered.  */
   gdbarch_init_osabi (info, gdbarch);