Home | History | Annotate | Line # | Download | only in analyzer
      1  1.1  mrg /* Regions of memory.
      2  1.1  mrg    Copyright (C) 2019-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by David Malcolm <dmalcolm (at) redhat.com>.
      4  1.1  mrg 
      5  1.1  mrg This file is part of GCC.
      6  1.1  mrg 
      7  1.1  mrg GCC is free software; you can redistribute it and/or modify it
      8  1.1  mrg under the terms of the GNU General Public License as published by
      9  1.1  mrg the Free Software Foundation; either version 3, or (at your option)
     10  1.1  mrg any later version.
     11  1.1  mrg 
     12  1.1  mrg GCC is distributed in the hope that it will be useful, but
     13  1.1  mrg WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     15  1.1  mrg General Public License for more details.
     16  1.1  mrg 
     17  1.1  mrg You should have received a copy of the GNU General Public License
     18  1.1  mrg along with GCC; see the file COPYING3.  If not see
     19  1.1  mrg <http://www.gnu.org/licenses/>.  */
     20  1.1  mrg 
     21  1.1  mrg #include "config.h"
     22  1.1  mrg #include "system.h"
     23  1.1  mrg #include "coretypes.h"
     24  1.1  mrg #include "tree.h"
     25  1.1  mrg #include "diagnostic-core.h"
     26  1.1  mrg #include "gimple-pretty-print.h"
     27  1.1  mrg #include "function.h"
     28  1.1  mrg #include "basic-block.h"
     29  1.1  mrg #include "gimple.h"
     30  1.1  mrg #include "gimple-iterator.h"
     31  1.1  mrg #include "diagnostic-core.h"
     32  1.1  mrg #include "graphviz.h"
     33  1.1  mrg #include "options.h"
     34  1.1  mrg #include "cgraph.h"
     35  1.1  mrg #include "tree-dfa.h"
     36  1.1  mrg #include "stringpool.h"
     37  1.1  mrg #include "convert.h"
     38  1.1  mrg #include "target.h"
     39  1.1  mrg #include "fold-const.h"
     40  1.1  mrg #include "tree-pretty-print.h"
     41  1.1  mrg #include "diagnostic-color.h"
     42  1.1  mrg #include "diagnostic-metadata.h"
     43  1.1  mrg #include "tristate.h"
     44  1.1  mrg #include "bitmap.h"
     45  1.1  mrg #include "selftest.h"
     46  1.1  mrg #include "function.h"
     47  1.1  mrg #include "json.h"
     48  1.1  mrg #include "analyzer/analyzer.h"
     49  1.1  mrg #include "analyzer/analyzer-logging.h"
     50  1.1  mrg #include "ordered-hash-map.h"
     51  1.1  mrg #include "options.h"
     52  1.1  mrg #include "cgraph.h"
     53  1.1  mrg #include "cfg.h"
     54  1.1  mrg #include "digraph.h"
     55  1.1  mrg #include "analyzer/supergraph.h"
     56  1.1  mrg #include "sbitmap.h"
     57  1.1  mrg #include "analyzer/call-string.h"
     58  1.1  mrg #include "analyzer/program-point.h"
     59  1.1  mrg #include "analyzer/store.h"
     60  1.1  mrg #include "analyzer/region.h"
     61  1.1  mrg #include "analyzer/region-model.h"
     62  1.1  mrg #include "analyzer/sm.h"
     63  1.1  mrg #include "analyzer/program-state.h"
     64  1.1  mrg 
     65  1.1  mrg #if ENABLE_ANALYZER
     66  1.1  mrg 
     67  1.1  mrg namespace ana {
     68  1.1  mrg 
     69  1.1  mrg /* class region and its various subclasses.  */
     70  1.1  mrg 
     71  1.1  mrg /* class region.  */
     72  1.1  mrg 
     73  1.1  mrg region::~region ()
     74  1.1  mrg {
     75  1.1  mrg   delete m_cached_offset;
     76  1.1  mrg }
     77  1.1  mrg 
     78  1.1  mrg /* Compare REG1 and REG2 by id.  */
     79  1.1  mrg 
     80  1.1  mrg int
     81  1.1  mrg region::cmp_ids (const region *reg1, const region *reg2)
     82  1.1  mrg {
     83  1.1  mrg   return (long)reg1->get_id () - (long)reg2->get_id ();
     84  1.1  mrg }
     85  1.1  mrg 
     86  1.1  mrg /* Determine the base region for this region: when considering bindings
     87  1.1  mrg    for this region, the base region is the ancestor which identifies
     88  1.1  mrg    which cluster they should be partitioned into.
     89  1.1  mrg    Regions within the same struct/union/array are in the same cluster.
     90  1.1  mrg    Different decls are in different clusters.  */
     91  1.1  mrg 
     92  1.1  mrg const region *
     93  1.1  mrg region::get_base_region () const
     94  1.1  mrg {
     95  1.1  mrg   const region *iter = this;
     96  1.1  mrg   while (iter)
     97  1.1  mrg     {
     98  1.1  mrg       switch (iter->get_kind ())
     99  1.1  mrg 	{
    100  1.1  mrg 	case RK_FIELD:
    101  1.1  mrg 	case RK_ELEMENT:
    102  1.1  mrg 	case RK_OFFSET:
    103  1.1  mrg 	case RK_SIZED:
    104  1.1  mrg 	case RK_BIT_RANGE:
    105  1.1  mrg 	  iter = iter->get_parent_region ();
    106  1.1  mrg 	  continue;
    107  1.1  mrg 	case RK_CAST:
    108  1.1  mrg 	  iter = iter->dyn_cast_cast_region ()->get_original_region ();
    109  1.1  mrg 	  continue;
    110  1.1  mrg 	default:
    111  1.1  mrg 	  return iter;
    112  1.1  mrg 	}
    113  1.1  mrg     }
    114  1.1  mrg   return iter;
    115  1.1  mrg }
    116  1.1  mrg 
    117  1.1  mrg /* Return true if get_base_region() == this for this region.  */
    118  1.1  mrg 
    119  1.1  mrg bool
    120  1.1  mrg region::base_region_p () const
    121  1.1  mrg {
    122  1.1  mrg   switch (get_kind ())
    123  1.1  mrg     {
    124  1.1  mrg     /* Region kinds representing a descendent of a base region.  */
    125  1.1  mrg     case RK_FIELD:
    126  1.1  mrg     case RK_ELEMENT:
    127  1.1  mrg     case RK_OFFSET:
    128  1.1  mrg     case RK_SIZED:
    129  1.1  mrg     case RK_CAST:
    130  1.1  mrg     case RK_BIT_RANGE:
    131  1.1  mrg       return false;
    132  1.1  mrg 
    133  1.1  mrg     default:
    134  1.1  mrg       return true;
    135  1.1  mrg     }
    136  1.1  mrg }
    137  1.1  mrg 
    138  1.1  mrg /* Return true if this region is ELDER or one of its descendents.  */
    139  1.1  mrg 
    140  1.1  mrg bool
    141  1.1  mrg region::descendent_of_p (const region *elder) const
    142  1.1  mrg {
    143  1.1  mrg   const region *iter = this;
    144  1.1  mrg   while (iter)
    145  1.1  mrg     {
    146  1.1  mrg       if (iter == elder)
    147  1.1  mrg 	return true;
    148  1.1  mrg       if (iter->get_kind () == RK_CAST)
    149  1.1  mrg 	iter = iter->dyn_cast_cast_region ()->get_original_region ();
    150  1.1  mrg       else
    151  1.1  mrg 	iter = iter->get_parent_region ();
    152  1.1  mrg     }
    153  1.1  mrg   return false;
    154  1.1  mrg }
    155  1.1  mrg 
    156  1.1  mrg /* If this region is a frame_region, or a descendent of one, return it.
    157  1.1  mrg    Otherwise return NULL.  */
    158  1.1  mrg 
    159  1.1  mrg const frame_region *
    160  1.1  mrg region::maybe_get_frame_region () const
    161  1.1  mrg {
    162  1.1  mrg   const region *iter = this;
    163  1.1  mrg   while (iter)
    164  1.1  mrg     {
    165  1.1  mrg       if (const frame_region *frame_reg = iter->dyn_cast_frame_region ())
    166  1.1  mrg 	return frame_reg;
    167  1.1  mrg       if (iter->get_kind () == RK_CAST)
    168  1.1  mrg 	iter = iter->dyn_cast_cast_region ()->get_original_region ();
    169  1.1  mrg       else
    170  1.1  mrg 	iter = iter->get_parent_region ();
    171  1.1  mrg     }
    172  1.1  mrg   return NULL;
    173  1.1  mrg }
    174  1.1  mrg 
    175  1.1  mrg /* Get the memory space of this region.  */
    176  1.1  mrg 
    177  1.1  mrg enum memory_space
    178  1.1  mrg region::get_memory_space () const
    179  1.1  mrg {
    180  1.1  mrg   const region *iter = this;
    181  1.1  mrg   while (iter)
    182  1.1  mrg     {
    183  1.1  mrg       switch (iter->get_kind ())
    184  1.1  mrg 	{
    185  1.1  mrg 	default:
    186  1.1  mrg 	  break;
    187  1.1  mrg 	case RK_GLOBALS:
    188  1.1  mrg 	  return MEMSPACE_GLOBALS;
    189  1.1  mrg 	case RK_CODE:
    190  1.1  mrg 	case RK_FUNCTION:
    191  1.1  mrg 	case RK_LABEL:
    192  1.1  mrg 	  return MEMSPACE_CODE;
    193  1.1  mrg 	case RK_FRAME:
    194  1.1  mrg 	case RK_STACK:
    195  1.1  mrg 	case RK_ALLOCA:
    196  1.1  mrg 	  return MEMSPACE_STACK;
    197  1.1  mrg 	case RK_HEAP:
    198  1.1  mrg 	case RK_HEAP_ALLOCATED:
    199  1.1  mrg 	  return MEMSPACE_HEAP;
    200  1.1  mrg 	case RK_STRING:
    201  1.1  mrg 	  return MEMSPACE_READONLY_DATA;
    202  1.1  mrg 	}
    203  1.1  mrg       if (iter->get_kind () == RK_CAST)
    204  1.1  mrg 	iter = iter->dyn_cast_cast_region ()->get_original_region ();
    205  1.1  mrg       else
    206  1.1  mrg 	iter = iter->get_parent_region ();
    207  1.1  mrg     }
    208  1.1  mrg   return MEMSPACE_UNKNOWN;
    209  1.1  mrg }
    210  1.1  mrg 
    211  1.1  mrg /* Subroutine for use by region_model_manager::get_or_create_initial_value.
    212  1.1  mrg    Return true if this region has an initial_svalue.
    213  1.1  mrg    Return false if attempting to use INIT_VAL(this_region) should give
    214  1.1  mrg    the "UNINITIALIZED" poison value.  */
    215  1.1  mrg 
    216  1.1  mrg bool
    217  1.1  mrg region::can_have_initial_svalue_p () const
    218  1.1  mrg {
    219  1.1  mrg   const region *base_reg = get_base_region ();
    220  1.1  mrg 
    221  1.1  mrg   /* Check for memory spaces that are uninitialized by default.  */
    222  1.1  mrg   enum memory_space mem_space = base_reg->get_memory_space ();
    223  1.1  mrg   switch (mem_space)
    224  1.1  mrg     {
    225  1.1  mrg     default:
    226  1.1  mrg       gcc_unreachable ();
    227  1.1  mrg     case MEMSPACE_UNKNOWN:
    228  1.1  mrg     case MEMSPACE_CODE:
    229  1.1  mrg     case MEMSPACE_GLOBALS:
    230  1.1  mrg     case MEMSPACE_READONLY_DATA:
    231  1.1  mrg       /* Such regions have initial_svalues.  */
    232  1.1  mrg       return true;
    233  1.1  mrg 
    234  1.1  mrg     case MEMSPACE_HEAP:
    235  1.1  mrg       /* Heap allocations are uninitialized by default.  */
    236  1.1  mrg       return false;
    237  1.1  mrg 
    238  1.1  mrg     case MEMSPACE_STACK:
    239  1.1  mrg       if (tree decl = base_reg->maybe_get_decl ())
    240  1.1  mrg 	{
    241  1.1  mrg 	  /* See the assertion in frame_region::get_region_for_local for the
    242  1.1  mrg 	     tree codes we need to handle here.  */
    243  1.1  mrg 	  switch (TREE_CODE (decl))
    244  1.1  mrg 	    {
    245  1.1  mrg 	    default:
    246  1.1  mrg 	      gcc_unreachable ();
    247  1.1  mrg 
    248  1.1  mrg 	    case PARM_DECL:
    249  1.1  mrg 	      /* Parameters have initial values.  */
    250  1.1  mrg 	      return true;
    251  1.1  mrg 
    252  1.1  mrg 	    case VAR_DECL:
    253  1.1  mrg 	    case RESULT_DECL:
    254  1.1  mrg 	      /* Function locals don't have initial values.  */
    255  1.1  mrg 	      return false;
    256  1.1  mrg 
    257  1.1  mrg 	    case SSA_NAME:
    258  1.1  mrg 	      {
    259  1.1  mrg 		tree ssa_name = decl;
    260  1.1  mrg 		/* SSA names that are the default defn of a PARM_DECL
    261  1.1  mrg 		   have initial_svalues; other SSA names don't.  */
    262  1.1  mrg 		if (SSA_NAME_IS_DEFAULT_DEF (ssa_name)
    263  1.1  mrg 		    && SSA_NAME_VAR (ssa_name)
    264  1.1  mrg 		    && TREE_CODE (SSA_NAME_VAR (ssa_name)) == PARM_DECL)
    265  1.1  mrg 		  return true;
    266  1.1  mrg 		else
    267  1.1  mrg 		  return false;
    268  1.1  mrg 	      }
    269  1.1  mrg 	    }
    270  1.1  mrg 	}
    271  1.1  mrg 
    272  1.1  mrg       /* If we have an on-stack region that isn't associated with a decl
    273  1.1  mrg 	 or SSA name, then we have VLA/alloca, which is uninitialized.  */
    274  1.1  mrg       return false;
    275  1.1  mrg     }
    276  1.1  mrg }
    277  1.1  mrg 
    278  1.1  mrg /* If this region is a decl_region, return the decl.
    279  1.1  mrg    Otherwise return NULL.  */
    280  1.1  mrg 
    281  1.1  mrg tree
    282  1.1  mrg region::maybe_get_decl () const
    283  1.1  mrg {
    284  1.1  mrg   if (const decl_region *decl_reg = dyn_cast_decl_region ())
    285  1.1  mrg     return decl_reg->get_decl ();
    286  1.1  mrg   return NULL_TREE;
    287  1.1  mrg }
    288  1.1  mrg 
    289  1.1  mrg /* Get the region_offset for this region (calculating it on the
    290  1.1  mrg    first call and caching it internally).  */
    291  1.1  mrg 
    292  1.1  mrg region_offset
    293  1.1  mrg region::get_offset () const
    294  1.1  mrg {
    295  1.1  mrg   if(!m_cached_offset)
    296  1.1  mrg     m_cached_offset = new region_offset (calc_offset ());
    297  1.1  mrg   return *m_cached_offset;
    298  1.1  mrg }
    299  1.1  mrg 
    300  1.1  mrg /* Base class implementation of region::get_byte_size vfunc.
    301  1.1  mrg    If the size of this region (in bytes) is known statically, write it to *OUT
    302  1.1  mrg    and return true.
    303  1.1  mrg    Otherwise return false.  */
    304  1.1  mrg 
    305  1.1  mrg bool
    306  1.1  mrg region::get_byte_size (byte_size_t *out) const
    307  1.1  mrg {
    308  1.1  mrg   tree type = get_type ();
    309  1.1  mrg 
    310  1.1  mrg   /* Bail out e.g. for heap-allocated regions.  */
    311  1.1  mrg   if (!type)
    312  1.1  mrg     return false;
    313  1.1  mrg 
    314  1.1  mrg   HOST_WIDE_INT bytes = int_size_in_bytes (type);
    315  1.1  mrg   if (bytes == -1)
    316  1.1  mrg     return false;
    317  1.1  mrg   *out = bytes;
    318  1.1  mrg   return true;
    319  1.1  mrg }
    320  1.1  mrg 
    321  1.1  mrg /* Base implementation of region::get_byte_size_sval vfunc.  */
    322  1.1  mrg 
    323  1.1  mrg const svalue *
    324  1.1  mrg region::get_byte_size_sval (region_model_manager *mgr) const
    325  1.1  mrg {
    326  1.1  mrg   tree type = get_type ();
    327  1.1  mrg 
    328  1.1  mrg   /* Bail out e.g. for heap-allocated regions.  */
    329  1.1  mrg   if (!type)
    330  1.1  mrg     return mgr->get_or_create_unknown_svalue (size_type_node);
    331  1.1  mrg 
    332  1.1  mrg   HOST_WIDE_INT bytes = int_size_in_bytes (type);
    333  1.1  mrg   if (bytes == -1)
    334  1.1  mrg     return mgr->get_or_create_unknown_svalue (size_type_node);
    335  1.1  mrg 
    336  1.1  mrg   tree byte_size = size_in_bytes (type);
    337  1.1  mrg   if (TREE_TYPE (byte_size) != size_type_node)
    338  1.1  mrg     byte_size = fold_build1 (NOP_EXPR, size_type_node, byte_size);
    339  1.1  mrg   return mgr->get_or_create_constant_svalue (byte_size);
    340  1.1  mrg }
    341  1.1  mrg 
    342  1.1  mrg /* Attempt to get the size of TYPE in bits.
    343  1.1  mrg    If successful, return true and write the size to *OUT.
    344  1.1  mrg    Otherwise return false.  */
    345  1.1  mrg 
    346  1.1  mrg bool
    347  1.1  mrg int_size_in_bits (const_tree type, bit_size_t *out)
    348  1.1  mrg {
    349  1.1  mrg   if (INTEGRAL_TYPE_P (type))
    350  1.1  mrg     {
    351  1.1  mrg       *out = TYPE_PRECISION (type);
    352  1.1  mrg       return true;
    353  1.1  mrg     }
    354  1.1  mrg 
    355  1.1  mrg   tree sz = TYPE_SIZE (type);
    356  1.1  mrg   if (sz && tree_fits_uhwi_p (sz))
    357  1.1  mrg     {
    358  1.1  mrg       *out = TREE_INT_CST_LOW (sz);
    359  1.1  mrg       return true;
    360  1.1  mrg     }
    361  1.1  mrg   else
    362  1.1  mrg     return false;
    363  1.1  mrg }
    364  1.1  mrg 
    365  1.1  mrg /* If the size of this region (in bits) is known statically, write it to *OUT
    366  1.1  mrg    and return true.
    367  1.1  mrg    Otherwise return false.  */
    368  1.1  mrg 
    369  1.1  mrg bool
    370  1.1  mrg region::get_bit_size (bit_size_t *out) const
    371  1.1  mrg {
    372  1.1  mrg   tree type = get_type ();
    373  1.1  mrg 
    374  1.1  mrg   /* Bail out e.g. for heap-allocated regions.  */
    375  1.1  mrg   if (!type)
    376  1.1  mrg     return false;
    377  1.1  mrg 
    378  1.1  mrg   return int_size_in_bits (type, out);
    379  1.1  mrg }
    380  1.1  mrg 
    381  1.1  mrg /* Get the field within RECORD_TYPE at BIT_OFFSET.  */
    382  1.1  mrg 
    383  1.1  mrg tree
    384  1.1  mrg get_field_at_bit_offset (tree record_type, bit_offset_t bit_offset)
    385  1.1  mrg {
    386  1.1  mrg   gcc_assert (TREE_CODE (record_type) == RECORD_TYPE);
    387  1.1  mrg   if (bit_offset < 0)
    388  1.1  mrg     return NULL;
    389  1.1  mrg 
    390  1.1  mrg   /* Find the first field that has an offset > BIT_OFFSET,
    391  1.1  mrg      then return the one preceding it.
    392  1.1  mrg      Skip other trees within the chain, such as FUNCTION_DECLs.  */
    393  1.1  mrg   tree last_field = NULL_TREE;
    394  1.1  mrg   for (tree iter = TYPE_FIELDS (record_type); iter != NULL_TREE;
    395  1.1  mrg        iter = DECL_CHAIN (iter))
    396  1.1  mrg     {
    397  1.1  mrg       if (TREE_CODE (iter) == FIELD_DECL)
    398  1.1  mrg 	{
    399  1.1  mrg 	  int iter_field_offset = int_bit_position (iter);
    400  1.1  mrg 	  if (bit_offset < iter_field_offset)
    401  1.1  mrg 	    return last_field;
    402  1.1  mrg 	  last_field = iter;
    403  1.1  mrg 	}
    404  1.1  mrg     }
    405  1.1  mrg   return last_field;
    406  1.1  mrg }
    407  1.1  mrg 
    408  1.1  mrg /* Populate *OUT with descendent regions of type TYPE that match
    409  1.1  mrg    RELATIVE_BIT_OFFSET and SIZE_IN_BITS within this region.  */
    410  1.1  mrg 
    411  1.1  mrg void
    412  1.1  mrg region::get_subregions_for_binding (region_model_manager *mgr,
    413  1.1  mrg 				    bit_offset_t relative_bit_offset,
    414  1.1  mrg 				    bit_size_t size_in_bits,
    415  1.1  mrg 				    tree type,
    416  1.1  mrg 				    auto_vec <const region *> *out) const
    417  1.1  mrg {
    418  1.1  mrg   if (get_type () == NULL_TREE || type == NULL_TREE)
    419  1.1  mrg     return;
    420  1.1  mrg   if (relative_bit_offset == 0
    421  1.1  mrg       && types_compatible_p (get_type (), type))
    422  1.1  mrg     {
    423  1.1  mrg       out->safe_push (this);
    424  1.1  mrg       return;
    425  1.1  mrg     }
    426  1.1  mrg   switch (TREE_CODE (get_type ()))
    427  1.1  mrg     {
    428  1.1  mrg     case ARRAY_TYPE:
    429  1.1  mrg       {
    430  1.1  mrg 	tree element_type = TREE_TYPE (get_type ());
    431  1.1  mrg 	HOST_WIDE_INT hwi_byte_size = int_size_in_bytes (element_type);
    432  1.1  mrg 	if (hwi_byte_size > 0)
    433  1.1  mrg 	  {
    434  1.1  mrg 	    HOST_WIDE_INT bits_per_element
    435  1.1  mrg 	      = hwi_byte_size << LOG2_BITS_PER_UNIT;
    436  1.1  mrg 	    HOST_WIDE_INT element_index
    437  1.1  mrg 	      = (relative_bit_offset.to_shwi () / bits_per_element);
    438  1.1  mrg 	    tree element_index_cst
    439  1.1  mrg 	      = build_int_cst (integer_type_node, element_index);
    440  1.1  mrg 	    HOST_WIDE_INT inner_bit_offset
    441  1.1  mrg 	      = relative_bit_offset.to_shwi () % bits_per_element;
    442  1.1  mrg 	    const region *subregion = mgr->get_element_region
    443  1.1  mrg 	      (this, element_type,
    444  1.1  mrg 	       mgr->get_or_create_constant_svalue (element_index_cst));
    445  1.1  mrg 	    subregion->get_subregions_for_binding (mgr, inner_bit_offset,
    446  1.1  mrg 						   size_in_bits, type, out);
    447  1.1  mrg 	  }
    448  1.1  mrg       }
    449  1.1  mrg       break;
    450  1.1  mrg     case RECORD_TYPE:
    451  1.1  mrg       {
    452  1.1  mrg 	/* The bit offset might be *within* one of the fields (such as
    453  1.1  mrg 	   with nested structs).
    454  1.1  mrg 	   So we want to find the enclosing field, adjust the offset,
    455  1.1  mrg 	   and repeat.  */
    456  1.1  mrg 	if (tree field = get_field_at_bit_offset (get_type (),
    457  1.1  mrg 						  relative_bit_offset))
    458  1.1  mrg 	  {
    459  1.1  mrg 	    int field_bit_offset = int_bit_position (field);
    460  1.1  mrg 	    const region *subregion = mgr->get_field_region (this, field);
    461  1.1  mrg 	    subregion->get_subregions_for_binding
    462  1.1  mrg 	      (mgr, relative_bit_offset - field_bit_offset,
    463  1.1  mrg 	       size_in_bits, type, out);
    464  1.1  mrg 	  }
    465  1.1  mrg       }
    466  1.1  mrg       break;
    467  1.1  mrg     case UNION_TYPE:
    468  1.1  mrg       {
    469  1.1  mrg 	for (tree field = TYPE_FIELDS (get_type ()); field != NULL_TREE;
    470  1.1  mrg 	     field = DECL_CHAIN (field))
    471  1.1  mrg 	  {
    472  1.1  mrg 	    if (TREE_CODE (field) != FIELD_DECL)
    473  1.1  mrg 	      continue;
    474  1.1  mrg 	    const region *subregion = mgr->get_field_region (this, field);
    475  1.1  mrg 	    subregion->get_subregions_for_binding (mgr,
    476  1.1  mrg 						   relative_bit_offset,
    477  1.1  mrg 						   size_in_bits,
    478  1.1  mrg 						   type,
    479  1.1  mrg 						   out);
    480  1.1  mrg 	  }
    481  1.1  mrg       }
    482  1.1  mrg       break;
    483  1.1  mrg     default:
    484  1.1  mrg       /* Do nothing.  */
    485  1.1  mrg       break;
    486  1.1  mrg     }
    487  1.1  mrg }
    488  1.1  mrg 
    489  1.1  mrg /* Walk from this region up to the base region within its cluster, calculating
    490  1.1  mrg    the offset relative to the base region, either as an offset in bits,
    491  1.1  mrg    or a symbolic offset.  */
    492  1.1  mrg 
    493  1.1  mrg region_offset
    494  1.1  mrg region::calc_offset () const
    495  1.1  mrg {
    496  1.1  mrg   const region *iter_region = this;
    497  1.1  mrg   bit_offset_t accum_bit_offset = 0;
    498  1.1  mrg 
    499  1.1  mrg   while (iter_region)
    500  1.1  mrg     {
    501  1.1  mrg       switch (iter_region->get_kind ())
    502  1.1  mrg 	{
    503  1.1  mrg 	case RK_FIELD:
    504  1.1  mrg 	case RK_ELEMENT:
    505  1.1  mrg 	case RK_OFFSET:
    506  1.1  mrg 	case RK_BIT_RANGE:
    507  1.1  mrg 	  {
    508  1.1  mrg 	    bit_offset_t rel_bit_offset;
    509  1.1  mrg 	    if (!iter_region->get_relative_concrete_offset (&rel_bit_offset))
    510  1.1  mrg 	      return region_offset::make_symbolic
    511  1.1  mrg 		(iter_region->get_parent_region ());
    512  1.1  mrg 	    accum_bit_offset += rel_bit_offset;
    513  1.1  mrg 	    iter_region = iter_region->get_parent_region ();
    514  1.1  mrg 	  }
    515  1.1  mrg 	  continue;
    516  1.1  mrg 
    517  1.1  mrg 	case RK_SIZED:
    518  1.1  mrg 	  iter_region = iter_region->get_parent_region ();
    519  1.1  mrg 	  continue;
    520  1.1  mrg 
    521  1.1  mrg 	case RK_CAST:
    522  1.1  mrg 	  {
    523  1.1  mrg 	    const cast_region *cast_reg
    524  1.1  mrg 	      = as_a <const cast_region *> (iter_region);
    525  1.1  mrg 	    iter_region = cast_reg->get_original_region ();
    526  1.1  mrg 	  }
    527  1.1  mrg 	  continue;
    528  1.1  mrg 
    529  1.1  mrg 	default:
    530  1.1  mrg 	  return region_offset::make_concrete (iter_region, accum_bit_offset);
    531  1.1  mrg 	}
    532  1.1  mrg     }
    533  1.1  mrg   return region_offset::make_concrete (iter_region, accum_bit_offset);
    534  1.1  mrg }
    535  1.1  mrg 
    536  1.1  mrg /* Base implementation of region::get_relative_concrete_offset vfunc.  */
    537  1.1  mrg 
    538  1.1  mrg bool
    539  1.1  mrg region::get_relative_concrete_offset (bit_offset_t *) const
    540  1.1  mrg {
    541  1.1  mrg   return false;
    542  1.1  mrg }
    543  1.1  mrg 
    544  1.1  mrg /* Attempt to get the position and size of this region expressed as a
    545  1.1  mrg    concrete range of bytes relative to its parent.
    546  1.1  mrg    If successful, return true and write to *OUT.
    547  1.1  mrg    Otherwise return false.  */
    548  1.1  mrg 
    549  1.1  mrg bool
    550  1.1  mrg region::get_relative_concrete_byte_range (byte_range *out) const
    551  1.1  mrg {
    552  1.1  mrg   /* We must have a concrete offset relative to the parent.  */
    553  1.1  mrg   bit_offset_t rel_bit_offset;
    554  1.1  mrg   if (!get_relative_concrete_offset (&rel_bit_offset))
    555  1.1  mrg     return false;
    556  1.1  mrg   /* ...which must be a whole number of bytes.  */
    557  1.1  mrg   if (rel_bit_offset % BITS_PER_UNIT != 0)
    558  1.1  mrg     return false;
    559  1.1  mrg   byte_offset_t start_byte_offset = rel_bit_offset / BITS_PER_UNIT;
    560  1.1  mrg 
    561  1.1  mrg   /* We must have a concrete size, which must be a whole number
    562  1.1  mrg      of bytes.  */
    563  1.1  mrg   byte_size_t num_bytes;
    564  1.1  mrg   if (!get_byte_size (&num_bytes))
    565  1.1  mrg     return false;
    566  1.1  mrg 
    567  1.1  mrg   /* Success.  */
    568  1.1  mrg   *out = byte_range (start_byte_offset, num_bytes);
    569  1.1  mrg   return true;
    570  1.1  mrg }
    571  1.1  mrg 
    572  1.1  mrg /* Dump a description of this region to stderr.  */
    573  1.1  mrg 
    574  1.1  mrg DEBUG_FUNCTION void
    575  1.1  mrg region::dump (bool simple) const
    576  1.1  mrg {
    577  1.1  mrg   pretty_printer pp;
    578  1.1  mrg   pp_format_decoder (&pp) = default_tree_printer;
    579  1.1  mrg   pp_show_color (&pp) = pp_show_color (global_dc->printer);
    580  1.1  mrg   pp.buffer->stream = stderr;
    581  1.1  mrg   dump_to_pp (&pp, simple);
    582  1.1  mrg   pp_newline (&pp);
    583  1.1  mrg   pp_flush (&pp);
    584  1.1  mrg }
    585  1.1  mrg 
    586  1.1  mrg /* Return a new json::string describing the region.  */
    587  1.1  mrg 
    588  1.1  mrg json::value *
    589  1.1  mrg region::to_json () const
    590  1.1  mrg {
    591  1.1  mrg   label_text desc = get_desc (true);
    592  1.1  mrg   json::value *reg_js = new json::string (desc.m_buffer);
    593  1.1  mrg   desc.maybe_free ();
    594  1.1  mrg   return reg_js;
    595  1.1  mrg }
    596  1.1  mrg 
    597  1.1  mrg /* Generate a description of this region.  */
    598  1.1  mrg 
    599  1.1  mrg DEBUG_FUNCTION label_text
    600  1.1  mrg region::get_desc (bool simple) const
    601  1.1  mrg {
    602  1.1  mrg   pretty_printer pp;
    603  1.1  mrg   pp_format_decoder (&pp) = default_tree_printer;
    604  1.1  mrg   dump_to_pp (&pp, simple);
    605  1.1  mrg   return label_text::take (xstrdup (pp_formatted_text (&pp)));
    606  1.1  mrg }
    607  1.1  mrg 
    608  1.1  mrg /* Base implementation of region::accept vfunc.
    609  1.1  mrg    Subclass implementations should chain up to this.  */
    610  1.1  mrg 
    611  1.1  mrg void
    612  1.1  mrg region::accept (visitor *v) const
    613  1.1  mrg {
    614  1.1  mrg   v->visit_region (this);
    615  1.1  mrg   if (m_parent)
    616  1.1  mrg     m_parent->accept (v);
    617  1.1  mrg }
    618  1.1  mrg 
    619  1.1  mrg /* Return true if this is a symbolic region for deferencing an
    620  1.1  mrg    unknown ptr.
    621  1.1  mrg    We shouldn't attempt to bind values for this region (but
    622  1.1  mrg    can unbind values for other regions).  */
    623  1.1  mrg 
    624  1.1  mrg bool
    625  1.1  mrg region::symbolic_for_unknown_ptr_p () const
    626  1.1  mrg {
    627  1.1  mrg   if (const symbolic_region *sym_reg = dyn_cast_symbolic_region ())
    628  1.1  mrg     if (sym_reg->get_pointer ()->get_kind () == SK_UNKNOWN)
    629  1.1  mrg       return true;
    630  1.1  mrg   return false;
    631  1.1  mrg }
    632  1.1  mrg 
    633  1.1  mrg /* Return true if this is a region for a decl with name DECL_NAME.
    634  1.1  mrg    Intended for use when debugging (for assertions and conditional
    635  1.1  mrg    breakpoints).  */
    636  1.1  mrg 
    637  1.1  mrg DEBUG_FUNCTION bool
    638  1.1  mrg region::is_named_decl_p (const char *decl_name) const
    639  1.1  mrg {
    640  1.1  mrg   if (tree decl = maybe_get_decl ())
    641  1.1  mrg     if (DECL_NAME (decl)
    642  1.1  mrg 	&& !strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)), decl_name))
    643  1.1  mrg       return true;
    644  1.1  mrg   return false;
    645  1.1  mrg }
    646  1.1  mrg 
    647  1.1  mrg /* region's ctor.  */
    648  1.1  mrg 
    649  1.1  mrg region::region (complexity c, unsigned id, const region *parent, tree type)
    650  1.1  mrg : m_complexity (c), m_id (id), m_parent (parent), m_type (type),
    651  1.1  mrg   m_cached_offset (NULL)
    652  1.1  mrg {
    653  1.1  mrg   gcc_assert (type == NULL_TREE || TYPE_P (type));
    654  1.1  mrg }
    655  1.1  mrg 
    656  1.1  mrg /* Comparator for use by vec<const region *>::qsort,
    657  1.1  mrg    using their IDs to order them.  */
    658  1.1  mrg 
    659  1.1  mrg int
    660  1.1  mrg region::cmp_ptr_ptr (const void *p1, const void *p2)
    661  1.1  mrg {
    662  1.1  mrg   const region * const *reg1 = (const region * const *)p1;
    663  1.1  mrg   const region * const *reg2 = (const region * const *)p2;
    664  1.1  mrg 
    665  1.1  mrg   return cmp_ids (*reg1, *reg2);
    666  1.1  mrg }
    667  1.1  mrg 
    668  1.1  mrg /* Determine if a pointer to this region must be non-NULL.
    669  1.1  mrg 
    670  1.1  mrg    Generally, pointers to regions must be non-NULL, but pointers
    671  1.1  mrg    to symbolic_regions might, in fact, be NULL.
    672  1.1  mrg 
    673  1.1  mrg    This allows us to simulate functions like malloc and calloc with:
    674  1.1  mrg    - only one "outcome" from each statement,
    675  1.1  mrg    - the idea that the pointer is on the heap if non-NULL
    676  1.1  mrg    - the possibility that the pointer could be NULL
    677  1.1  mrg    - the idea that successive values returned from malloc are non-equal
    678  1.1  mrg    - to be able to zero-fill for calloc.  */
    679  1.1  mrg 
    680  1.1  mrg bool
    681  1.1  mrg region::non_null_p () const
    682  1.1  mrg {
    683  1.1  mrg   switch (get_kind ())
    684  1.1  mrg     {
    685  1.1  mrg     default:
    686  1.1  mrg       return true;
    687  1.1  mrg     case RK_SYMBOLIC:
    688  1.1  mrg       /* Are we within a symbolic_region?  If so, it could be NULL, and we
    689  1.1  mrg 	 have to fall back on the constraints.  */
    690  1.1  mrg       return false;
    691  1.1  mrg     case RK_HEAP_ALLOCATED:
    692  1.1  mrg       return false;
    693  1.1  mrg     }
    694  1.1  mrg }
    695  1.1  mrg 
    696  1.1  mrg /* Return true iff this region is defined in terms of SVAL.  */
    697  1.1  mrg 
    698  1.1  mrg bool
    699  1.1  mrg region::involves_p (const svalue *sval) const
    700  1.1  mrg {
    701  1.1  mrg   if (const symbolic_region *symbolic_reg = dyn_cast_symbolic_region ())
    702  1.1  mrg     {
    703  1.1  mrg       if (symbolic_reg->get_pointer ()->involves_p (sval))
    704  1.1  mrg 	return true;
    705  1.1  mrg     }
    706  1.1  mrg 
    707  1.1  mrg   return false;
    708  1.1  mrg }
    709  1.1  mrg 
    710  1.1  mrg /* Comparator for trees to impose a deterministic ordering on
    711  1.1  mrg    T1 and T2.  */
    712  1.1  mrg 
    713  1.1  mrg static int
    714  1.1  mrg tree_cmp (const_tree t1, const_tree t2)
    715  1.1  mrg {
    716  1.1  mrg   gcc_assert (t1);
    717  1.1  mrg   gcc_assert (t2);
    718  1.1  mrg 
    719  1.1  mrg   /* Test tree codes first.  */
    720  1.1  mrg   if (TREE_CODE (t1) != TREE_CODE (t2))
    721  1.1  mrg     return TREE_CODE (t1) - TREE_CODE (t2);
    722  1.1  mrg 
    723  1.1  mrg   /* From this point on, we know T1 and T2 have the same tree code.  */
    724  1.1  mrg 
    725  1.1  mrg   if (DECL_P (t1))
    726  1.1  mrg     {
    727  1.1  mrg       if (DECL_NAME (t1) && DECL_NAME (t2))
    728  1.1  mrg 	return strcmp (IDENTIFIER_POINTER (DECL_NAME (t1)),
    729  1.1  mrg 		       IDENTIFIER_POINTER (DECL_NAME (t2)));
    730  1.1  mrg       else
    731  1.1  mrg 	{
    732  1.1  mrg 	  if (DECL_NAME (t1))
    733  1.1  mrg 	    return -1;
    734  1.1  mrg 	  else if (DECL_NAME (t2))
    735  1.1  mrg 	    return 1;
    736  1.1  mrg 	  else
    737  1.1  mrg 	    return DECL_UID (t1) - DECL_UID (t2);
    738  1.1  mrg 	}
    739  1.1  mrg     }
    740  1.1  mrg 
    741  1.1  mrg   switch (TREE_CODE (t1))
    742  1.1  mrg     {
    743  1.1  mrg     case SSA_NAME:
    744  1.1  mrg       {
    745  1.1  mrg 	if (SSA_NAME_VAR (t1) && SSA_NAME_VAR (t2))
    746  1.1  mrg 	  {
    747  1.1  mrg 	    int var_cmp = tree_cmp (SSA_NAME_VAR (t1), SSA_NAME_VAR (t2));
    748  1.1  mrg 	    if (var_cmp)
    749  1.1  mrg 	      return var_cmp;
    750  1.1  mrg 	    return SSA_NAME_VERSION (t1) - SSA_NAME_VERSION (t2);
    751  1.1  mrg 	  }
    752  1.1  mrg 	else
    753  1.1  mrg 	  {
    754  1.1  mrg 	    if (SSA_NAME_VAR (t1))
    755  1.1  mrg 	      return -1;
    756  1.1  mrg 	    else if (SSA_NAME_VAR (t2))
    757  1.1  mrg 	      return 1;
    758  1.1  mrg 	    else
    759  1.1  mrg 	      return SSA_NAME_VERSION (t1) - SSA_NAME_VERSION (t2);
    760  1.1  mrg 	  }
    761  1.1  mrg       }
    762  1.1  mrg       break;
    763  1.1  mrg 
    764  1.1  mrg     case INTEGER_CST:
    765  1.1  mrg       return tree_int_cst_compare (t1, t2);
    766  1.1  mrg 
    767  1.1  mrg     case REAL_CST:
    768  1.1  mrg       {
    769  1.1  mrg 	const real_value *rv1 = TREE_REAL_CST_PTR (t1);
    770  1.1  mrg 	const real_value *rv2 = TREE_REAL_CST_PTR (t2);
    771  1.1  mrg 	if (real_compare (UNORDERED_EXPR, rv1, rv2))
    772  1.1  mrg 	  {
    773  1.1  mrg 	    /* Impose an arbitrary order on NaNs relative to other NaNs
    774  1.1  mrg 	       and to non-NaNs.  */
    775  1.1  mrg 	    if (int cmp_isnan = real_isnan (rv1) - real_isnan (rv2))
    776  1.1  mrg 	      return cmp_isnan;
    777  1.1  mrg 	    if (int cmp_issignaling_nan
    778  1.1  mrg 		  = real_issignaling_nan (rv1) - real_issignaling_nan (rv2))
    779  1.1  mrg 	      return cmp_issignaling_nan;
    780  1.1  mrg 	    return real_isneg (rv1) - real_isneg (rv2);
    781  1.1  mrg 	  }
    782  1.1  mrg 	if (real_compare (LT_EXPR, rv1, rv2))
    783  1.1  mrg 	  return -1;
    784  1.1  mrg 	if (real_compare (GT_EXPR, rv1, rv2))
    785  1.1  mrg 	  return 1;
    786  1.1  mrg 	return 0;
    787  1.1  mrg       }
    788  1.1  mrg 
    789  1.1  mrg     case STRING_CST:
    790  1.1  mrg       return strcmp (TREE_STRING_POINTER (t1),
    791  1.1  mrg 		     TREE_STRING_POINTER (t2));
    792  1.1  mrg 
    793  1.1  mrg     default:
    794  1.1  mrg       gcc_unreachable ();
    795  1.1  mrg       break;
    796  1.1  mrg     }
    797  1.1  mrg 
    798  1.1  mrg   gcc_unreachable ();
    799  1.1  mrg 
    800  1.1  mrg   return 0;
    801  1.1  mrg }
    802  1.1  mrg 
    803  1.1  mrg /* qsort comparator for trees to impose a deterministic ordering on
    804  1.1  mrg    P1 and P2.  */
    805  1.1  mrg 
    806  1.1  mrg int
    807  1.1  mrg tree_cmp (const void *p1, const void *p2)
    808  1.1  mrg {
    809  1.1  mrg   const_tree t1 = *(const_tree const *)p1;
    810  1.1  mrg   const_tree t2 = *(const_tree const *)p2;
    811  1.1  mrg 
    812  1.1  mrg   return tree_cmp (t1, t2);
    813  1.1  mrg }
    814  1.1  mrg 
    815  1.1  mrg /* class frame_region : public space_region.  */
    816  1.1  mrg 
    817  1.1  mrg frame_region::~frame_region ()
    818  1.1  mrg {
    819  1.1  mrg   for (map_t::iterator iter = m_locals.begin ();
    820  1.1  mrg        iter != m_locals.end ();
    821  1.1  mrg        ++iter)
    822  1.1  mrg     delete (*iter).second;
    823  1.1  mrg }
    824  1.1  mrg 
    825  1.1  mrg void
    826  1.1  mrg frame_region::accept (visitor *v) const
    827  1.1  mrg {
    828  1.1  mrg   region::accept (v);
    829  1.1  mrg   if (m_calling_frame)
    830  1.1  mrg     m_calling_frame->accept (v);
    831  1.1  mrg }
    832  1.1  mrg 
    833  1.1  mrg /* Implementation of region::dump_to_pp vfunc for frame_region.  */
    834  1.1  mrg 
    835  1.1  mrg void
    836  1.1  mrg frame_region::dump_to_pp (pretty_printer *pp, bool simple) const
    837  1.1  mrg {
    838  1.1  mrg   if (simple)
    839  1.1  mrg     pp_printf (pp, "frame: %qs@%i", function_name (m_fun), get_stack_depth ());
    840  1.1  mrg   else
    841  1.1  mrg     pp_printf (pp, "frame_region(%qs, index: %i, depth: %i)",
    842  1.1  mrg 	       function_name (m_fun), m_index, get_stack_depth ());
    843  1.1  mrg }
    844  1.1  mrg 
    845  1.1  mrg const decl_region *
    846  1.1  mrg frame_region::get_region_for_local (region_model_manager *mgr,
    847  1.1  mrg 				    tree expr,
    848  1.1  mrg 				    const region_model_context *ctxt) const
    849  1.1  mrg {
    850  1.1  mrg   if (CHECKING_P)
    851  1.1  mrg     {
    852  1.1  mrg       /* Verify that EXPR is a local or SSA name, and that it's for the
    853  1.1  mrg 	 correct function for this stack frame.  */
    854  1.1  mrg       gcc_assert (TREE_CODE (expr) == PARM_DECL
    855  1.1  mrg 		  || TREE_CODE (expr) == VAR_DECL
    856  1.1  mrg 		  || TREE_CODE (expr) == SSA_NAME
    857  1.1  mrg 		  || TREE_CODE (expr) == RESULT_DECL);
    858  1.1  mrg       switch (TREE_CODE (expr))
    859  1.1  mrg 	{
    860  1.1  mrg 	default:
    861  1.1  mrg 	  gcc_unreachable ();
    862  1.1  mrg 	case VAR_DECL:
    863  1.1  mrg 	  gcc_assert (!is_global_var (expr));
    864  1.1  mrg 	  /* Fall through.  */
    865  1.1  mrg 	case PARM_DECL:
    866  1.1  mrg 	case RESULT_DECL:
    867  1.1  mrg 	  gcc_assert (DECL_CONTEXT (expr) == m_fun->decl);
    868  1.1  mrg 	  break;
    869  1.1  mrg 	case SSA_NAME:
    870  1.1  mrg 	  {
    871  1.1  mrg 	    if (tree var = SSA_NAME_VAR (expr))
    872  1.1  mrg 	      {
    873  1.1  mrg 		if (DECL_P (var))
    874  1.1  mrg 		  gcc_assert (DECL_CONTEXT (var) == m_fun->decl);
    875  1.1  mrg 	      }
    876  1.1  mrg 	    else if (ctxt)
    877  1.1  mrg 	      if (const extrinsic_state *ext_state = ctxt->get_ext_state ())
    878  1.1  mrg 		if (const supergraph *sg
    879  1.1  mrg 		    = ext_state->get_engine ()->get_supergraph ())
    880  1.1  mrg 		  {
    881  1.1  mrg 		    const gimple *def_stmt = SSA_NAME_DEF_STMT (expr);
    882  1.1  mrg 		    const supernode *snode
    883  1.1  mrg 		      = sg->get_supernode_for_stmt (def_stmt);
    884  1.1  mrg 		    gcc_assert (snode->get_function () == m_fun);
    885  1.1  mrg 		  }
    886  1.1  mrg 	  }
    887  1.1  mrg 	  break;
    888  1.1  mrg 	}
    889  1.1  mrg     }
    890  1.1  mrg 
    891  1.1  mrg   /* Ideally we'd use mutable here.  */
    892  1.1  mrg   map_t &mutable_locals = const_cast <map_t &> (m_locals);
    893  1.1  mrg 
    894  1.1  mrg   if (decl_region **slot = mutable_locals.get (expr))
    895  1.1  mrg     return *slot;
    896  1.1  mrg   decl_region *reg
    897  1.1  mrg     = new decl_region (mgr->alloc_region_id (), this, expr);
    898  1.1  mrg   mutable_locals.put (expr, reg);
    899  1.1  mrg   return reg;
    900  1.1  mrg }
    901  1.1  mrg 
    902  1.1  mrg /* class globals_region : public space_region.  */
    903  1.1  mrg 
    904  1.1  mrg /* Implementation of region::dump_to_pp vfunc for globals_region.  */
    905  1.1  mrg 
    906  1.1  mrg void
    907  1.1  mrg globals_region::dump_to_pp (pretty_printer *pp, bool simple) const
    908  1.1  mrg {
    909  1.1  mrg   if (simple)
    910  1.1  mrg     pp_string (pp, "::");
    911  1.1  mrg   else
    912  1.1  mrg     pp_string (pp, "globals");
    913  1.1  mrg }
    914  1.1  mrg 
    915  1.1  mrg /* class code_region : public map_region.  */
    916  1.1  mrg 
    917  1.1  mrg /* Implementation of region::dump_to_pp vfunc for code_region.  */
    918  1.1  mrg 
    919  1.1  mrg void
    920  1.1  mrg code_region::dump_to_pp (pretty_printer *pp, bool simple) const
    921  1.1  mrg {
    922  1.1  mrg   if (simple)
    923  1.1  mrg     pp_string (pp, "code region");
    924  1.1  mrg   else
    925  1.1  mrg     pp_string (pp, "code_region()");
    926  1.1  mrg }
    927  1.1  mrg 
    928  1.1  mrg /* class function_region : public region.  */
    929  1.1  mrg 
    930  1.1  mrg /* Implementation of region::dump_to_pp vfunc for function_region.  */
    931  1.1  mrg 
    932  1.1  mrg void
    933  1.1  mrg function_region::dump_to_pp (pretty_printer *pp, bool simple) const
    934  1.1  mrg {
    935  1.1  mrg   if (simple)
    936  1.1  mrg     {
    937  1.1  mrg       dump_quoted_tree (pp, m_fndecl);
    938  1.1  mrg     }
    939  1.1  mrg   else
    940  1.1  mrg     {
    941  1.1  mrg       pp_string (pp, "function_region(");
    942  1.1  mrg       dump_quoted_tree (pp, m_fndecl);
    943  1.1  mrg       pp_string (pp, ")");
    944  1.1  mrg     }
    945  1.1  mrg }
    946  1.1  mrg 
    947  1.1  mrg /* class label_region : public region.  */
    948  1.1  mrg 
    949  1.1  mrg /* Implementation of region::dump_to_pp vfunc for label_region.  */
    950  1.1  mrg 
    951  1.1  mrg void
    952  1.1  mrg label_region::dump_to_pp (pretty_printer *pp, bool simple) const
    953  1.1  mrg {
    954  1.1  mrg   if (simple)
    955  1.1  mrg     {
    956  1.1  mrg       dump_quoted_tree (pp, m_label);
    957  1.1  mrg     }
    958  1.1  mrg   else
    959  1.1  mrg     {
    960  1.1  mrg       pp_string (pp, "label_region(");
    961  1.1  mrg       dump_quoted_tree (pp, m_label);
    962  1.1  mrg       pp_string (pp, ")");
    963  1.1  mrg     }
    964  1.1  mrg }
    965  1.1  mrg 
    966  1.1  mrg /* class stack_region : public region.  */
    967  1.1  mrg 
    968  1.1  mrg /* Implementation of region::dump_to_pp vfunc for stack_region.  */
    969  1.1  mrg 
    970  1.1  mrg void
    971  1.1  mrg stack_region::dump_to_pp (pretty_printer *pp, bool simple) const
    972  1.1  mrg {
    973  1.1  mrg   if (simple)
    974  1.1  mrg     pp_string (pp, "stack region");
    975  1.1  mrg   else
    976  1.1  mrg     pp_string (pp, "stack_region()");
    977  1.1  mrg }
    978  1.1  mrg 
    979  1.1  mrg /* class heap_region : public region.  */
    980  1.1  mrg 
    981  1.1  mrg /* Implementation of region::dump_to_pp vfunc for heap_region.  */
    982  1.1  mrg 
    983  1.1  mrg void
    984  1.1  mrg heap_region::dump_to_pp (pretty_printer *pp, bool simple) const
    985  1.1  mrg {
    986  1.1  mrg   if (simple)
    987  1.1  mrg     pp_string (pp, "heap region");
    988  1.1  mrg   else
    989  1.1  mrg     pp_string (pp, "heap_region()");
    990  1.1  mrg }
    991  1.1  mrg 
    992  1.1  mrg /* class root_region : public region.  */
    993  1.1  mrg 
    994  1.1  mrg /* root_region's ctor.  */
    995  1.1  mrg 
    996  1.1  mrg root_region::root_region (unsigned id)
    997  1.1  mrg : region (complexity (1, 1), id, NULL, NULL_TREE)
    998  1.1  mrg {
    999  1.1  mrg }
   1000  1.1  mrg 
   1001  1.1  mrg /* Implementation of region::dump_to_pp vfunc for root_region.  */
   1002  1.1  mrg 
   1003  1.1  mrg void
   1004  1.1  mrg root_region::dump_to_pp (pretty_printer *pp, bool simple) const
   1005  1.1  mrg {
   1006  1.1  mrg   if (simple)
   1007  1.1  mrg     pp_string (pp, "root region");
   1008  1.1  mrg   else
   1009  1.1  mrg     pp_string (pp, "root_region()");
   1010  1.1  mrg }
   1011  1.1  mrg 
   1012  1.1  mrg /* class symbolic_region : public map_region.  */
   1013  1.1  mrg 
   1014  1.1  mrg /* symbolic_region's ctor.  */
   1015  1.1  mrg 
   1016  1.1  mrg symbolic_region::symbolic_region (unsigned id, region *parent,
   1017  1.1  mrg 				  const svalue *sval_ptr)
   1018  1.1  mrg : region (complexity::from_pair (parent, sval_ptr), id, parent,
   1019  1.1  mrg 	  (sval_ptr->get_type ()
   1020  1.1  mrg 	   ? TREE_TYPE (sval_ptr->get_type ())
   1021  1.1  mrg 	   : NULL_TREE)),
   1022  1.1  mrg   m_sval_ptr (sval_ptr)
   1023  1.1  mrg {
   1024  1.1  mrg }
   1025  1.1  mrg 
   1026  1.1  mrg /* Implementation of region::accept vfunc for symbolic_region.  */
   1027  1.1  mrg 
   1028  1.1  mrg void
   1029  1.1  mrg symbolic_region::accept (visitor *v) const
   1030  1.1  mrg {
   1031  1.1  mrg   region::accept (v);
   1032  1.1  mrg   m_sval_ptr->accept (v);
   1033  1.1  mrg }
   1034  1.1  mrg 
   1035  1.1  mrg /* Implementation of region::dump_to_pp vfunc for symbolic_region.  */
   1036  1.1  mrg 
   1037  1.1  mrg void
   1038  1.1  mrg symbolic_region::dump_to_pp (pretty_printer *pp, bool simple) const
   1039  1.1  mrg {
   1040  1.1  mrg   if (simple)
   1041  1.1  mrg     {
   1042  1.1  mrg       pp_string (pp, "(*");
   1043  1.1  mrg       m_sval_ptr->dump_to_pp (pp, simple);
   1044  1.1  mrg       pp_string (pp, ")");
   1045  1.1  mrg     }
   1046  1.1  mrg   else
   1047  1.1  mrg     {
   1048  1.1  mrg       pp_string (pp, "symbolic_region(");
   1049  1.1  mrg       get_parent_region ()->dump_to_pp (pp, simple);
   1050  1.1  mrg       if (get_type ())
   1051  1.1  mrg 	{
   1052  1.1  mrg 	  pp_string (pp, ", ");
   1053  1.1  mrg 	  print_quoted_type (pp, get_type ());
   1054  1.1  mrg 	}
   1055  1.1  mrg       pp_string (pp, ", ");
   1056  1.1  mrg       m_sval_ptr->dump_to_pp (pp, simple);
   1057  1.1  mrg       pp_string (pp, ")");
   1058  1.1  mrg     }
   1059  1.1  mrg }
   1060  1.1  mrg 
   1061  1.1  mrg /* class decl_region : public region.  */
   1062  1.1  mrg 
   1063  1.1  mrg /* Implementation of region::dump_to_pp vfunc for decl_region.  */
   1064  1.1  mrg 
   1065  1.1  mrg void
   1066  1.1  mrg decl_region::dump_to_pp (pretty_printer *pp, bool simple) const
   1067  1.1  mrg {
   1068  1.1  mrg   if (simple)
   1069  1.1  mrg     pp_printf (pp, "%E", m_decl);
   1070  1.1  mrg   else
   1071  1.1  mrg     {
   1072  1.1  mrg       pp_string (pp, "decl_region(");
   1073  1.1  mrg       get_parent_region ()->dump_to_pp (pp, simple);
   1074  1.1  mrg       pp_string (pp, ", ");
   1075  1.1  mrg       print_quoted_type (pp, get_type ());
   1076  1.1  mrg       pp_printf (pp, ", %qE)", m_decl);
   1077  1.1  mrg     }
   1078  1.1  mrg }
   1079  1.1  mrg 
   1080  1.1  mrg /* Get the stack depth for the frame containing this decl, or 0
   1081  1.1  mrg    for a global.  */
   1082  1.1  mrg 
   1083  1.1  mrg int
   1084  1.1  mrg decl_region::get_stack_depth () const
   1085  1.1  mrg {
   1086  1.1  mrg   if (get_parent_region () == NULL)
   1087  1.1  mrg     return 0;
   1088  1.1  mrg   if (const frame_region *frame_reg
   1089  1.1  mrg 	= get_parent_region ()->dyn_cast_frame_region ())
   1090  1.1  mrg     return frame_reg->get_stack_depth ();
   1091  1.1  mrg   return 0;
   1092  1.1  mrg }
   1093  1.1  mrg 
   1094  1.1  mrg /* If the underlying decl is in the global constant pool,
   1095  1.1  mrg    return an svalue representing the constant value.
   1096  1.1  mrg    Otherwise return NULL.  */
   1097  1.1  mrg 
   1098  1.1  mrg const svalue *
   1099  1.1  mrg decl_region::maybe_get_constant_value (region_model_manager *mgr) const
   1100  1.1  mrg {
   1101  1.1  mrg   if (TREE_CODE (m_decl) == VAR_DECL
   1102  1.1  mrg       && DECL_IN_CONSTANT_POOL (m_decl)
   1103  1.1  mrg       && DECL_INITIAL (m_decl)
   1104  1.1  mrg       && TREE_CODE (DECL_INITIAL (m_decl)) == CONSTRUCTOR)
   1105  1.1  mrg     return get_svalue_for_constructor (DECL_INITIAL (m_decl), mgr);
   1106  1.1  mrg   return NULL;
   1107  1.1  mrg }
   1108  1.1  mrg 
   1109  1.1  mrg /* Get an svalue for CTOR, a CONSTRUCTOR for this region's decl.  */
   1110  1.1  mrg 
   1111  1.1  mrg const svalue *
   1112  1.1  mrg decl_region::get_svalue_for_constructor (tree ctor,
   1113  1.1  mrg 					 region_model_manager *mgr) const
   1114  1.1  mrg {
   1115  1.1  mrg   gcc_assert (!TREE_CLOBBER_P (ctor));
   1116  1.1  mrg 
   1117  1.1  mrg   /* Create a binding map, applying ctor to it, using this
   1118  1.1  mrg      decl_region as the base region when building child regions
   1119  1.1  mrg      for offset calculations.  */
   1120  1.1  mrg   binding_map map;
   1121  1.1  mrg   if (!map.apply_ctor_to_region (this, ctor, mgr))
   1122  1.1  mrg     return mgr->get_or_create_unknown_svalue (get_type ());
   1123  1.1  mrg 
   1124  1.1  mrg   /* Return a compound svalue for the map we built.  */
   1125  1.1  mrg   return mgr->get_or_create_compound_svalue (get_type (), map);
   1126  1.1  mrg }
   1127  1.1  mrg 
   1128  1.1  mrg /* For use on decl_regions for global variables.
   1129  1.1  mrg 
   1130  1.1  mrg    Get an svalue for the initial value of this region at entry to
   1131  1.1  mrg    "main" (either based on DECL_INITIAL, or implicit initialization to
   1132  1.1  mrg    zero.
   1133  1.1  mrg 
   1134  1.1  mrg    Return NULL if there is a problem.  */
   1135  1.1  mrg 
   1136  1.1  mrg const svalue *
   1137  1.1  mrg decl_region::get_svalue_for_initializer (region_model_manager *mgr) const
   1138  1.1  mrg {
   1139  1.1  mrg   tree init = DECL_INITIAL (m_decl);
   1140  1.1  mrg   if (!init)
   1141  1.1  mrg     {
   1142  1.1  mrg       /* If we have an "extern" decl then there may be an initializer in
   1143  1.1  mrg 	 another TU.  */
   1144  1.1  mrg       if (DECL_EXTERNAL (m_decl))
   1145  1.1  mrg 	return NULL;
   1146  1.1  mrg 
   1147  1.1  mrg       /* Implicit initialization to zero; use a compound_svalue for it.
   1148  1.1  mrg 	 Doing so requires that we have a concrete binding for this region,
   1149  1.1  mrg 	 which can fail if we have a region with unknown size
   1150  1.1  mrg 	 (e.g. "extern const char arr[];").  */
   1151  1.1  mrg       const binding_key *binding
   1152  1.1  mrg 	= binding_key::make (mgr->get_store_manager (), this);
   1153  1.1  mrg       if (binding->symbolic_p ())
   1154  1.1  mrg 	return NULL;
   1155  1.1  mrg 
   1156  1.1  mrg       binding_cluster c (this);
   1157  1.1  mrg       c.zero_fill_region (mgr->get_store_manager (), this);
   1158  1.1  mrg       return mgr->get_or_create_compound_svalue (TREE_TYPE (m_decl),
   1159  1.1  mrg 						 c.get_map ());
   1160  1.1  mrg     }
   1161  1.1  mrg 
   1162  1.1  mrg   /* LTO can write out error_mark_node as the DECL_INITIAL for simple scalar
   1163  1.1  mrg      values (to avoid writing out an extra section).  */
   1164  1.1  mrg   if (init == error_mark_node)
   1165  1.1  mrg     return NULL;
   1166  1.1  mrg 
   1167  1.1  mrg   if (TREE_CODE (init) == CONSTRUCTOR)
   1168  1.1  mrg     return get_svalue_for_constructor (init, mgr);
   1169  1.1  mrg 
   1170  1.1  mrg   /* Reuse the get_rvalue logic from region_model.  */
   1171  1.1  mrg   region_model m (mgr);
   1172  1.1  mrg   return m.get_rvalue (path_var (init, 0), NULL);
   1173  1.1  mrg }
   1174  1.1  mrg 
   1175  1.1  mrg /* Subroutine of symnode_requires_tracking_p; return true if REF
   1176  1.1  mrg    might imply that we should be tracking the value of its decl.  */
   1177  1.1  mrg 
   1178  1.1  mrg static bool
   1179  1.1  mrg ipa_ref_requires_tracking (ipa_ref *ref)
   1180  1.1  mrg {
   1181  1.1  mrg   /* If we have a load/store/alias of the symbol, then we'll track
   1182  1.1  mrg      the decl's value.  */
   1183  1.1  mrg   if (ref->use != IPA_REF_ADDR)
   1184  1.1  mrg     return true;
   1185  1.1  mrg 
   1186  1.1  mrg   if (ref->stmt == NULL)
   1187  1.1  mrg     return true;
   1188  1.1  mrg 
   1189  1.1  mrg   switch (ref->stmt->code)
   1190  1.1  mrg     {
   1191  1.1  mrg     default:
   1192  1.1  mrg       return true;
   1193  1.1  mrg     case GIMPLE_CALL:
   1194  1.1  mrg       {
   1195  1.1  mrg 	cgraph_node *caller_cnode = dyn_cast <cgraph_node *> (ref->referring);
   1196  1.1  mrg 	if (caller_cnode == NULL)
   1197  1.1  mrg 	  return true;
   1198  1.1  mrg 	cgraph_edge *edge = caller_cnode->get_edge (ref->stmt);
   1199  1.1  mrg 	if (!edge)
   1200  1.1  mrg 	  return true;
   1201  1.1  mrg 	if (edge->callee == NULL)
   1202  1.1  mrg 	  return true; /* e.g. call through function ptr.  */
   1203  1.1  mrg 	if (edge->callee->definition)
   1204  1.1  mrg 	  return true;
   1205  1.1  mrg 	/* If we get here, then this ref is a pointer passed to
   1206  1.1  mrg 	   a function we don't have the definition for.  */
   1207  1.1  mrg 	return false;
   1208  1.1  mrg       }
   1209  1.1  mrg       break;
   1210  1.1  mrg     case GIMPLE_ASM:
   1211  1.1  mrg       {
   1212  1.1  mrg 	const gasm *asm_stmt = as_a <const gasm *> (ref->stmt);
   1213  1.1  mrg 	if (gimple_asm_noutputs (asm_stmt) > 0)
   1214  1.1  mrg 	  return true;
   1215  1.1  mrg 	if (gimple_asm_nclobbers (asm_stmt) > 0)
   1216  1.1  mrg 	  return true;
   1217  1.1  mrg 	/* If we get here, then this ref is the decl being passed
   1218  1.1  mrg 	   by pointer to asm with no outputs.  */
   1219  1.1  mrg 	return false;
   1220  1.1  mrg       }
   1221  1.1  mrg       break;
   1222  1.1  mrg     }
   1223  1.1  mrg }
   1224  1.1  mrg 
   1225  1.1  mrg /* Determine if the decl for SYMNODE should have binding_clusters
   1226  1.1  mrg    in our state objects; return false to optimize away tracking
   1227  1.1  mrg    certain decls in our state objects, as an optimization.  */
   1228  1.1  mrg 
   1229  1.1  mrg static bool
   1230  1.1  mrg symnode_requires_tracking_p (symtab_node *symnode)
   1231  1.1  mrg {
   1232  1.1  mrg   gcc_assert (symnode);
   1233  1.1  mrg   if (symnode->externally_visible)
   1234  1.1  mrg     return true;
   1235  1.1  mrg   tree context_fndecl = DECL_CONTEXT (symnode->decl);
   1236  1.1  mrg   if (context_fndecl == NULL)
   1237  1.1  mrg     return true;
   1238  1.1  mrg   if (TREE_CODE (context_fndecl) != FUNCTION_DECL)
   1239  1.1  mrg     return true;
   1240  1.1  mrg   for (auto ref : symnode->ref_list.referring)
   1241  1.1  mrg     if (ipa_ref_requires_tracking (ref))
   1242  1.1  mrg       return true;
   1243  1.1  mrg 
   1244  1.1  mrg   /* If we get here, then we don't have uses of this decl that require
   1245  1.1  mrg      tracking; we never read from it or write to it explicitly.  */
   1246  1.1  mrg   return false;
   1247  1.1  mrg }
   1248  1.1  mrg 
   1249  1.1  mrg /* Subroutine of decl_region ctor: determine whether this decl_region
   1250  1.1  mrg    can have binding_clusters; return false to optimize away tracking
   1251  1.1  mrg    of certain decls in our state objects, as an optimization.  */
   1252  1.1  mrg 
   1253  1.1  mrg bool
   1254  1.1  mrg decl_region::calc_tracked_p (tree decl)
   1255  1.1  mrg {
   1256  1.1  mrg   /* Precondition of symtab_node::get.  */
   1257  1.1  mrg   if (TREE_CODE (decl) == VAR_DECL
   1258  1.1  mrg       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl) || in_lto_p))
   1259  1.1  mrg     if (symtab_node *symnode = symtab_node::get (decl))
   1260  1.1  mrg       return symnode_requires_tracking_p (symnode);
   1261  1.1  mrg   return true;
   1262  1.1  mrg }
   1263  1.1  mrg 
   1264  1.1  mrg /* class field_region : public region.  */
   1265  1.1  mrg 
   1266  1.1  mrg /* Implementation of region::dump_to_pp vfunc for field_region.  */
   1267  1.1  mrg 
   1268  1.1  mrg void
   1269  1.1  mrg field_region::dump_to_pp (pretty_printer *pp, bool simple) const
   1270  1.1  mrg {
   1271  1.1  mrg   if (simple)
   1272  1.1  mrg     {
   1273  1.1  mrg       get_parent_region ()->dump_to_pp (pp, simple);
   1274  1.1  mrg       pp_string (pp, ".");
   1275  1.1  mrg       pp_printf (pp, "%E", m_field);
   1276  1.1  mrg     }
   1277  1.1  mrg   else
   1278  1.1  mrg     {
   1279  1.1  mrg       pp_string (pp, "field_region(");
   1280  1.1  mrg       get_parent_region ()->dump_to_pp (pp, simple);
   1281  1.1  mrg       pp_string (pp, ", ");
   1282  1.1  mrg       print_quoted_type (pp, get_type ());
   1283  1.1  mrg       pp_printf (pp, ", %qE)", m_field);
   1284  1.1  mrg     }
   1285  1.1  mrg }
   1286  1.1  mrg 
   1287  1.1  mrg /* Implementation of region::get_relative_concrete_offset vfunc
   1288  1.1  mrg    for field_region.  */
   1289  1.1  mrg 
   1290  1.1  mrg bool
   1291  1.1  mrg field_region::get_relative_concrete_offset (bit_offset_t *out) const
   1292  1.1  mrg {
   1293  1.1  mrg   /* Compare with e.g. gimple-fold.cc's
   1294  1.1  mrg      fold_nonarray_ctor_reference.  */
   1295  1.1  mrg   tree byte_offset = DECL_FIELD_OFFSET (m_field);
   1296  1.1  mrg   if (TREE_CODE (byte_offset) != INTEGER_CST)
   1297  1.1  mrg     return false;
   1298  1.1  mrg   tree field_offset = DECL_FIELD_BIT_OFFSET (m_field);
   1299  1.1  mrg   /* Compute bit offset of the field.  */
   1300  1.1  mrg   offset_int bitoffset
   1301  1.1  mrg     = (wi::to_offset (field_offset)
   1302  1.1  mrg        + (wi::to_offset (byte_offset) << LOG2_BITS_PER_UNIT));
   1303  1.1  mrg   *out = bitoffset;
   1304  1.1  mrg   return true;
   1305  1.1  mrg }
   1306  1.1  mrg 
   1307  1.1  mrg /* class element_region : public region.  */
   1308  1.1  mrg 
   1309  1.1  mrg /* Implementation of region::accept vfunc for element_region.  */
   1310  1.1  mrg 
   1311  1.1  mrg void
   1312  1.1  mrg element_region::accept (visitor *v) const
   1313  1.1  mrg {
   1314  1.1  mrg   region::accept (v);
   1315  1.1  mrg   m_index->accept (v);
   1316  1.1  mrg }
   1317  1.1  mrg 
   1318  1.1  mrg /* Implementation of region::dump_to_pp vfunc for element_region.  */
   1319  1.1  mrg 
   1320  1.1  mrg void
   1321  1.1  mrg element_region::dump_to_pp (pretty_printer *pp, bool simple) const
   1322  1.1  mrg {
   1323  1.1  mrg   if (simple)
   1324  1.1  mrg     {
   1325  1.1  mrg       //pp_string (pp, "(");
   1326  1.1  mrg       get_parent_region ()->dump_to_pp (pp, simple);
   1327  1.1  mrg       pp_string (pp, "[");
   1328  1.1  mrg       m_index->dump_to_pp (pp, simple);
   1329  1.1  mrg       pp_string (pp, "]");
   1330  1.1  mrg       //pp_string (pp, ")");
   1331  1.1  mrg     }
   1332  1.1  mrg   else
   1333  1.1  mrg     {
   1334  1.1  mrg       pp_string (pp, "element_region(");
   1335  1.1  mrg       get_parent_region ()->dump_to_pp (pp, simple);
   1336  1.1  mrg       pp_string (pp, ", ");
   1337  1.1  mrg       print_quoted_type (pp, get_type ());
   1338  1.1  mrg       pp_string (pp, ", ");
   1339  1.1  mrg       m_index->dump_to_pp (pp, simple);
   1340  1.1  mrg       pp_printf (pp, ")");
   1341  1.1  mrg     }
   1342  1.1  mrg }
   1343  1.1  mrg 
   1344  1.1  mrg /* Implementation of region::get_relative_concrete_offset vfunc
   1345  1.1  mrg    for element_region.  */
   1346  1.1  mrg 
   1347  1.1  mrg bool
   1348  1.1  mrg element_region::get_relative_concrete_offset (bit_offset_t *out) const
   1349  1.1  mrg {
   1350  1.1  mrg   if (tree idx_cst = m_index->maybe_get_constant ())
   1351  1.1  mrg     {
   1352  1.1  mrg       gcc_assert (TREE_CODE (idx_cst) == INTEGER_CST);
   1353  1.1  mrg 
   1354  1.1  mrg       tree elem_type = get_type ();
   1355  1.1  mrg       offset_int element_idx = wi::to_offset (idx_cst);
   1356  1.1  mrg 
   1357  1.1  mrg       /* First, use int_size_in_bytes, to reject the case where we
   1358  1.1  mrg 	 have an incomplete type, or a non-constant value.  */
   1359  1.1  mrg       HOST_WIDE_INT hwi_byte_size = int_size_in_bytes (elem_type);
   1360  1.1  mrg       if (hwi_byte_size > 0)
   1361  1.1  mrg 	{
   1362  1.1  mrg 	  offset_int element_bit_size
   1363  1.1  mrg 	    = hwi_byte_size << LOG2_BITS_PER_UNIT;
   1364  1.1  mrg 	  offset_int element_bit_offset
   1365  1.1  mrg 	    = element_idx * element_bit_size;
   1366  1.1  mrg 	  *out = element_bit_offset;
   1367  1.1  mrg 	  return true;
   1368  1.1  mrg 	}
   1369  1.1  mrg     }
   1370  1.1  mrg   return false;
   1371  1.1  mrg }
   1372  1.1  mrg 
   1373  1.1  mrg /* class offset_region : public region.  */
   1374  1.1  mrg 
   1375  1.1  mrg /* Implementation of region::accept vfunc for offset_region.  */
   1376  1.1  mrg 
   1377  1.1  mrg void
   1378  1.1  mrg offset_region::accept (visitor *v) const
   1379  1.1  mrg {
   1380  1.1  mrg   region::accept (v);
   1381  1.1  mrg   m_byte_offset->accept (v);
   1382  1.1  mrg }
   1383  1.1  mrg 
   1384  1.1  mrg /* Implementation of region::dump_to_pp vfunc for offset_region.  */
   1385  1.1  mrg 
   1386  1.1  mrg void
   1387  1.1  mrg offset_region::dump_to_pp (pretty_printer *pp, bool simple) const
   1388  1.1  mrg {
   1389  1.1  mrg   if (simple)
   1390  1.1  mrg     {
   1391  1.1  mrg       //pp_string (pp, "(");
   1392  1.1  mrg       get_parent_region ()->dump_to_pp (pp, simple);
   1393  1.1  mrg       pp_string (pp, "+");
   1394  1.1  mrg       m_byte_offset->dump_to_pp (pp, simple);
   1395  1.1  mrg       //pp_string (pp, ")");
   1396  1.1  mrg     }
   1397  1.1  mrg   else
   1398  1.1  mrg     {
   1399  1.1  mrg       pp_string (pp, "offset_region(");
   1400  1.1  mrg       get_parent_region ()->dump_to_pp (pp, simple);
   1401  1.1  mrg       pp_string (pp, ", ");
   1402  1.1  mrg       print_quoted_type (pp, get_type ());
   1403  1.1  mrg       pp_string (pp, ", ");
   1404  1.1  mrg       m_byte_offset->dump_to_pp (pp, simple);
   1405  1.1  mrg       pp_printf (pp, ")");
   1406  1.1  mrg     }
   1407  1.1  mrg }
   1408  1.1  mrg 
   1409  1.1  mrg /* Implementation of region::get_relative_concrete_offset vfunc
   1410  1.1  mrg    for offset_region.  */
   1411  1.1  mrg 
   1412  1.1  mrg bool
   1413  1.1  mrg offset_region::get_relative_concrete_offset (bit_offset_t *out) const
   1414  1.1  mrg {
   1415  1.1  mrg   if (tree byte_offset_cst = m_byte_offset->maybe_get_constant ())
   1416  1.1  mrg     {
   1417  1.1  mrg       gcc_assert (TREE_CODE (byte_offset_cst) == INTEGER_CST);
   1418  1.1  mrg       /* Use a signed value for the byte offset, to handle
   1419  1.1  mrg 	 negative offsets.  */
   1420  1.1  mrg       HOST_WIDE_INT byte_offset
   1421  1.1  mrg 	= wi::to_offset (byte_offset_cst).to_shwi ();
   1422  1.1  mrg       HOST_WIDE_INT bit_offset = byte_offset * BITS_PER_UNIT;
   1423  1.1  mrg       *out = bit_offset;
   1424  1.1  mrg       return true;
   1425  1.1  mrg     }
   1426  1.1  mrg   return false;
   1427  1.1  mrg }
   1428  1.1  mrg 
   1429  1.1  mrg /* class sized_region : public region.  */
   1430  1.1  mrg 
   1431  1.1  mrg /* Implementation of region::accept vfunc for sized_region.  */
   1432  1.1  mrg 
   1433  1.1  mrg void
   1434  1.1  mrg sized_region::accept (visitor *v) const
   1435  1.1  mrg {
   1436  1.1  mrg   region::accept (v);
   1437  1.1  mrg   m_byte_size_sval->accept (v);
   1438  1.1  mrg }
   1439  1.1  mrg 
   1440  1.1  mrg /* Implementation of region::dump_to_pp vfunc for sized_region.  */
   1441  1.1  mrg 
   1442  1.1  mrg void
   1443  1.1  mrg sized_region::dump_to_pp (pretty_printer *pp, bool simple) const
   1444  1.1  mrg {
   1445  1.1  mrg   if (simple)
   1446  1.1  mrg     {
   1447  1.1  mrg       pp_string (pp, "SIZED_REG(");
   1448  1.1  mrg       get_parent_region ()->dump_to_pp (pp, simple);
   1449  1.1  mrg       pp_string (pp, ", ");
   1450  1.1  mrg       m_byte_size_sval->dump_to_pp (pp, simple);
   1451  1.1  mrg       pp_string (pp, ")");
   1452  1.1  mrg     }
   1453  1.1  mrg   else
   1454  1.1  mrg     {
   1455  1.1  mrg       pp_string (pp, "sized_region(");
   1456  1.1  mrg       get_parent_region ()->dump_to_pp (pp, simple);
   1457  1.1  mrg       pp_string (pp, ", ");
   1458  1.1  mrg       m_byte_size_sval->dump_to_pp (pp, simple);
   1459  1.1  mrg       pp_printf (pp, ")");
   1460  1.1  mrg     }
   1461  1.1  mrg }
   1462  1.1  mrg 
   1463  1.1  mrg /* Implementation of region::get_byte_size vfunc for sized_region.  */
   1464  1.1  mrg 
   1465  1.1  mrg bool
   1466  1.1  mrg sized_region::get_byte_size (byte_size_t *out) const
   1467  1.1  mrg {
   1468  1.1  mrg   if (tree cst = m_byte_size_sval->maybe_get_constant ())
   1469  1.1  mrg     {
   1470  1.1  mrg       gcc_assert (TREE_CODE (cst) == INTEGER_CST);
   1471  1.1  mrg       *out = tree_to_uhwi (cst);
   1472  1.1  mrg       return true;
   1473  1.1  mrg     }
   1474  1.1  mrg   return false;
   1475  1.1  mrg }
   1476  1.1  mrg 
   1477  1.1  mrg /* Implementation of region::get_bit_size vfunc for sized_region.  */
   1478  1.1  mrg 
   1479  1.1  mrg bool
   1480  1.1  mrg sized_region::get_bit_size (bit_size_t *out) const
   1481  1.1  mrg {
   1482  1.1  mrg   byte_size_t byte_size;
   1483  1.1  mrg   if (!get_byte_size (&byte_size))
   1484  1.1  mrg     return false;
   1485  1.1  mrg   *out = byte_size * BITS_PER_UNIT;
   1486  1.1  mrg   return true;
   1487  1.1  mrg }
   1488  1.1  mrg 
   1489  1.1  mrg /* class cast_region : public region.  */
   1490  1.1  mrg 
   1491  1.1  mrg /* Implementation of region::accept vfunc for cast_region.  */
   1492  1.1  mrg 
   1493  1.1  mrg void
   1494  1.1  mrg cast_region::accept (visitor *v) const
   1495  1.1  mrg {
   1496  1.1  mrg   region::accept (v);
   1497  1.1  mrg   m_original_region->accept (v);
   1498  1.1  mrg }
   1499  1.1  mrg 
   1500  1.1  mrg /* Implementation of region::dump_to_pp vfunc for cast_region.  */
   1501  1.1  mrg 
   1502  1.1  mrg void
   1503  1.1  mrg cast_region::dump_to_pp (pretty_printer *pp, bool simple) const
   1504  1.1  mrg {
   1505  1.1  mrg   if (simple)
   1506  1.1  mrg     {
   1507  1.1  mrg       pp_string (pp, "CAST_REG(");
   1508  1.1  mrg       print_quoted_type (pp, get_type ());
   1509  1.1  mrg       pp_string (pp, ", ");
   1510  1.1  mrg       m_original_region->dump_to_pp (pp, simple);
   1511  1.1  mrg       pp_string (pp, ")");
   1512  1.1  mrg     }
   1513  1.1  mrg   else
   1514  1.1  mrg     {
   1515  1.1  mrg       pp_string (pp, "cast_region(");
   1516  1.1  mrg       m_original_region->dump_to_pp (pp, simple);
   1517  1.1  mrg       pp_string (pp, ", ");
   1518  1.1  mrg       print_quoted_type (pp, get_type ());
   1519  1.1  mrg       pp_printf (pp, ")");
   1520  1.1  mrg     }
   1521  1.1  mrg }
   1522  1.1  mrg 
   1523  1.1  mrg /* class heap_allocated_region : public region.  */
   1524  1.1  mrg 
   1525  1.1  mrg /* Implementation of region::dump_to_pp vfunc for heap_allocated_region.  */
   1526  1.1  mrg 
   1527  1.1  mrg void
   1528  1.1  mrg heap_allocated_region::dump_to_pp (pretty_printer *pp, bool simple) const
   1529  1.1  mrg {
   1530  1.1  mrg   if (simple)
   1531  1.1  mrg     pp_printf (pp, "HEAP_ALLOCATED_REGION(%i)", get_id ());
   1532  1.1  mrg   else
   1533  1.1  mrg     pp_printf (pp, "heap_allocated_region(%i)", get_id ());
   1534  1.1  mrg }
   1535  1.1  mrg 
   1536  1.1  mrg /* class alloca_region : public region.  */
   1537  1.1  mrg 
   1538  1.1  mrg /* Implementation of region::dump_to_pp vfunc for alloca_region.  */
   1539  1.1  mrg 
   1540  1.1  mrg void
   1541  1.1  mrg alloca_region::dump_to_pp (pretty_printer *pp, bool simple) const
   1542  1.1  mrg {
   1543  1.1  mrg   if (simple)
   1544  1.1  mrg     pp_string (pp, "ALLOCA_REGION");
   1545  1.1  mrg   else
   1546  1.1  mrg     pp_string (pp, "alloca_region()");
   1547  1.1  mrg }
   1548  1.1  mrg 
   1549  1.1  mrg /* class string_region : public region.  */
   1550  1.1  mrg 
   1551  1.1  mrg /* Implementation of region::dump_to_pp vfunc for string_region.  */
   1552  1.1  mrg 
   1553  1.1  mrg void
   1554  1.1  mrg string_region::dump_to_pp (pretty_printer *pp, bool simple) const
   1555  1.1  mrg {
   1556  1.1  mrg   if (simple)
   1557  1.1  mrg     dump_tree (pp, m_string_cst);
   1558  1.1  mrg   else
   1559  1.1  mrg     {
   1560  1.1  mrg       pp_string (pp, "string_region(");
   1561  1.1  mrg       dump_tree (pp, m_string_cst);
   1562  1.1  mrg       if (!flag_dump_noaddr)
   1563  1.1  mrg 	{
   1564  1.1  mrg 	  pp_string (pp, " (");
   1565  1.1  mrg 	  pp_pointer (pp, m_string_cst);
   1566  1.1  mrg 	  pp_string (pp, "))");
   1567  1.1  mrg 	}
   1568  1.1  mrg     }
   1569  1.1  mrg }
   1570  1.1  mrg 
   1571  1.1  mrg /* class bit_range_region : public region.  */
   1572  1.1  mrg 
   1573  1.1  mrg /* Implementation of region::dump_to_pp vfunc for bit_range_region.  */
   1574  1.1  mrg 
   1575  1.1  mrg void
   1576  1.1  mrg bit_range_region::dump_to_pp (pretty_printer *pp, bool simple) const
   1577  1.1  mrg {
   1578  1.1  mrg   if (simple)
   1579  1.1  mrg     {
   1580  1.1  mrg       pp_string (pp, "BIT_RANGE_REG(");
   1581  1.1  mrg       get_parent_region ()->dump_to_pp (pp, simple);
   1582  1.1  mrg       pp_string (pp, ", ");
   1583  1.1  mrg       m_bits.dump_to_pp (pp);
   1584  1.1  mrg       pp_string (pp, ")");
   1585  1.1  mrg     }
   1586  1.1  mrg   else
   1587  1.1  mrg     {
   1588  1.1  mrg       pp_string (pp, "bit_range_region(");
   1589  1.1  mrg       get_parent_region ()->dump_to_pp (pp, simple);
   1590  1.1  mrg       pp_string (pp, ", ");
   1591  1.1  mrg       m_bits.dump_to_pp (pp);
   1592  1.1  mrg       pp_printf (pp, ")");
   1593  1.1  mrg     }
   1594  1.1  mrg }
   1595  1.1  mrg 
   1596  1.1  mrg /* Implementation of region::get_byte_size vfunc for bit_range_region.  */
   1597  1.1  mrg 
   1598  1.1  mrg bool
   1599  1.1  mrg bit_range_region::get_byte_size (byte_size_t *out) const
   1600  1.1  mrg {
   1601  1.1  mrg   if (m_bits.m_size_in_bits % BITS_PER_UNIT == 0)
   1602  1.1  mrg     {
   1603  1.1  mrg       *out = m_bits.m_size_in_bits / BITS_PER_UNIT;
   1604  1.1  mrg       return true;
   1605  1.1  mrg     }
   1606  1.1  mrg   return false;
   1607  1.1  mrg }
   1608  1.1  mrg 
   1609  1.1  mrg /* Implementation of region::get_bit_size vfunc for bit_range_region.  */
   1610  1.1  mrg 
   1611  1.1  mrg bool
   1612  1.1  mrg bit_range_region::get_bit_size (bit_size_t *out) const
   1613  1.1  mrg {
   1614  1.1  mrg   *out = m_bits.m_size_in_bits;
   1615  1.1  mrg   return true;
   1616  1.1  mrg }
   1617  1.1  mrg 
   1618  1.1  mrg /* Implementation of region::get_byte_size_sval vfunc for bit_range_region.  */
   1619  1.1  mrg 
   1620  1.1  mrg const svalue *
   1621  1.1  mrg bit_range_region::get_byte_size_sval (region_model_manager *mgr) const
   1622  1.1  mrg {
   1623  1.1  mrg   if (m_bits.m_size_in_bits % BITS_PER_UNIT != 0)
   1624  1.1  mrg     return mgr->get_or_create_unknown_svalue (size_type_node);
   1625  1.1  mrg 
   1626  1.1  mrg   HOST_WIDE_INT num_bytes = m_bits.m_size_in_bits.to_shwi () / BITS_PER_UNIT;
   1627  1.1  mrg   return mgr->get_or_create_int_cst (size_type_node, num_bytes);
   1628  1.1  mrg }
   1629  1.1  mrg 
   1630  1.1  mrg /* Implementation of region::get_relative_concrete_offset vfunc for
   1631  1.1  mrg    bit_range_region.  */
   1632  1.1  mrg 
   1633  1.1  mrg bool
   1634  1.1  mrg bit_range_region::get_relative_concrete_offset (bit_offset_t *out) const
   1635  1.1  mrg {
   1636  1.1  mrg   *out = m_bits.get_start_bit_offset ();
   1637  1.1  mrg   return true;
   1638  1.1  mrg }
   1639  1.1  mrg 
   1640  1.1  mrg /* class unknown_region : public region.  */
   1641  1.1  mrg 
   1642  1.1  mrg /* Implementation of region::dump_to_pp vfunc for unknown_region.  */
   1643  1.1  mrg 
   1644  1.1  mrg void
   1645  1.1  mrg unknown_region::dump_to_pp (pretty_printer *pp, bool /*simple*/) const
   1646  1.1  mrg {
   1647  1.1  mrg   pp_string (pp, "UNKNOWN_REGION");
   1648  1.1  mrg }
   1649  1.1  mrg 
   1650  1.1  mrg } // namespace ana
   1651  1.1  mrg 
   1652  1.1  mrg #endif /* #if ENABLE_ANALYZER */
   1653