gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / selftest-arch.c
index 9a19f7688e3afe6fa3604c550ecc2794a1b5737d..91d9f8673724e7b3160867bb5e6eb68b8afa3349 100644 (file)
@@ -1,5 +1,5 @@
 /* GDB self-test for each gdbarch.
-   Copyright (C) 2017 Free Software Foundation, Inc.
+   Copyright (C) 2017-2020 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "defs.h"
 
 #if GDB_SELF_TEST
-#include "selftest.h"
+#include "gdbsupport/selftest.h"
 #include "selftest-arch.h"
 #include "arch-utils.h"
 
 namespace selftests {
 
-static std::vector<self_test_foreach_arch_function *> gdbarch_tests;
+/* A kind of selftest that calls the test function once for each gdbarch known
+   to GDB.  */
+
+struct gdbarch_selftest : public selftest
+{
+  gdbarch_selftest (self_test_foreach_arch_function *function_)
+  : function (function_)
+  {}
+
+  void operator() () const override
+  {
+    const char **arches = gdbarch_printable_names ();
+    bool pass = true;
+
+    for (int i = 0; arches[i] != NULL; i++)
+      {
+       if (strcmp ("fr300", arches[i]) == 0)
+         {
+           /* PR 20946 */
+           continue;
+         }
+       else if (strcmp ("powerpc:EC603e", arches[i]) == 0
+                || strcmp ("powerpc:e500mc", arches[i]) == 0
+                || strcmp ("powerpc:e500mc64", arches[i]) == 0
+                || strcmp ("powerpc:titan", arches[i]) == 0
+                || strcmp ("powerpc:vle", arches[i]) == 0
+                || strcmp ("powerpc:e5500", arches[i]) == 0
+                || strcmp ("powerpc:e6500", arches[i]) == 0)
+         {
+           /* PR 19797 */
+           continue;
+         }
+
+       QUIT;
+
+       try
+         {
+           struct gdbarch_info info;
+
+           gdbarch_info_init (&info);
+           info.bfd_arch_info = bfd_scan_arch (arches[i]);
+
+           struct gdbarch *gdbarch = gdbarch_find_by_info (info);
+           SELF_CHECK (gdbarch != NULL);
+
+           function (gdbarch);
+         }
+       catch (const gdb_exception_error &ex)
+         {
+           pass = false;
+           exception_fprintf (gdb_stderr, ex,
+                              _("Self test failed: arch %s: "), arches[i]);
+         }
+
+       reset ();
+      }
+
+    SELF_CHECK (pass);
+  }
+
+  self_test_foreach_arch_function *function;
+};
 
 void
-register_test_foreach_arch (self_test_foreach_arch_function *function)
+register_test_foreach_arch (const std::string &name,
+                           self_test_foreach_arch_function *function)
 {
-  gdbarch_tests.push_back (function);
+  register_test (name, new gdbarch_selftest (function));
 }
 
 void
@@ -40,73 +102,5 @@ reset ()
   registers_changed ();
   reinit_frame_cache ();
 }
-
-static void
-tests_with_arch ()
-{
-  int failed = 0;
-
-  for (const auto &f : gdbarch_tests)
-    {
-      const char **arches = gdbarch_printable_names ();
-
-      for (int i = 0; arches[i] != NULL; i++)
-       {
-         if (strcmp ("fr300", arches[i]) == 0)
-           {
-             /* PR 20946 */
-             continue;
-           }
-         else if (strcmp ("powerpc:EC603e", arches[i]) == 0
-                  || strcmp ("powerpc:e500mc", arches[i]) == 0
-                  || strcmp ("powerpc:e500mc64", arches[i]) == 0
-                  || strcmp ("powerpc:titan", arches[i]) == 0
-                  || strcmp ("powerpc:vle", arches[i]) == 0
-                  || strcmp ("powerpc:e5500", arches[i]) == 0
-                  || strcmp ("powerpc:e6500", arches[i]) == 0)
-           {
-             /* PR 19797 */
-             continue;
-           }
-
-         QUIT;
-
-         TRY
-           {
-             struct gdbarch_info info;
-
-             gdbarch_info_init (&info);
-             info.bfd_arch_info = bfd_scan_arch (arches[i]);
-
-             struct gdbarch *gdbarch = gdbarch_find_by_info (info);
-             SELF_CHECK (gdbarch != NULL);
-             f (gdbarch);
-           }
-         CATCH (ex, RETURN_MASK_ERROR)
-           {
-             ++failed;
-             exception_fprintf (gdb_stderr, ex,
-                                _("Self test failed: arch %s: "), arches[i]);
-           }
-         END_CATCH
-
-         reset ();
-       }
-    }
-
-  SELF_CHECK (failed == 0);
-}
-
 } // namespace selftests
 #endif /* GDB_SELF_TEST */
-
-/* Suppress warning from -Wmissing-prototypes.  */
-extern initialize_file_ftype _initialize_selftests_foreach_arch;
-
-void
-_initialize_selftests_foreach_arch ()
-{
-#if GDB_SELF_TEST
-  selftests::register_test (selftests::tests_with_arch);
-#endif
-}
This page took 0.037848 seconds and 4 git commands to generate.