(root)/
gcc-13.2.0/
gcc/
selftest-rtl.h
       1  /* A self-testing framework, for use by -fself-test.
       2     Copyright (C) 2016-2023 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  #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  
      28  class rtx_reuse_manager;
      29  
      30  namespace 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  
      35  extern void
      36  assert_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  
      57  extern 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  
      74  extern 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  
      79  class 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  
      92  extern rtx_insn *get_insn_by_uid (int uid);
      93  
      94  extern 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 */