111
|
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 */
|