From: Ulrich Weigand Date: Wed, 10 Sep 2014 13:59:33 +0000 (+0200) Subject: AIX: Remove exec_one_dummy_insn hack X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8efa9855823a78b8f465f39ddd8736266a6f31c4;p=binutils-gdb.git AIX: Remove exec_one_dummy_insn hack 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4601ae7eb60..2388096e639 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2014-09-10 Ulrich Weigand  + + * rs6000-nat.c (exec_one_dummy_insn): Remove. + (store_register): Do not call exec_one_dummy_insn. + 2014-09-10 Joel Brobecker * ada-lang.c (ada_array_bound): If ARR is a TYPE_CODE_PTR, diff --git a/gdb/rs6000-nat.c b/gdb/rs6000-nat.c index 1b09680f5f4..68fb5c9cb02 100644 --- a/gdb/rs6000-nat.c +++ b/gdb/rs6000-nat.c @@ -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); -} /* Set the current architecture from the host running GDB. Called when