+2020-08-13 David Malcolm <dmalcolm@redhat.com>
+
+ * analyzer-logging.cc: Ignore "-Wformat-diag".
+ (logger::enter_scope): Use inc_indent in both overloads.
+ (logger::exit_scope): Use dec_indent.
+ * analyzer-logging.h (logger::inc_indent): New.
+ (logger::dec_indent): New.
+ * analyzer-selftests.cc (run_analyzer_selftests): Call
+ analyzer_store_cc_tests.
+ * analyzer-selftests.h (analyzer_store_cc_tests): New decl.
+ * analyzer.cc (get_stmt_location): New function.
+ * analyzer.h (class initial_svalue): New forward decl.
+ (class unaryop_svalue): New forward decl.
+ (class binop_svalue): New forward decl.
+ (class sub_svalue): New forward decl.
+ (class unmergeable_svalue): New forward decl.
+ (class placeholder_svalue): New forward decl.
+ (class widening_svalue): New forward decl.
+ (class compound_svalue): New forward decl.
+ (class conjured_svalue): New forward decl.
+ (svalue_set): New typedef.
+ (class map_region): Delete.
+ (class array_region): Delete.
+ (class frame_region): New forward decl.
+ (class function_region): New forward decl.
+ (class label_region): New forward decl.
+ (class decl_region): New forward decl.
+ (class element_region): New forward decl.
+ (class offset_region): New forward decl.
+ (class cast_region): New forward decl.
+ (class field_region): New forward decl.
+ (class string_region): New forward decl.
+ (class region_model_manager): New forward decl.
+ (class store_manager): New forward decl.
+ (class store): New forward decl.
+ (class call_details): New forward decl.
+ (struct svalue_id_merger_mapping): Delete.
+ (struct canonicalization): Delete.
+ (class function_point): New forward decl.
+ (class engine): New forward decl.
+ (dump_tree): New function decl.
+ (print_quoted_type): New function decl.
+ (readability_comparator): New function decl.
+ (tree_cmp): New function decl.
+ (class path_var): Move here from region-model.h
+ (bit_offset_t, bit_size_t, byte_size_t): New typedefs.
+ (class region_offset): New class.
+ (get_stmt_location): New decl.
+ (struct member_function_hash_traits): New struct.
+ (class consolidation_map): New class.
+ Ignore "-Wformat-diag".
+ * analyzer.opt (-param=analyzer-max-svalue-depth=): New param.
+ (-param=analyzer-max-enodes-for-full-dump=): New param.
+ * call-string.cc: Ignore -Wformat-diag.
+ * checker-path.cc: Move includes of "analyzer/call-string.h" and
+ "analyzer/program-point.h" to before "analyzer/region-model.h",
+ and also include "analyzer/store.h" before it.
+ (state_change_event::state_change_event): Replace "tree var" param
+ with "const svalue *sval". Convert "origin" param from tree to
+ "const svalue *".
+ (state_change_event::get_desc): Call get_representative_tree to
+ convert the var and origin from const svalue * to tree. Use
+ svalue::get_desc rather than %qE when describing state changes.
+ (checker_path::add_final_event): Use get_stmt_location.
+ * checker-path.h (state_change_event::state_change_event): Port
+ from tree to const svalue *.
+ (state_change_event::get_lvalue): Delete.
+ (state_change_event::get_dest_function): New.
+ (state_change_event::m_var): Replace with...
+ (state_change_event::m_sval): ...this.
+ (state_change_event::m_origin): Convert from tree to
+ const svalue *.
+ * constraint-manager.cc: Include "analyzer/call-string.h",
+ "analyzer/program-point.h", and "analyzer/store.h" before
+ "analyzer/region-model.h".
+ (struct bound, struct range): Move to constraint-manager.h.
+ (compare_constants): New function.
+ (range::dump): Rename to...
+ (range::dump_to_pp): ...this. Support NULL constants.
+ (range::dump): Reintroduce for dumping to stderr.
+ (range::constrained_to_single_element): Return result, rather than
+ writing to *OUT.
+ (range::eval_condition): New.
+ (range::below_lower_bound): New.
+ (range::above_upper_bound): New.
+ (equiv_class::equiv_class): Port from svalue_id to const svalue *.
+ (equiv_class::print): Likewise.
+ (equiv_class::hash): Likewise.
+ (equiv_class::operator==): Port from svalue_id to const svalue *.
+ (equiv_class::add): Port from svalue_id to const svalue *. Drop
+ "cm" param.
+ (equiv_class::del): Port from svalue_id to const svalue *.
+ (equiv_class::get_representative): Likewise.
+ (equiv_class::remap_svalue_ids): Delete.
+ (svalue_id_cmp_by_id): Rename to...
+ (svalue_cmp_by_ptr): ...this, porting from svalue_id to
+ const svalue *.
+ (equiv_class::canonicalize): Update qsort comparator.
+ (constraint::implied_by): New.
+ (constraint_manager::constraint_manager): Copy m_mgr in copy ctor.
+ (constraint_manager::dump_to_pp): Add "multiline" param
+ (constraint_manager::dump): Pass "true" for "multiline".
+ (constraint_manager::add_constraint): Port from svalue_id to
+ const svalue *. Split out second part into...
+ (constraint_manager::add_unknown_constraint): ...this new
+ function. Remove self-constraints when merging equivalence
+ classes.
+ (constraint_manager::add_constraint_internal): Remove constraints
+ that would be implied by the new constraint. Port from svalue_id
+ to const svalue *.
+ (constraint_manager::get_equiv_class_by_sid): Rename to...
+ (constraint_manager::get_equiv_class_by_svalue): ...this, porting
+ from svalue_id to const svalue *.
+ (constraint_manager::get_or_add_equiv_class): Port from svalue_id
+ to const svalue *.
+ (constraint_manager::eval_condition): Make const. Call
+ compare_constants and return early if it provides a known result.
+ (constraint_manager::get_ec_bounds): New.
+ (constraint_manager::eval_condition): New overloads. Make
+ existing one const, and use compare_constants.
+ (constraint_manager::purge): Convert "p" param to a template
+ rather that an abstract base class. Port from svalue_id to
+ const svalue *.
+ (class dead_svalue_purger): New class.
+ (constraint_manager::remap_svalue_ids): Delete.
+ (constraint_manager::on_liveness_change): New.
+ (equiv_class_cmp): Port from svalue_id to const svalue *.
+ (constraint_manager::canonicalize): Likewise. Combine with
+ purging of redundant equivalence classes and constraints.
+ (class cleaned_constraint_manager): Delete.
+ (class merger_fact_visitor): Make "m_cm_b" const. Add "m_merger"
+ field.
+ (merger_fact_visitor::fact): Port from svalue_id to const svalue *.
+ Add special case for widening.
+ (constraint_manager::merge): Port from svalue_id to const svalue *.
+ (constraint_manager::clean_merger_input): Delete.
+ (constraint_manager::for_each_fact): Port from svalue_id to
+ const svalue *.
+ (constraint_manager::validate): Likewise.
+ (selftest::test_constraint_conditions): Provide a
+ region_model_manager when creating region_model instances.
+ Add test for self-equality not creating equivalence classes.
+ (selftest::test_transitivity): Provide a region_model_manager when
+ creating region_model instances. Verify that EC-merging happens
+ when constraints are implied.
+ (selftest::test_constant_comparisons): Provide a
+ region_model_manager when creating region_model instances.
+ (selftest::test_constraint_impl): Likewise. Remove over-specified
+ assertions.
+ (selftest::test_equality): Provide a region_model_manager when
+ creating region_model instances.
+ (selftest::test_many_constants): Likewise. Provide a
+ program_point when testing merging.
+ (selftest::run_constraint_manager_tests): Move call to
+ test_constant_comparisons to outside the transitivity guard.
+ * constraint-manager.h (struct bound): Move here from
+ constraint-manager.cc.
+ (struct range): Likewise.
+ (struct::eval_condition): New decl.
+ (struct::below_lower_bound): New decl.
+ (struct::above_upper_bound): New decl.
+ (equiv_class::add): Port from svalue_id to const svalue *.
+ (equiv_class::del): Likewise.
+ (equiv_class::get_representative): Likewise.
+ (equiv_class::remap_svalue_ids): Drop.
+ (equiv_class::m_cst_sid): Convert to..
+ (equiv_class::m_cst_sval): ...this.
+ (equiv_class::m_vars): Port from svalue_id to const svalue *.
+ (constraint::bool implied_by): New decl.
+ (fact_visitor::on_fact): Port from svalue_id to const svalue *.
+ (constraint_manager::constraint_manager): Add mgr param.
+ (constraint_manager::clone): Delete.
+ (constraint_manager::maybe_get_constant): Delete.
+ (constraint_manager::get_sid_for_constant): Delete.
+ (constraint_manager::get_num_svalues): Delete.
+ (constraint_manager::dump_to_pp): Add "multiline" param.
+ (constraint_manager::get_equiv_class): Port from svalue_id to
+ const svalue *.
+ (constraint_manager::add_constraint): Likewise.
+ (constraint_manager::get_equiv_class_by_sid): Rename to...
+ (constraint_manager::get_equiv_class_by_svalue): ...this, porting
+ from svalue_id to const svalue *.
+ (constraint_manager::add_unknown_constraint): New decl.
+ (constraint_manager::get_or_add_equiv_class): Port from svalue_id
+ to const svalue *.
+ (constraint_manager::eval_condition): Likewise. Add overloads.
+ (constraint_manager::get_ec_bounds): New decl.
+ (constraint_manager::purge): Convert to template.
+ (constraint_manager::remap_svalue_ids): Delete.
+ (constraint_manager::on_liveness_change): New decl.
+ (constraint_manager::canonicalize): Drop param.
+ (constraint_manager::clean_merger_input): Delete.
+ (constraint_manager::m_mgr): New field.
+ * diagnostic-manager.cc: Move includes of
+ "analyzer/call-string.h" and "analyzer/program-point.h" to before
+ "analyzer/region-model.h", and also include "analyzer/store.h"
+ before it.
+ (saved_diagnostic::saved_diagnostic): Add "sval" param.
+ (diagnostic_manager::diagnostic_manager): Add engine param.
+ (diagnostic_manager::add_diagnostic): Add "sval" param, passing it
+ to saved_diagnostic ctor. Update overload to pass NULL for it.
+ (dedupe_winners::dedupe_winners): Add engine param.
+ (dedupe_winners::add): Add "eg" param. Pass m_engine to
+ feasible_p.
+ (dedupe_winner::m_engine): New field.
+ (diagnostic_manager::emit_saved_diagnostics): Pass engine to
+ dedupe_winners. Pass &eg when adding candidates. Pass svalue
+ rather than tree to prune_path. Use get_stmt_location to get
+ primary location of diagnostic.
+ (diagnostic_manager::emit_saved_diagnostic): Likewise.
+ (get_any_origin): Drop.
+ (state_change_event_creator::on_global_state_change): Pass NULL
+ const svalue * rather than NULL_TREE trees to state_change_event
+ ctor.
+ (state_change_event_creator::on_state_change): Port from tree and
+ svalue_id to const svalue *.
+ (for_each_state_change): Port from svalue_id to const svalue *.
+ (struct null_assignment_sm_context): New.
+ (diagnostic_manager::add_events_for_eedge): Add state change
+ events for assignment to NULL.
+ (diagnostic_manager::prune_path): Update param from tree to
+ const svalue *.
+ (diagnostic_manager::prune_for_sm_diagnostic): Port from tracking
+ by tree to by const svalue *.
+ * diagnostic-manager.h (saved_diagnostic::saved_diagnostic): Add sval
+ param.
+ (saved_diagnostic::m_sval): New field.
+ (diagnostic_manager::diagnostic_manager): Add engine param.
+ (diagnostic_manager::get_engine): New.
+ (diagnostic_manager::add_diagnostic): Add "sval" param.
+ (diagnostic_manager::prune_path): Likewise.
+ (diagnostic_manager::prune_for_sm_diagnostic): New overload.
+ (diagnostic_manager::m_eng): New field.
+ * engine.cc: Move includes of "analyzer/call-string.h" and
+ "analyzer/program-point.h" to before "analyzer/region-model.h",
+ and also include "analyzer/store.h" before it.
+ (impl_region_model_context::impl_region_model_context): Update for
+ removal of m_change field.
+ (impl_region_model_context::remap_svalue_ids): Delete.
+ (impl_region_model_context::on_svalue_leak): New.
+ (impl_region_model_context::on_svalue_purge): Delete.
+ (impl_region_model_context::on_liveness_change): New.
+ (impl_region_model_context::on_unknown_change): Update param
+ from svalue_id to const svalue *. Add is_mutable param.
+ (setjmp_svalue::compare_fields): Delete.
+ (setjmp_svalue::accept): New.
+ (setjmp_svalue::add_to_hash): Delete.
+ (setjmp_svalue::dump_to_pp): New.
+ (setjmp_svalue::print_details): Delete.
+ (impl_sm_context::impl_sm_context): Drop "change" param.
+ (impl_sm_context::get_fndecl_for_call): Drop "m_change".
+ (impl_sm_context::on_transition): Drop ATTRIBUTE_UNUSED from
+ "stmt" param. Drop m_change. Port from svalue_id to
+ const svalue *.
+ (impl_sm_context::warn_for_state): Drop m_change. Port from
+ svalue_id to const svalue *.
+ (impl_sm_context::get_readable_tree): Rename to...
+ (impl_sm_context::get_diagnostic_tree): ...this. Port from
+ svalue_id to const svalue *.
+ (impl_sm_context::is_zero_assignment): New.
+ (impl_sm_context::m_change): Delete field.
+ (leak_stmt_finder::find_stmt): Handle m_var being NULL.
+ (readability): Increase penalty for MEM_REF. For SSA_NAMEs,
+ slightly favor the underlying var over the SSA name. Heavily
+ penalize temporaries. Handle RESULT_DECL.
+ (readability_comparator): Make non-static. Consider stack depths.
+ (impl_region_model_context::on_state_leak): Convert from svalue_id
+ to const svalue *, updating for region_model changes. Use
+ id_equal.
+ (impl_region_model_context::on_inherited_svalue): Delete.
+ (impl_region_model_context::on_cast): Delete.
+ (impl_region_model_context::on_condition): Drop m_change.
+ (impl_region_model_context::on_phi): Likewise.
+ (impl_region_model_context::on_unexpected_tree_code): Handle t
+ being NULL.
+ (point_and_state::validate): Update stack checking for
+ region_model changes.
+ (eg_traits::dump_args_t::show_enode_details_p): New.
+ (exploded_node::exploded_node): Initialize m_num_processed_stmts.
+ (exploded_node::get_processed_stmt): New function.
+ (exploded_node::get_dot_fillcolor): Add more colors.
+ (exploded_node::dump_dot): Guard the printing of the point and
+ state with show_enode_details_p. Print the processed stmts for
+ this enode after the initial state.
+ (exploded_node::dump_to_pp): Pass true for new multiline param
+ of program_state::dump_to_pp.
+ (exploded_node::on_stmt): Drop "change" param. Log the stmt.
+ Set input_location. Implement __analyzer_describe. Update
+ implementation of __analyzer_dump and __analyzer_eval.
+ Remove purging of sm-state for unknown fncalls from here.
+ (exploded_node::on_edge): Drop "change" param.
+ (exploded_node::on_longjmp): Port from region_id/svalue_id to
+ const region */const svalue *. Call program_state::detect_leaks.
+ Drop state_change.
+ (exploded_node::detect_leaks): Update for changes to region_model.
+ Call program_state::detect_leaks.
+ (exploded_edge::exploded_edge): Drop ext_state and change params.
+ (exploded_edge::dump_dot): "args" is no longer used. Drop dumping
+ of m_change.
+ (exploded_graph::exploded_graph): Pass engine to
+ m_diagnostic_manager ctor. Use program_point::origin.
+ (exploded_graph::add_function_entry): Drop ctxt. Use
+ program_state::push_frame. Drop state_change.
+ (exploded_graph::get_or_create_node): Drop "change" param. Add
+ "enode_for_diag" param. Update dumping calls for API changes.
+ Pass point to can_merge_with_p. Show enode indices
+ within -Wanalyzer-too-complex diagnostic for hitting the per-point
+ limit.
+ (exploded_graph::add_edge): Drop "change" param. Log which nodes
+ are being connected. Update for changes to exploded_edge ctor.
+ (exploded_graph::get_per_program_point_data): New.
+ (exploded_graph::process_worklist): Pass point to
+ can_merge_with_p. Drop state_change. Update dumping call for API
+ change.
+ (exploded_graph::process_node): Drop state_change. Split the
+ node in-place if an sm-state-change occurs. Update
+ m_num_processed_stmts. Update dumping calls for API change.
+ (exploded_graph::log_stats): Call engine::log_stats.
+ (exploded_graph::dump_states_for_supernode): Update dumping
+ call.
+ (exploded_path::feasible_p): Add "eng" and "eg" params.
+ Rename "i" to "end_idx". Pass the manager to the region_model
+ ctor. Update for every processed stmt in the enode, not just the
+ first. Keep track of which snodes have been visited, and call
+ loop_replay_fixup when revisiting one.
+ (enode_label::get_text): Update dump call for new param.
+ (exploded_graph::dump_exploded_nodes): Likewise.
+ (exploded_graph::get_node_by_index): New.
+ (impl_run_checkers): Create engine instance and pass its address
+ to extrinsic_state ctor.
+ * exploded-graph.h
+ (impl_region_model_context::impl_region_model_context): Drop
+ "change" params.
+ (impl_region_model_context::void remap_svalue_ids): Delete.
+ (impl_region_model_context::on_svalue_purge): Delete.
+ (impl_region_model_context::on_svalue_leak): New.
+ (impl_region_model_context::on_liveness_change): New.
+ (impl_region_model_context::on_state_leak): Update signature.
+ (impl_region_model_context::on_inherited_svalue): Delete.
+ (impl_region_model_context::on_cast): Delete.
+ (impl_region_model_context::on_unknown_change): Update signature.
+ (impl_region_model_context::m_change): Delete.
+ (eg_traits::dump_args_t::show_enode_details_p): New.
+ (exploded_node::on_stmt): Drop "change" param.
+ (exploded_node::on_edge): Likewise.
+ (exploded_node::get_processed_stmt): New decl.
+ (exploded_node::m_num_processed_stmts): New field.
+ (exploded_edge::exploded_edge): Drop ext_state and change params.
+ (exploded_edge::m_change): Delete.
+ (exploded_graph::get_engine): New accessor.
+ (exploded_graph::get_or_create_node): Drop "change" param. Add
+ "enode_for_diag" param.
+ (exploded_graph::add_edge): Drop "change" param.
+ (exploded_graph::get_per_program_point_data): New decl.
+ (exploded_graph::get_node_by_index): New decl.
+ (exploded_path::feasible_p): Add "eng" and "eg" params.
+ * program-point.cc: Include "analyzer/store.h" before including
+ "analyzer/region-model.h".
+ (function_point::function_point): Move here from
+ program-point.h.
+ (function_point::get_function): Likewise.
+ (function_point::from_function_entry): Likewise.
+ (function_point::before_supernode): Likewise.
+ (function_point::next_stmt): New function.
+ * program-point.h (function_point::function_point): Move
+ implementation from here to program-point.cc.
+ (function_point::get_function): Likewise.
+ (function_point::from_function_entry): Likewise.
+ (function_point::before_supernode): Likewise.
+ (function_point::next_stmt): New decl.
+ (program_point::operator!=): New.
+ (program_point::origin): New.
+ (program_point::next_stmt): New.
+ (program_point::m_function_point): Make non-const.
+ * program-state.cc: Move includes of "analyzer/call-string.h" and
+ "analyzer/program-point.h" to before "analyzer/region-model.h",
+ and also include "analyzer/store.h" before it.
+ (extrinsic_state::get_model_manager): New.
+ (sm_state_map::sm_state_map): Pass in sm and sm_idx to ctor,
+ rather than pass the around.
+ (sm_state_map::clone_with_remapping): Delete.
+ (sm_state_map::print): Remove "sm" param in favor of "m_sm". Add
+ "simple" and "multiline" params and support multiline vs single
+ line dumping.
+ (sm_state_map::dump): Remove "sm" param in favor of "m_sm". Add
+ "simple" param.
+ (sm_state_map::hash): Port from svalue_id to const svalue *.
+ (sm_state_map::operator==): Likewise.
+ (sm_state_map::get_state): Likewise. Call canonicalize_svalue on
+ input. Handle inheritance of sm-state. Call get_default_state.
+ (sm_state_map::get_origin): Port from svalue_id to const svalue *.
+ (sm_state_map::set_state): Likewise. Pass in ext_state. Reject
+ attempts to set state on UNKNOWN.
+ (sm_state_map::impl_set_state): Port from svalue_id to
+ const svalue *. Pass in ext_state. Call canonicalize_svalue on
+ input.
+ (sm_state_map::purge_for_unknown_fncall): Delete.
+ (sm_state_map::on_svalue_leak): New.
+ (sm_state_map::remap_svalue_ids): Delete.
+ (sm_state_map::on_liveness_change): New.
+ (sm_state_map::on_unknown_change): Reimplement.
+ (sm_state_map::on_svalue_purge): Delete.
+ (sm_state_map::on_inherited_svalue): Delete.
+ (sm_state_map::on_cast): Delete.
+ (sm_state_map::validate): Delete.
+ (sm_state_map::canonicalize_svalue): New.
+ (program_state::program_state): Update to pass manager to
+ region_model's ctor. Constify num_states and pass state machine
+ and index to sm_state_map ctor.
+ (program_state::print): Update for changes to dump API.
+ (program_state::dump_to_pp): Ignore the summarize param. Add
+ "multiline" param.
+ (program_state::dump_to_file): Add "multiline" param.
+ (program_state::dump): Pass "true" for new "multiline" param.
+ (program_state::push_frame): New.
+ (program_state::on_edge): Drop "change" param. Call
+ program_state::detect_leaks.
+ (program_state::prune_for_point): Add enode_for_diag param.
+ Reimplement based on store class. Call detect_leaks
+ (program_state::remap_svalue_ids): Delete.
+ (program_state::get_representative_tree): Port from svalue_id to
+ const svalue *.
+ (program_state::can_merge_with_p): Add "point" param. Add early
+ reject for sm-differences. Drop id remapping.
+ (program_state::validate): Drop region model and sm_state_map
+ validation.
+ (state_change::sm_change::dump): Delete.
+ (state_change::sm_change::remap_svalue_ids): Delete.
+ (state_change::sm_change::on_svalue_purge): Delete.
+ (log_set_of_svalues): New.
+ (state_change::sm_change::validate): Delete.
+ (state_change::state_change): Delete.
+ (state_change::add_sm_change): Delete.
+ (state_change::affects_p): Delete.
+ (state_change::dump): Delete.
+ (state_change::remap_svalue_ids): Delete.
+ (state_change::on_svalue_purge): Delete.
+ (state_change::validate): Delete.
+ (selftest::assert_dump_eq): Delete.
+ (ASSERT_DUMP_EQ): Delete.
+ (selftest::test_sm_state_map): Update for changes to region_model
+ and sm_state_map, porting from svalue_id to const svalue *.
+ (selftest::test_program_state_dumping): Likewise. Drop test of
+ dumping, renaming to...
+ (selftest::test_program_state_1): ...this.
+ (selftest::test_program_state_dumping_2): Likewise, renaming to...
+ (selftest::test_program_state_2): ...this.
+ (selftest::test_program_state_merging): Update for changes to
+ region_model.
+ (selftest::test_program_state_merging_2): Likewise.
+ (selftest::analyzer_program_state_cc_tests): Update for renamed
+ tests.
+ * program-state.h (extrinsic_state::extrinsic_state): Add logger
+ and engine params.
+ (extrinsic_state::get_logger): New accessor.
+ (extrinsic_state::get_engine): New accessor.
+ (extrinsic_state::get_model_manager): New accessor.
+ (extrinsic_state::m_logger): New field.
+ (extrinsic_state::m_engine): New field.
+ (struct default_hash_traits<svalue_id>): Delete.
+ (pod_hash_traits<svalue_id>::hash): Delete.
+ (pod_hash_traits<svalue_id>::equal): Delete.
+ (pod_hash_traits<svalue_id>::mark_deleted): Delete.
+ (pod_hash_traits<svalue_id>::mark_empty): Delete.
+ (pod_hash_traits<svalue_id>::is_deleted): Delete.
+ (pod_hash_traits<svalue_id>::is_empty): Delete.
+ (sm_state_map::entry_t::entry_t): Port from svalue_id to
+ const svalue *.
+ (sm_state_map::entry_t::m_origin): Likewise.
+ (sm_state_map::map_t): Likewise.
+ (sm_state_map::sm_state_map): Add state_machine and index params.
+ (sm_state_map::clone_with_remapping): Delete.
+ (sm_state_map::print): Drop sm param; add simple and multiline
+ params.
+ (sm_state_map::dump): Drop sm param; add simple param.
+ (sm_state_map::get_state): Port from svalue_id to const svalue *.
+ Add ext_state param.
+ (sm_state_map::get_origin): Likewise.
+ (sm_state_map::set_state): Likewise.
+ (sm_state_map::impl_set_state): Likewise.
+ (sm_state_map::purge_for_unknown_fncall): Delete.
+ (sm_state_map::remap_svalue_ids): Delete.
+ (sm_state_map::on_svalue_purge): Delete.
+ (sm_state_map::on_svalue_leak): New.
+ (sm_state_map::on_liveness_change): New.
+ (sm_state_map::on_inherited_svalue): Delete.
+ (sm_state_map::on_cast): Delete.
+ (sm_state_map::validate): Delete.
+ (sm_state_map::on_unknown_change): Port from svalue_id to
+ const svalue *. Add is_mutable and ext_state params.
+ (sm_state_map::canonicalize_svalue): New.
+ (sm_state_map::m_sm): New field.
+ (sm_state_map::m_sm_idx): New field.
+ (program_state::operator=): Delete.
+ (program_state::dump_to_pp): Drop "summarize" param, adding
+ "simple" and "multiline".
+ (program_state::dump_to_file): Likewise.
+ (program_state::dump): Rename "summarize" to "simple".
+ (program_state::push_frame): New.
+ (program_state::get_current_function): New.
+ (program_state::on_edge): Drop "change" param.
+ (program_state::prune_for_point): Likewise. Add enode_for_diag
+ param.
+ (program_state::remap_svalue_ids): Delete.
+ (program_state::get_representative_tree): Port from svalue_id to
+ const svalue *.
+ (program_state::can_purge_p): Likewise. Pass ext_state to get_state.
+ (program_state::can_merge_with_p): Add point param.
+ (program_state::detect_leaks): New.
+ (state_change_visitor::on_state_change): Port from tree and
+ svalue_id to a pair of const svalue *.
+ (class state_change): Delete.
+ * region.cc: New file.
+ * region-model-impl-calls.cc: New file.
+ * region-model-manager.cc: New file.
+ * region-model-reachability.cc: New file.
+ * region-model-reachability.h: New file.
+ * region-model.cc: Include "analyzer/call-string.h",
+ "analyzer/program-point.h", and "analyzer/store.h" before
+ "analyzer/region-model.h". Include
+ "analyzer/region-model-reachability.h".
+ (dump_tree): Make non-static.
+ (dump_quoted_tree): Make non-static.
+ (print_quoted_type): Make non-static.
+ (path_var::dump): Delete.
+ (dump_separator): Delete.
+ (class impl_constraint_manager): Delete.
+ (svalue_id::print): Delete.
+ (svalue_id::dump_node_name_to_pp): Delete.
+ (svalue_id::validate): Delete.
+ (region_id::print): Delete.
+ (region_id::dump_node_name_to_pp): Delete.
+ (region_id::validate): Delete.
+ (region_id_set::region_id_set): Delete.
+ (svalue_id_set::svalue_id_set): Delete.
+ (svalue::operator==): Delete.
+ (svalue::hash): Delete.
+ (svalue::print): Delete.
+ (svalue::dump_dot_to_pp): Delete.
+ (svalue::remap_region_ids): Delete.
+ (svalue::walk_for_canonicalization): Delete.
+ (svalue::get_child_sid): Delete.
+ (svalue::maybe_get_constant): Delete.
+ (region_svalue::compare_fields): Delete.
+ (region_svalue::add_to_hash): Delete.
+ (region_svalue::print_details): Delete.
+ (region_svalue::dump_dot_to_pp): Delete.
+ (region_svalue::remap_region_ids): Delete.
+ (region_svalue::merge_values): Delete.
+ (region_svalue::walk_for_canonicalization): Delete.
+ (region_svalue::eval_condition): Delete.
+ (constant_svalue::compare_fields): Delete.
+ (constant_svalue::add_to_hash): Delete.
+ (constant_svalue::merge_values): Delete.
+ (constant_svalue::eval_condition): Move to svalue.cc.
+ (constant_svalue::print_details): Delete.
+ (constant_svalue::get_child_sid): Delete.
+ (unknown_svalue::compare_fields): Delete.
+ (unknown_svalue::add_to_hash): Delete.
+ (unknown_svalue::print_details): Delete.
+ (poison_kind_to_str): Move to svalue.cc.
+ (poisoned_svalue::compare_fields): Delete.
+ (poisoned_svalue::add_to_hash): Delete.
+ (poisoned_svalue::print_details): Delete.
+ (region_kind_to_str): Move to region.cc and reimplement.
+ (region::operator==): Delete.
+ (region::get_parent_region): Delete.
+ (region::set_value): Delete.
+ (region::become_active_view): Delete.
+ (region::deactivate_any_active_view): Delete.
+ (region::deactivate_view): Delete.
+ (region::get_value): Delete.
+ (region::get_inherited_child_sid): Delete.
+ (region_model::copy_region): Delete.
+ (region_model::copy_struct_region): Delete.
+ (region_model::copy_union_region): Delete.
+ (region_model::copy_array_region): Delete.
+ (region::hash): Delete.
+ (region::print): Delete.
+ (region::dump_dot_to_pp): Delete.
+ (region::dump_to_pp): Delete.
+ (region::dump_child_label): Delete.
+ (region::validate): Delete.
+ (region::remap_svalue_ids): Delete.
+ (region::remap_region_ids): Delete.
+ (region::add_view): Delete.
+ (region::get_view): Delete.
+ (region::region): Move to region.cc.
+ (region::add_to_hash): Delete.
+ (region::print_fields): Delete.
+ (region::non_null_p): Delete.
+ (primitive_region::clone): Delete.
+ (primitive_region::walk_for_canonicalization): Delete.
+ (map_region::map_region): Delete.
+ (map_region::compare_fields): Delete.
+ (map_region::print_fields): Delete.
+ (map_region::validate): Delete.
+ (map_region::dump_dot_to_pp): Delete.
+ (map_region::dump_child_label): Delete.
+ (map_region::get_or_create): Delete.
+ (map_region::get): Delete.
+ (map_region::add_to_hash): Delete.
+ (map_region::remap_region_ids): Delete.
+ (map_region::unbind): Delete.
+ (map_region::get_tree_for_child_region): Delete.
+ (map_region::get_tree_for_child_region): Delete.
+ (tree_cmp): Move to region.cc.
+ (map_region::can_merge_p): Delete.
+ (map_region::walk_for_canonicalization): Delete.
+ (map_region::get_value_by_name): Delete.
+ (struct_or_union_region::valid_key_p): Delete.
+ (struct_or_union_region::compare_fields): Delete.
+ (struct_region::clone): Delete.
+ (struct_region::compare_fields): Delete.
+ (union_region::clone): Delete.
+ (union_region::compare_fields): Delete.
+ (frame_region::compare_fields): Delete.
+ (frame_region::clone): Delete.
+ (frame_region::valid_key_p): Delete.
+ (frame_region::print_fields): Delete.
+ (frame_region::add_to_hash): Delete.
+ (globals_region::compare_fields): Delete.
+ (globals_region::clone): Delete.
+ (globals_region::valid_key_p): Delete.
+ (code_region::compare_fields): Delete.
+ (code_region::clone): Delete.
+ (code_region::valid_key_p): Delete.
+ (array_region::array_region): Delete.
+ (array_region::get_element): Delete.
+ (array_region::clone): Delete.
+ (array_region::compare_fields): Delete.
+ (array_region::print_fields): Delete.
+ (array_region::validate): Delete.
+ (array_region::dump_dot_to_pp): Delete.
+ (array_region::dump_child_label): Delete.
+ (array_region::get_or_create): Delete.
+ (array_region::get): Delete.
+ (array_region::add_to_hash): Delete.
+ (array_region::remap_region_ids): Delete.
+ (array_region::get_key_for_child_region): Delete.
+ (array_region::key_cmp): Delete.
+ (array_region::walk_for_canonicalization): Delete.
+ (array_region::key_from_constant): Delete.
+ (array_region::constant_from_key): Delete.
+ (function_region::compare_fields): Delete.
+ (function_region::clone): Delete.
+ (function_region::valid_key_p): Delete.
+ (stack_region::stack_region): Delete.
+ (stack_region::compare_fields): Delete.
+ (stack_region::clone): Delete.
+ (stack_region::print_fields): Delete.
+ (stack_region::dump_child_label): Delete.
+ (stack_region::validate): Delete.
+ (stack_region::push_frame): Delete.
+ (stack_region::get_current_frame_id): Delete.
+ (stack_region::pop_frame): Delete.
+ (stack_region::add_to_hash): Delete.
+ (stack_region::remap_region_ids): Delete.
+ (stack_region::can_merge_p): Delete.
+ (stack_region::walk_for_canonicalization): Delete.
+ (stack_region::get_value_by_name): Delete.
+ (heap_region::heap_region): Delete.
+ (heap_region::compare_fields): Delete.
+ (heap_region::clone): Delete.
+ (heap_region::walk_for_canonicalization): Delete.
+ (root_region::root_region): Delete.
+ (root_region::compare_fields): Delete.
+ (root_region::clone): Delete.
+ (root_region::print_fields): Delete.
+ (root_region::validate): Delete.
+ (root_region::dump_child_label): Delete.
+ (root_region::push_frame): Delete.
+ (root_region::get_current_frame_id): Delete.
+ (root_region::pop_frame): Delete.
+ (root_region::ensure_stack_region): Delete.
+ (root_region::get_stack_region): Delete.
+ (root_region::ensure_globals_region): Delete.
+ (root_region::get_code_region): Delete.
+ (root_region::ensure_code_region): Delete.
+ (root_region::get_globals_region): Delete.
+ (root_region::ensure_heap_region): Delete.
+ (root_region::get_heap_region): Delete.
+ (root_region::remap_region_ids): Delete.
+ (root_region::can_merge_p): Delete.
+ (root_region::add_to_hash): Delete.
+ (root_region::walk_for_canonicalization): Delete.
+ (root_region::get_value_by_name): Delete.
+ (symbolic_region::symbolic_region): Delete.
+ (symbolic_region::compare_fields): Delete.
+ (symbolic_region::clone): Delete.
+ (symbolic_region::walk_for_canonicalization): Delete.
+ (symbolic_region::print_fields): Delete.
+ (region_model::region_model): Add region_model_manager * param.
+ Reimplement in terms of store, dropping impl_constraint_manager
+ subclass.
+ (region_model::operator=): Reimplement in terms of store
+ (region_model::operator==): Likewise.
+ (region_model::hash): Likewise.
+ (region_model::print): Delete.
+ (region_model::print_svalue): Delete.
+ (region_model::dump_dot_to_pp): Delete.
+ (region_model::dump_dot_to_file): Delete.
+ (region_model::dump_dot): Delete.
+ (region_model::dump_to_pp): Replace "summarize" param with
+ "simple" and "multiline". Port to store-based implementation.
+ (region_model::dump): Replace "summarize" param with "simple" and
+ "multiline".
+ (dump_vec_of_tree): Delete.
+ (region_model::dump_summary_of_rep_path_vars): Delete.
+ (region_model::validate): Delete.
+ (svalue_id_cmp_by_constant_svalue_model): Delete.
+ (svalue_id_cmp_by_constant_svalue): Delete.
+ (region_model::canonicalize): Drop "ctxt" param. Reimplement in
+ terms of store and constraints.
+ (region_model::canonicalized_p): Remove NULL arg to canonicalize.
+ (region_model::loop_replay_fixup): New.
+ (poisoned_value_diagnostic::emit): Tweak wording of warnings.
+ (region_model::check_for_poison): Delete.
+ (region_model::get_gassign_result): New.
+ (region_model::on_assignment): Port to store-based implementation.
+ (region_model::on_call_pre): Delete calls to check_for_poison.
+ Move implementations to region-model-impl-calls.c and port to
+ store-based implementation.
+ (region_model::on_call_post): Likewise.
+ (class reachable_regions): Move to region-model-reachability.h/cc
+ and port to store-based implementation.
+ (region_model::handle_unrecognized_call): Port to store-based
+ implementation.
+ (region_model::get_reachable_svalues): New.
+ (region_model::on_setjmp): Port to store-based implementation.
+ (region_model::on_longjmp): Likewise.
+ (region_model::handle_phi): Drop is_back_edge param and the logic
+ using it.
+ (region_model::get_lvalue_1): Port from region_id to const region *.
+ (region_model::make_region_for_unexpected_tree_code): Delete.
+ (assert_compat_types): If the check fails, use internal_error to
+ show the types.
+ (region_model::get_lvalue): Port from region_id to const region *.
+ (region_model::get_rvalue_1): Port from svalue_id to const svalue *.
+ (region_model::get_rvalue): Likewise.
+ (region_model::get_or_create_ptr_svalue): Delete.
+ (region_model::get_or_create_constant_svalue): Delete.
+ (region_model::get_svalue_for_fndecl): Delete.
+ (region_model::get_region_for_fndecl): Delete.
+ (region_model::get_svalue_for_label): Delete.
+ (region_model::get_region_for_label): Delete.
+ (build_cast): Delete.
+ (region_model::maybe_cast_1): Delete.
+ (region_model::maybe_cast): Delete.
+ (region_model::get_field_region): Delete.
+ (region_model::get_store_value): New.
+ (region_model::region_exists_p): New.
+ (region_model::deref_rvalue): Port from svalue_id to const svalue *.
+ (region_model::set_value): Likewise.
+ (region_model::clobber_region): New.
+ (region_model::purge_region): New.
+ (region_model::zero_fill_region): New.
+ (region_model::mark_region_as_unknown): New.
+ (region_model::eval_condition): Port from svalue_id to
+ const svalue *.
+ (region_model::eval_condition_without_cm): Likewise.
+ (region_model::compare_initial_and_pointer): New.
+ (region_model::add_constraint): Port from svalue_id to
+ const svalue *.
+ (region_model::maybe_get_constant): Delete.
+ (region_model::get_representative_path_var): New.
+ (region_model::add_new_malloc_region): Delete.
+ (region_model::get_representative_tree): Port to const svalue *.
+ (region_model::get_representative_path_var): Port to
+ const region *.
+ (region_model::get_path_vars_for_svalue): Delete.
+ (region_model::set_to_new_unknown_value): Delete.
+ (region_model::update_for_phis): Don't pass is_back_edge to handle_phi.
+ (region_model::update_for_call_superedge): Port from svalue_id to
+ const svalue *.
+ (region_model::update_for_return_superedge): Port to store-based
+ implementation.
+ (region_model::update_for_call_summary): Replace
+ set_to_new_unknown_value with mark_region_as_unknown.
+ (region_model::get_root_region): Delete.
+ (region_model::get_stack_region_id): Delete.
+ (region_model::push_frame): Delete.
+ (region_model::get_current_frame_id): Delete.
+ (region_model::get_current_function): Delete.
+ (region_model::pop_frame): Delete.
+ (region_model::on_top_level_param): New.
+ (region_model::get_stack_depth): Delete.
+ (region_model::get_function_at_depth): Delete.
+ (region_model::get_globals_region_id): Delete.
+ (region_model::add_svalue): Delete.
+ (region_model::replace_svalue): Delete.
+ (region_model::add_region): Delete.
+ (region_model::get_svalue): Delete.
+ (region_model::get_region): Delete.
+ (make_region_for_type): Delete.
+ (region_model::add_region_for_type): Delete.
+ (region_model::on_top_level_param): New.
+ (class restrict_to_used_svalues): Delete.
+ (region_model::purge_unused_svalues): Delete.
+ (region_model::push_frame): New.
+ (region_model::remap_svalue_ids): Delete.
+ (region_model::remap_region_ids): Delete.
+ (region_model::purge_regions): Delete.
+ (region_model::get_descendents): Delete.
+ (region_model::delete_region_and_descendents): Delete.
+ (region_model::poison_any_pointers_to_bad_regions): Delete.
+ (region_model::can_merge_with_p): Delete.
+ (region_model::get_current_function): New.
+ (region_model::get_value_by_name): Delete.
+ (region_model::convert_byte_offset_to_array_index): Delete.
+ (region_model::pop_frame): New.
+ (region_model::get_or_create_mem_ref): Delete.
+ (region_model::get_stack_depth): New.
+ (region_model::get_frame_at_index): New.
+ (region_model::unbind_region_and_descendents): New.
+ (struct bad_pointer_finder): New.
+ (region_model::get_or_create_pointer_plus_expr): Delete.
+ (region_model::poison_any_pointers_to_descendents): New.
+ (region_model::get_or_create_view): Delete.
+ (region_model::can_merge_with_p): New.
+ (region_model::get_fndecl_for_call): Port from svalue_id to
+ const svalue *.
+ (struct append_ssa_names_cb_data): New.
+ (get_ssa_name_regions_for_current_frame): New.
+ (region_model::append_ssa_names_cb): New.
+ (model_merger::dump_to_pp): Add "simple" param. Drop dumping of
+ remappings.
+ (model_merger::dump): Add "simple" param to both overloads.
+ (model_merger::can_merge_values_p): Delete.
+ (model_merger::record_regions): Delete.
+ (model_merger::record_svalues): Delete.
+ (svalue_id_merger_mapping::svalue_id_merger_mapping): Delete.
+ (svalue_id_merger_mapping::dump_to_pp): Delete.
+ (svalue_id_merger_mapping::dump): Delete.
+ (region_model::create_region_for_heap_alloc): New.
+ (region_model::create_region_for_alloca): New.
+ (region_model::record_dynamic_extents): New.
+ (canonicalization::canonicalization): Delete.
+ (canonicalization::walk_rid): Delete.
+ (canonicalization::walk_sid): Delete.
+ (canonicalization::dump_to_pp): Delete.
+ (canonicalization::dump): Delete.
+ (inchash::add): Delete overloads for svalue_id and region_id.
+ (engine::log_stats): New.
+ (assert_condition): Add overload comparing svalues.
+ (assert_dump_eq): Pass "true" for multiline.
+ (selftest::test_dump): Update for rewrite of region_model.
+ (selftest::test_dump_2): Rename to...
+ (selftest::test_struct): ...this. Provide a region_model_manager
+ when creating region_model instance. Remove dump test. Add
+ checks for get_offset.
+ (selftest::test_dump_3): Rename to...
+ (selftest::test_array_1): ...this. Provide a region_model_manager
+ when creating region_model instance. Remove dump test.
+ (selftest::test_get_representative_tree): Port from svalue_id to
+ new API. Add test coverage for various expressions.
+ (selftest::test_unique_constants): Provide a region_model_manager
+ for the region_model. Add test coverage for comparing const vs
+ non-const.
+ (selftest::test_svalue_equality): Delete.
+ (selftest::test_region_equality): Delete.
+ (selftest::test_unique_unknowns): New.
+ (class purge_all_svalue_ids): Delete.
+ (class purge_one_svalue_id): Delete.
+ (selftest::test_purging_by_criteria): Delete.
+ (selftest::test_initial_svalue_folding): New.
+ (selftest::test_unaryop_svalue_folding): New.
+ (selftest::test_binop_svalue_folding): New.
+ (selftest::test_sub_svalue_folding): New.
+ (selftest::test_purge_unused_svalues): Delete.
+ (selftest::test_descendent_of_p): New.
+ (selftest::test_assignment): Provide a region_model_manager for
+ the region_model. Drop the dump test.
+ (selftest::test_compound_assignment): Likewise.
+ (selftest::test_stack_frames): Port to new implementation.
+ (selftest::test_get_representative_path_var): Likewise.
+ (selftest::test_canonicalization_1): Rename to...
+ (selftest::test_equality_1): ...this. Port to new API, and add
+ (selftest::test_canonicalization_2): Provide a
+ region_model_manager when creating region_model instances.
+ Remove redundant canicalization.
+ (selftest::test_canonicalization_3): Provide a
+ region_model_manager when creating region_model instances.
+ Remove param from calls to region_model::canonicalize.
+ (selftest::test_canonicalization_4): Likewise.
+ (selftest::assert_region_models_merge): Constify
+ out_merged_svalue. Port to new API.
+ (selftest::test_state_merging): Provide a
+ region_model_manager when creating region_model instances.
+ Provide a program_point point when merging them. Replace
+ set_to_new_unknown_value with usage of placeholder_svalues.
+ Drop get_value_by_name. Port from svalue_id to const svalue *.
+ Add test of heap allocation.
+ (selftest::test_constraint_merging): Provide a
+ region_model_manager when creating region_model instances.
+ Provide a program_point point when merging them. Eliminate use
+ of set_to_new_unknown_value.
+ (selftest::test_widening_constraints): New.
+ (selftest::test_iteration_1): New.
+ (selftest::test_malloc_constraints): Port to store-based
+ implementation.
+ (selftest::test_var): New test.
+ (selftest::test_array_2): New test.
+ (selftest::test_mem_ref): New test.
+ (selftest::test_POINTER_PLUS_EXPR_then_MEM_REF): New.
+ (selftest::test_malloc): New.
+ (selftest::test_alloca): New.
+ (selftest::analyzer_region_model_cc_tests): Update for renamings.
+ Call new functions.
+ * region-model.h (class path_var): Move to analyzer.h.
+ (class svalue_id): Delete.
+ (class region_id): Delete.
+ (class id_map): Delete.
+ (svalue_id_map): Delete.
+ (region_id_map): Delete.
+ (id_map<T>::id_map): Delete.
+ (id_map<T>::put): Delete.
+ (id_map<T>::get_dst_for_src): Delete.
+ (id_map<T>::get_src_for_dst): Delete.
+ (id_map<T>::dump_to_pp): Delete.
+ (id_map<T>::dump): Delete.
+ (id_map<T>::update): Delete.
+ (one_way_svalue_id_map): Delete.
+ (one_way_region_id_map): Delete.
+ (class region_id_set): Delete.
+ (class svalue_id_set): Delete.
+ (struct complexity): New.
+ (class visitor): New.
+ (enum svalue_kind): Add SK_SETJMP, SK_INITIAL, SK_UNARYOP,
+ SK_BINOP, SK_SUB,SK_UNMERGEABLE, SK_PLACEHOLDER, SK_WIDENING,
+ SK_COMPOUND, and SK_CONJURED.
+ (svalue::operator==): Delete.
+ (svalue::operator!=): Delete.
+ (svalue::clone): Delete.
+ (svalue::hash): Delete.
+ (svalue::dump_dot_to_pp): Delete.
+ (svalue::dump_to_pp): New.
+ (svalue::dump): New.
+ (svalue::get_desc): New.
+ (svalue::dyn_cast_initial_svalue): New.
+ (svalue::dyn_cast_unaryop_svalue): New.
+ (svalue::dyn_cast_binop_svalue): New.
+ (svalue::dyn_cast_sub_svalue): New.
+ (svalue::dyn_cast_unmergeable_svalue): New.
+ (svalue::dyn_cast_widening_svalue): New.
+ (svalue::dyn_cast_compound_svalue): New.
+ (svalue::dyn_cast_conjured_svalue): New.
+ (svalue::maybe_undo_cast): New.
+ (svalue::unwrap_any_unmergeable): New.
+ (svalue::remap_region_ids): Delete
+ (svalue::can_merge_p): New.
+ (svalue::walk_for_canonicalization): Delete
+ (svalue::get_complexity): New.
+ (svalue::get_child_sid): Delete
+ (svalue::accept): New.
+ (svalue::live_p): New.
+ (svalue::implicitly_live_p): New.
+ (svalue::svalue): Add complexity param.
+ (svalue::add_to_hash): Delete
+ (svalue::print_details): Delete
+ (svalue::m_complexity): New field.
+ (region_svalue::key_t): New struct.
+ (region_svalue::region_svalue): Port from region_id to
+ const region_id *. Add complexity.
+ (region_svalue::compare_fields): Delete.
+ (region_svalue::clone): Delete.
+ (region_svalue::dump_dot_to_pp): Delete.
+ (region_svalue::get_pointee): Port from region_id to
+ const region_id *.
+ (region_svalue::remap_region_ids): Delete.
+ (region_svalue::merge_values): Delete.
+ (region_svalue::dump_to_pp): New.
+ (region_svalue::accept): New.
+ (region_svalue::walk_for_canonicalization): Delete.
+ (region_svalue::eval_condition): Make params const.
+ (region_svalue::add_to_hash): Delete.
+ (region_svalue::print_details): Delete.
+ (region_svalue::m_rid): Replace with...
+ (region_svalue::m_reg): ...this.
+ (is_a_helper <region_svalue *>::test): Convert to...
+ (is_a_helper <const region_svalue *>::test): ...this.
+ (template <> struct default_hash_traits<region_svalue::key_t>):
+ New.
+ (constant_svalue::constant_svalue): Add complexity.
+ (constant_svalue::compare_fields): Delete.
+ (constant_svalue::clone): Delete.
+ (constant_svalue::add_to_hash): Delete.
+ (constant_svalue::dump_to_pp): New.
+ (constant_svalue::accept): New.
+ (constant_svalue::implicitly_live_p): New.
+ (constant_svalue::merge_values): Delete.
+ (constant_svalue::eval_condition): Make params const.
+ (constant_svalue::get_child_sid): Delete.
+ (constant_svalue::print_details): Delete.
+ (is_a_helper <constant_svalue *>::test): Convert to...
+ (is_a_helper <const constant_svalue *>::test): ...this.
+ (class unknown_svalue): Update leading comment.
+ (unknown_svalue::unknown_svalue): Add complexity.
+ (unknown_svalue::compare_fields): Delete.
+ (unknown_svalue::add_to_hash): Delete.
+ (unknown_svalue::dyn_cast_unknown_svalue): Delete.
+ (unknown_svalue::print_details): Delete.
+ (unknown_svalue::dump_to_pp): New.
+ (unknown_svalue::accept): New.
+ (poisoned_svalue::key_t): New struct.
+ (poisoned_svalue::poisoned_svalue): Add complexity.
+ (poisoned_svalue::compare_fields): Delete.
+ (poisoned_svalue::clone): Delete.
+ (poisoned_svalue::add_to_hash): Delete.
+ (poisoned_svalue::dump_to_pp): New.
+ (poisoned_svalue::accept): New.
+ (poisoned_svalue::print_details): Delete.
+ (is_a_helper <poisoned_svalue *>::test): Convert to...
+ (is_a_helper <const poisoned_svalue *>::test): ...this.
+ (template <> struct default_hash_traits<poisoned_svalue::key_t>):
+ New.
+ (setjmp_record::add_to_hash): New.
+ (setjmp_svalue::key_t): New struct.
+ (setjmp_svalue::compare_fields): Delete.
+ (setjmp_svalue::clone): Delete.
+ (setjmp_svalue::add_to_hash): Delete.
+ (setjmp_svalue::setjmp_svalue): Add complexity.
+ (setjmp_svalue::dump_to_pp): New.
+ (setjmp_svalue::accept): New.
+ (setjmp_svalue::void print_details): Delete.
+ (is_a_helper <const setjmp_svalue *>::test): New.
+ (template <> struct default_hash_traits<setjmp_svalue::key_t>): New.
+ (class initial_svalue : public svalue): New.
+ (is_a_helper <const initial_svalue *>::test): New.
+ (class unaryop_svalue): New.
+ (is_a_helper <const unaryop_svalue *>::test): New.
+ (template <> struct default_hash_traits<unaryop_svalue::key_t>): New.
+ (class binop_svalue): New.
+ (is_a_helper <const binop_svalue *>::test): New.
+ (template <> struct default_hash_traits<binop_svalue::key_t>): New.
+ (class sub_svalue): New.
+ (is_a_helper <const sub_svalue *>::test): New.
+ (template <> struct default_hash_traits<sub_svalue::key_t>): New.
+ (class unmergeable_svalue): New.
+ (is_a_helper <const unmergeable_svalue *>::test): New.
+ (class placeholder_svalue): New.
+ (is_a_helper <placeholder_svalue *>::test): New.
+ (class widening_svalue): New.
+ (is_a_helper <widening_svalue *>::test): New.
+ (template <> struct default_hash_traits<widening_svalue::key_t>): New.
+ (class compound_svalue): New.
+ (is_a_helper <compound_svalue *>::test): New.
+ (template <> struct default_hash_traits<compound_svalue::key_t>): New.
+ (class conjured_svalue): New.
+ (is_a_helper <conjured_svalue *>::test): New.
+ (template <> struct default_hash_traits<conjured_svalue::key_t>): New.
+ (enum region_kind): Delete RK_PRIMITIVE, RK_STRUCT, RK_UNION, and
+ RK_ARRAY. Add RK_LABEL, RK_DECL, RK_FIELD, RK_ELEMENT, RK_OFFSET,
+ RK_CAST, RK_HEAP_ALLOCATED, RK_ALLOCA, RK_STRING, and RK_UNKNOWN.
+ (region_kind_to_str): Delete.
+ (region::~region): Move implementation to region.cc.
+ (region::operator==): Delete.
+ (region::operator!=): Delete.
+ (region::clone): Delete.
+ (region::get_id): New.
+ (region::cmp_ids): New.
+ (region::dyn_cast_map_region): Delete.
+ (region::dyn_cast_array_region): Delete.
+ (region::region_id get_parent): Delete.
+ (region::get_parent_region): Convert to a simple accessor.
+ (region::void set_value): Delete.
+ (region::svalue_id get_value): Delete.
+ (region::svalue_id get_value_direct): Delete.
+ (region::svalue_id get_inherited_child_sid): Delete.
+ (region::dyn_cast_frame_region): New.
+ (region::dyn_cast_function_region): New.
+ (region::dyn_cast_decl_region): New.
+ (region::dyn_cast_field_region): New.
+ (region::dyn_cast_element_region): New.
+ (region::dyn_cast_offset_region): New.
+ (region::dyn_cast_cast_region): New.
+ (region::dyn_cast_string_region): New.
+ (region::accept): New.
+ (region::get_base_region): New.
+ (region::base_region_p): New.
+ (region::descendent_of_p): New.
+ (region::maybe_get_frame_region): New.
+ (region::maybe_get_decl): New.
+ (region::hash): Delete.
+ (region::rint): Delete.
+ (region::dump_dot_to_pp): Delete.
+ (region::get_desc): New.
+ (region::dump_to_pp): Convert to vfunc, changing signature.
+ (region::dump_child_label): Delete.
+ (region::remap_svalue_ids): Delete.
+ (region::remap_region_ids): Delete.
+ (region::dump): New.
+ (region::walk_for_canonicalization): Delete.
+ (region::non_null_p): Drop region_model param.
+ (region::add_view): Delete.
+ (region::get_view): Delete.
+ (region::get_active_view): Delete.
+ (region::is_view_p): Delete.
+ (region::cmp_ptrs): New.
+ (region::validate): Delete.
+ (region::get_offset): New.
+ (region::get_byte_size): New.
+ (region::get_bit_size): New.
+ (region::get_subregions_for_binding): New.
+ (region::region): Add complexity param. Convert parent from
+ region_id to const region *. Drop svalue_id. Drop copy ctor.
+ (region::symbolic_for_unknown_ptr_p): New.
+ (region::add_to_hash): Delete.
+ (region::print_fields): Delete.
+ (region::get_complexity): New accessor.
+ (region::become_active_view): Delete.
+ (region::deactivate_any_active_view): Delete.
+ (region::deactivate_view): Delete.
+ (region::calc_offset): New.
+ (region::m_parent_rid): Delete.
+ (region::m_sval_id): Delete.
+ (region::m_complexity): New.
+ (region::m_id): New.
+ (region::m_parent): New.
+ (region::m_view_rids): Delete.
+ (region::m_is_view): Delete.
+ (region::m_active_view_rid): Delete.
+ (region::m_cached_offset): New.
+ (is_a_helper <region *>::test): Convert to...
+ (is_a_helper <const region *>::test): ... this.
+ (class primitive_region): Delete.
+ (class space_region): New.
+ (class map_region): Delete.
+ (is_a_helper <map_region *>::test): Delete.
+ (class frame_region): Reimplement.
+ (template <> struct default_hash_traits<frame_region::key_t>):
+ New.
+ (class globals_region): Reimplement.
+ (is_a_helper <globals_region *>::test): Convert to...
+ (is_a_helper <const globals_region *>::test): ...this.
+ (class struct_or_union_region): Delete.
+ (is_a_helper <struct_or_union_region *>::test): Delete.
+ (class code_region): Reimplement.
+ (is_a_helper <const code_region *>::test): New.
+ (class struct_region): Delete.
+ (is_a_helper <struct_region *>::test): Delete.
+ (class function_region): Reimplement.
+ (is_a_helper <function_region *>::test): Convert to...
+ (is_a_helper <const function_region *>::test): ...this.
+ (class union_region): Delete.
+ (is_a_helper <union_region *>::test): Delete.
+ (class label_region): New.
+ (is_a_helper <const label_region *>::test): New.
+ (class scope_region): Delete.
+ (class stack_region): Reimplement.
+ (is_a_helper <stack_region *>::test): Convert to...
+ (is_a_helper <const stack_region *>::test): ...this.
+ (class heap_region): Reimplement.
+ (is_a_helper <heap_region *>::test): Convert to...
+ (is_a_helper <const heap_region *>::test): ...this.
+ (class root_region): Reimplement.
+ (is_a_helper <root_region *>::test): Convert to...
+ (is_a_helper <const root_region *>::test): ...this.
+ (class symbolic_region): Reimplement.
+ (is_a_helper <const symbolic_region *>::test): New.
+ (template <> struct default_hash_traits<symbolic_region::key_t>):
+ New.
+ (class decl_region): New.
+ (is_a_helper <const decl_region *>::test): New.
+ (class field_region): New.
+ (template <> struct default_hash_traits<field_region::key_t>): New.
+ (class array_region): Delete.
+ (class element_region): New.
+ (is_a_helper <array_region *>::test): Delete.
+ (is_a_helper <const element_region *>::test): New.
+ (template <> struct default_hash_traits<element_region::key_t>):
+ New.
+ (class offset_region): New.
+ (is_a_helper <const offset_region *>::test): New.
+ (template <> struct default_hash_traits<offset_region::key_t>):
+ New.
+ (class cast_region): New.
+ (is_a_helper <const cast_region *>::test): New.
+ (template <> struct default_hash_traits<cast_region::key_t>): New.
+ (class heap_allocated_region): New.
+ (class alloca_region): New.
+ (class string_region): New.
+ (is_a_helper <const string_region *>::test): New.
+ (class unknown_region): New.
+ (class region_model_manager): New.
+ (struct append_ssa_names_cb_data): New.
+ (class call_details): New.
+ (region_model::region_model): Add region_model_manager param.
+ (region_model::print_svalue): Delete.
+ (region_model::dump_dot_to_pp): Delete.
+ (region_model::dump_dot_to_file): Delete.
+ (region_model::dump_dot): Delete.
+ (region_model::dump_to_pp): Drop summarize param in favor of
+ simple and multiline.
+ (region_model::dump): Likewise.
+ (region_model::summarize_to_pp): Delete.
+ (region_model::summarize): Delete.
+ (region_model::void canonicalize): Drop ctxt param.
+ (region_model::void check_for_poison): Delete.
+ (region_model::get_gassign_result): New.
+ (region_model::impl_call_alloca): New.
+ (region_model::impl_call_analyzer_describe): New.
+ (region_model::impl_call_analyzer_eval): New.
+ (region_model::impl_call_builtin_expect): New.
+ (region_model::impl_call_calloc): New.
+ (region_model::impl_call_free): New.
+ (region_model::impl_call_malloc): New.
+ (region_model::impl_call_memset): New.
+ (region_model::impl_call_strlen): New.
+ (region_model::get_reachable_svalues): New.
+ (region_model::handle_phi): Drop is_back_edge param.
+ (region_model::region_id get_root_rid): Delete.
+ (region_model::root_region *get_root_region): Delete.
+ (region_model::region_id get_stack_region_id): Delete.
+ (region_model::push_frame): Convert from region_id and svalue_id
+ to const region * and const svalue *.
+ (region_model::get_current_frame_id): Replace with...
+ (region_model::get_current_frame): ...this.
+ (region_model::pop_frame): Convert from region_id to
+ const region *. Drop purge and stats param. Add out_result.
+ (region_model::function *get_function_at_depth): Delete.
+ (region_model::get_globals_region_id): Delete.
+ (region_model::add_svalue): Delete.
+ (region_model::replace_svalue): Delete.
+ (region_model::add_region): Delete.
+ (region_model::add_region_for_type): Delete.
+ (region_model::get_svalue): Delete.
+ (region_model::get_region): Delete.
+ (region_model::get_lvalue): Convert from region_id to
+ const region *.
+ (region_model::get_rvalue): Convert from svalue_id to
+ const svalue *.
+ (region_model::get_or_create_ptr_svalue): Delete.
+ (region_model::get_or_create_constant_svalue): Delete.
+ (region_model::get_svalue_for_fndecl): Delete.
+ (region_model::get_svalue_for_label): Delete.
+ (region_model::get_region_for_fndecl): Delete.
+ (region_model::get_region_for_label): Delete.
+ (region_model::get_frame_at_index (int index) const;): New.
+ (region_model::maybe_cast): Delete.
+ (region_model::maybe_cast_1): Delete.
+ (region_model::get_field_region): Delete.
+ (region_model::id deref_rvalue): Convert from region_id and
+ svalue_id to const region * and const svalue *. Drop overload,
+ passing in both a tree and an svalue.
+ (region_model::set_value): Convert from region_id and svalue_id to
+ const region * and const svalue *.
+ (region_model::set_to_new_unknown_value): Delete.
+ (region_model::clobber_region (const region *reg);): New.
+ (region_model::purge_region (const region *reg);): New.
+ (region_model::zero_fill_region (const region *reg);): New.
+ (region_model::mark_region_as_unknown (const region *reg);): New.
+ (region_model::copy_region): Convert from region_id to
+ const region *.
+ (region_model::eval_condition): Convert from svalue_id to
+ const svalue *.
+ (region_model::eval_condition_without_cm): Likewise.
+ (region_model::compare_initial_and_pointer): New.
+ (region_model:maybe_get_constant): Delete.
+ (region_model::add_new_malloc_region): Delete.
+ (region_model::get_representative_tree): Convert from svalue_id to
+ const svalue *.
+ (region_model::get_representative_path_var): Delete decl taking a
+ region_id in favor of two decls, for svalue vs region, with an
+ svalue_set to ensure termination.
+ (region_model::get_path_vars_for_svalue): Delete.
+ (region_model::create_region_for_heap_alloc): New.
+ (region_model::create_region_for_alloca): New.
+ (region_model::purge_unused_svalues): Delete.
+ (region_model::remap_svalue_ids): Delete.
+ (region_model::remap_region_ids): Delete.
+ (region_model::purge_regions): Delete.
+ (region_model::get_num_svalues): Delete.
+ (region_model::get_num_regions): Delete.
+ (region_model::get_descendents): Delete.
+ (region_model::get_store): New.
+ (region_model::delete_region_and_descendents): Delete.
+ (region_model::get_manager): New.
+ (region_model::unbind_region_and_descendents): New.
+ (region_model::can_merge_with_p): Add point param. Drop
+ svalue_id_merger_mapping.
+ (region_model::get_value_by_name): Delete.
+ (region_model::convert_byte_offset_to_array_index): Delete.
+ (region_model::get_or_create_mem_ref): Delete.
+ (region_model::get_or_create_pointer_plus_expr): Delete.
+ (region_model::get_or_create_view): Delete.
+ (region_model::get_lvalue_1): Convert from region_id to
+ const region *.
+ (region_model::get_rvalue_1): Convert from svalue_id to
+ const svalue *.
+ (region_model::get_ssa_name_regions_for_current_frame): New.
+ (region_model::append_ssa_names_cb): New.
+ (region_model::get_store_value): New.
+ (region_model::copy_struct_region): Delete.
+ (region_model::copy_union_region): Delete.
+ (region_model::copy_array_region): Delete.
+ (region_model::region_exists_p): New.
+ (region_model::make_region_for_unexpected_tree_code): Delete.
+ (region_model::loop_replay_fixup): New.
+ (region_model::poison_any_pointers_to_bad_regions): Delete.
+ (region_model::poison_any_pointers_to_descendents): New.
+ (region_model::dump_summary_of_rep_path_vars): Delete.
+ (region_model::on_top_level_param): New.
+ (region_model::record_dynamic_extents): New.
+ (region_model::m_mgr;): New.
+ (region_model::m_store;): New.
+ (region_model::m_svalues;): Delete.
+ (region_model::m_regions;): Delete.
+ (region_model::m_root_rid;): Delete.
+ (region_model::m_current_frame;): New.
+ (region_model_context::remap_svalue_ids): Delete.
+ (region_model_context::can_purge_p): Delete.
+ (region_model_context::on_svalue_leak): New.
+ (region_model_context::on_svalue_purge): Delete.
+ (region_model_context::on_liveness_change): New.
+ (region_model_context::on_inherited_svalue): Delete.
+ (region_model_context::on_cast): Delete.
+ (region_model_context::on_unknown_change): Convert from svalue_id to
+ const svalue * and add is_mutable.
+ (class noop_region_model_context): Update for region_model_context
+ changes.
+ (model_merger::model_merger): Add program_point. Drop
+ svalue_id_merger_mapping.
+ (model_merger::dump_to_pp): Add "simple" param.
+ (model_merger::dump): Likewise.
+ (model_merger::get_region_a): Delete.
+ (model_merger::get_region_b): Delete.
+ (model_merger::can_merge_values_p): Delete.
+ (model_merger::record_regions): Delete.
+ (model_merger::record_svalues): Delete.
+ (model_merger::m_point): New field.
+ (model_merger::m_map_regions_from_a_to_m): Delete.
+ (model_merger::m_map_regions_from_b_to_m): Delete.
+ (model_merger::m_sid_mapping): Delete.
+ (struct svalue_id_merger_mapping): Delete.
+ (class engine): New.
+ (struct canonicalization): Delete.
+ (inchash::add): Delete decls for hashing svalue_id and region_id.
+ (test_region_model_context::on_unexpected_tree_code): Require t to
+ be non-NULL.
+ (selftest::assert_condition): Add overload comparing a pair of
+ const svalue *.
+ * sm-file.cc: Include "tristate.h", "selftest.h",
+ "analyzer/call-string.h", "analyzer/program-point.h",
+ "analyzer/store.h", and "analyzer/region-model.h".
+ (fileptr_state_machine::get_default_state): New.
+ (fileptr_state_machine::on_stmt): Remove calls to
+ get_readable_tree in favor of get_diagnostic_tree.
+ * sm-malloc.cc: Include "tristate.h", "selftest.h",
+ "analyzer/call-string.h", "analyzer/program-point.h",
+ "analyzer/store.h", and "analyzer/region-model.h".
+ (malloc_state_machine::get_default_state): New.
+ (malloc_state_machine::reset_when_passed_to_unknown_fn_p): New.
+ (malloc_diagnostic::describe_state_change): Handle change.m_expr
+ being NULL.
+ (null_arg::emit): Avoid printing "NULL '0'".
+ (null_arg::describe_final_event): Avoid printing "(0) NULL".
+ (malloc_leak::emit): Handle m_arg being NULL.
+ (malloc_leak::describe_final_event): Handle ev.m_expr being NULL.
+ (malloc_state_machine::on_stmt): Don't call get_readable_tree.
+ Call get_diagnostic_tree when creating pending diagnostics.
+ Update for is_zero_assignment becoming a member function of
+ sm_ctxt.
+ Don't transition to m_non_heap for ADDR_EXPR(MEM_REF()).
+ (malloc_state_machine::reset_when_passed_to_unknown_fn_p): New
+ vfunc implementation.
+ * sm-sensitive.cc (sensitive_state_machine::warn_for_any_exposure): Call
+ get_diagnostic_tree and pass the result to warn_for_state.
+ * sm-signal.cc: Move includes of "analyzer/call-string.h" and
+ "analyzer/program-point.h" to before "analyzer/region-model.h",
+ and also include "analyzer/store.h" before it.
+ (signal_unsafe_call::describe_state_change): Use
+ get_dest_function to get handler.
+ (update_model_for_signal_handler): Pass manager to region_model
+ ctor.
+ (register_signal_handler::impl_transition): Update for changes to
+ get_or_create_node and add_edge.
+ * sm-taint.cc (taint_state_machine::on_stmt): Remove calls to
+ get_readable_tree, replacing them when calling warn_for_state with
+ calls to get_diagnostic_tree.
+ * sm.cc (is_zero_assignment): Delete.
+ (any_pointer_p): Move to within namespace ana.
+ * sm.h (is_zero_assignment): Remove decl.
+ (any_pointer_p): Move decl to within namespace ana.
+ (state_machine::get_default_state): New vfunc.
+ (state_machine::reset_when_passed_to_unknown_fn_p): New vfunc.
+ (sm_context::get_readable_tree): Rename to...
+ (sm_context::get_diagnostic_tree): ...this.
+ (sm_context::is_zero_assignment): New vfunc.
+ * store.cc: New file.
+ * store.h: New file.
+ * svalue.cc: New file.
+
2020-05-22 Mark Wielaard <mark@klomp.org>
* sm-signal.cc(signal_unsafe_call::emit): Possibly add