From cddc6cc5073fa3466b523bb2c3f4cc9f1deaf576 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Wed, 11 Mar 2026 09:41:22 -0400 Subject: [PATCH 18/38] analyzer: show value ranges in svalue::dump MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- gcc/analyzer/svalue.cc | 8 ++++++++ gcc/value-range.cc | 12 ++++++++++++ gcc/value-range.h | 1 + 3 files changed, 21 insertions(+) diff --git a/gcc/analyzer/svalue.cc b/gcc/analyzer/svalue.cc index 986f4d8a906..a62d85b1658 100644 --- a/gcc/analyzer/svalue.cc +++ b/gcc/analyzer/svalue.cc @@ -227,6 +227,14 @@ svalue::make_dump_widget (const text_art::dump_widget_info &dwi, 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 w (text_art::tree_widget::make (dwi, &pp)); diff --git a/gcc/value-range.cc b/gcc/value-range.cc index eeb3abffe6c..8d849cd4d9e 100644 --- a/gcc/value-range.cc +++ b/gcc/value-range.cc @@ -157,6 +157,18 @@ value_range::dump (FILE *out) const 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) { diff --git a/gcc/value-range.h b/gcc/value-range.h index eaf29236d99..85deebab092 100644 --- a/gcc/value-range.h +++ b/gcc/value-range.h @@ -792,6 +792,7 @@ public: 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 (); } -- 2.49.0