LCOV - code coverage report
Current view: top level - gcc - crc-verification.h (source / functions) Coverage Total Hit
Test: gcc.info Lines: 100.0 % 14 14
Test Date: 2024-12-21 13:15:12 Functions: 100.0 % 1 1
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /* Execute symbolically all paths of the loop.
       2                 :             :    Copyright (C) 2022-2024 Free Software Foundation, Inc.
       3                 :             :    Contributed by Mariam Arutunian <mariamarutunian@gmail.com>
       4                 :             : 
       5                 :             : This file is part of GCC.
       6                 :             : 
       7                 :             : GCC is free software; you can redistribute it and/or modify it under
       8                 :             : the terms of the GNU General Public License as published by the Free
       9                 :             : Software Foundation; either version 3, or (at your option) any later
      10                 :             : version.
      11                 :             : 
      12                 :             : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      13                 :             : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      14                 :             : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      15                 :             : for more details.
      16                 :             : 
      17                 :             : You should have received a copy of the GNU General Public License
      18                 :             : along with GCC; see the file COPYING3.  If not see
      19                 :             : <http://www.gnu.org/licenses/>.   */
      20                 :             : 
      21                 :             : #ifndef GCC_CRC_VERIFICATION
      22                 :             : #define GCC_CRC_VERIFICATION
      23                 :             : 
      24                 :             : #include "config.h"
      25                 :             : #include "system.h"
      26                 :             : #include "coretypes.h"
      27                 :             : #include "backend.h"
      28                 :             : #include "cfgloop.h"
      29                 :             : #include "sym-exec/sym-exec-state.h"
      30                 :             : 
      31                 :             : class crc_symbolic_execution {
      32                 :             : 
      33                 :             :  private:
      34                 :             :   /* A vector of states to keep the current state of each executed path.  */
      35                 :             :   vec<state *> m_states;
      36                 :             : 
      37                 :             :   /* A vector of final states
      38                 :             :      to keep the returned_value and path conditions.  */
      39                 :             :   vec<state *> m_final_states;
      40                 :             : 
      41                 :             :   /* Potential CRC loop, which must be executed symbolically,
      42                 :             :      to check whether it calculates CRC.  */
      43                 :             :   class loop *m_crc_loop;
      44                 :             : 
      45                 :             :   /* Output CRC from the last block of the loop.  */
      46                 :             :   gphi *m_output_crc;
      47                 :             : 
      48                 :             :   /* Indicates whether the loop execution brought to loop exit.
      49                 :             :      I.e. the condition of the loop is false.  */
      50                 :             :   bool m_is_last_iteration;
      51                 :             : 
      52                 :             :   /* Returns true if the variable is used outside the loop.
      53                 :             :      Otherwise, returns false.  */
      54                 :             :   bool is_used_outside_the_loop (tree);
      55                 :             : 
      56                 :             :   /* Add next basic blocks of the conditional block
      57                 :             :      for the execution path into the stack.
      58                 :             :      If the condition depends on symbolic values, keep both edges.
      59                 :             :      If the condition is true, keep true edge, else - false edge.
      60                 :             :      Returns true if addition succeed.  Otherwise - false.  */
      61                 :             :   bool add_next_bbs (basic_block, state *, auto_vec<edge> &);
      62                 :             : 
      63                 :             :   /* Keep conditions depending on symbolic variables in the states.  */
      64                 :             :   static bool add_condition (const gcond *, state *, state *);
      65                 :             : 
      66                 :             :   /* The function adds E edge into the STACK if it doesn't have an immediate
      67                 :             :      successor back edge.
      68                 :             : 
      69                 :             :      When loop counter is checked in the if condition,
      70                 :             :      we mustn't continue on real path as we want to stop the execution before
      71                 :             :      the second iteration.  */
      72                 :             :   bool add_edge (edge, auto_vec<edge> &);
      73                 :             : 
      74                 :             :   /* Create new state for true and false branch.
      75                 :             :      Keep conditions in new created states.  */
      76                 :             :   bool resolve_condition (const gcond *, auto_vec<edge> &);
      77                 :             : 
      78                 :             :   /* If final states are less than two, adds new FINAL_STATE and returns true.
      79                 :             :    Otherwise, returns false.
      80                 :             :    In CRC cases we detect may not occur more than two final states.  */
      81                 :             :   bool add_final_state (state *);
      82                 :             : 
      83                 :             :   /* Keep the state of the executed path in final states.  */
      84                 :             :   bool keep_states ();
      85                 :             : 
      86                 :             :   bool execute_assign_statement (const gassign *);
      87                 :             : 
      88                 :             :   /* Execute gimple statements of the basic block.
      89                 :             :      Keeping values of variables in the state.  */
      90                 :             :   bool execute_bb_gimple_statements (basic_block, auto_vec<edge> &);
      91                 :             : 
      92                 :             :   /* Assign values of phi instruction to its result.
      93                 :             :      Keep updated values in the state.  */
      94                 :             :   bool execute_bb_phi_statements (basic_block, edge);
      95                 :             : 
      96                 :             :   /* Execute all statements of the basic block.
      97                 :             :     Keeping values of variables in the state.  */
      98                 :             :   bool execute_bb_statements (basic_block, edge, auto_vec<edge> &);
      99                 :             : 
     100                 :             :   /* Create initial state of the loop's header BB variables which have constant
     101                 :             :    values.
     102                 :             :    If it is the first iteration of the loop, initialise variables with the
     103                 :             :    initial values, otherwise initialise the variable with the value calculated
     104                 :             :    during the previous execution.  */
     105                 :             :   state *create_initial_state (class loop *);
     106                 :             : 
     107                 :             : /* Traverse function fun's all paths from the first basic block to the last.
     108                 :             :    Each time iterate loops only once.
     109                 :             :    Symbolically execute statements of each path.  */
     110                 :             :   bool traverse_function (function *);
     111                 :             : 
     112                 :             :   /* Execute the loop, which calculates crc with initial values,
     113                 :             :    to calculate the polynomial.  */
     114                 :             :   bool execute_crc_loop (gphi *, gphi *, bool);
     115                 :             : 
     116                 :             :  public:
     117                 :             : 
     118                 :             :   /* Returns calculated polynomial by executing the loop
     119                 :             :      with concrete values.
     120                 :             :      First value of the pair is the tree containing the value of the polynomial,
     121                 :             :      second is the calculated polynomial.  The pair may contain nullptr.  */
     122                 :             :   std::pair <tree, value *>
     123                 :             :   extract_polynomial (gphi *, gphi *, tree, bool);
     124                 :             : 
     125                 :             :   /* Symbolically execute the CRC loop, doing one iteration.  */
     126                 :             :   bool symb_execute_crc_loop ();
     127                 :             : 
     128                 :        3021 :   const vec<state *> &get_final_states ()
     129                 :             :   {
     130                 :        3021 :     return m_final_states;
     131                 :             :   }
     132                 :             : 
     133                 :        3240 :   bool is_last_iteration ()
     134                 :             :   {
     135                 :        3240 :     return m_is_last_iteration;
     136                 :             :   }
     137                 :             : 
     138                 :         477 :   crc_symbolic_execution (class loop *loop, gphi * output_crc) :
     139                 :         477 :       m_crc_loop (loop), m_output_crc (output_crc), m_is_last_iteration (false)
     140                 :             :   {
     141                 :             :     /* Reserve memory for the vectors of states.  */
     142                 :         477 :     int max_states = 2;
     143                 :         477 :     m_states.create (max_states);
     144                 :         477 :     m_final_states.create (max_states);
     145                 :         477 :   }
     146                 :             : 
     147                 :         477 :   ~crc_symbolic_execution ()
     148                 :             :   {
     149                 :             :     /* Free memory.  */
     150                 :         477 :     state::clear_states (&m_states);
     151                 :         477 :     state::clear_states (&m_final_states);
     152                 :         258 :   }
     153                 :             : };
     154                 :             : 
     155                 :             : 
     156                 :             : /**************************** LFSR MATCHING *********************************/
     157                 :             : 
     158                 :             : /* Returns true if all states match the LFSR, otherwise - false.  */
     159                 :             : bool all_states_match_lfsr (value *, bool, tree, const vec<state *> &);
     160                 :             : 
     161                 :             : 
     162                 :             : #endif //GCC_CRC_VERIFICATION
        

Generated by: LCOV version 2.1-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.