annotate gcc/analyzer/checker-path.h @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /* Subclasses of diagnostic_path and diagnostic_event for analyzer diagnostics.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 Copyright (C) 2019-2020 Free Software Foundation, Inc.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 Contributed by David Malcolm <dmalcolm@redhat.com>.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 This file is part of GCC.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify it
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 under the terms of the GNU General Public License as published by
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 the Free Software Foundation; either version 3, or (at your option)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 any later version.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful, but
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 WITHOUT ANY WARRANTY; without even the implied warranty of
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 General Public License for more details.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 <http://www.gnu.org/licenses/>. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 #ifndef GCC_ANALYZER_CHECKER_PATH_H
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 #define GCC_ANALYZER_CHECKER_PATH_H
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 namespace ana {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 /* An enum for discriminating between the concrete subclasses of
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 checker_event. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 enum event_kind
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 EK_DEBUG,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 EK_CUSTOM,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 EK_STMT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 EK_FUNCTION_ENTRY,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 EK_STATE_CHANGE,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 EK_START_CFG_EDGE,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 EK_END_CFG_EDGE,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 EK_CALL_EDGE,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 EK_RETURN_EDGE,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 EK_SETJMP,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 EK_REWIND_FROM_LONGJMP,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 EK_REWIND_TO_SETJMP,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 EK_WARNING
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 extern const char *event_kind_to_string (enum event_kind ek);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 /* Event subclasses.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 The class hierarchy looks like this (using indentation to show
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 inheritance, and with event_kinds shown for the concrete subclasses):
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 diagnostic_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 checker_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 debug_event (EK_DEBUG)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 custom_event (EK_CUSTOM)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 statement_event (EK_STMT)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 function_entry_event (EK_FUNCTION_ENTRY)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 state_change_event (EK_STATE_CHANGE)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 superedge_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 cfg_edge_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 start_cfg_edge_event (EK_START_CFG_EDGE)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 end_cfg_edge_event (EK_END_CFG_EDGE)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 call_event (EK_CALL_EDGE)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 return_edge (EK_RETURN_EDGE)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 setjmp_event (EK_SETJMP)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 rewind_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 rewind_from_longjmp_event (EK_REWIND_FROM_LONGJMP)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 rewind_to_setjmp_event (EK_REWIND_TO_SETJMP)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 warning_event (EK_WARNING). */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 /* Abstract subclass of diagnostic_event; the base class for use in
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 checker_path (the analyzer's diagnostic_path subclass). */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 class checker_event : public diagnostic_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 checker_event (enum event_kind kind,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 location_t loc, tree fndecl, int depth)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 : m_kind (kind), m_loc (loc), m_fndecl (fndecl), m_depth (depth),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 m_pending_diagnostic (NULL), m_emission_id ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 /* Implementation of diagnostic_event. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 location_t get_location () const FINAL OVERRIDE { return m_loc; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 tree get_fndecl () const FINAL OVERRIDE { return m_fndecl; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 int get_stack_depth () const FINAL OVERRIDE { return m_depth; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 /* Additional functionality. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 virtual void prepare_for_emission (checker_path *,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 pending_diagnostic *pd,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 diagnostic_event_id_t emission_id);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 virtual bool is_call_p () const { return false; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 virtual bool is_function_entry_p () const { return false; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 virtual bool is_return_p () const { return false; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 void dump (pretty_printer *pp) const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 const enum event_kind m_kind;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 protected:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 location_t m_loc;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 tree m_fndecl;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 int m_depth;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 pending_diagnostic *m_pending_diagnostic;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 diagnostic_event_id_t m_emission_id; // only set once all pruning has occurred
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 /* A concrete event subclass for a purely textual event, for use in
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 debugging path creation and filtering. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 class debug_event : public checker_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 debug_event (location_t loc, tree fndecl, int depth,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 const char *desc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 : checker_event (EK_DEBUG, loc, fndecl, depth),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 m_desc (xstrdup (desc))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 ~debug_event ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 free (m_desc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 label_text get_desc (bool) const FINAL OVERRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 private:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 char *m_desc;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 /* A concrete event subclass for custom events. These are not filtered,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 as they are likely to be pertinent to the diagnostic. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 class custom_event : public checker_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 custom_event (location_t loc, tree fndecl, int depth,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 const char *desc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 : checker_event (EK_CUSTOM, loc, fndecl, depth),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 m_desc (xstrdup (desc))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 ~custom_event ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 free (m_desc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 label_text get_desc (bool) const FINAL OVERRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 private:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 char *m_desc;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 /* A concrete event subclass describing the execution of a gimple statement,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 for use at high verbosity levels when debugging paths. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 class statement_event : public checker_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 statement_event (const gimple *stmt, tree fndecl, int depth,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 const program_state &dst_state);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 label_text get_desc (bool) const FINAL OVERRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 const gimple * const m_stmt;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 const program_state m_dst_state;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 /* An event subclass describing the entry to a function. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 class function_entry_event : public checker_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 function_entry_event (location_t loc, tree fndecl, int depth)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 : checker_event (EK_FUNCTION_ENTRY, loc, fndecl, depth)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 label_text get_desc (bool can_colorize) const FINAL OVERRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 bool is_function_entry_p () const FINAL OVERRIDE { return true; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 /* Subclass of checker_event describing a state change. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 class state_change_event : public checker_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 state_change_event (const supernode *node, const gimple *stmt,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194 int stack_depth,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 const state_machine &sm,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 tree var,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 state_machine::state_t from,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 state_machine::state_t to,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 tree origin,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 const program_state &dst_state);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 label_text get_desc (bool can_colorize) const FINAL OVERRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 region_id get_lvalue (tree expr) const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 return m_dst_state.m_region_model->get_lvalue (expr, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 const supernode *m_node;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210 const gimple *m_stmt;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 const state_machine &m_sm;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212 tree m_var;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 state_machine::state_t m_from;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 state_machine::state_t m_to;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 tree m_origin;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216 program_state m_dst_state;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219 /* Subclass of checker_event; parent class for subclasses that relate to
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 a superedge. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 class superedge_event : public checker_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 /* Mark this edge event as being either an interprocedural call or
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 return in which VAR is in STATE, and that this is critical to the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 diagnostic (so that get_desc can attempt to get a better description
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 from any pending_diagnostic). */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229 void record_critical_state (tree var, state_machine::state_t state)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231 m_var = var;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 m_critical_state = state;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 const callgraph_superedge& get_callgraph_superedge () const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 bool should_filter_p (int verbosity) const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239 protected:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 superedge_event (enum event_kind kind, const exploded_edge &eedge,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 location_t loc, tree fndecl, int depth);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 const exploded_edge &m_eedge;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245 const superedge *m_sedge;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 tree m_var;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 state_machine::state_t m_critical_state;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 /* An abstract event subclass for when a CFG edge is followed; it has two
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 subclasses, representing the start of the edge and the end of the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252 edge, which come in pairs. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 class cfg_edge_event : public superedge_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 const cfg_superedge& get_cfg_superedge () const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 protected:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 cfg_edge_event (enum event_kind kind, const exploded_edge &eedge,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 location_t loc, tree fndecl, int depth);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 /* A concrete event subclass for the start of a CFG edge
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 e.g. "following 'false' branch...'. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267 class start_cfg_edge_event : public cfg_edge_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270 start_cfg_edge_event (const exploded_edge &eedge,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271 location_t loc, tree fndecl, int depth)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 : cfg_edge_event (EK_START_CFG_EDGE, eedge, loc, fndecl, depth)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276 label_text get_desc (bool can_colorize) const FINAL OVERRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 private:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 label_text maybe_describe_condition (bool can_colorize) const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281 static label_text maybe_describe_condition (bool can_colorize,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282 tree lhs,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 enum tree_code op,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284 tree rhs);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285 static bool should_print_expr_p (tree);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288 /* A concrete event subclass for the end of a CFG edge
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289 e.g. "...to here'. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 class end_cfg_edge_event : public cfg_edge_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
292 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
293 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
294 end_cfg_edge_event (const exploded_edge &eedge,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
295 location_t loc, tree fndecl, int depth)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
296 : cfg_edge_event (EK_END_CFG_EDGE, eedge, loc, fndecl, depth)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
297 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
298 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
299
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
300 label_text get_desc (bool /*can_colorize*/) const FINAL OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
301 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
302 return label_text::borrow ("...to here");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
303 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
304 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
305
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
306 /* A concrete event subclass for an interprocedural call. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
307
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
308 class call_event : public superedge_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
309 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
310 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
311 call_event (const exploded_edge &eedge,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
312 location_t loc, tree fndecl, int depth);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
313
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
314 label_text get_desc (bool can_colorize) const FINAL OVERRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
315
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
316 bool is_call_p () const FINAL OVERRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
317 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
318
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
319 /* A concrete event subclass for an interprocedural return. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
320
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
321 class return_event : public superedge_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
322 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
323 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
324 return_event (const exploded_edge &eedge,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
325 location_t loc, tree fndecl, int depth);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
326
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
327 label_text get_desc (bool can_colorize) const FINAL OVERRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
328
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
329 bool is_return_p () const FINAL OVERRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
330 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
331
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
332 /* A concrete event subclass for a setjmp or sigsetjmp call. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
333
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
334 class setjmp_event : public checker_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
335 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
336 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
337 setjmp_event (location_t loc, const exploded_node *enode,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
338 tree fndecl, int depth, const gcall *setjmp_call)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
339 : checker_event (EK_SETJMP, loc, fndecl, depth),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
340 m_enode (enode), m_setjmp_call (setjmp_call)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
341 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
342 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
343
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
344 label_text get_desc (bool can_colorize) const FINAL OVERRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
345
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
346 void prepare_for_emission (checker_path *path,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
347 pending_diagnostic *pd,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
348 diagnostic_event_id_t emission_id) FINAL OVERRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
349
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
350 private:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
351 const exploded_node *m_enode;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
352 const gcall *m_setjmp_call;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
353 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
354
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
355 /* An abstract event subclass for rewinding from a longjmp to a setjmp
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
356 (or siglongjmp to sigsetjmp).
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
357
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
358 Base class for two from/to subclasses, showing the two halves of the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
359 rewind. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
360
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
361 class rewind_event : public checker_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
362 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
363 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
364 tree get_longjmp_caller () const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
365 tree get_setjmp_caller () const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
366 const exploded_edge *get_eedge () const { return m_eedge; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
367
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
368 protected:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
369 rewind_event (const exploded_edge *eedge,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
370 enum event_kind kind,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
371 location_t loc, tree fndecl, int depth,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
372 const rewind_info_t *rewind_info);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
373 const rewind_info_t *m_rewind_info;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
374
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
375 private:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
376 const exploded_edge *m_eedge;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
377 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
378
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
379 /* A concrete event subclass for rewinding from a longjmp to a setjmp,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
380 showing the longjmp (or siglongjmp). */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
381
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
382 class rewind_from_longjmp_event : public rewind_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
383 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
384 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
385 rewind_from_longjmp_event (const exploded_edge *eedge,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
386 location_t loc, tree fndecl, int depth,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
387 const rewind_info_t *rewind_info)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
388 : rewind_event (eedge, EK_REWIND_FROM_LONGJMP, loc, fndecl, depth,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
389 rewind_info)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
390 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
391 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
392
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
393 label_text get_desc (bool can_colorize) const FINAL OVERRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
394 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
395
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
396 /* A concrete event subclass for rewinding from a longjmp to a setjmp,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
397 showing the setjmp (or sigsetjmp). */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
398
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
399 class rewind_to_setjmp_event : public rewind_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
400 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
401 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
402 rewind_to_setjmp_event (const exploded_edge *eedge,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
403 location_t loc, tree fndecl, int depth,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
404 const rewind_info_t *rewind_info)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
405 : rewind_event (eedge, EK_REWIND_TO_SETJMP, loc, fndecl, depth,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
406 rewind_info)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
407 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
408 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
409
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
410 label_text get_desc (bool can_colorize) const FINAL OVERRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
411
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
412 void prepare_for_emission (checker_path *path,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
413 pending_diagnostic *pd,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
414 diagnostic_event_id_t emission_id) FINAL OVERRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
415
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
416 private:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
417 diagnostic_event_id_t m_original_setjmp_event_id;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
418 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
419
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
420 /* Concrete subclass of checker_event for use at the end of a path:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
421 a repeat of the warning message at the end of the path (perhaps with
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
422 references to pertinent events that occurred on the way), at the point
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
423 where the problem occurs. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
424
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
425 class warning_event : public checker_event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
426 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
427 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
428 warning_event (location_t loc, tree fndecl, int depth,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
429 const state_machine *sm,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
430 tree var, state_machine::state_t state)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
431 : checker_event (EK_WARNING, loc, fndecl, depth),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
432 m_sm (sm), m_var (var), m_state (state)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
433 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
434 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
435
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
436 label_text get_desc (bool can_colorize) const FINAL OVERRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
437
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
438 private:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
439 const state_machine *m_sm;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
440 tree m_var;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
441 state_machine::state_t m_state;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
442 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
443
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
444 /* Subclass of diagnostic_path for analyzer diagnostics. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
445
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
446 class checker_path : public diagnostic_path
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
447 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
448 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
449 checker_path () : diagnostic_path () {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
450
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
451 /* Implementation of diagnostic_path vfuncs. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
452
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
453 unsigned num_events () const FINAL OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
454 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
455 return m_events.length ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
456 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
457
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
458 const diagnostic_event & get_event (int idx) const FINAL OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
459 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
460 return *m_events[idx];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
461 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
462
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
463 checker_event *get_checker_event (int idx)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
464 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
465 return m_events[idx];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
466 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
467
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
468 void dump (pretty_printer *pp) const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
469 void debug () const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
470
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
471 void maybe_log (logger *logger, const char *desc) const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
472
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
473 void add_event (checker_event *event)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
474 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
475 m_events.safe_push (event);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
476 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
477
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
478 void delete_event (int idx)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
479 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
480 checker_event *event = m_events[idx];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
481 m_events.ordered_remove (idx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
482 delete event;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
483 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
484
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
485 void add_final_event (const state_machine *sm,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
486 const exploded_node *enode, const gimple *stmt,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
487 tree var, state_machine::state_t state);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
488
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
489 /* After all event-pruning, a hook for notifying each event what
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
490 its ID will be. The events are notified in order, allowing
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
491 for later events to refer to the IDs of earlier events in
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
492 their descriptions. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
493 void prepare_for_emission (pending_diagnostic *pd)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
494 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
495 checker_event *e;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
496 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
497 FOR_EACH_VEC_ELT (m_events, i, e)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
498 e->prepare_for_emission (this, pd, diagnostic_event_id_t (i));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
499 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
500
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
501 void record_setjmp_event (const exploded_node *enode,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
502 diagnostic_event_id_t setjmp_emission_id)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
503 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
504 m_setjmp_event_ids.put (enode, setjmp_emission_id);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
505 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
506
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
507 bool get_setjmp_event (const exploded_node *enode,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
508 diagnostic_event_id_t *out_emission_id)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
509 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
510 if (diagnostic_event_id_t *emission_id = m_setjmp_event_ids.get (enode))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
511 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
512 *out_emission_id = *emission_id;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
513 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
514 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
515 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
516 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
517
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
518 private:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
519 DISABLE_COPY_AND_ASSIGN(checker_path);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
520
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
521 /* The events that have occurred along this path. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
522 auto_delete_vec<checker_event> m_events;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
523
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
524 /* During prepare_for_emission (and after), the setjmp_event for each
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
525 exploded_node *, so that rewind events can refer to them in their
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
526 descriptions. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
527 hash_map <const exploded_node *, diagnostic_event_id_t> m_setjmp_event_ids;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
528 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
529
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
530 } // namespace ana
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
531
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
532 #endif /* GCC_ANALYZER_CHECKER_PATH_H */