From d890c720b8c4daf8892a175296d8e88ec992c92d Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Thu, 5 May 2022 09:54:59 -0400 Subject: [PATCH] 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 --- gdb/regcache.c | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/gdb/regcache.c b/gdb/regcache.c index a5e83da1ca4..037659ef8fa 100644 --- a/gdb/regcache.c +++ b/gdb/regcache.c @@ -1944,30 +1944,9 @@ cooked_read_test (struct gdbarch *gdbarch) static void 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. */ - - target_ops_no_register mock_target; - - /* 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); - + scoped_mock_context ctx (gdbarch); + readwrite_regcache readwrite (&ctx.mock_target, gdbarch); const int num_regs = gdbarch_num_cooked_regs (gdbarch); for (auto regnum = 0; regnum < num_regs; regnum++) -- 2.30.2