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