This was very helpful when debugging the cast_region::m_original_region
removal, but is probably too verbose to enable except by hand on
specific calls to get_representative_tree.

Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
Successful run of analyzer integration tests on x86_64-pc-linux-gnu.
Pushed to trunk as r15-1109-gd039eef925878e.

gcc/analyzer/ChangeLog:
        * engine.cc (impl_region_model_context::on_state_leak): Pass nullptr
        to get_representative_path_var.
        * region-model.cc (region_model::get_representative_path_var_1):
        Add logger param and use it in both overloads.
        (region_model::get_representative_path_var): Likewise.
        (region_model::get_representative_tree): Likewise.
        (selftest::test_get_representative_path_var): Pass nullptr to
        get_representative_path_var.
        * region-model.h (region_model::get_representative_tree): Add
        optional logger param to both overloads.
        (region_model::get_representative_path_var): Add logger param to
        both overloads.
        (region_model::get_representative_path_var_1): Likewise.
        * store.cc (binding_cluster::get_representative_path_vars): Add
        logger param and use it.
        (store::get_representative_path_vars): Likewise.
        * store.h (binding_cluster::get_representative_path_vars): Add
        logger param.
        (store::get_representative_path_vars): Likewise.

Signed-off-by: David Malcolm <dmalc...@redhat.com>
---
 gcc/analyzer/engine.cc       |   3 +-
 gcc/analyzer/region-model.cc | 109 +++++++++++++++++++++++++++--------
 gcc/analyzer/region-model.h  |  18 ++++--
 gcc/analyzer/store.cc        |  12 +++-
 gcc/analyzer/store.h         |   2 +
 5 files changed, 109 insertions(+), 35 deletions(-)

diff --git a/gcc/analyzer/engine.cc b/gcc/analyzer/engine.cc
index 8b3706cdfa87..30c0913c861d 100644
--- a/gcc/analyzer/engine.cc
+++ b/gcc/analyzer/engine.cc
@@ -903,7 +903,8 @@ impl_region_model_context::on_state_leak (const 
state_machine &sm,
   svalue_set visited;
   path_var leaked_pv
     = m_old_state->m_region_model->get_representative_path_var (sval,
-                                                               &visited);
+                                                               &visited,
+                                                               nullptr);
 
   /* Strip off top-level casts  */
   if (leaked_pv.m_tree && TREE_CODE (leaked_pv.m_tree) == NOP_EXPR)
