diff options
author | David Malcolm <dmalcolm@redhat.com> | 2021-04-01 18:22:52 -0400 |
---|---|---|
committer | David Malcolm <dmalcolm@redhat.com> | 2021-04-01 18:22:52 -0400 |
commit | 6e943d5a2e3c581e40ccab46bec986a1f22c70c2 (patch) | |
tree | ea25b0beb527ae5bce1d974c9a7d1bd59f6b498b /gcc/analyzer/exploded-graph.h | |
parent | 6a60ffc297b9d4903543a25538e62e7fb39420a9 (diff) | |
download | gcc-6e943d5a2e3c581e40ccab46bec986a1f22c70c2.zip gcc-6e943d5a2e3c581e40ccab46bec986a1f22c70c2.tar.gz gcc-6e943d5a2e3c581e40ccab46bec986a1f22c70c2.tar.bz2 |
analyzer: record per-enode saved_diagnostics
Various places iterate through all of the saved_diagnostics to find
just the ones that are at a given enode. This patch adds a per-enode
record of the diagnostics that are at each node, to save iterating
through all of the diagnostics each time.
gcc/analyzer/ChangeLog:
* diagnostic-manager.cc (diagnostic_manager::add_diagnostic): Make
enode param non-constant, and call add_diagnostic on it. Add
enode index to log message.
(diagnostic_manager::add_diagnostic): Make enode param
non-constant.
* diagnostic-manager.h (diagnostic_manager::add_diagnostic):
Likewise for both decls.
* engine.cc
(impl_region_model_context::impl_region_model_context): Likewise
for enode_for_diag.
(impl_sm_context::impl_sm_context): Likewise.
(impl_sm_context::m_enode_for_diag): Likewise.
(exploded_node::dump_dot): Don't pass the diagnostic manager
to dump_saved_diagnostics.
(exploded_node::dump_saved_diagnostics): Drop param. Iterate
directly through all saved diagnostics for the enode, rather
than all saved diagnostics in the diagnostic_manager and
filtering.
(exploded_node::on_stmt): Make non-const.
(exploded_node::on_edge): Likewise.
(exploded_node::on_longjmp): Likewise.
(exploded_node::detect_leaks): Likewise.
(exploded_graph::get_or_create_node): Make enode_for_diag param
non-const.
(exploded_graph_annotator::print_enode): Iterate
directly through all saved diagnostics for the enode, rather
than all saved diagnostics in the diagnostic_manager and
filtering.
* exploded-graph.h
(impl_region_model_context::impl_region_model_context): Make
enode_for_diag param non-constant.
(impl_region_model_context::m_enode_for_diag): Likewise.
(exploded_node::dump_saved_diagnostics): Drop param.
(exploded_node::on_stmt): Make non-const.
(exploded_node::on_edge): Likewise.
(exploded_node::on_longjmp): Likewise.
(exploded_node::detect_leaks): Likewise.
(exploded_node::add_diagnostic): New.
(exploded_node::get_num_diagnostics): New.
(exploded_node::get_saved_diagnostic): New.
(exploded_node::m_saved_diagnostics): New.
(exploded_graph::get_or_create_node): Make enode_for_diag param
non-constant.
* feasible-graph.cc (feasible_node::dump_dot): Drop
diagnostic_manager from call to dump_saved_diagnostics.
* program-state.cc (program_state::on_edge): Convert enode param
to non-const pointer.
(program_state::prune_for_point): Likewise for enode_for_diag
param.
* program-state.h (program_state::on_edge): Convert enode param
to non-const pointer.
(program_state::prune_for_point): Likewise for enode_for_diag
param.
Diffstat (limited to 'gcc/analyzer/exploded-graph.h')
-rw-r--r-- | gcc/analyzer/exploded-graph.h | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/gcc/analyzer/exploded-graph.h b/gcc/analyzer/exploded-graph.h index deb739f..2566641 100644 --- a/gcc/analyzer/exploded-graph.h +++ b/gcc/analyzer/exploded-graph.h @@ -30,7 +30,7 @@ class impl_region_model_context : public region_model_context { public: impl_region_model_context (exploded_graph &eg, - const exploded_node *enode_for_diag, + exploded_node *enode_for_diag, /* TODO: should we be getting the ECs from the old state, rather than the new? */ @@ -70,7 +70,7 @@ class impl_region_model_context : public region_model_context exploded_graph *m_eg; log_user m_logger; - const exploded_node *m_enode_for_diag; + exploded_node *m_enode_for_diag; const program_state *m_old_state; program_state *m_new_state; const gimple *m_stmt; @@ -186,8 +186,7 @@ class exploded_node : public dnode<eg_traits> void dump (const extrinsic_state &ext_state) const; void dump_processed_stmts (pretty_printer *pp) const; - void dump_saved_diagnostics (pretty_printer *pp, - const diagnostic_manager &dm) const; + void dump_saved_diagnostics (pretty_printer *pp) const; json::object *to_json (const extrinsic_state &ext_state) const; @@ -227,17 +226,17 @@ class exploded_node : public dnode<eg_traits> on_stmt_flags on_stmt (exploded_graph &eg, const supernode *snode, const gimple *stmt, - program_state *state) const; + program_state *state); bool on_edge (exploded_graph &eg, const superedge *succ, program_point *next_point, - program_state *next_state) const; + program_state *next_state); void on_longjmp (exploded_graph &eg, const gcall *call, program_state *new_state, - region_model_context *ctxt) const; + region_model_context *ctxt); - void detect_leaks (exploded_graph &eg) const; + void detect_leaks (exploded_graph &eg); const program_point &get_point () const { return m_ps.get_point (); } const supernode *get_supernode () const @@ -269,6 +268,19 @@ class exploded_node : public dnode<eg_traits> m_status = status; } + void add_diagnostic (const saved_diagnostic *sd) + { + m_saved_diagnostics.safe_push (sd); + } + unsigned get_num_diagnostics () const + { + return m_saved_diagnostics.length (); + } + const saved_diagnostic *get_saved_diagnostic (unsigned idx) const + { + return m_saved_diagnostics[idx]; + } + private: DISABLE_COPY_AND_ASSIGN (exploded_node); @@ -278,6 +290,10 @@ private: enum status m_status; + /* The saved_diagnostics at this enode, borrowed from the + diagnostic_manager. */ + auto_vec <const saved_diagnostic *> m_saved_diagnostics; + public: /* The index of this exploded_node. */ const int m_index; @@ -761,7 +777,7 @@ public: exploded_node *get_or_create_node (const program_point &point, const program_state &state, - const exploded_node *enode_for_diag); + exploded_node *enode_for_diag); exploded_edge *add_edge (exploded_node *src, exploded_node *dest, const superedge *sedge, exploded_edge::custom_info_t *custom = NULL); |