+2017-10-04 Pedro Alves <palves@redhat.com>
+
+ * frame.c (create_test_frame): Delete.
+ * frame.h (create_test_frame): Delete.
+ * gdbarch-selftests.c: Include gdbthread.h and target.h.
+ (class regcache_test): Delete.
+ (test_target_has_registers, test_target_has_stack)
+ (test_target_has_memory, test_target_prepare_to_store)
+ (test_target_store_registers): New functions.
+ (test_target_ops): New class.
+ (register_to_value_test): Error out if there's already a
+ process_stratum (or higher) target pushed. Create a fuller mock
+ environment, with mock target_ops, inferior, address space, thread
+ and inferior_ptid.
+ * progspace.c (struct address_space): Move to ...
+ * progspace.h (struct address_space): ... here.
+ * regcache.h (regcache::~regcache, regcache::raw_write)
+ [GDB_SELF_TEST]: No longer virtual.
+
2017-10-04 Simon Marchi <simon.marchi@ericsson.com>
* mi/mi-main.c (list_available_thread_groups): Reverse filter logic.
#include "selftest.h"
#include "selftest-arch.h"
#include "inferior.h"
+#include "gdbthread.h"
+#include "target.h"
namespace selftests {
-/* A read-write regcache which doesn't write the target. */
+/* A mock process_stratum target_ops that doesn't read/write registers
+ anywhere. */
-class regcache_test : public regcache
+static int
+test_target_has_registers (target_ops *self)
{
-public:
- explicit regcache_test (struct gdbarch *gdbarch)
- : regcache (gdbarch, NULL, false)
- {
- set_ptid (inferior_ptid);
+ return 1;
+}
- current_regcache.push_front (this);
- }
+static int
+test_target_has_stack (target_ops *self)
+{
+ return 1;
+}
+
+static int
+test_target_has_memory (target_ops *self)
+{
+ return 1;
+}
+
+static void
+test_target_prepare_to_store (target_ops *self, regcache *regs)
+{
+}
+
+static void
+test_target_store_registers (target_ops *self, regcache *regs, int regno)
+{
+}
- void raw_write (int regnum, const gdb_byte *buf) override
+class test_target_ops : public target_ops
+{
+public:
+ test_target_ops ()
+ : target_ops {}
{
- raw_set_cached_value (regnum, buf);
+ to_magic = OPS_MAGIC;
+ to_stratum = process_stratum;
+ to_has_memory = test_target_has_memory;
+ to_has_stack = test_target_has_stack;
+ to_has_registers = test_target_has_registers;
+ to_prepare_to_store = test_target_prepare_to_store;
+ to_store_registers = test_target_store_registers;
+
+ complete_target_initialization (this);
}
};
builtin->builtin_char32,
};
- current_inferior()->gdbarch = gdbarch;
+ /* Error out if debugging something, because we're going to push the
+ test target, which would pop any existing target. */
+ if (current_target.to_stratum >= process_stratum)
+ error (_("target already pushed"));
+
+ /* Create a mock environment. An inferior with a thread, with a
+ process_stratum target pushed. */
+
+ test_target_ops mock_target;
+ ptid_t mock_ptid (1, 1);
+ inferior mock_inferior (mock_ptid.pid ());
+ address_space mock_aspace {};
+ mock_inferior.gdbarch = gdbarch;
+ mock_inferior.aspace = &mock_aspace;
+ thread_info mock_thread (&mock_inferior, mock_ptid);
+
+ scoped_restore restore_thread_list
+ = make_scoped_restore (&thread_list, &mock_thread);
+
+ /* Add the mock inferior to the inferior list so that look ups by
+ target+ptid can find it. */
+ scoped_restore restore_inferior_list
+ = make_scoped_restore (&inferior_list);
+ inferior_list = &mock_inferior;
+
+ /* Switch to the mock inferior. */
+ scoped_restore_current_inferior restore_current_inferior;
+ set_current_inferior (&mock_inferior);
+
+ /* Push the process_stratum target so we can mock accessing
+ registers. */
+ 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;
+
+ /* Switch to the mock thread. */
+ scoped_restore restore_inferior_ptid
+ = make_scoped_restore (&inferior_ptid, mock_ptid);
- struct regcache *regcache = new regcache_test (gdbarch);
- struct frame_info *frame = create_test_frame (regcache);
+ struct frame_info *frame = get_current_frame ();
const int num_regs = (gdbarch_num_regs (gdbarch)
+ gdbarch_num_pseudo_regs (gdbarch));
- SELF_CHECK (regcache == get_current_regcache ());
-
/* Test gdbarch methods register_to_value and value_to_register with
different combinations of register numbers and types. */
for (const auto &type : types)