Commit 7d9c107a by David Malcolm

analyzer: introduce noop_region_model_context

tentative_region_model_context and test_region_model_context are both
forced to implement numerous pure virtual vfuncs of the abstract
region_model_context.

This patch adds a noop_region_model_context which provides empty
implementations of all of region_model_context's pure virtual functions,
and subclasses the above classes from that, rather than from
region_model_context directly.

gcc/analyzer/ChangeLog:
	* region-model.h (class noop_region_model_context): New subclass
	of region_model_context.
	(class tentative_region_model_context): Inherit from
	noop_region_model_context rather than from region_model_context;
	drop redundant vfunc implementations.
	(class test_region_model_context): Likewise.
parent 0db2cd17
2020-03-18 David Malcolm <dmalcolm@redhat.com>
* region-model.h (class noop_region_model_context): New subclass
of region_model_context.
(class tentative_region_model_context): Inherit from
noop_region_model_context rather than from region_model_context;
drop redundant vfunc implementations.
(class test_region_model_context): Likewise.
2020-03-18 David Malcolm <dmalcolm@redhat.com>
* engine.cc (exploded_node::exploded_node): Move implementation
here from header; accept point_and_state by const reference rather
than by value.
......
......@@ -1972,42 +1972,50 @@ class region_model_context
const dump_location_t &loc) = 0;
};
/* A subclass of region_model_context for determining if operations fail
e.g. "can we generate a region for the lvalue of EXPR?". */
/* A "do nothing" subclass of region_model_context. */
class tentative_region_model_context : public region_model_context
class noop_region_model_context : public region_model_context
{
public:
tentative_region_model_context () : m_num_unexpected_codes (0) {}
void warn (pending_diagnostic *) FINAL OVERRIDE {}
void remap_svalue_ids (const svalue_id_map &) FINAL OVERRIDE {}
int on_svalue_purge (svalue_id, const svalue_id_map &) FINAL OVERRIDE
void warn (pending_diagnostic *) OVERRIDE {}
void remap_svalue_ids (const svalue_id_map &) OVERRIDE {}
int on_svalue_purge (svalue_id, const svalue_id_map &) OVERRIDE
{
return 0;
}
logger *get_logger () FINAL OVERRIDE { return NULL; }
logger *get_logger () OVERRIDE { return NULL; }
void on_inherited_svalue (svalue_id parent_sid ATTRIBUTE_UNUSED,
svalue_id child_sid ATTRIBUTE_UNUSED)
FINAL OVERRIDE
OVERRIDE
{
}
void on_cast (svalue_id src_sid ATTRIBUTE_UNUSED,
svalue_id dst_sid ATTRIBUTE_UNUSED) FINAL OVERRIDE
svalue_id dst_sid ATTRIBUTE_UNUSED) OVERRIDE
{
}
void on_condition (tree lhs ATTRIBUTE_UNUSED,
enum tree_code op ATTRIBUTE_UNUSED,
tree rhs ATTRIBUTE_UNUSED) FINAL OVERRIDE
tree rhs ATTRIBUTE_UNUSED) OVERRIDE
{
}
void on_unknown_change (svalue_id sid ATTRIBUTE_UNUSED) FINAL OVERRIDE
void on_unknown_change (svalue_id sid ATTRIBUTE_UNUSED) OVERRIDE
{
}
void on_phi (const gphi *phi ATTRIBUTE_UNUSED,
tree rhs ATTRIBUTE_UNUSED) FINAL OVERRIDE
tree rhs ATTRIBUTE_UNUSED) OVERRIDE
{
}
void on_unexpected_tree_code (tree, const dump_location_t &) OVERRIDE {}
};
/* A subclass of region_model_context for determining if operations fail
e.g. "can we generate a region for the lvalue of EXPR?". */
class tentative_region_model_context : public noop_region_model_context
{
public:
tentative_region_model_context () : m_num_unexpected_codes (0) {}
void on_unexpected_tree_code (tree, const dump_location_t &)
FINAL OVERRIDE
{
......@@ -2143,7 +2151,7 @@ using namespace ::selftest;
/* An implementation of region_model_context for use in selftests, which
stores any pending_diagnostic instances passed to it. */
class test_region_model_context : public region_model_context
class test_region_model_context : public noop_region_model_context
{
public:
void warn (pending_diagnostic *d) FINAL OVERRIDE
......@@ -2151,54 +2159,8 @@ public:
m_diagnostics.safe_push (d);
}
void remap_svalue_ids (const svalue_id_map &) FINAL OVERRIDE
{
/* Empty. */
}
#if 0
bool can_purge_p (svalue_id) FINAL OVERRIDE
{
return true;
}
#endif
int on_svalue_purge (svalue_id, const svalue_id_map &) FINAL OVERRIDE
{
/* Empty. */
return 0;
}
logger *get_logger () FINAL OVERRIDE { return NULL; }
void on_inherited_svalue (svalue_id parent_sid ATTRIBUTE_UNUSED,
svalue_id child_sid ATTRIBUTE_UNUSED)
FINAL OVERRIDE
{
}
void on_cast (svalue_id src_sid ATTRIBUTE_UNUSED,
svalue_id dst_sid ATTRIBUTE_UNUSED) FINAL OVERRIDE
{
}
unsigned get_num_diagnostics () const { return m_diagnostics.length (); }
void on_condition (tree lhs ATTRIBUTE_UNUSED,
enum tree_code op ATTRIBUTE_UNUSED,
tree rhs ATTRIBUTE_UNUSED) FINAL OVERRIDE
{
}
void on_unknown_change (svalue_id sid ATTRIBUTE_UNUSED) FINAL OVERRIDE
{
}
void on_phi (const gphi *phi ATTRIBUTE_UNUSED,
tree rhs ATTRIBUTE_UNUSED) FINAL OVERRIDE
{
}
void on_unexpected_tree_code (tree t, const dump_location_t &)
FINAL OVERRIDE
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment