]> Git Repo - binutils.git/blob - gdb/selftest-arch.c
Automatic date update in version.in
[binutils.git] / gdb / selftest-arch.c
1 /* GDB self-test for each gdbarch.
2    Copyright (C) 2017-2022 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 */
This page took 0.030288 seconds and 4 git commands to generate.