(root)/
gcc-13.2.0/
gcc/
analyzer/
known-function-manager.h
       1  /* Support for plugin-supplied behaviors of known functions.
       2     Copyright (C) 2022-2023 Free Software Foundation, Inc.
       3     Contributed by David Malcolm <dmalcolm@redhat.com>.
       4  
       5  This file is part of GCC.
       6  
       7  GCC is free software; you can redistribute it and/or modify it
       8  under the terms of the GNU General Public License as published by
       9  the Free Software Foundation; either version 3, or (at your option)
      10  any later version.
      11  
      12  GCC is distributed in the hope that it will be useful, but
      13  WITHOUT ANY WARRANTY; without even the implied warranty of
      14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      15  General Public License 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_ANALYZER_KNOWN_FUNCTION_MANAGER_H
      22  #define GCC_ANALYZER_KNOWN_FUNCTION_MANAGER_H
      23  
      24  #include "analyzer/analyzer-logging.h"
      25  
      26  namespace ana {
      27  
      28  /* Instances of known_function are registered with the known_function_manager
      29     when the analyzer starts.
      30  
      31     The known_function_manager has responsibility for determining which
      32     known_function instance (if any) is relevant at a call site, by checking
      33     name or id, and by calling known_function::matches_call_types_p to ensure
      34     that the known_function's preconditions hold (typically assumptions about
      35     types e.g. that "has 3 args, and that arg 0 is of pointer type").
      36  
      37     The known_function subclasses themselves have responsibility for
      38     determining the outcome(s) of the call.  */
      39  
      40  class known_function_manager : public log_user
      41  {
      42  public:
      43    known_function_manager (logger *logger);
      44    ~known_function_manager ();
      45  
      46    void add (const char *name, std::unique_ptr<known_function> kf);
      47    void add (enum built_in_function name, std::unique_ptr<known_function> kf);
      48    void add (enum internal_fn ifn, std::unique_ptr<known_function> kf);
      49  
      50    const known_function *get_match (tree fndecl, const call_details &cd) const;
      51    const known_function *get_internal_fn (enum internal_fn) const;
      52  
      53  private:
      54    DISABLE_COPY_AND_ASSIGN (known_function_manager);
      55  
      56    const known_function *get_normal_builtin (enum built_in_function name) const;
      57    const known_function *get_by_identifier (tree identifier) const;
      58  
      59    /* Map from identifier to known_function instance.
      60       Has ownership of the latter.  */
      61    hash_map<tree, known_function *> m_map_id_to_kf;
      62  
      63    /* Array of known builtins.  */
      64    known_function *m_combined_fns_arr[CFN_LAST];
      65  };
      66  
      67  } // namespace ana
      68  
      69  #endif /* GCC_ANALYZER_KNOWN_FUNCTION_MANAGER_H */