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