This patch adds value_range info where available to the various nodes
in svalue dumps, such as:
(gdb) call rhs2_sval->dump ()
(27): ‘long long unsigned int’: binop_svalue(bit_and_expr: ‘&’) value range: {[irange] long long unsigned int [0, 0]}
├─ (24): ‘long long unsigned int’: unaryop_svalue(nop_expr) value range: {[irange] long long unsigned int [0,
4294967295] MASK 0xffffffff VALUE 0x0}
│ ╰─ (22): ‘unsigned int’: initial_svalue value range: {[irange] unsigned int VARYING}
│ ╰─ m_reg: (21): ‘unsigned int’: decl_region(‘m’)
│ ╰─ parent: (4): globals
│ ╰─ parent: (0): root region
╰─ (26): ‘long long unsigned int’: constant_svalue (‘
5497558138880’) value range: {[irange] long long unsigned int [
5497558138880,
5497558138880]}
where we can see that sval 27 has value range [0,0] and
where that comes from (due to being a bit_and_expr of non-overlapping
ranges from sval 24 and 26).
gcc/analyzer/ChangeLog:
* svalue.cc (svalue::make_dump_widget): Show value ranges in
svalue dumps.
gcc/ChangeLog:
* value-range.cc (value_range::print): New, based on
value_range::dump.
* value-range.h (value_range::print): New decl.
Signed-off-by: David Malcolm <dmalcolm@redhat.com>
print_dump_widget_label (&pp);
+ value_range out;
+ if (maybe_get_value_range (out))
+ {
+ pp_printf (&pp, " value range: {"),
+ out.print (&pp);
+ pp_string (&pp, "}");
+ }
+
std::unique_ptr<text_art::tree_widget> w
(text_art::tree_widget::make (dwi, &pp));
fprintf (out, "NULL");
}
+void
+value_range::print (pretty_printer *pp) const
+{
+ if (m_vrange)
+ {
+ vrange_printer vrange_pp (pp);
+ m_vrange->accept (vrange_pp);
+ }
+ else
+ pp_string (pp, "NULL");
+}
+
DEBUG_FUNCTION void
debug (const value_range &r)
{
operator vrange &();
operator const vrange &() const;
void dump (FILE *) const;
+ void print (pretty_printer *) const;
static bool supports_type_p (const_tree type);
tree type () { return m_vrange->type (); }