aboutsummaryrefslogtreecommitdiff
path: root/gcc/analyzer/program-state.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/analyzer/program-state.cc')
-rw-r--r--gcc/analyzer/program-state.cc48
1 files changed, 48 insertions, 0 deletions
diff --git a/gcc/analyzer/program-state.cc b/gcc/analyzer/program-state.cc
index f0f4046..b54bdce 100644
--- a/gcc/analyzer/program-state.cc
+++ b/gcc/analyzer/program-state.cc
@@ -56,6 +56,7 @@ along with GCC; see the file COPYING3. If not see
#include "analyzer/program-state.h"
#include "analyzer/exploded-graph.h"
#include "analyzer/state-purge.h"
+#include "analyzer/call-summary.h"
#include "analyzer/analyzer-selftests.h"
#if ENABLE_ANALYZER
@@ -743,6 +744,31 @@ program_state::program_state (const extrinsic_state &ext_state)
}
}
+/* Attempt to to use R to replay SUMMARY into this object.
+ Return true if it is possible. */
+
+bool
+sm_state_map::replay_call_summary (call_summary_replay &r,
+ const sm_state_map &summary)
+{
+ for (auto kv : summary.m_map)
+ {
+ const svalue *summary_sval = kv.first;
+ const svalue *caller_sval = r.convert_svalue_from_summary (summary_sval);
+ if (!caller_sval)
+ continue;
+ const svalue *summary_origin = kv.second.m_origin;
+ const svalue *caller_origin
+ = (summary_origin
+ ? r.convert_svalue_from_summary (summary_origin)
+ : NULL);
+ // caller_origin can be NULL.
+ m_map.put (caller_sval, entry_t (kv.second.m_state, caller_origin));
+ }
+ m_global_state = summary.m_global_state;
+ return true;
+}
+
/* program_state's copy ctor. */
program_state::program_state (const program_state &other)
@@ -1437,6 +1463,28 @@ program_state::detect_leaks (const program_state &src_state,
dest_state.m_region_model->unset_dynamic_extents (reg);
}
+/* Attempt to to use R to replay SUMMARY into this object.
+ Return true if it is possible. */
+
+bool
+program_state::replay_call_summary (call_summary_replay &r,
+ const program_state &summary)
+{
+ if (!m_region_model->replay_call_summary (r, *summary.m_region_model))
+ return false;
+
+ for (unsigned sm_idx = 0; sm_idx < m_checker_states.length (); sm_idx++)
+ {
+ const sm_state_map *summary_sm_map = summary.m_checker_states[sm_idx];
+ m_checker_states[sm_idx]->replay_call_summary (r, *summary_sm_map);
+ }
+
+ if (!summary.m_valid)
+ m_valid = false;
+
+ return true;
+}
+
/* Handle calls to "__analyzer_dump_state". */
void