diff --git a/gcc/analyzer/region-model.cc b/gcc/analyzer/region-model.cc
index 9f24011c17bf..a25181f2a3ec 100644
--- a/gcc/analyzer/region-model.cc
+++ b/gcc/analyzer/region-model.cc
@@ -5343,7 +5343,8 @@ region_model::eval_condition (tree lhs,
 
 path_var
 region_model::get_representative_path_var_1 (const svalue *sval,
-                                            svalue_set *visited) const
+                                            svalue_set *visited,
+                                            logger *logger) const
 {
   gcc_assert (sval);
 
@@ -5360,7 +5361,8 @@ region_model::get_representative_path_var_1 (const svalue 
*sval,
   /* Handle casts by recursion into get_representative_path_var.  */
   if (const svalue *cast_sval = sval->maybe_undo_cast ())
     {
-      path_var result = get_representative_path_var (cast_sval, visited);
+      path_var result = get_representative_path_var (cast_sval, visited,
+                                                    logger);
       tree orig_type = sval->get_type ();
       /* If necessary, wrap the result in a cast.  */
       if (result.m_tree && orig_type)
@@ -5369,7 +5371,7 @@ region_model::get_representative_path_var_1 (const svalue 
*sval,
     }
 
   auto_vec<path_var> pvs;
-  m_store.get_representative_path_vars (this, visited, sval, &pvs);
+  m_store.get_representative_path_vars (this, visited, sval, logger, &pvs);
 
   if (tree cst = sval->maybe_get_constant ())
     pvs.safe_push (path_var (cst, 0));
@@ -5378,7 +5380,7 @@ region_model::get_representative_path_var_1 (const svalue 
*sval,
   if (const region_svalue *ptr_sval = sval->dyn_cast_region_svalue ())
     {
       const region *reg = ptr_sval->get_pointee ();
-      if (path_var pv = get_representative_path_var (reg, visited))
+      if (path_var pv = get_representative_path_var (reg, visited, logger))
        return path_var (build1 (ADDR_EXPR,
                                 sval->get_type (),
                                 pv.m_tree),
@@ -5391,7 +5393,7 @@ region_model::get_representative_path_var_1 (const svalue 
*sval,
       const svalue *parent_sval = sub_sval->get_parent ();
       const region *subreg = sub_sval->get_subregion ();
       if (path_var parent_pv
-           = get_representative_path_var (parent_sval, visited))
+           = get_representative_path_var (parent_sval, visited, logger))
        if (const field_region *field_reg = subreg->dyn_cast_field_region ())
          return path_var (build3 (COMPONENT_REF,
                                   sval->get_type (),
@@ -5404,9 +5406,11 @@ region_model::get_representative_path_var_1 (const 
svalue *sval,
   /* Handle binops.  */
   if (const binop_svalue *binop_sval = sval->dyn_cast_binop_svalue ())
     if (path_var lhs_pv
-       = get_representative_path_var (binop_sval->get_arg0 (), visited))
+       = get_representative_path_var (binop_sval->get_arg0 (), visited,
+                                      logger))
       if (path_var rhs_pv
-         = get_representative_path_var (binop_sval->get_arg1 (), visited))
+         = get_representative_path_var (binop_sval->get_arg1 (), visited,
+                                        logger))
        return path_var (build2 (binop_sval->get_op (),
                                 sval->get_type (),
                                 lhs_pv.m_tree, rhs_pv.m_tree),
@@ -5429,19 +5433,42 @@ region_model::get_representative_path_var_1 (const 
svalue *sval,
 
 path_var
 region_model::get_representative_path_var (const svalue *sval,
-                                          svalue_set *visited) const
+                                          svalue_set *visited,
+                                          logger *logger) const
 {
   if (sval == NULL)
     return path_var (NULL_TREE, 0);
 
+  LOG_SCOPE (logger);
+  if (logger)
+    {
+      logger->start_log_line ();
+      logger->log_partial ("sval: ");
+      sval->dump_to_pp (logger->get_printer (), true);
+      logger->end_log_line ();
+    }
+
   tree orig_type = sval->get_type ();
 
-  path_var result = get_representative_path_var_1 (sval, visited);
+  path_var result = get_representative_path_var_1 (sval, visited, logger);
 
   /* Verify that the result has the same type as SVAL, if any.  */
   if (result.m_tree && orig_type)
     gcc_assert (TREE_TYPE (result.m_tree) == orig_type);
 
+  if (logger)
+    {
+      logger->start_log_line ();
+      logger->log_partial ("sval: ");
+      sval->dump_to_pp (logger->get_printer (), true);
+      logger->end_log_line ();
+
+      if (result.m_tree)
+       logger->log ("tree: %qE", result.m_tree);
+      else
+       logger->log ("tree: NULL");
+    }
+
   return result;
 }
 
@@ -5452,10 +5479,10 @@ region_model::get_representative_path_var (const svalue 
*sval,
    from analyzer diagnostics.  */
 
 tree
-region_model::get_representative_tree (const svalue *sval) const
+region_model::get_representative_tree (const svalue *sval, logger *logger) 
const
 {
   svalue_set visited;
-  tree expr = get_representative_path_var (sval, &visited).m_tree;
+  tree expr = get_representative_path_var (sval, &visited, logger).m_tree;
 
   /* Strip off any top-level cast.  */
   if (expr && TREE_CODE (expr) == NOP_EXPR)
@@ -5465,10 +5492,10 @@ region_model::get_representative_tree (const svalue 
*sval) const
 }
 
 tree
-region_model::get_representative_tree (const region *reg) const
+region_model::get_representative_tree (const region *reg, logger *logger) const
 {
   svalue_set visited;
-  tree expr = get_representative_path_var (reg, &visited).m_tree;
+  tree expr = get_representative_path_var (reg, &visited, logger).m_tree;
 
   /* Strip off any top-level cast.  */
   if (expr && TREE_CODE (expr) == NOP_EXPR)
@@ -5488,7 +5515,8 @@ region_model::get_representative_tree (const region *reg) 
const
 
 path_var
 region_model::get_representative_path_var_1 (const region *reg,
-                                            svalue_set *visited) const
+                                            svalue_set *visited,
+                                            logger *logger) const
 {
   switch (reg->get_kind ())
     {
@@ -5522,7 +5550,8 @@ region_model::get_representative_path_var_1 (const region 
*reg,
        const symbolic_region *symbolic_reg
          = as_a <const symbolic_region *> (reg);
        const svalue *pointer = symbolic_reg->get_pointer ();
-       path_var pointer_pv = get_representative_path_var (pointer, visited);
+       path_var pointer_pv = get_representative_path_var (pointer, visited,
+                                                          logger);
        if (!pointer_pv)
          return path_var (NULL_TREE, 0);
        tree offset = build_int_cst (pointer->get_type (), 0);
@@ -5541,7 +5570,8 @@ region_model::get_representative_path_var_1 (const region 
*reg,
       {
        const field_region *field_reg = as_a <const field_region *> (reg);
        path_var parent_pv
-         = get_representative_path_var (reg->get_parent_region (), visited);
+         = get_representative_path_var (reg->get_parent_region (), visited,
+                                        logger);
        if (!parent_pv)
          return path_var (NULL_TREE, 0);
        return path_var (build3 (COMPONENT_REF,
@@ -5557,11 +5587,13 @@ region_model::get_representative_path_var_1 (const 
region *reg,
        const element_region *element_reg
          = as_a <const element_region *> (reg);
        path_var parent_pv
-         = get_representative_path_var (reg->get_parent_region (), visited);
+         = get_representative_path_var (reg->get_parent_region (), visited,
+                                        logger);
        if (!parent_pv)
          return path_var (NULL_TREE, 0);
        path_var index_pv
-         = get_representative_path_var (element_reg->get_index (), visited);
+         = get_representative_path_var (element_reg->get_index (), visited,
+                                        logger);
        if (!index_pv)
          return path_var (NULL_TREE, 0);
        return path_var (build4 (ARRAY_REF,
@@ -5576,12 +5608,13 @@ region_model::get_representative_path_var_1 (const 
region *reg,
        const offset_region *offset_reg
          = as_a <const offset_region *> (reg);
        path_var parent_pv
-         = get_representative_path_var (reg->get_parent_region (), visited);
+         = get_representative_path_var (reg->get_parent_region (), visited,
+                                        logger);
        if (!parent_pv)
          return path_var (NULL_TREE, 0);
        path_var offset_pv
          = get_representative_path_var (offset_reg->get_byte_offset (),
-                                        visited);
+                                        visited, logger);
        if (!offset_pv || TREE_CODE (offset_pv.m_tree) != INTEGER_CST)
          return path_var (NULL_TREE, 0);
        tree addr_parent = build1 (ADDR_EXPR,
@@ -5600,7 +5633,8 @@ region_model::get_representative_path_var_1 (const region 
*reg,
     case RK_CAST:
       {
        path_var parent_pv
-         = get_representative_path_var (reg->get_parent_region (), visited);
+         = get_representative_path_var (reg->get_parent_region (), visited,
+                                        logger);
        if (!parent_pv)
          return path_var (NULL_TREE, 0);
        return path_var (build1 (NOP_EXPR,
@@ -5641,14 +5675,37 @@ region_model::get_representative_path_var_1 (const 
region *reg,
 
 path_var
 region_model::get_representative_path_var (const region *reg,
-                                          svalue_set *visited) const
+                                          svalue_set *visited,
+                                          logger *logger) const
 {
-  path_var result = get_representative_path_var_1 (reg, visited);
+  LOG_SCOPE (logger);
+  if (logger)
+    {
+      logger->start_log_line ();
+      logger->log_partial ("reg: ");
+      reg->dump_to_pp (logger->get_printer (), true);
+      logger->end_log_line ();
+    }
+
+  path_var result = get_representative_path_var_1 (reg, visited, logger);
 
   /* Verify that the result has the same type as REG, if any.  */
   if (result.m_tree && reg->get_type ())
     gcc_assert (TREE_TYPE (result.m_tree) == reg->get_type ());
 
+  if (logger)
+    {
+      logger->start_log_line ();
+      logger->log_partial ("reg: ");
+      reg->dump_to_pp (logger->get_printer (), true);
+      logger->end_log_line ();
+
+      if (result.m_tree)
+       logger->log ("tree: %qE", result.m_tree);
+      else
+       logger->log ("tree: NULL");
+    }
+
   return result;
 }
 
@@ -8422,7 +8479,8 @@ test_get_representative_path_var ()
       {
        svalue_set visited;
        ASSERT_EQ (model.get_representative_path_var (parm_regs[depth],
-                                                     &visited),
+                                                     &visited,
+                                                     nullptr),
                   path_var (n, depth + 1));
       }
       /* ...and that we can lookup lvalues for locals for all frames,
@@ -8433,7 +8491,8 @@ test_get_representative_path_var ()
       {
        svalue_set visited;
        ASSERT_EQ (model.get_representative_path_var (parm_svals[depth],
-                                                     &visited),
+                                                     &visited,
+                                                     nullptr),
                   path_var (n, depth + 1));
       }
     }
diff --git a/gcc/analyzer/region-model.h b/gcc/analyzer/region-model.h
index 1a0233f2e8ab..912b558a18dd 100644
--- a/gcc/analyzer/region-model.h
+++ b/gcc/analyzer/region-model.h
@@ -435,14 +435,18 @@ class region_model
                                          region_model_context *ctxt);
   void get_referenced_base_regions (auto_bitmap &out_ids) const;
 
-  tree get_representative_tree (const svalue *sval) const;
-  tree get_representative_tree (const region *reg) const;
+  tree get_representative_tree (const svalue *sval,
+                               logger *logger = nullptr) const;
+  tree get_representative_tree (const region *reg,
+                               logger *logger = nullptr) const;
   path_var
   get_representative_path_var (const svalue *sval,
-                              svalue_set *visited) const;
+                              svalue_set *visited,
+                              logger *logger) const;
   path_var
   get_representative_path_var (const region *reg,
-                              svalue_set *visited) const;
+                              svalue_set *visited,
+                              logger *logger) const;
 
   /* For selftests.  */
   constraint_manager *get_constraints ()
@@ -585,10 +589,12 @@ private:
 
   path_var
   get_representative_path_var_1 (const svalue *sval,
-                                svalue_set *visited) const;
+                                svalue_set *visited,
+                                logger *logger) const;
   path_var
   get_representative_path_var_1 (const region *reg,
-                                svalue_set *visited) const;
+                                svalue_set *visited,
+                                logger *logger) const;
 
   const known_function *get_known_function (tree fndecl,
                                            const call_details &cd) const;
diff --git a/gcc/analyzer/store.cc b/gcc/analyzer/store.cc
index d14cfa329b8d..d5c1a9f6aff2 100644
--- a/gcc/analyzer/store.cc
+++ b/gcc/analyzer/store.cc
@@ -2281,6 +2281,7 @@ binding_cluster::get_representative_path_vars (const 
region_model *model,
                                               svalue_set *visited,
                                               const region *base_reg,
                                               const svalue *sval,
+                                              logger *logger,
                                               auto_vec<path_var> *out_pvs)
   const
 {
@@ -2308,7 +2309,8 @@ binding_cluster::get_representative_path_vars (const 
region_model *model,
                {
                  if (path_var pv
                      = model->get_representative_path_var (subregion,
-                                                           visited))
+                                                           visited,
+                                                           logger))
                    append_pathvar_with_type (pv, sval->get_type (), out_pvs);
                }
            }
@@ -2317,7 +2319,8 @@ binding_cluster::get_representative_path_vars (const 
region_model *model,
              const symbolic_binding *skey = (const symbolic_binding *)key;
              if (path_var pv
                  = model->get_representative_path_var (skey->get_region (),
-                                                       visited))
+                                                       visited,
+                                                       logger))
                append_pathvar_with_type (pv, sval->get_type (), out_pvs);
            }
        }
@@ -3282,6 +3285,7 @@ void
 store::get_representative_path_vars (const region_model *model,
                                     svalue_set *visited,
                                     const svalue *sval,
+                                    logger *logger,
                                     auto_vec<path_var> *out_pvs) const
 {
   gcc_assert (sval);
@@ -3293,6 +3297,7 @@ store::get_representative_path_vars (const region_model 
*model,
       const region *base_reg = (*iter).first;
       binding_cluster *cluster = (*iter).second;
       cluster->get_representative_path_vars (model, visited, base_reg, sval,
+                                            logger,
                                             out_pvs);
     }
 
@@ -3300,7 +3305,8 @@ store::get_representative_path_vars (const region_model 
*model,
     {
       const region *reg = init_sval->get_region ();
       if (path_var pv = model->get_representative_path_var (reg,
-                                                           visited))
+                                                           visited,
+                                                           logger))
        out_pvs->safe_push (pv);
     }
 }
diff --git a/gcc/analyzer/store.h b/gcc/analyzer/store.h
index 9be9df723794..affb6e218a6a 100644
--- a/gcc/analyzer/store.h
+++ b/gcc/analyzer/store.h
@@ -681,6 +681,7 @@ public:
                                     svalue_set *visited,
                                     const region *base_reg,
                                     const svalue *sval,
+                                    logger *logger,
                                     auto_vec<path_var> *out_pvs) const;
 
   const svalue *maybe_get_simple_value (store_manager *mgr) const;
@@ -806,6 +807,7 @@ public:
   void get_representative_path_vars (const region_model *model,
                                     svalue_set *visited,
                                     const svalue *sval,
+                                    logger *logger,
                                     auto_vec<path_var> *out_pvs) const;
 
   cluster_map_t::iterator begin () const { return m_cluster_map.begin (); }
-- 
2.26.3

Reply via email to