Home | History | Annotate | Line # | Download | only in gdb
selftest-arch.c revision 1.1.1.3.2.1
      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