aboutsummaryrefslogtreecommitdiff
path: root/gcc/analyzer/exploded-graph.h
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2021-04-01 18:22:52 -0400
committerDavid Malcolm <dmalcolm@redhat.com>2021-04-01 18:22:52 -0400
commit6e943d5a2e3c581e40ccab46bec986a1f22c70c2 (patch)
treeea25b0beb527ae5bce1d974c9a7d1bd59f6b498b /gcc/analyzer/exploded-graph.h
parent6a60ffc297b9d4903543a25538e62e7fb39420a9 (diff)
downloadgcc-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.h34
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);