* rs6000-tdep.c (ppc_deal_with_atomic_sequence): Correct branch
authorAlan Modra <amodra@gmail.com>
Tue, 22 Nov 2011 08:19:16 +0000 (08:19 +0000)
committerAlan Modra <amodra@gmail.com>
Tue, 22 Nov 2011 08:19:16 +0000 (08:19 +0000)
destination calculation.  Don't expect >> to sign extend.  Don't
add a break if branch lands inside the sequence anywhere.

gdb/ChangeLog
gdb/rs6000-tdep.c

index 109c2f7df4456d638d60932be86b562957cce250..d94e5066d86958b10eff3854be9ecdaf5f76869a 100644 (file)
@@ -1,3 +1,9 @@
+2011-11-22  Alan Modra  <amodra@gmail.com>
+
+       * rs6000-tdep.c (ppc_deal_with_atomic_sequence): Correct branch
+       destination calculation.  Don't expect >> to sign extend.  Don't
+       add a break if branch lands inside the sequence anywhere.
+
 2011-11-21  Keith Seitz  <keiths@redhat.com>
 
        * gdb.mi/mi-var-display.exp: Remove XFAIL for c_variable-7.51,
index 653964430f0b7153f5cb4c396084ae9e91a4a646..da3a7a4a89df173937a0d15add1da6c65fc29de3 100644 (file)
@@ -1116,8 +1116,8 @@ ppc_deal_with_atomic_sequence (struct frame_info *frame)
          its destination address.  */
       if ((insn & BRANCH_MASK) == BC_INSN)
         {
-          int immediate = ((insn & ~3) << 16) >> 16;
-          int absolute = ((insn >> 1) & 1);
+          int immediate = ((insn & 0xfffc) ^ 0x8000) - 0x8000;
+          int absolute = insn & 2;
 
           if (bc_insn_count >= 1)
             return 0; /* More than one conditional branch found, fallback 
@@ -1126,7 +1126,7 @@ ppc_deal_with_atomic_sequence (struct frame_info *frame)
          if (absolute)
            breaks[1] = immediate;
          else
-           breaks[1] = pc + immediate;
+           breaks[1] = loc + immediate;
 
          bc_insn_count++;
          last_breakpoint++;
@@ -1150,11 +1150,10 @@ ppc_deal_with_atomic_sequence (struct frame_info *frame)
   breaks[0] = loc;
 
   /* Check for duplicated breakpoints.  Check also for a breakpoint
-     placed (branch instruction's destination) at the stwcx/stdcx 
-     instruction, this resets the reservation and take us back to the 
-     lwarx/ldarx instruction at the beginning of the atomic sequence.  */
-  if (last_breakpoint && ((breaks[1] == breaks[0]) 
-      || (breaks[1] == closing_insn)))
+     placed (branch instruction's destination) anywhere in sequence.  */
+  if (last_breakpoint
+      && (breaks[1] == breaks[0]
+         || (breaks[1] >= pc && breaks[1] <= closing_insn)))
     last_breakpoint = 0;
 
   /* Effectively inserts the breakpoints.  */