xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/selftest-arch.c (revision 345cf9fb81bd0411c53e25d62cd93bdcaa865312)
1 /* GDB self-test for each gdbarch.
2    Copyright (C) 2017-2020 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 
21 #if GDB_SELF_TEST
22 #include "gdbsupport/selftest.h"
23 #include "selftest-arch.h"
24 #include "arch-utils.h"
25 
26 namespace selftests {
27 
28 /* A kind of selftest that calls the test function once for each gdbarch known
29    to GDB.  */
30 
31 struct gdbarch_selftest : public selftest
32 {
33   gdbarch_selftest (self_test_foreach_arch_function *function_)
34   : function (function_)
35   {}
36 
37   void operator() () const override
38   {
39     const char **arches = gdbarch_printable_names ();
40     bool pass = true;
41 
42     for (int i = 0; arches[i] != NULL; i++)
43       {
44 	if (strcmp ("fr300", arches[i]) == 0)
45 	  {
46 	    /* PR 20946 */
47 	    continue;
48 	  }
49 	else if (strcmp ("powerpc:EC603e", arches[i]) == 0
50 		 || strcmp ("powerpc:e500mc", arches[i]) == 0
51 		 || strcmp ("powerpc:e500mc64", arches[i]) == 0
52 		 || strcmp ("powerpc:titan", arches[i]) == 0
53 		 || strcmp ("powerpc:vle", arches[i]) == 0
54 		 || strcmp ("powerpc:e5500", arches[i]) == 0
55 		 || strcmp ("powerpc:e6500", arches[i]) == 0)
56 	  {
57 	    /* PR 19797 */
58 	    continue;
59 	  }
60 
61 	QUIT;
62 
63 	try
64 	  {
65 	    struct gdbarch_info info;
66 
67 	    gdbarch_info_init (&info);
68 	    info.bfd_arch_info = bfd_scan_arch (arches[i]);
69 
70 	    struct gdbarch *gdbarch = gdbarch_find_by_info (info);
71 	    SELF_CHECK (gdbarch != NULL);
72 
73 	    function (gdbarch);
74 	  }
75 	catch (const gdb_exception_error &ex)
76 	  {
77 	    pass = false;
78 	    exception_fprintf (gdb_stderr, ex,
79 			       _("Self test failed: arch %s: "), arches[i]);
80 	  }
81 
82 	reset ();
83       }
84 
85     SELF_CHECK (pass);
86   }
87 
88   self_test_foreach_arch_function *function;
89 };
90 
91 void
92 register_test_foreach_arch (const std::string &name,
93 			    self_test_foreach_arch_function *function)
94 {
95   register_test (name, new gdbarch_selftest (function));
96 }
97 
98 void
99 reset ()
100 {
101   /* Clear GDB internal state.  */
102   registers_changed ();
103   reinit_frame_cache ();
104 }
105 } // namespace selftests
106 #endif /* GDB_SELF_TEST */
107