AIX: Remove exec_one_dummy_insn hack
authorUlrich Weigand <ulrich.weigand@de.ibm.com>
Wed, 10 Sep 2014 13:59:33 +0000 (15:59 +0200)
committerUlrich Weigand <ulrich.weigand@de.ibm.com>
Wed, 10 Sep 2014 13:59:33 +0000 (15:59 +0200)
Old AIX versions required GDB to update the stack pointer register and
execute at least one instruction before accessing the space newly allocated
on the user stack.  This was done using the exec_one_dummy_insn routine
in rs6000-nat.c

However, in currently supported AIX versions (tested on AIX 6.1), this hack
is no longer necessary.  In fact, removing the hack actually fixed several
test case failures, and removes a call to deprecated_insert_raw_breakpoint.

gdb/ChangeLog:

* rs6000-nat.c (exec_one_dummy_insn): Remove.
(store_register): Do not call exec_one_dummy_insn.

gdb/ChangeLog
gdb/rs6000-nat.c

index 4601ae7..2388096 100644 (file)
@@ -1,3 +1,8 @@
+2014-09-10  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * rs6000-nat.c (exec_one_dummy_insn): Remove.
+       (store_register): Do not call exec_one_dummy_insn.
+
 2014-09-10  Joel Brobecker  <brobecker@adacore.com>
 
        * ada-lang.c (ada_array_bound): If ARR is a TYPE_CODE_PTR,
index 1b09680..68fb5c9 100644 (file)
@@ -76,8 +76,6 @@
 # define ARCH64() (register_size (target_gdbarch (), 0) == 8)
 #endif
 
-static void exec_one_dummy_insn (struct regcache *);
-
 static target_xfer_partial_ftype rs6000_xfer_shared_libraries;
 
 /* Given REGNO, a gdb register number, return the corresponding
@@ -253,14 +251,6 @@ store_register (struct regcache *regcache, int regno)
   /* Fixed-point registers.  */
   else
     {
-      if (regno == gdbarch_sp_regnum (gdbarch))
-       /* Execute one dummy instruction (which is a breakpoint) in inferior
-          process to give kernel a chance to do internal housekeeping.
-          Otherwise the following ptrace(2) calls will mess up user stack
-          since kernel will get confused about the bottom of the stack
-          (%sp).  */
-       exec_one_dummy_insn (regcache);
-
       /* The PT_WRITE_GPR operation is rather odd.  For 32-bit inferiors,
          the register's value is passed by value, but for 64-bit inferiors,
         the address of a buffer containing the value is passed.  */
@@ -533,53 +523,6 @@ rs6000_wait (struct target_ops *ops,
 
   return pid_to_ptid (pid);
 }
-
-/* Execute one dummy breakpoint instruction.  This way we give the kernel
-   a chance to do some housekeeping and update inferior's internal data,
-   including u_area.  */
-
-static void
-exec_one_dummy_insn (struct regcache *regcache)
-{
-#define        DUMMY_INSN_ADDR AIX_TEXT_SEGMENT_BASE+0x200
-
-  struct gdbarch *gdbarch = get_regcache_arch (regcache);
-  int ret, status, pid;
-  CORE_ADDR prev_pc;
-  void *bp;
-
-  /* We plant one dummy breakpoint into DUMMY_INSN_ADDR address.  We
-     assume that this address will never be executed again by the real
-     code.  */
-
-  bp = deprecated_insert_raw_breakpoint (gdbarch, NULL, DUMMY_INSN_ADDR);
-
-  /* You might think this could be done with a single ptrace call, and
-     you'd be correct for just about every platform I've ever worked
-     on.  However, rs6000-ibm-aix4.1.3 seems to have screwed this up --
-     the inferior never hits the breakpoint (it's also worth noting
-     powerpc-ibm-aix4.1.3 works correctly).  */
-  prev_pc = regcache_read_pc (regcache);
-  regcache_write_pc (regcache, DUMMY_INSN_ADDR);
-  if (ARCH64 ())
-    ret = rs6000_ptrace64 (PT_CONTINUE, ptid_get_pid (inferior_ptid),
-                          1, 0, NULL);
-  else
-    ret = rs6000_ptrace32 (PT_CONTINUE, ptid_get_pid (inferior_ptid),
-                          (int *) 1, 0, NULL);
-
-  if (ret != 0)
-    perror (_("pt_continue"));
-
-  do
-    {
-      pid = waitpid (ptid_get_pid (inferior_ptid), &status, 0);
-    }
-  while (pid != ptid_get_pid (inferior_ptid));
-
-  regcache_write_pc (regcache, prev_pc);
-  deprecated_remove_raw_breakpoint (gdbarch, bp);
-}
 \f
 
 /* Set the current architecture from the host running GDB.  Called when