xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/selftest-arch.c (revision 6881a4007f077b54e5f51159c52b9b25f57deb0d)
1 /* GDB self-test for each gdbarch.
2    Copyright (C) 2017-2023 Free Software Foundation, Inc.
3 
4    This file is part of GDB.
5 
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18 
19 #include "defs.h"
20 #include <functional>
21 
22 #if GDB_SELF_TEST
23 #include "gdbsupport/selftest.h"
24 #include "selftest-arch.h"
25 #include "arch-utils.h"
26 
27 namespace selftests {
28 
29 static bool skip_arch (const char *arch)
30 {
31   if (strcmp ("powerpc:EC603e", arch) == 0
32       || strcmp ("powerpc:e500mc", arch) == 0
33       || strcmp ("powerpc:e500mc64", arch) == 0
34       || strcmp ("powerpc:titan", arch) == 0
35       || strcmp ("powerpc:vle", arch) == 0
36       || strcmp ("powerpc:e5500", arch) == 0
37       || strcmp ("powerpc:e6500", arch) == 0)
38     {
39       /* PR 19797 */
40       return true;
41     }
42 
43   return false;
44 }
45 
46 /* Generate a selftest for each gdbarch known to GDB.  */
47 
48 static std::vector<selftest>
49 foreach_arch_test_generator (const std::string &name,
50 			     self_test_foreach_arch_function *function)
51 {
52   std::vector<selftest> tests;
53   std::vector<const char *> arches = gdbarch_printable_names ();
54   tests.reserve (arches.size ());
55   for (const char *arch : arches)
56     {
57       if (skip_arch (arch))
58 	continue;
59 
60       struct gdbarch_info info;
61       info.bfd_arch_info = bfd_scan_arch (arch);
62       info.osabi = GDB_OSABI_NONE;
63 
64       auto test_fn
65 	= ([=] ()
66 	   {
67 	     struct gdbarch *gdbarch = gdbarch_find_by_info (info);
68 	     SELF_CHECK (gdbarch != NULL);
69 	     function (gdbarch);
70 	     reset ();
71 	   });
72 
73       std::string id;
74 
75       bool has_sep = strchr (arch, ':') != nullptr;
76       if (has_sep)
77 	/* Avoid avr::avr:1.  */
78 	id = arch;
79       else if (strncasecmp (info.bfd_arch_info->arch_name, arch,
80 			    strlen (info.bfd_arch_info->arch_name)) == 0)
81 	/* Avoid arm::arm.  */
82 	id = arch;
83       else
84 	/* Use arc::A6 instead of A6.  This still leaves us with an unfortunate
85 	   redundant id like am33_2::am33-2, but that doesn't seem worth the
86 	   effort to avoid.  */
87 	id = string_printf ("%s::%s", info.bfd_arch_info->arch_name, arch);
88 
89       id = string_printf ("%s::%s", name.c_str (), id.c_str ());
90       tests.emplace_back (id, test_fn);
91     }
92   return tests;
93 }
94 
95 /* See selftest-arch.h.  */
96 
97 void
98 register_test_foreach_arch (const std::string &name,
99 			    self_test_foreach_arch_function *function)
100 {
101   add_lazy_generator ([=] ()
102 		      {
103 		        return foreach_arch_test_generator (name, function);
104 		      });
105 }
106 
107 void
108 reset ()
109 {
110   /* Clear GDB internal state.  */
111   registers_changed ();
112   reinit_frame_cache ();
113 }
114 } // namespace selftests
115 #endif /* GDB_SELF_TEST */
116