mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-05 23:23:09 +00:00
gdb: make regcache's cooked_write_test selftest work with native-extended-gdbserver board
Running
$ make check TESTS="gdb.gdb/unittest.exp" RUNTESTFLAGS="--target_board=native-extended-gdbserver"
I get some failures:
Running selftest regcache::cooked_write_test::i386.^M
Self test failed: target already pushed^M
Running selftest regcache::cooked_write_test::i386:intel.^M
Self test failed: target already pushed^M
Running selftest regcache::cooked_write_test::i386:x64-32.^M
Self test failed: target already pushed^M
Running selftest regcache::cooked_write_test::i386:x64-32:intel.^M
Self test failed: target already pushed^M
Running selftest regcache::cooked_write_test::i386:x86-64.^M
Self test failed: target already pushed^M
Running selftest regcache::cooked_write_test::i386:x86-64:intel.^M
Self test failed: target already pushed^M
Running selftest regcache::cooked_write_test::i8086.^M
Self test failed: target already pushed^M
This is because the native-extended-gdbserver automatically connects GDB
to a GDBserver on startup, and therefore pushes a remote target on the
initial inferior. cooked_write_test is currently written in a way that
errors out if the current inferior has a process_stratum_target pushed.
Rewrite it to use scoped_mock_context, so it doesn't depend on the
current inferior (the current one upon entering the function).
Change-Id: I0357f989eacbdecc4bf88b043754451b476052ad
This commit is contained in:
@@ -1944,30 +1944,9 @@ cooked_read_test (struct gdbarch *gdbarch)
|
|||||||
static void
|
static void
|
||||||
cooked_write_test (struct gdbarch *gdbarch)
|
cooked_write_test (struct gdbarch *gdbarch)
|
||||||
{
|
{
|
||||||
/* Error out if debugging something, because we're going to push the
|
|
||||||
test target, which would pop any existing target. */
|
|
||||||
if (current_inferior ()->top_target ()->stratum () >= process_stratum)
|
|
||||||
error (_("target already pushed"));
|
|
||||||
|
|
||||||
/* Create a mock environment. A process_stratum target pushed. */
|
/* Create a mock environment. A process_stratum target pushed. */
|
||||||
|
scoped_mock_context<target_ops_no_register> ctx (gdbarch);
|
||||||
target_ops_no_register mock_target;
|
readwrite_regcache readwrite (&ctx.mock_target, gdbarch);
|
||||||
|
|
||||||
/* Push the process_stratum target so we can mock accessing
|
|
||||||
registers. */
|
|
||||||
current_inferior ()->push_target (&mock_target);
|
|
||||||
|
|
||||||
/* Pop it again on exit (return/exception). */
|
|
||||||
struct on_exit
|
|
||||||
{
|
|
||||||
~on_exit ()
|
|
||||||
{
|
|
||||||
pop_all_targets_at_and_above (process_stratum);
|
|
||||||
}
|
|
||||||
} pop_targets;
|
|
||||||
|
|
||||||
readwrite_regcache readwrite (&mock_target, gdbarch);
|
|
||||||
|
|
||||||
const int num_regs = gdbarch_num_cooked_regs (gdbarch);
|
const int num_regs = gdbarch_num_cooked_regs (gdbarch);
|
||||||
|
|
||||||
for (auto regnum = 0; regnum < num_regs; regnum++)
|
for (auto regnum = 0; regnum < num_regs; regnum++)
|
||||||
|
|||||||
Reference in New Issue
Block a user