forked from Imagelibrary/binutils-gdb
Revert "Call target_can_do_single_step from maybe_software_singlestep"
This reverts commit 14de1447c9.
An automated tester said that this patch caused a regression on
aarch64:
FAIL: gdb.arch/aarch64-atomic-inst.exp: Step through the ldxr/stxr sequence (timeout)
I looked into it a bit yesterday but couldn't see an obvious problem;
and it's somewhat of a pain to try to debug it at the moment.
Tom de Vries also noticed this and filed it in bugzilla. So, I'm
backing the patch out until I can port the failing test to the AdaCore
internal test suite in order to find out what went wrong.
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28440
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33255
This commit is contained in:
@@ -960,6 +960,11 @@ arm_linux_software_single_step (struct regcache *regcache)
|
|||||||
struct gdbarch *gdbarch = regcache->arch ();
|
struct gdbarch *gdbarch = regcache->arch ();
|
||||||
struct arm_get_next_pcs next_pcs_ctx;
|
struct arm_get_next_pcs next_pcs_ctx;
|
||||||
|
|
||||||
|
/* If the target does have hardware single step, GDB doesn't have
|
||||||
|
to bother software single step. */
|
||||||
|
if (target_can_do_single_step () == 1)
|
||||||
|
return {};
|
||||||
|
|
||||||
arm_get_next_pcs_ctor (&next_pcs_ctx,
|
arm_get_next_pcs_ctor (&next_pcs_ctx,
|
||||||
&arm_linux_get_next_pcs_ops,
|
&arm_linux_get_next_pcs_ops,
|
||||||
gdbarch_byte_order (gdbarch),
|
gdbarch_byte_order (gdbarch),
|
||||||
|
|||||||
@@ -13998,26 +13998,11 @@ insert_single_step_breakpoint (struct gdbarch *gdbarch,
|
|||||||
update_global_location_list (UGLL_INSERT);
|
update_global_location_list (UGLL_INSERT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to setup for software single stepping. Return true if
|
/* Insert single step breakpoints according to the current state. */
|
||||||
target_resume() should use hardware single step.
|
|
||||||
|
|
||||||
GDBARCH is the current gdbarch. */
|
int
|
||||||
|
insert_single_step_breakpoints (struct gdbarch *gdbarch)
|
||||||
bool
|
|
||||||
maybe_software_singlestep (struct gdbarch *gdbarch)
|
|
||||||
{
|
{
|
||||||
if (execution_direction != EXEC_FORWARD)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (target_can_do_single_step () == 1)
|
|
||||||
{
|
|
||||||
/* The target definitely has hardware single step. */
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!gdbarch_software_single_step_p (gdbarch))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
regcache *regcache = get_thread_regcache (inferior_thread ());
|
regcache *regcache = get_thread_regcache (inferior_thread ());
|
||||||
std::vector<CORE_ADDR> next_pcs;
|
std::vector<CORE_ADDR> next_pcs;
|
||||||
|
|
||||||
@@ -14031,10 +14016,10 @@ maybe_software_singlestep (struct gdbarch *gdbarch)
|
|||||||
for (CORE_ADDR pc : next_pcs)
|
for (CORE_ADDR pc : next_pcs)
|
||||||
insert_single_step_breakpoint (gdbarch, aspace, pc);
|
insert_single_step_breakpoint (gdbarch, aspace, pc);
|
||||||
|
|
||||||
return false;
|
return 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* See breakpoint.h. */
|
/* See breakpoint.h. */
|
||||||
|
|||||||
@@ -1884,10 +1884,10 @@ extern void insert_single_step_breakpoint (struct gdbarch *,
|
|||||||
const address_space *,
|
const address_space *,
|
||||||
CORE_ADDR);
|
CORE_ADDR);
|
||||||
|
|
||||||
/* Try to setup for software single stepping. Return true if
|
/* Insert all software single step breakpoints for the current frame.
|
||||||
target_resume() should use hardware single step. GDBARCH is the
|
Return true if any software single step breakpoints are inserted,
|
||||||
current gdbarch. */
|
otherwise, return false. */
|
||||||
extern bool maybe_software_singlestep (struct gdbarch *);
|
extern int insert_single_step_breakpoints (struct gdbarch *);
|
||||||
|
|
||||||
/* Check whether any hardware watchpoints have triggered or not,
|
/* Check whether any hardware watchpoints have triggered or not,
|
||||||
according to the target, and record it in each watchpoint's
|
according to the target, and record it in each watchpoint's
|
||||||
|
|||||||
@@ -776,10 +776,16 @@ extern void set_gdbarch_get_memtag (struct gdbarch *gdbarch, gdbarch_get_memtag_
|
|||||||
extern CORE_ADDR gdbarch_memtag_granule_size (struct gdbarch *gdbarch);
|
extern CORE_ADDR gdbarch_memtag_granule_size (struct gdbarch *gdbarch);
|
||||||
extern void set_gdbarch_memtag_granule_size (struct gdbarch *gdbarch, CORE_ADDR memtag_granule_size);
|
extern void set_gdbarch_memtag_granule_size (struct gdbarch *gdbarch, CORE_ADDR memtag_granule_size);
|
||||||
|
|
||||||
/* Return a vector of addresses at which the software single step
|
/* FIXME/cagney/2001-01-18: This should be split in two. A target method that
|
||||||
breakpoints should be inserted. An empty vector means software single
|
indicates if the target needs software single step. An ISA method to
|
||||||
step is not used.
|
implement it.
|
||||||
|
|
||||||
|
FIXME/cagney/2001-01-18: The logic is backwards. It should be asking if the
|
||||||
|
target can single step. If not, then implement single step using breakpoints.
|
||||||
|
|
||||||
|
Return a vector of addresses on which the software single step
|
||||||
|
breakpoints should be inserted. NULL means software single step is
|
||||||
|
not used.
|
||||||
Multiple breakpoints may be inserted for some instructions such as
|
Multiple breakpoints may be inserted for some instructions such as
|
||||||
conditional branch. However, each implementation must always evaluate
|
conditional branch. However, each implementation must always evaluate
|
||||||
the condition and only put the breakpoint at the branch destination if
|
the condition and only put the breakpoint at the branch destination if
|
||||||
|
|||||||
@@ -1378,10 +1378,16 @@ For a non-zero value, this represents the number of bytes of memory per tag.
|
|||||||
|
|
||||||
Function(
|
Function(
|
||||||
comment="""
|
comment="""
|
||||||
Return a vector of addresses at which the software single step
|
FIXME/cagney/2001-01-18: This should be split in two. A target method that
|
||||||
breakpoints should be inserted. An empty vector means software single
|
indicates if the target needs software single step. An ISA method to
|
||||||
step is not used.
|
implement it.
|
||||||
|
|
||||||
|
FIXME/cagney/2001-01-18: The logic is backwards. It should be asking if the
|
||||||
|
target can single step. If not, then implement single step using breakpoints.
|
||||||
|
|
||||||
|
Return a vector of addresses on which the software single step
|
||||||
|
breakpoints should be inserted. NULL means software single step is
|
||||||
|
not used.
|
||||||
Multiple breakpoints may be inserted for some instructions such as
|
Multiple breakpoints may be inserted for some instructions such as
|
||||||
conditional branch. However, each implementation must always evaluate
|
conditional branch. However, each implementation must always evaluate
|
||||||
the condition and only put the breakpoint at the branch destination if
|
the condition and only put the breakpoint at the branch destination if
|
||||||
|
|||||||
19
gdb/infrun.c
19
gdb/infrun.c
@@ -93,6 +93,8 @@ static void insert_step_resume_breakpoint_at_caller (const frame_info_ptr &);
|
|||||||
|
|
||||||
static void insert_longjmp_resume_breakpoint (struct gdbarch *, CORE_ADDR);
|
static void insert_longjmp_resume_breakpoint (struct gdbarch *, CORE_ADDR);
|
||||||
|
|
||||||
|
static bool maybe_software_singlestep (struct gdbarch *gdbarch);
|
||||||
|
|
||||||
static void resume (gdb_signal sig);
|
static void resume (gdb_signal sig);
|
||||||
|
|
||||||
static void wait_for_inferior (inferior *inf);
|
static void wait_for_inferior (inferior *inf);
|
||||||
@@ -2357,6 +2359,23 @@ set_schedlock_func (const char *args, int from_tty, struct cmd_list_element *c)
|
|||||||
process. */
|
process. */
|
||||||
bool sched_multi = false;
|
bool sched_multi = false;
|
||||||
|
|
||||||
|
/* Try to setup for software single stepping. Return true if target_resume()
|
||||||
|
should use hardware single step.
|
||||||
|
|
||||||
|
GDBARCH the current gdbarch. */
|
||||||
|
|
||||||
|
static bool
|
||||||
|
maybe_software_singlestep (struct gdbarch *gdbarch)
|
||||||
|
{
|
||||||
|
bool hw_step = true;
|
||||||
|
|
||||||
|
if (execution_direction == EXEC_FORWARD
|
||||||
|
&& gdbarch_software_single_step_p (gdbarch))
|
||||||
|
hw_step = !insert_single_step_breakpoints (gdbarch);
|
||||||
|
|
||||||
|
return hw_step;
|
||||||
|
}
|
||||||
|
|
||||||
/* See infrun.h. */
|
/* See infrun.h. */
|
||||||
|
|
||||||
ptid_t
|
ptid_t
|
||||||
|
|||||||
@@ -1105,7 +1105,7 @@ record_full_target::resume (ptid_t ptid, int step, enum gdb_signal signal)
|
|||||||
record_full_resume_step = 1;
|
record_full_resume_step = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
step = maybe_software_singlestep (gdbarch);
|
step = !insert_single_step_breakpoints (gdbarch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1277,7 +1277,7 @@ record_full_wait_1 (struct target_ops *ops,
|
|||||||
};
|
};
|
||||||
|
|
||||||
reinit_frame_cache ();
|
reinit_frame_cache ();
|
||||||
step = maybe_software_singlestep (gdbarch);
|
step = !insert_single_step_breakpoints (gdbarch);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (record_debug)
|
if (record_debug)
|
||||||
|
|||||||
Reference in New Issue
Block a user