xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/selftest-rtl.c (revision d90047b5d07facf36e6c01dcc0bded8997ce9cc2)
1 /* Selftest support for RTL.
2    Copyright (C) 2016-2017 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "selftest.h"
24 #include "backend.h"
25 #include "target.h"
26 #include "rtl.h"
27 #include "read-rtl-function.h"
28 #include "read-md.h"
29 #include "tree-core.h"
30 #include "memmodel.h"
31 #include "emit-rtl.h"
32 #include "selftest-rtl.h"
33 
34 #if CHECKING_P
35 
36 namespace selftest {
37 
38 /* Compare rtx EXPECTED and ACTUAL by pointer equality, calling
39    ::selftest::pass if they are equal, aborting if they are non-equal.
40    LOC is the effective location of the assertion, MSG describes it.  */
41 
42 void
43 assert_rtx_ptr_eq_at (const location &loc, const char *msg,
44 		      rtx expected, rtx actual)
45 {
46   if (expected == actual)
47     ::selftest::pass (loc, msg);
48   else
49     {
50       fprintf (stderr, "%s:%i: %s: FAIL: %s\n", loc.m_file, loc.m_line,
51 	       loc.m_function, msg);
52       fprintf (stderr, "  expected (at %p): ", (void *)expected);
53       print_rtl (stderr, expected);
54       fprintf (stderr, "\n  actual (at %p): ", (void *)actual);
55       print_rtl (stderr, actual);
56       fprintf (stderr, "\n");
57       abort ();
58     }
59 }
60 
61 /* Constructor for selftest::rtl_dump_test.
62    Read a dumped RTL function from PATH.
63    Takes ownership of PATH, freeing in dtor.
64    Use LOC as the effective location when reporting failures.  */
65 
66 rtl_dump_test::rtl_dump_test (const location &loc, char *path)
67   : m_path (path)
68 {
69   bool read_ok = read_rtl_function_body (path);
70   ASSERT_TRUE_AT (loc, read_ok);
71 }
72 
73 /* Destructor for selftest::rtl_dump_test.
74    Cleanup global state relating to the function, and free the path.  */
75 
76 selftest::rtl_dump_test::~rtl_dump_test ()
77 {
78   /* Cleanups.  */
79   current_function_decl = NULL;
80   free_after_compilation (cfun);
81   set_cfun (NULL);
82   free (m_path);
83 }
84 
85 /* Get the insn with the given uid, or NULL if not found.  */
86 
87 rtx_insn *
88 get_insn_by_uid (int uid)
89 {
90   for (rtx_insn *insn = get_insns (); insn; insn = NEXT_INSN (insn))
91     if (INSN_UID (insn) == uid)
92       return insn;
93 
94   /* Not found.  */
95   return NULL;
96 }
97 
98 } // namespace selftest
99 
100 #endif /* #if CHECKING_P */
101