1 /* Integration of the analyzer with GCC's pass manager. 2 Copyright (C) 2019-2024 Free Software Foundation, Inc. 3 Contributed by David Malcolm <dmalcolm (at) 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 #include "config.h" 22 #define INCLUDE_MEMORY 23 #include "system.h" 24 #include "coretypes.h" 25 #include "context.h" 26 #include "tree-pass.h" 27 #include "diagnostic.h" 28 #include "options.h" 29 #include "tree.h" 30 #include "analyzer/analyzer.h" 31 #include "analyzer/engine.h" 32 33 namespace { 34 35 /* Data for the analyzer pass. */ 36 37 const pass_data pass_data_analyzer = 38 { 39 IPA_PASS, /* type */ 40 "analyzer", /* name */ 41 OPTGROUP_NONE, /* optinfo_flags */ 42 TV_ANALYZER, /* tv_id */ 43 PROP_ssa, /* properties_required */ 44 0, /* properties_provided */ 45 0, /* properties_destroyed */ 46 0, /* todo_flags_start */ 47 0, /* todo_flags_finish */ 48 }; 49 50 /* The analyzer pass. */ 51 52 class pass_analyzer : public ipa_opt_pass_d 53 { 54 public: 55 pass_analyzer(gcc::context *ctxt) 56 : ipa_opt_pass_d (pass_data_analyzer, ctxt, 57 NULL, /* generate_summary */ 58 NULL, /* write_summary */ 59 NULL, /* read_summary */ 60 NULL, /* write_optimization_summary */ 61 NULL, /* read_optimization_summary */ 62 NULL, /* stmt_fixup */ 63 0, /* function_transform_todo_flags_start */ 64 NULL, /* function_transform */ 65 NULL) /* variable_transform */ 66 {} 67 68 /* opt_pass methods: */ 69 bool gate (function *) final override; 70 unsigned int execute (function *) final override; 71 }; // class pass_analyzer 72 73 /* Only run the analyzer if -fanalyzer. */ 74 75 bool 76 pass_analyzer::gate (function *) 77 { 78 return flag_analyzer != 0; 79 } 80 81 /* Entrypoint for the analyzer pass. */ 82 83 unsigned int 84 pass_analyzer::execute (function *) 85 { 86 #if ENABLE_ANALYZER 87 ana::run_checkers (); 88 #else 89 sorry_no_analyzer (); 90 #endif 91 92 return 0; 93 } 94 95 } // anon namespace 96 97 /* Make an instance of the analyzer pass. */ 98 99 ipa_opt_pass_d * 100 make_pass_analyzer (gcc::context *ctxt) 101 { 102 return new pass_analyzer (ctxt); 103 } 104 105 #if !ENABLE_ANALYZER 106 107 /* Issue a "sorry" diagnostic that the analyzer was not enabled. */ 108 109 void 110 sorry_no_analyzer () 111 { 112 sorry ("%qs was not enabled in this build of GCC" 113 " (missing configure-time option %qs)", 114 "-fanalyzer", "--enable-analyzer"); 115 } 116 117 #endif /* #if !ENABLE_ANALYZER */ 118