mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-04-06 14:21:43 +08:00
gdb+gdbserver/Linux: Remove USE_SIGTRAP_SIGINFO fallback
It's been over 9 years (since commit faf09f0119da) since Linux GDB and GDBserver started relying on SIGTRAP si_code to tell whether a breakpoint triggered, which is important for non-stop mode. When that then-new code was added, I had left the then-old code as fallback, in case some architectured still needed it. Given AFAIK there haven't been complaints since, this commit finally removes the fallback code, along with USE_SIGTRAP_SIGINFO. Change-Id: I140a5333a9fe70e90dbd186aca1f081549b2e63d
This commit is contained in:
parent
c7d73a7157
commit
5739a1b98d
@ -2633,18 +2633,6 @@ status_callback (struct lwp_info *lp)
|
||||
discard = 1;
|
||||
}
|
||||
|
||||
#if !USE_SIGTRAP_SIGINFO
|
||||
else if (!breakpoint_inserted_here_p (lwp_inferior (lp)->aspace, pc))
|
||||
{
|
||||
linux_nat_debug_printf ("previous breakpoint of %s, at %s gone",
|
||||
lp->ptid.to_string ().c_str (),
|
||||
paddress (current_inferior ()->arch (),
|
||||
lp->stop_pc));
|
||||
|
||||
discard = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (discard)
|
||||
{
|
||||
linux_nat_debug_printf ("pending event of %s cancelled.",
|
||||
@ -2724,9 +2712,7 @@ save_stop_reason (struct lwp_info *lp)
|
||||
struct gdbarch *gdbarch;
|
||||
CORE_ADDR pc;
|
||||
CORE_ADDR sw_bp_pc;
|
||||
#if USE_SIGTRAP_SIGINFO
|
||||
siginfo_t siginfo;
|
||||
#endif
|
||||
|
||||
gdb_assert (lp->stop_reason == TARGET_STOPPED_BY_NO_REASON);
|
||||
gdb_assert (lp->status != 0);
|
||||
@ -2744,7 +2730,6 @@ save_stop_reason (struct lwp_info *lp)
|
||||
pc = regcache_read_pc (regcache);
|
||||
sw_bp_pc = pc - gdbarch_decr_pc_after_break (gdbarch);
|
||||
|
||||
#if USE_SIGTRAP_SIGINFO
|
||||
if (linux_nat_get_siginfo (lp->ptid, &siginfo))
|
||||
{
|
||||
if (siginfo.si_signo == SIGTRAP)
|
||||
@ -2787,21 +2772,6 @@ save_stop_reason (struct lwp_info *lp)
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
if ((!lp->step || lp->stop_pc == sw_bp_pc)
|
||||
&& software_breakpoint_inserted_here_p (inf->aspace, sw_bp_pc))
|
||||
{
|
||||
/* The LWP was either continued, or stepped a software
|
||||
breakpoint instruction. */
|
||||
lp->stop_reason = TARGET_STOPPED_BY_SW_BREAKPOINT;
|
||||
}
|
||||
|
||||
if (hardware_breakpoint_inserted_here_p (inf->aspace, pc))
|
||||
lp->stop_reason = TARGET_STOPPED_BY_HW_BREAKPOINT;
|
||||
|
||||
if (lp->stop_reason == TARGET_STOPPED_BY_NO_REASON)
|
||||
check_stopped_by_watchpoint (lp);
|
||||
#endif
|
||||
|
||||
if (lp->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT)
|
||||
{
|
||||
@ -2847,7 +2817,7 @@ linux_nat_target::stopped_by_sw_breakpoint ()
|
||||
bool
|
||||
linux_nat_target::supports_stopped_by_sw_breakpoint ()
|
||||
{
|
||||
return USE_SIGTRAP_SIGINFO;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Returns true if the LWP had stopped for a hardware
|
||||
@ -2868,7 +2838,7 @@ linux_nat_target::stopped_by_hw_breakpoint ()
|
||||
bool
|
||||
linux_nat_target::supports_stopped_by_hw_breakpoint ()
|
||||
{
|
||||
return USE_SIGTRAP_SIGINFO;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Select one LWP out of those that have events pending. */
|
||||
@ -3461,25 +3431,6 @@ linux_nat_wait_1 (ptid_t ptid, struct target_waitstatus *ourstatus,
|
||||
|
||||
gdb_assert (lp != NULL);
|
||||
|
||||
/* Now that we've selected our final event LWP, un-adjust its PC if
|
||||
it was a software breakpoint, and we can't reliably support the
|
||||
"stopped by software breakpoint" stop reason. */
|
||||
if (lp->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT
|
||||
&& !USE_SIGTRAP_SIGINFO)
|
||||
{
|
||||
struct regcache *regcache = get_thread_regcache (linux_target, lp->ptid);
|
||||
struct gdbarch *gdbarch = regcache->arch ();
|
||||
int decr_pc = gdbarch_decr_pc_after_break (gdbarch);
|
||||
|
||||
if (decr_pc != 0)
|
||||
{
|
||||
CORE_ADDR pc;
|
||||
|
||||
pc = regcache_read_pc (regcache);
|
||||
regcache_write_pc (regcache, pc + decr_pc);
|
||||
}
|
||||
}
|
||||
|
||||
/* We'll need this to determine whether to report a SIGSTOP as
|
||||
GDB_SIGNAL_0. Need to take a copy because resume_clear_callback
|
||||
clears it. */
|
||||
|
@ -95,9 +95,9 @@
|
||||
#define __WALL 0x40000000 /* Wait for any child. */
|
||||
#endif
|
||||
|
||||
/* True if whether a breakpoint/watchpoint triggered can be determined
|
||||
from the si_code of SIGTRAP's siginfo_t (TRAP_BRKPT/TRAP_HWBKPT).
|
||||
That is, if the kernel can tell us whether the thread executed a
|
||||
/* Whether a breakpoint/watchpoint triggered can be determined from
|
||||
the si_code of SIGTRAP's siginfo_t (TRAP_BRKPT/TRAP_HWBKPT). That
|
||||
is, since the kernel can tell us whether the thread executed a
|
||||
software breakpoint, we trust it. The kernel will be determining
|
||||
that from the hardware (e.g., from which exception was raised in
|
||||
the CPU). Relying on whether a breakpoint is planted in memory at
|
||||
@ -110,10 +110,7 @@
|
||||
architectures. The moribund location mechanism helps with that
|
||||
somewhat but it is an heuristic, and can well fail. Getting that
|
||||
information out of the kernel and ultimately out of the CPU is the
|
||||
way to go. That said, some architecture may get the si_code wrong,
|
||||
and as such we're leaving fallback code in place. We'll remove
|
||||
this after a while if no problem is reported. */
|
||||
#define USE_SIGTRAP_SIGINFO 1
|
||||
way to go. */
|
||||
|
||||
/* The x86 kernel gets some of the si_code values backwards, like
|
||||
this:
|
||||
|
@ -824,9 +824,7 @@ linux_process_target::save_stop_reason (lwp_info *lwp)
|
||||
{
|
||||
CORE_ADDR pc;
|
||||
CORE_ADDR sw_breakpoint_pc;
|
||||
#if USE_SIGTRAP_SIGINFO
|
||||
siginfo_t siginfo;
|
||||
#endif
|
||||
|
||||
if (!low_supports_breakpoints ())
|
||||
return false;
|
||||
@ -846,7 +844,6 @@ linux_process_target::save_stop_reason (lwp_info *lwp)
|
||||
scoped_restore_current_thread restore_thread;
|
||||
switch_to_thread (get_lwp_thread (lwp));
|
||||
|
||||
#if USE_SIGTRAP_SIGINFO
|
||||
if (ptrace (PTRACE_GETSIGINFO, lwpid_of (current_thread),
|
||||
(PTRACE_TYPE_ARG3) 0, &siginfo) == 0)
|
||||
{
|
||||
@ -888,21 +885,6 @@ linux_process_target::save_stop_reason (lwp_info *lwp)
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
/* We may have just stepped a breakpoint instruction. E.g., in
|
||||
non-stop mode, GDB first tells the thread A to step a range, and
|
||||
then the user inserts a breakpoint inside the range. In that
|
||||
case we need to report the breakpoint PC. */
|
||||
if ((!lwp->stepping || lwp->stop_pc == sw_breakpoint_pc)
|
||||
&& low_breakpoint_at (sw_breakpoint_pc))
|
||||
lwp->stop_reason = TARGET_STOPPED_BY_SW_BREAKPOINT;
|
||||
|
||||
if (hardware_breakpoint_inserted_here (pc))
|
||||
lwp->stop_reason = TARGET_STOPPED_BY_HW_BREAKPOINT;
|
||||
|
||||
if (lwp->stop_reason == TARGET_STOPPED_BY_NO_REASON)
|
||||
check_stopped_by_watchpoint (lwp);
|
||||
#endif
|
||||
|
||||
if (lwp->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT)
|
||||
{
|
||||
@ -1704,23 +1686,6 @@ linux_process_target::thread_still_has_status_pending (thread_info *thread)
|
||||
discard = 1;
|
||||
}
|
||||
|
||||
#if !USE_SIGTRAP_SIGINFO
|
||||
else if (lp->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT
|
||||
&& !low_breakpoint_at (pc))
|
||||
{
|
||||
threads_debug_printf ("previous SW breakpoint of %ld gone",
|
||||
lwpid_of (thread));
|
||||
discard = 1;
|
||||
}
|
||||
else if (lp->stop_reason == TARGET_STOPPED_BY_HW_BREAKPOINT
|
||||
&& !hardware_breakpoint_inserted_here (pc))
|
||||
{
|
||||
threads_debug_printf ("previous HW breakpoint of %ld gone",
|
||||
lwpid_of (thread));
|
||||
discard = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (discard)
|
||||
{
|
||||
threads_debug_printf ("discarding pending breakpoint status");
|
||||
@ -5652,7 +5617,7 @@ linux_process_target::stopped_by_sw_breakpoint ()
|
||||
bool
|
||||
linux_process_target::supports_stopped_by_sw_breakpoint ()
|
||||
{
|
||||
return USE_SIGTRAP_SIGINFO;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Implement the stopped_by_hw_breakpoint target_ops
|
||||
@ -5672,7 +5637,7 @@ linux_process_target::stopped_by_hw_breakpoint ()
|
||||
bool
|
||||
linux_process_target::supports_stopped_by_hw_breakpoint ()
|
||||
{
|
||||
return USE_SIGTRAP_SIGINFO;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Implement the supports_hardware_single_step target_ops method. */
|
||||
|
Loading…
x
Reference in New Issue
Block a user