1/* A self-testing framework, for use by -fself-test.
2 Copyright (C) 2016-2017 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 3, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
19
20#ifndef GCC_SELFTEST_RTL_H
21#define GCC_SELFTEST_RTL_H
22
23/* The selftest code should entirely disappear in a production
24 configuration, hence we guard all of it with #if CHECKING_P. */
25
26#if CHECKING_P
27
28class rtx_reuse_manager;
29
30namespace selftest {
31
32/* Verify that X is dumped as EXPECTED_DUMP, using compact mode.
33 Use LOC as the effective location when reporting errors. */
34
35extern void
36assert_rtl_dump_eq (const location &loc, const char *expected_dump, rtx x,
37 rtx_reuse_manager *reuse_manager);
38
39/* Verify that RTX is dumped as EXPECTED_DUMP, using compact mode. */
40
41#define ASSERT_RTL_DUMP_EQ(EXPECTED_DUMP, RTX) \
42 assert_rtl_dump_eq (SELFTEST_LOCATION, (EXPECTED_DUMP), (RTX), NULL)
43
44/* As above, but using REUSE_MANAGER when dumping. */
45
46#define ASSERT_RTL_DUMP_EQ_WITH_REUSE(EXPECTED_DUMP, RTX, REUSE_MANAGER) \
47 assert_rtl_dump_eq (SELFTEST_LOCATION, (EXPECTED_DUMP), (RTX), \
48 (REUSE_MANAGER))
49
50#define ASSERT_RTX_EQ(EXPECTED, ACTUAL) \
51 SELFTEST_BEGIN_STMT \
52 const char *desc_ = "ASSERT_RTX_EQ (" #EXPECTED ", " #ACTUAL ")"; \
53 ::selftest::assert_rtx_eq_at (SELFTEST_LOCATION, desc_, (EXPECTED), \
54 (ACTUAL)); \
55 SELFTEST_END_STMT
56
57extern void assert_rtx_eq_at (const location &, const char *, rtx, rtx);
58
59/* Evaluate rtx EXPECTED and ACTUAL and compare them with ==
60 (i.e. pointer equality), calling ::selftest::pass if they are
61 equal, aborting if they are non-equal. */
62
63#define ASSERT_RTX_PTR_EQ(EXPECTED, ACTUAL) \
64 SELFTEST_BEGIN_STMT \
65 const char *desc_ = "ASSERT_RTX_PTR_EQ (" #EXPECTED ", " #ACTUAL ")"; \
66 ::selftest::assert_rtx_ptr_eq_at (SELFTEST_LOCATION, desc_, (EXPECTED), \
67 (ACTUAL)); \
68 SELFTEST_END_STMT
69
70/* Compare rtx EXPECTED and ACTUAL by pointer equality, calling
71 ::selftest::pass if they are equal, aborting if they are non-equal.
72 LOC is the effective location of the assertion, MSG describes it. */
73
74extern void assert_rtx_ptr_eq_at (const location &loc, const char *msg,
75 rtx expected, rtx actual);
76
77/* A class for testing RTL function dumps. */
78
79class rtl_dump_test
80{
81 public:
82 /* Takes ownership of PATH. */
83 rtl_dump_test (const location &loc, char *path);
84 ~rtl_dump_test ();
85
86 private:
87 char *m_path;
88};
89
90/* Get the insn with the given uid, or NULL if not found. */
91
92extern rtx_insn *get_insn_by_uid (int uid);
93
94extern void verify_three_block_rtl_cfg (function *fun);
95
96} /* end of namespace selftest. */
97
98#endif /* #if CHECKING_P */
99
100#endif /* GCC_SELFTEST_RTL_H */
101