1/* Nested function decomposition for GIMPLE. 2 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 3 Free Software Foundation, Inc. 4 5 This file is part of GCC. 6 7 GCC is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3, or (at your option) 10 any later version. 11 12 GCC is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with GCC; see the file COPYING3. If not see 19 <http://www.gnu.org/licenses/>. */ 20 21#include "config.h" 22#include "system.h" 23#include "coretypes.h" 24#include "tm.h" 25#include "tree.h" 26#include "rtl.h" 27#include "tm_p.h" 28#include "function.h" 29#include "tree-dump.h" 30#include "tree-inline.h" 31#include "gimple.h" 32#include "tree-iterator.h" 33#include "tree-flow.h" 34#include "cgraph.h" 35#include "expr.h" 36#include "langhooks.h" 37#include "pointer-set.h" 38#include "ggc.h" 39 40 41/* The object of this pass is to lower the representation of a set of nested 42 functions in order to expose all of the gory details of the various 43 nonlocal references. We want to do this sooner rather than later, in 44 order to give us more freedom in emitting all of the functions in question. 45 46 Back in olden times, when gcc was young, we developed an insanely 47 complicated scheme whereby variables which were referenced nonlocally 48 were forced to live in the stack of the declaring function, and then 49 the nested functions magically discovered where these variables were 50 placed. In order for this scheme to function properly, it required 51 that the outer function be partially expanded, then we switch to 52 compiling the inner function, and once done with those we switch back 53 to compiling the outer function. Such delicate ordering requirements 54 makes it difficult to do whole translation unit optimizations 55 involving such functions. 56 57 The implementation here is much more direct. Everything that can be 58 referenced by an inner function is a member of an explicitly created 59 structure herein called the "nonlocal frame struct". The incoming 60 static chain for a nested function is a pointer to this struct in 61 the parent. In this way, we settle on known offsets from a known 62 base, and so are decoupled from the logic that places objects in the 63 function's stack frame. More importantly, we don't have to wait for 64 that to happen -- since the compilation of the inner function is no 65 longer tied to a real stack frame, the nonlocal frame struct can be 66 allocated anywhere. Which means that the outer function is now 67 inlinable. 68 69 Theory of operation here is very simple. Iterate over all the 70 statements in all the functions (depth first) several times, 71 allocating structures and fields on demand. In general we want to 72 examine inner functions first, so that we can avoid making changes 73 to outer functions which are unnecessary. 74 75 The order of the passes matters a bit, in that later passes will be 76 skipped if it is discovered that the functions don't actually interact 77 at all. That is, they're nested in the lexical sense but could have 78 been written as independent functions without change. */ 79 80 81struct nesting_info 82{ 83 struct nesting_info *outer; 84 struct nesting_info *inner; 85 struct nesting_info *next; 86 87 struct pointer_map_t *field_map; 88 struct pointer_map_t *var_map; 89 bitmap suppress_expansion; 90 91 tree context; 92 tree new_local_var_chain; 93 tree debug_var_chain; 94 tree frame_type; 95 tree frame_decl; 96 tree chain_field; 97 tree chain_decl; 98 tree nl_goto_field; 99 100 bool any_parm_remapped; 101 bool any_tramp_created; 102 char static_chain_added; 103}; 104 105 106/* Iterate over the nesting tree, starting with ROOT, depth first. */ 107 108static inline struct nesting_info * 109iter_nestinfo_start (struct nesting_info *root) 110{ 111 while (root->inner) 112 root = root->inner; 113 return root; 114} 115 116static inline struct nesting_info * 117iter_nestinfo_next (struct nesting_info *node) 118{ 119 if (node->next) 120 return iter_nestinfo_start (node->next); 121 return node->outer; 122} 123 124#define FOR_EACH_NEST_INFO(I, ROOT) \ 125 for ((I) = iter_nestinfo_start (ROOT); (I); (I) = iter_nestinfo_next (I)) 126 127/* Obstack used for the bitmaps in the struct above. */ 128static struct bitmap_obstack nesting_info_bitmap_obstack; 129 130 131/* We're working in so many different function contexts simultaneously, 132 that create_tmp_var is dangerous. Prevent mishap. */ 133#define create_tmp_var cant_use_create_tmp_var_here_dummy 134 135/* Like create_tmp_var, except record the variable for registration at 136 the given nesting level. */ 137 138static tree 139create_tmp_var_for (struct nesting_info *info, tree type, const char *prefix) 140{ 141 tree tmp_var; 142 143 /* If the type is of variable size or a type which must be created by the 144 frontend, something is wrong. Note that we explicitly allow 145 incomplete types here, since we create them ourselves here. */ 146 gcc_assert (!TREE_ADDRESSABLE (type)); 147 gcc_assert (!TYPE_SIZE_UNIT (type) 148 || TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST); 149 150 tmp_var = create_tmp_var_raw (type, prefix); 151 DECL_CONTEXT (tmp_var) = info->context; 152 TREE_CHAIN (tmp_var) = info->new_local_var_chain; 153 DECL_SEEN_IN_BIND_EXPR_P (tmp_var) = 1; 154 if (TREE_CODE (type) == COMPLEX_TYPE 155 || TREE_CODE (type) == VECTOR_TYPE) 156 DECL_GIMPLE_REG_P (tmp_var) = 1; 157 158 info->new_local_var_chain = tmp_var; 159 160 return tmp_var; 161} 162 163/* Take the address of EXP to be used within function CONTEXT. 164 Mark it for addressability as necessary. */ 165 166tree 167build_addr (tree exp, tree context) 168{ 169 tree base = exp; 170 tree save_context; 171 tree retval; 172 173 while (handled_component_p (base)) 174 base = TREE_OPERAND (base, 0); 175 176 if (DECL_P (base)) 177 TREE_ADDRESSABLE (base) = 1; 178 179 /* Building the ADDR_EXPR will compute a set of properties for 180 that ADDR_EXPR. Those properties are unfortunately context 181 specific, i.e., they are dependent on CURRENT_FUNCTION_DECL. 182 183 Temporarily set CURRENT_FUNCTION_DECL to the desired context, 184 build the ADDR_EXPR, then restore CURRENT_FUNCTION_DECL. That 185 way the properties are for the ADDR_EXPR are computed properly. */ 186 save_context = current_function_decl; 187 current_function_decl = context; 188 retval = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (exp)), exp); 189 current_function_decl = save_context; 190 return retval; 191} 192 193/* Insert FIELD into TYPE, sorted by alignment requirements. */ 194 195void 196insert_field_into_struct (tree type, tree field) 197{ 198 tree *p; 199 200 DECL_CONTEXT (field) = type; 201 202 for (p = &TYPE_FIELDS (type); *p ; p = &TREE_CHAIN (*p)) 203 if (DECL_ALIGN (field) >= DECL_ALIGN (*p)) 204 break; 205 206 TREE_CHAIN (field) = *p; 207 *p = field; 208 209 /* Set correct alignment for frame struct type. */ 210 if (TYPE_ALIGN (type) < DECL_ALIGN (field)) 211 TYPE_ALIGN (type) = DECL_ALIGN (field); 212} 213 214/* Build or return the RECORD_TYPE that describes the frame state that is 215 shared between INFO->CONTEXT and its nested functions. This record will 216 not be complete until finalize_nesting_tree; up until that point we'll 217 be adding fields as necessary. 218 219 We also build the DECL that represents this frame in the function. */ 220 221static tree 222get_frame_type (struct nesting_info *info) 223{ 224 tree type = info->frame_type; 225 if (!type) 226 { 227 char *name; 228 229 type = make_node (RECORD_TYPE); 230 231 name = concat ("FRAME.", 232 IDENTIFIER_POINTER (DECL_NAME (info->context)), 233 NULL); 234 TYPE_NAME (type) = get_identifier (name); 235 free (name); 236 237 info->frame_type = type; 238 info->frame_decl = create_tmp_var_for (info, type, "FRAME"); 239 240 /* ??? Always make it addressable for now, since it is meant to 241 be pointed to by the static chain pointer. This pessimizes 242 when it turns out that no static chains are needed because 243 the nested functions referencing non-local variables are not 244 reachable, but the true pessimization is to create the non- 245 local frame structure in the first place. */ 246 TREE_ADDRESSABLE (info->frame_decl) = 1; 247 } 248 return type; 249} 250 251/* Return true if DECL should be referenced by pointer in the non-local 252 frame structure. */ 253 254static bool 255use_pointer_in_frame (tree decl) 256{ 257 if (TREE_CODE (decl) == PARM_DECL) 258 { 259 /* It's illegal to copy TREE_ADDRESSABLE, impossible to copy variable 260 sized decls, and inefficient to copy large aggregates. Don't bother 261 moving anything but scalar variables. */ 262 return AGGREGATE_TYPE_P (TREE_TYPE (decl)); 263 } 264 else 265 { 266 /* Variable sized types make things "interesting" in the frame. */ 267 return DECL_SIZE (decl) == NULL || !TREE_CONSTANT (DECL_SIZE (decl)); 268 } 269} 270 271/* Given DECL, a non-locally accessed variable, find or create a field 272 in the non-local frame structure for the given nesting context. */ 273 274static tree 275lookup_field_for_decl (struct nesting_info *info, tree decl, 276 enum insert_option insert) 277{ 278 void **slot; 279 280 if (insert == NO_INSERT) 281 { 282 slot = pointer_map_contains (info->field_map, decl); 283 return slot ? (tree) *slot : NULL_TREE; 284 } 285 286 slot = pointer_map_insert (info->field_map, decl); 287 if (!*slot) 288 { 289 tree field = make_node (FIELD_DECL); 290 DECL_NAME (field) = DECL_NAME (decl); 291 292 if (use_pointer_in_frame (decl)) 293 { 294 TREE_TYPE (field) = build_pointer_type (TREE_TYPE (decl)); 295 DECL_ALIGN (field) = TYPE_ALIGN (TREE_TYPE (field)); 296 DECL_NONADDRESSABLE_P (field) = 1; 297 } 298 else 299 { 300 TREE_TYPE (field) = TREE_TYPE (decl); 301 DECL_SOURCE_LOCATION (field) = DECL_SOURCE_LOCATION (decl); 302 DECL_ALIGN (field) = DECL_ALIGN (decl); 303 DECL_USER_ALIGN (field) = DECL_USER_ALIGN (decl); 304 TREE_ADDRESSABLE (field) = TREE_ADDRESSABLE (decl); 305 DECL_NONADDRESSABLE_P (field) = !TREE_ADDRESSABLE (decl); 306 TREE_THIS_VOLATILE (field) = TREE_THIS_VOLATILE (decl); 307 } 308 309 insert_field_into_struct (get_frame_type (info), field); 310 *slot = field; 311 312 if (TREE_CODE (decl) == PARM_DECL) 313 info->any_parm_remapped = true; 314 } 315 316 return (tree) *slot; 317} 318 319/* Build or return the variable that holds the static chain within 320 INFO->CONTEXT. This variable may only be used within INFO->CONTEXT. */ 321 322static tree 323get_chain_decl (struct nesting_info *info) 324{ 325 tree decl = info->chain_decl; 326 327 if (!decl) 328 { 329 tree type; 330 331 type = get_frame_type (info->outer); 332 type = build_pointer_type (type); 333 334 /* Note that this variable is *not* entered into any BIND_EXPR; 335 the construction of this variable is handled specially in 336 expand_function_start and initialize_inlined_parameters. 337 Note also that it's represented as a parameter. This is more 338 close to the truth, since the initial value does come from 339 the caller. */ 340 decl = build_decl (DECL_SOURCE_LOCATION (info->context), 341 PARM_DECL, create_tmp_var_name ("CHAIN"), type); 342 DECL_ARTIFICIAL (decl) = 1; 343 DECL_IGNORED_P (decl) = 1; 344 TREE_USED (decl) = 1; 345 DECL_CONTEXT (decl) = info->context; 346 DECL_ARG_TYPE (decl) = type; 347 348 /* Tell tree-inline.c that we never write to this variable, so 349 it can copy-prop the replacement value immediately. */ 350 TREE_READONLY (decl) = 1; 351 352 info->chain_decl = decl; 353 354 if (dump_file 355 && (dump_flags & TDF_DETAILS) 356 && !DECL_STATIC_CHAIN (info->context)) 357 fprintf (dump_file, "Setting static-chain for %s\n", 358 lang_hooks.decl_printable_name (info->context, 2)); 359 360 DECL_STATIC_CHAIN (info->context) = 1; 361 } 362 return decl; 363} 364 365/* Build or return the field within the non-local frame state that holds 366 the static chain for INFO->CONTEXT. This is the way to walk back up 367 multiple nesting levels. */ 368 369static tree 370get_chain_field (struct nesting_info *info) 371{ 372 tree field = info->chain_field; 373 374 if (!field) 375 { 376 tree type = build_pointer_type (get_frame_type (info->outer)); 377 378 field = make_node (FIELD_DECL); 379 DECL_NAME (field) = get_identifier ("__chain"); 380 TREE_TYPE (field) = type; 381 DECL_ALIGN (field) = TYPE_ALIGN (type); 382 DECL_NONADDRESSABLE_P (field) = 1; 383 384 insert_field_into_struct (get_frame_type (info), field); 385 386 info->chain_field = field; 387 388 if (dump_file 389 && (dump_flags & TDF_DETAILS) 390 && !DECL_STATIC_CHAIN (info->context)) 391 fprintf (dump_file, "Setting static-chain for %s\n", 392 lang_hooks.decl_printable_name (info->context, 2)); 393 394 DECL_STATIC_CHAIN (info->context) = 1; 395 } 396 return field; 397} 398 399/* Initialize a new temporary with the GIMPLE_CALL STMT. */ 400 401static tree 402init_tmp_var_with_call (struct nesting_info *info, gimple_stmt_iterator *gsi, 403 gimple call) 404{ 405 tree t; 406 407 t = create_tmp_var_for (info, gimple_call_return_type (call), NULL); 408 gimple_call_set_lhs (call, t); 409 if (! gsi_end_p (*gsi)) 410 gimple_set_location (call, gimple_location (gsi_stmt (*gsi))); 411 gsi_insert_before (gsi, call, GSI_SAME_STMT); 412 413 return t; 414} 415 416 417/* Copy EXP into a temporary. Allocate the temporary in the context of 418 INFO and insert the initialization statement before GSI. */ 419 420static tree 421init_tmp_var (struct nesting_info *info, tree exp, gimple_stmt_iterator *gsi) 422{ 423 tree t; 424 gimple stmt; 425 426 t = create_tmp_var_for (info, TREE_TYPE (exp), NULL); 427 stmt = gimple_build_assign (t, exp); 428 if (! gsi_end_p (*gsi)) 429 gimple_set_location (stmt, gimple_location (gsi_stmt (*gsi))); 430 gsi_insert_before_without_update (gsi, stmt, GSI_SAME_STMT); 431 432 return t; 433} 434 435 436/* Similarly, but only do so to force EXP to satisfy is_gimple_val. */ 437 438static tree 439gsi_gimplify_val (struct nesting_info *info, tree exp, 440 gimple_stmt_iterator *gsi) 441{ 442 if (is_gimple_val (exp)) 443 return exp; 444 else 445 return init_tmp_var (info, exp, gsi); 446} 447 448/* Similarly, but copy from the temporary and insert the statement 449 after the iterator. */ 450 451static tree 452save_tmp_var (struct nesting_info *info, tree exp, gimple_stmt_iterator *gsi) 453{ 454 tree t; 455 gimple stmt; 456 457 t = create_tmp_var_for (info, TREE_TYPE (exp), NULL); 458 stmt = gimple_build_assign (exp, t); 459 if (! gsi_end_p (*gsi)) 460 gimple_set_location (stmt, gimple_location (gsi_stmt (*gsi))); 461 gsi_insert_after_without_update (gsi, stmt, GSI_SAME_STMT); 462 463 return t; 464} 465 466/* Build or return the type used to represent a nested function trampoline. */ 467 468static GTY(()) tree trampoline_type; 469 470static tree 471get_trampoline_type (struct nesting_info *info) 472{ 473 unsigned align, size; 474 tree t; 475 476 if (trampoline_type) 477 return trampoline_type; 478 479 align = TRAMPOLINE_ALIGNMENT; 480 size = TRAMPOLINE_SIZE; 481 482 /* If we won't be able to guarantee alignment simply via TYPE_ALIGN, 483 then allocate extra space so that we can do dynamic alignment. */ 484 if (align > STACK_BOUNDARY) 485 { 486 size += ((align/BITS_PER_UNIT) - 1) & -(STACK_BOUNDARY/BITS_PER_UNIT); 487 align = STACK_BOUNDARY; 488 } 489 490 t = build_index_type (build_int_cst (NULL_TREE, size - 1)); 491 t = build_array_type (char_type_node, t); 492 t = build_decl (DECL_SOURCE_LOCATION (info->context), 493 FIELD_DECL, get_identifier ("__data"), t); 494 DECL_ALIGN (t) = align; 495 DECL_USER_ALIGN (t) = 1; 496 497 trampoline_type = make_node (RECORD_TYPE); 498 TYPE_NAME (trampoline_type) = get_identifier ("__builtin_trampoline"); 499 TYPE_FIELDS (trampoline_type) = t; 500 layout_type (trampoline_type); 501 DECL_CONTEXT (t) = trampoline_type; 502 503 return trampoline_type; 504} 505 506/* Given DECL, a nested function, find or create a field in the non-local 507 frame structure for a trampoline for this function. */ 508 509static tree 510lookup_tramp_for_decl (struct nesting_info *info, tree decl, 511 enum insert_option insert) 512{ 513 void **slot; 514 515 if (insert == NO_INSERT) 516 { 517 slot = pointer_map_contains (info->var_map, decl); 518 return slot ? (tree) *slot : NULL_TREE; 519 } 520 521 slot = pointer_map_insert (info->var_map, decl); 522 if (!*slot) 523 { 524 tree field = make_node (FIELD_DECL); 525 DECL_NAME (field) = DECL_NAME (decl); 526 TREE_TYPE (field) = get_trampoline_type (info); 527 TREE_ADDRESSABLE (field) = 1; 528 529 insert_field_into_struct (get_frame_type (info), field); 530 *slot = field; 531 532 info->any_tramp_created = true; 533 } 534 535 return (tree) *slot; 536} 537 538/* Build or return the field within the non-local frame state that holds 539 the non-local goto "jmp_buf". The buffer itself is maintained by the 540 rtl middle-end as dynamic stack space is allocated. */ 541 542static tree 543get_nl_goto_field (struct nesting_info *info) 544{ 545 tree field = info->nl_goto_field; 546 if (!field) 547 { 548 unsigned size; 549 tree type; 550 551 /* For __builtin_nonlocal_goto, we need N words. The first is the 552 frame pointer, the rest is for the target's stack pointer save 553 area. The number of words is controlled by STACK_SAVEAREA_MODE; 554 not the best interface, but it'll do for now. */ 555 if (Pmode == ptr_mode) 556 type = ptr_type_node; 557 else 558 type = lang_hooks.types.type_for_mode (Pmode, 1); 559 560 size = GET_MODE_SIZE (STACK_SAVEAREA_MODE (SAVE_NONLOCAL)); 561 size = size / GET_MODE_SIZE (Pmode); 562 size = size + 1; 563 564 type = build_array_type 565 (type, build_index_type (build_int_cst (NULL_TREE, size))); 566 567 field = make_node (FIELD_DECL); 568 DECL_NAME (field) = get_identifier ("__nl_goto_buf"); 569 TREE_TYPE (field) = type; 570 DECL_ALIGN (field) = TYPE_ALIGN (type); 571 TREE_ADDRESSABLE (field) = 1; 572 573 insert_field_into_struct (get_frame_type (info), field); 574 575 info->nl_goto_field = field; 576 } 577 578 return field; 579} 580 581/* Invoke CALLBACK on all statements of GIMPLE sequence SEQ. */ 582 583static void 584walk_body (walk_stmt_fn callback_stmt, walk_tree_fn callback_op, 585 struct nesting_info *info, gimple_seq seq) 586{ 587 struct walk_stmt_info wi; 588 589 memset (&wi, 0, sizeof (wi)); 590 wi.info = info; 591 wi.val_only = true; 592 walk_gimple_seq (seq, callback_stmt, callback_op, &wi); 593} 594 595 596/* Invoke CALLBACK_STMT/CALLBACK_OP on all statements of INFO->CONTEXT. */ 597 598static inline void 599walk_function (walk_stmt_fn callback_stmt, walk_tree_fn callback_op, 600 struct nesting_info *info) 601{ 602 walk_body (callback_stmt, callback_op, info, gimple_body (info->context)); 603} 604 605/* Invoke CALLBACK on a GIMPLE_OMP_FOR's init, cond, incr and pre-body. */ 606 607static void 608walk_gimple_omp_for (gimple for_stmt, 609 walk_stmt_fn callback_stmt, walk_tree_fn callback_op, 610 struct nesting_info *info) 611{ 612 struct walk_stmt_info wi; 613 gimple_seq seq; 614 tree t; 615 size_t i; 616 617 walk_body (callback_stmt, callback_op, info, gimple_omp_for_pre_body (for_stmt)); 618 619 seq = gimple_seq_alloc (); 620 memset (&wi, 0, sizeof (wi)); 621 wi.info = info; 622 wi.gsi = gsi_last (seq); 623 624 for (i = 0; i < gimple_omp_for_collapse (for_stmt); i++) 625 { 626 wi.val_only = false; 627 walk_tree (gimple_omp_for_index_ptr (for_stmt, i), callback_op, 628 &wi, NULL); 629 wi.val_only = true; 630 wi.is_lhs = false; 631 walk_tree (gimple_omp_for_initial_ptr (for_stmt, i), callback_op, 632 &wi, NULL); 633 634 wi.val_only = true; 635 wi.is_lhs = false; 636 walk_tree (gimple_omp_for_final_ptr (for_stmt, i), callback_op, 637 &wi, NULL); 638 639 t = gimple_omp_for_incr (for_stmt, i); 640 gcc_assert (BINARY_CLASS_P (t)); 641 wi.val_only = false; 642 walk_tree (&TREE_OPERAND (t, 0), callback_op, &wi, NULL); 643 wi.val_only = true; 644 wi.is_lhs = false; 645 walk_tree (&TREE_OPERAND (t, 1), callback_op, &wi, NULL); 646 } 647 648 if (gimple_seq_empty_p (seq)) 649 gimple_seq_free (seq); 650 else 651 { 652 gimple_seq pre_body = gimple_omp_for_pre_body (for_stmt); 653 annotate_all_with_location (seq, gimple_location (for_stmt)); 654 gimple_seq_add_seq (&pre_body, seq); 655 gimple_omp_for_set_pre_body (for_stmt, pre_body); 656 } 657} 658 659/* Similarly for ROOT and all functions nested underneath, depth first. */ 660 661static void 662walk_all_functions (walk_stmt_fn callback_stmt, walk_tree_fn callback_op, 663 struct nesting_info *root) 664{ 665 struct nesting_info *n; 666 FOR_EACH_NEST_INFO (n, root) 667 walk_function (callback_stmt, callback_op, n); 668} 669 670 671/* We have to check for a fairly pathological case. The operands of function 672 nested function are to be interpreted in the context of the enclosing 673 function. So if any are variably-sized, they will get remapped when the 674 enclosing function is inlined. But that remapping would also have to be 675 done in the types of the PARM_DECLs of the nested function, meaning the 676 argument types of that function will disagree with the arguments in the 677 calls to that function. So we'd either have to make a copy of the nested 678 function corresponding to each time the enclosing function was inlined or 679 add a VIEW_CONVERT_EXPR to each such operand for each call to the nested 680 function. The former is not practical. The latter would still require 681 detecting this case to know when to add the conversions. So, for now at 682 least, we don't inline such an enclosing function. 683 684 We have to do that check recursively, so here return indicating whether 685 FNDECL has such a nested function. ORIG_FN is the function we were 686 trying to inline to use for checking whether any argument is variably 687 modified by anything in it. 688 689 It would be better to do this in tree-inline.c so that we could give 690 the appropriate warning for why a function can't be inlined, but that's 691 too late since the nesting structure has already been flattened and 692 adding a flag just to record this fact seems a waste of a flag. */ 693 694static bool 695check_for_nested_with_variably_modified (tree fndecl, tree orig_fndecl) 696{ 697 struct cgraph_node *cgn = cgraph_node (fndecl); 698 tree arg; 699 700 for (cgn = cgn->nested; cgn ; cgn = cgn->next_nested) 701 { 702 for (arg = DECL_ARGUMENTS (cgn->decl); arg; arg = TREE_CHAIN (arg)) 703 if (variably_modified_type_p (TREE_TYPE (arg), orig_fndecl)) 704 return true; 705 706 if (check_for_nested_with_variably_modified (cgn->decl, orig_fndecl)) 707 return true; 708 } 709 710 return false; 711} 712 713/* Construct our local datastructure describing the function nesting 714 tree rooted by CGN. */ 715 716static struct nesting_info * 717create_nesting_tree (struct cgraph_node *cgn) 718{ 719 struct nesting_info *info = XCNEW (struct nesting_info); 720 info->field_map = pointer_map_create (); 721 info->var_map = pointer_map_create (); 722 info->suppress_expansion = BITMAP_ALLOC (&nesting_info_bitmap_obstack); 723 info->context = cgn->decl; 724 725 for (cgn = cgn->nested; cgn ; cgn = cgn->next_nested) 726 { 727 struct nesting_info *sub = create_nesting_tree (cgn); 728 sub->outer = info; 729 sub->next = info->inner; 730 info->inner = sub; 731 } 732 733 /* See discussion at check_for_nested_with_variably_modified for a 734 discussion of why this has to be here. */ 735 if (check_for_nested_with_variably_modified (info->context, info->context)) 736 DECL_UNINLINABLE (info->context) = true; 737 738 return info; 739} 740 741/* Return an expression computing the static chain for TARGET_CONTEXT 742 from INFO->CONTEXT. Insert any necessary computations before TSI. */ 743 744static tree 745get_static_chain (struct nesting_info *info, tree target_context, 746 gimple_stmt_iterator *gsi) 747{ 748 struct nesting_info *i; 749 tree x; 750 751 if (info->context == target_context) 752 { 753 x = build_addr (info->frame_decl, target_context); 754 } 755 else 756 { 757 x = get_chain_decl (info); 758 759 for (i = info->outer; i->context != target_context; i = i->outer) 760 { 761 tree field = get_chain_field (i); 762 763 x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x); 764 x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE); 765 x = init_tmp_var (info, x, gsi); 766 } 767 } 768 769 return x; 770} 771 772 773/* Return an expression referencing FIELD from TARGET_CONTEXT's non-local 774 frame as seen from INFO->CONTEXT. Insert any necessary computations 775 before GSI. */ 776 777static tree 778get_frame_field (struct nesting_info *info, tree target_context, 779 tree field, gimple_stmt_iterator *gsi) 780{ 781 struct nesting_info *i; 782 tree x; 783 784 if (info->context == target_context) 785 { 786 /* Make sure frame_decl gets created. */ 787 (void) get_frame_type (info); 788 x = info->frame_decl; 789 } 790 else 791 { 792 x = get_chain_decl (info); 793 794 for (i = info->outer; i->context != target_context; i = i->outer) 795 { 796 tree field = get_chain_field (i); 797 798 x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x); 799 x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE); 800 x = init_tmp_var (info, x, gsi); 801 } 802 803 x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x); 804 } 805 806 x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE); 807 return x; 808} 809 810static void note_nonlocal_vla_type (struct nesting_info *info, tree type); 811 812/* A subroutine of convert_nonlocal_reference_op. Create a local variable 813 in the nested function with DECL_VALUE_EXPR set to reference the true 814 variable in the parent function. This is used both for debug info 815 and in OpenMP lowering. */ 816 817static tree 818get_nonlocal_debug_decl (struct nesting_info *info, tree decl) 819{ 820 tree target_context; 821 struct nesting_info *i; 822 tree x, field, new_decl; 823 void **slot; 824 825 slot = pointer_map_insert (info->var_map, decl); 826 827 if (*slot) 828 return (tree) *slot; 829 830 target_context = decl_function_context (decl); 831 832 /* A copy of the code in get_frame_field, but without the temporaries. */ 833 if (info->context == target_context) 834 { 835 /* Make sure frame_decl gets created. */ 836 (void) get_frame_type (info); 837 x = info->frame_decl; 838 i = info; 839 } 840 else 841 { 842 x = get_chain_decl (info); 843 for (i = info->outer; i->context != target_context; i = i->outer) 844 { 845 field = get_chain_field (i); 846 x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x); 847 x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE); 848 } 849 x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x); 850 } 851 852 field = lookup_field_for_decl (i, decl, INSERT); 853 x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE); 854 if (use_pointer_in_frame (decl)) 855 x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x); 856 857 /* ??? We should be remapping types as well, surely. */ 858 new_decl = build_decl (DECL_SOURCE_LOCATION (decl), 859 VAR_DECL, DECL_NAME (decl), TREE_TYPE (decl)); 860 DECL_CONTEXT (new_decl) = info->context; 861 DECL_ARTIFICIAL (new_decl) = DECL_ARTIFICIAL (decl); 862 DECL_IGNORED_P (new_decl) = DECL_IGNORED_P (decl); 863 TREE_THIS_VOLATILE (new_decl) = TREE_THIS_VOLATILE (decl); 864 TREE_SIDE_EFFECTS (new_decl) = TREE_SIDE_EFFECTS (decl); 865 TREE_READONLY (new_decl) = TREE_READONLY (decl); 866 TREE_ADDRESSABLE (new_decl) = TREE_ADDRESSABLE (decl); 867 DECL_SEEN_IN_BIND_EXPR_P (new_decl) = 1; 868 if ((TREE_CODE (decl) == PARM_DECL 869 || TREE_CODE (decl) == RESULT_DECL 870 || TREE_CODE (decl) == VAR_DECL) 871 && DECL_BY_REFERENCE (decl)) 872 DECL_BY_REFERENCE (new_decl) = 1; 873 874 SET_DECL_VALUE_EXPR (new_decl, x); 875 DECL_HAS_VALUE_EXPR_P (new_decl) = 1; 876 877 *slot = new_decl; 878 TREE_CHAIN (new_decl) = info->debug_var_chain; 879 info->debug_var_chain = new_decl; 880 881 if (!optimize 882 && info->context != target_context 883 && variably_modified_type_p (TREE_TYPE (decl), NULL)) 884 note_nonlocal_vla_type (info, TREE_TYPE (decl)); 885 886 return new_decl; 887} 888 889 890/* Callback for walk_gimple_stmt, rewrite all references to VAR 891 and PARM_DECLs that belong to outer functions. 892 893 The rewrite will involve some number of structure accesses back up 894 the static chain. E.g. for a variable FOO up one nesting level it'll 895 be CHAIN->FOO. For two levels it'll be CHAIN->__chain->FOO. Further 896 indirections apply to decls for which use_pointer_in_frame is true. */ 897 898static tree 899convert_nonlocal_reference_op (tree *tp, int *walk_subtrees, void *data) 900{ 901 struct walk_stmt_info *wi = (struct walk_stmt_info *) data; 902 struct nesting_info *const info = (struct nesting_info *) wi->info; 903 tree t = *tp; 904 905 *walk_subtrees = 0; 906 switch (TREE_CODE (t)) 907 { 908 case VAR_DECL: 909 /* Non-automatic variables are never processed. */ 910 if (TREE_STATIC (t) || DECL_EXTERNAL (t)) 911 break; 912 /* FALLTHRU */ 913 914 case PARM_DECL: 915 if (decl_function_context (t) != info->context) 916 { 917 tree x; 918 wi->changed = true; 919 920 x = get_nonlocal_debug_decl (info, t); 921 if (!bitmap_bit_p (info->suppress_expansion, DECL_UID (t))) 922 { 923 tree target_context = decl_function_context (t); 924 struct nesting_info *i; 925 for (i = info->outer; i->context != target_context; i = i->outer) 926 continue; 927 x = lookup_field_for_decl (i, t, INSERT); 928 x = get_frame_field (info, target_context, x, &wi->gsi); 929 if (use_pointer_in_frame (t)) 930 { 931 x = init_tmp_var (info, x, &wi->gsi); 932 x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x); 933 } 934 } 935 936 if (wi->val_only) 937 { 938 if (wi->is_lhs) 939 x = save_tmp_var (info, x, &wi->gsi); 940 else 941 x = init_tmp_var (info, x, &wi->gsi); 942 } 943 944 *tp = x; 945 } 946 break; 947 948 case LABEL_DECL: 949 /* We're taking the address of a label from a parent function, but 950 this is not itself a non-local goto. Mark the label such that it 951 will not be deleted, much as we would with a label address in 952 static storage. */ 953 if (decl_function_context (t) != info->context) 954 FORCED_LABEL (t) = 1; 955 break; 956 957 case ADDR_EXPR: 958 { 959 bool save_val_only = wi->val_only; 960 961 wi->val_only = false; 962 wi->is_lhs = false; 963 wi->changed = false; 964 walk_tree (&TREE_OPERAND (t, 0), convert_nonlocal_reference_op, wi, 0); 965 wi->val_only = true; 966 967 if (wi->changed) 968 { 969 tree save_context; 970 971 /* If we changed anything, we might no longer be directly 972 referencing a decl. */ 973 save_context = current_function_decl; 974 current_function_decl = info->context; 975 recompute_tree_invariant_for_addr_expr (t); 976 current_function_decl = save_context; 977 978 /* If the callback converted the address argument in a context 979 where we only accept variables (and min_invariant, presumably), 980 then compute the address into a temporary. */ 981 if (save_val_only) 982 *tp = gsi_gimplify_val ((struct nesting_info *) wi->info, 983 t, &wi->gsi); 984 } 985 } 986 break; 987 988 case REALPART_EXPR: 989 case IMAGPART_EXPR: 990 case COMPONENT_REF: 991 case ARRAY_REF: 992 case ARRAY_RANGE_REF: 993 case BIT_FIELD_REF: 994 /* Go down this entire nest and just look at the final prefix and 995 anything that describes the references. Otherwise, we lose track 996 of whether a NOP_EXPR or VIEW_CONVERT_EXPR needs a simple value. */ 997 wi->val_only = true; 998 wi->is_lhs = false; 999 for (; handled_component_p (t); tp = &TREE_OPERAND (t, 0), t = *tp) 1000 { 1001 if (TREE_CODE (t) == COMPONENT_REF) 1002 walk_tree (&TREE_OPERAND (t, 2), convert_nonlocal_reference_op, wi, 1003 NULL); 1004 else if (TREE_CODE (t) == ARRAY_REF 1005 || TREE_CODE (t) == ARRAY_RANGE_REF) 1006 { 1007 walk_tree (&TREE_OPERAND (t, 1), convert_nonlocal_reference_op, 1008 wi, NULL); 1009 walk_tree (&TREE_OPERAND (t, 2), convert_nonlocal_reference_op, 1010 wi, NULL); 1011 walk_tree (&TREE_OPERAND (t, 3), convert_nonlocal_reference_op, 1012 wi, NULL); 1013 } 1014 else if (TREE_CODE (t) == BIT_FIELD_REF) 1015 { 1016 walk_tree (&TREE_OPERAND (t, 1), convert_nonlocal_reference_op, 1017 wi, NULL); 1018 walk_tree (&TREE_OPERAND (t, 2), convert_nonlocal_reference_op, 1019 wi, NULL); 1020 } 1021 } 1022 wi->val_only = false; 1023 walk_tree (tp, convert_nonlocal_reference_op, wi, NULL); 1024 break; 1025 1026 case VIEW_CONVERT_EXPR: 1027 /* Just request to look at the subtrees, leaving val_only and lhs 1028 untouched. This might actually be for !val_only + lhs, in which 1029 case we don't want to force a replacement by a temporary. */ 1030 *walk_subtrees = 1; 1031 break; 1032 1033 default: 1034 if (!IS_TYPE_OR_DECL_P (t)) 1035 { 1036 *walk_subtrees = 1; 1037 wi->val_only = true; 1038 wi->is_lhs = false; 1039 } 1040 break; 1041 } 1042 1043 return NULL_TREE; 1044} 1045 1046static tree convert_nonlocal_reference_stmt (gimple_stmt_iterator *, bool *, 1047 struct walk_stmt_info *); 1048 1049/* Helper for convert_nonlocal_references, rewrite all references to VAR 1050 and PARM_DECLs that belong to outer functions. */ 1051 1052static bool 1053convert_nonlocal_omp_clauses (tree *pclauses, struct walk_stmt_info *wi) 1054{ 1055 struct nesting_info *const info = (struct nesting_info *) wi->info; 1056 bool need_chain = false, need_stmts = false; 1057 tree clause, decl; 1058 int dummy; 1059 bitmap new_suppress; 1060 1061 new_suppress = BITMAP_GGC_ALLOC (); 1062 bitmap_copy (new_suppress, info->suppress_expansion); 1063 1064 for (clause = *pclauses; clause ; clause = OMP_CLAUSE_CHAIN (clause)) 1065 { 1066 switch (OMP_CLAUSE_CODE (clause)) 1067 { 1068 case OMP_CLAUSE_REDUCTION: 1069 if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause)) 1070 need_stmts = true; 1071 goto do_decl_clause; 1072 1073 case OMP_CLAUSE_LASTPRIVATE: 1074 if (OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (clause)) 1075 need_stmts = true; 1076 goto do_decl_clause; 1077 1078 case OMP_CLAUSE_PRIVATE: 1079 case OMP_CLAUSE_FIRSTPRIVATE: 1080 case OMP_CLAUSE_COPYPRIVATE: 1081 case OMP_CLAUSE_SHARED: 1082 do_decl_clause: 1083 decl = OMP_CLAUSE_DECL (clause); 1084 if (TREE_CODE (decl) == VAR_DECL 1085 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))) 1086 break; 1087 if (decl_function_context (decl) != info->context) 1088 { 1089 bitmap_set_bit (new_suppress, DECL_UID (decl)); 1090 OMP_CLAUSE_DECL (clause) = get_nonlocal_debug_decl (info, decl); 1091 if (OMP_CLAUSE_CODE (clause) != OMP_CLAUSE_PRIVATE) 1092 need_chain = true; 1093 } 1094 break; 1095 1096 case OMP_CLAUSE_SCHEDULE: 1097 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause) == NULL) 1098 break; 1099 /* FALLTHRU */ 1100 case OMP_CLAUSE_IF: 1101 case OMP_CLAUSE_NUM_THREADS: 1102 wi->val_only = true; 1103 wi->is_lhs = false; 1104 convert_nonlocal_reference_op (&OMP_CLAUSE_OPERAND (clause, 0), 1105 &dummy, wi); 1106 break; 1107 1108 case OMP_CLAUSE_NOWAIT: 1109 case OMP_CLAUSE_ORDERED: 1110 case OMP_CLAUSE_DEFAULT: 1111 case OMP_CLAUSE_COPYIN: 1112 case OMP_CLAUSE_COLLAPSE: 1113 case OMP_CLAUSE_UNTIED: 1114 break; 1115 1116 default: 1117 gcc_unreachable (); 1118 } 1119 } 1120 1121 info->suppress_expansion = new_suppress; 1122 1123 if (need_stmts) 1124 for (clause = *pclauses; clause ; clause = OMP_CLAUSE_CHAIN (clause)) 1125 switch (OMP_CLAUSE_CODE (clause)) 1126 { 1127 case OMP_CLAUSE_REDUCTION: 1128 if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause)) 1129 { 1130 tree old_context 1131 = DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause)); 1132 DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause)) 1133 = info->context; 1134 walk_body (convert_nonlocal_reference_stmt, 1135 convert_nonlocal_reference_op, info, 1136 OMP_CLAUSE_REDUCTION_GIMPLE_INIT (clause)); 1137 walk_body (convert_nonlocal_reference_stmt, 1138 convert_nonlocal_reference_op, info, 1139 OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (clause)); 1140 DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause)) 1141 = old_context; 1142 } 1143 break; 1144 1145 case OMP_CLAUSE_LASTPRIVATE: 1146 walk_body (convert_nonlocal_reference_stmt, 1147 convert_nonlocal_reference_op, info, 1148 OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (clause)); 1149 break; 1150 1151 default: 1152 break; 1153 } 1154 1155 return need_chain; 1156} 1157 1158/* Create nonlocal debug decls for nonlocal VLA array bounds. */ 1159 1160static void 1161note_nonlocal_vla_type (struct nesting_info *info, tree type) 1162{ 1163 while (POINTER_TYPE_P (type) && !TYPE_NAME (type)) 1164 type = TREE_TYPE (type); 1165 1166 if (TYPE_NAME (type) 1167 && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL 1168 && DECL_ORIGINAL_TYPE (TYPE_NAME (type))) 1169 type = DECL_ORIGINAL_TYPE (TYPE_NAME (type)); 1170 1171 while (POINTER_TYPE_P (type) 1172 || TREE_CODE (type) == VECTOR_TYPE 1173 || TREE_CODE (type) == FUNCTION_TYPE 1174 || TREE_CODE (type) == METHOD_TYPE) 1175 type = TREE_TYPE (type); 1176 1177 if (TREE_CODE (type) == ARRAY_TYPE) 1178 { 1179 tree domain, t; 1180 1181 note_nonlocal_vla_type (info, TREE_TYPE (type)); 1182 domain = TYPE_DOMAIN (type); 1183 if (domain) 1184 { 1185 t = TYPE_MIN_VALUE (domain); 1186 if (t && (TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == PARM_DECL) 1187 && decl_function_context (t) != info->context) 1188 get_nonlocal_debug_decl (info, t); 1189 t = TYPE_MAX_VALUE (domain); 1190 if (t && (TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == PARM_DECL) 1191 && decl_function_context (t) != info->context) 1192 get_nonlocal_debug_decl (info, t); 1193 } 1194 } 1195} 1196 1197/* Create nonlocal debug decls for nonlocal VLA array bounds for VLAs 1198 in BLOCK. */ 1199 1200static void 1201note_nonlocal_block_vlas (struct nesting_info *info, tree block) 1202{ 1203 tree var; 1204 1205 for (var = BLOCK_VARS (block); var; var = TREE_CHAIN (var)) 1206 if (TREE_CODE (var) == VAR_DECL 1207 && variably_modified_type_p (TREE_TYPE (var), NULL) 1208 && DECL_HAS_VALUE_EXPR_P (var) 1209 && decl_function_context (var) != info->context) 1210 note_nonlocal_vla_type (info, TREE_TYPE (var)); 1211} 1212 1213/* Callback for walk_gimple_stmt. Rewrite all references to VAR and 1214 PARM_DECLs that belong to outer functions. This handles statements 1215 that are not handled via the standard recursion done in 1216 walk_gimple_stmt. STMT is the statement to examine, DATA is as in 1217 convert_nonlocal_reference_op. Set *HANDLED_OPS_P to true if all the 1218 operands of STMT have been handled by this function. */ 1219 1220static tree 1221convert_nonlocal_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p, 1222 struct walk_stmt_info *wi) 1223{ 1224 struct nesting_info *info = (struct nesting_info *) wi->info; 1225 tree save_local_var_chain; 1226 bitmap save_suppress; 1227 gimple stmt = gsi_stmt (*gsi); 1228 1229 switch (gimple_code (stmt)) 1230 { 1231 case GIMPLE_GOTO: 1232 /* Don't walk non-local gotos for now. */ 1233 if (TREE_CODE (gimple_goto_dest (stmt)) != LABEL_DECL) 1234 { 1235 wi->val_only = true; 1236 wi->is_lhs = false; 1237 *handled_ops_p = true; 1238 return NULL_TREE; 1239 } 1240 break; 1241 1242 case GIMPLE_OMP_PARALLEL: 1243 case GIMPLE_OMP_TASK: 1244 save_suppress = info->suppress_expansion; 1245 if (convert_nonlocal_omp_clauses (gimple_omp_taskreg_clauses_ptr (stmt), 1246 wi)) 1247 { 1248 tree c, decl; 1249 decl = get_chain_decl (info); 1250 c = build_omp_clause (gimple_location (stmt), 1251 OMP_CLAUSE_FIRSTPRIVATE); 1252 OMP_CLAUSE_DECL (c) = decl; 1253 OMP_CLAUSE_CHAIN (c) = gimple_omp_taskreg_clauses (stmt); 1254 gimple_omp_taskreg_set_clauses (stmt, c); 1255 } 1256 1257 save_local_var_chain = info->new_local_var_chain; 1258 info->new_local_var_chain = NULL; 1259 1260 walk_body (convert_nonlocal_reference_stmt, convert_nonlocal_reference_op, 1261 info, gimple_omp_body (stmt)); 1262 1263 if (info->new_local_var_chain) 1264 declare_vars (info->new_local_var_chain, 1265 gimple_seq_first_stmt (gimple_omp_body (stmt)), 1266 false); 1267 info->new_local_var_chain = save_local_var_chain; 1268 info->suppress_expansion = save_suppress; 1269 break; 1270 1271 case GIMPLE_OMP_FOR: 1272 save_suppress = info->suppress_expansion; 1273 convert_nonlocal_omp_clauses (gimple_omp_for_clauses_ptr (stmt), wi); 1274 walk_gimple_omp_for (stmt, convert_nonlocal_reference_stmt, 1275 convert_nonlocal_reference_op, info); 1276 walk_body (convert_nonlocal_reference_stmt, 1277 convert_nonlocal_reference_op, info, gimple_omp_body (stmt)); 1278 info->suppress_expansion = save_suppress; 1279 break; 1280 1281 case GIMPLE_OMP_SECTIONS: 1282 save_suppress = info->suppress_expansion; 1283 convert_nonlocal_omp_clauses (gimple_omp_sections_clauses_ptr (stmt), wi); 1284 walk_body (convert_nonlocal_reference_stmt, convert_nonlocal_reference_op, 1285 info, gimple_omp_body (stmt)); 1286 info->suppress_expansion = save_suppress; 1287 break; 1288 1289 case GIMPLE_OMP_SINGLE: 1290 save_suppress = info->suppress_expansion; 1291 convert_nonlocal_omp_clauses (gimple_omp_single_clauses_ptr (stmt), wi); 1292 walk_body (convert_nonlocal_reference_stmt, convert_nonlocal_reference_op, 1293 info, gimple_omp_body (stmt)); 1294 info->suppress_expansion = save_suppress; 1295 break; 1296 1297 case GIMPLE_OMP_SECTION: 1298 case GIMPLE_OMP_MASTER: 1299 case GIMPLE_OMP_ORDERED: 1300 walk_body (convert_nonlocal_reference_stmt, convert_nonlocal_reference_op, 1301 info, gimple_omp_body (stmt)); 1302 break; 1303 1304 case GIMPLE_BIND: 1305 if (!optimize && gimple_bind_block (stmt)) 1306 note_nonlocal_block_vlas (info, gimple_bind_block (stmt)); 1307 1308 *handled_ops_p = false; 1309 return NULL_TREE; 1310 1311 case GIMPLE_COND: 1312 wi->val_only = true; 1313 wi->is_lhs = false; 1314 *handled_ops_p = false; 1315 return NULL_TREE; 1316 1317 default: 1318 /* For every other statement that we are not interested in 1319 handling here, let the walker traverse the operands. */ 1320 *handled_ops_p = false; 1321 return NULL_TREE; 1322 } 1323 1324 /* We have handled all of STMT operands, no need to traverse the operands. */ 1325 *handled_ops_p = true; 1326 return NULL_TREE; 1327} 1328 1329 1330/* A subroutine of convert_local_reference. Create a local variable 1331 in the parent function with DECL_VALUE_EXPR set to reference the 1332 field in FRAME. This is used both for debug info and in OpenMP 1333 lowering. */ 1334 1335static tree 1336get_local_debug_decl (struct nesting_info *info, tree decl, tree field) 1337{ 1338 tree x, new_decl; 1339 void **slot; 1340 1341 slot = pointer_map_insert (info->var_map, decl); 1342 if (*slot) 1343 return (tree) *slot; 1344 1345 /* Make sure frame_decl gets created. */ 1346 (void) get_frame_type (info); 1347 x = info->frame_decl; 1348 x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE); 1349 1350 new_decl = build_decl (DECL_SOURCE_LOCATION (decl), 1351 VAR_DECL, DECL_NAME (decl), TREE_TYPE (decl)); 1352 DECL_CONTEXT (new_decl) = info->context; 1353 DECL_ARTIFICIAL (new_decl) = DECL_ARTIFICIAL (decl); 1354 DECL_IGNORED_P (new_decl) = DECL_IGNORED_P (decl); 1355 TREE_THIS_VOLATILE (new_decl) = TREE_THIS_VOLATILE (decl); 1356 TREE_SIDE_EFFECTS (new_decl) = TREE_SIDE_EFFECTS (decl); 1357 TREE_READONLY (new_decl) = TREE_READONLY (decl); 1358 TREE_ADDRESSABLE (new_decl) = TREE_ADDRESSABLE (decl); 1359 DECL_SEEN_IN_BIND_EXPR_P (new_decl) = 1; 1360 if ((TREE_CODE (decl) == PARM_DECL 1361 || TREE_CODE (decl) == RESULT_DECL 1362 || TREE_CODE (decl) == VAR_DECL) 1363 && DECL_BY_REFERENCE (decl)) 1364 DECL_BY_REFERENCE (new_decl) = 1; 1365 1366 SET_DECL_VALUE_EXPR (new_decl, x); 1367 DECL_HAS_VALUE_EXPR_P (new_decl) = 1; 1368 *slot = new_decl; 1369 1370 TREE_CHAIN (new_decl) = info->debug_var_chain; 1371 info->debug_var_chain = new_decl; 1372 1373 /* Do not emit debug info twice. */ 1374 DECL_IGNORED_P (decl) = 1; 1375 1376 return new_decl; 1377} 1378 1379 1380/* Called via walk_function+walk_gimple_stmt, rewrite all references to VAR 1381 and PARM_DECLs that were referenced by inner nested functions. 1382 The rewrite will be a structure reference to the local frame variable. */ 1383 1384static bool convert_local_omp_clauses (tree *, struct walk_stmt_info *); 1385 1386static tree 1387convert_local_reference_op (tree *tp, int *walk_subtrees, void *data) 1388{ 1389 struct walk_stmt_info *wi = (struct walk_stmt_info *) data; 1390 struct nesting_info *const info = (struct nesting_info *) wi->info; 1391 tree t = *tp, field, x; 1392 bool save_val_only; 1393 1394 *walk_subtrees = 0; 1395 switch (TREE_CODE (t)) 1396 { 1397 case VAR_DECL: 1398 /* Non-automatic variables are never processed. */ 1399 if (TREE_STATIC (t) || DECL_EXTERNAL (t)) 1400 break; 1401 /* FALLTHRU */ 1402 1403 case PARM_DECL: 1404 if (decl_function_context (t) == info->context) 1405 { 1406 /* If we copied a pointer to the frame, then the original decl 1407 is used unchanged in the parent function. */ 1408 if (use_pointer_in_frame (t)) 1409 break; 1410 1411 /* No need to transform anything if no child references the 1412 variable. */ 1413 field = lookup_field_for_decl (info, t, NO_INSERT); 1414 if (!field) 1415 break; 1416 wi->changed = true; 1417 1418 x = get_local_debug_decl (info, t, field); 1419 if (!bitmap_bit_p (info->suppress_expansion, DECL_UID (t))) 1420 x = get_frame_field (info, info->context, field, &wi->gsi); 1421 1422 if (wi->val_only) 1423 { 1424 if (wi->is_lhs) 1425 x = save_tmp_var (info, x, &wi->gsi); 1426 else 1427 x = init_tmp_var (info, x, &wi->gsi); 1428 } 1429 1430 *tp = x; 1431 } 1432 break; 1433 1434 case ADDR_EXPR: 1435 save_val_only = wi->val_only; 1436 wi->val_only = false; 1437 wi->is_lhs = false; 1438 wi->changed = false; 1439 walk_tree (&TREE_OPERAND (t, 0), convert_local_reference_op, wi, NULL); 1440 wi->val_only = save_val_only; 1441 1442 /* If we converted anything ... */ 1443 if (wi->changed) 1444 { 1445 tree save_context; 1446 1447 /* Then the frame decl is now addressable. */ 1448 TREE_ADDRESSABLE (info->frame_decl) = 1; 1449 1450 save_context = current_function_decl; 1451 current_function_decl = info->context; 1452 recompute_tree_invariant_for_addr_expr (t); 1453 current_function_decl = save_context; 1454 1455 /* If we are in a context where we only accept values, then 1456 compute the address into a temporary. */ 1457 if (save_val_only) 1458 *tp = gsi_gimplify_val ((struct nesting_info *) wi->info, 1459 t, &wi->gsi); 1460 } 1461 break; 1462 1463 case REALPART_EXPR: 1464 case IMAGPART_EXPR: 1465 case COMPONENT_REF: 1466 case ARRAY_REF: 1467 case ARRAY_RANGE_REF: 1468 case BIT_FIELD_REF: 1469 /* Go down this entire nest and just look at the final prefix and 1470 anything that describes the references. Otherwise, we lose track 1471 of whether a NOP_EXPR or VIEW_CONVERT_EXPR needs a simple value. */ 1472 save_val_only = wi->val_only; 1473 wi->val_only = true; 1474 wi->is_lhs = false; 1475 for (; handled_component_p (t); tp = &TREE_OPERAND (t, 0), t = *tp) 1476 { 1477 if (TREE_CODE (t) == COMPONENT_REF) 1478 walk_tree (&TREE_OPERAND (t, 2), convert_local_reference_op, wi, 1479 NULL); 1480 else if (TREE_CODE (t) == ARRAY_REF 1481 || TREE_CODE (t) == ARRAY_RANGE_REF) 1482 { 1483 walk_tree (&TREE_OPERAND (t, 1), convert_local_reference_op, wi, 1484 NULL); 1485 walk_tree (&TREE_OPERAND (t, 2), convert_local_reference_op, wi, 1486 NULL); 1487 walk_tree (&TREE_OPERAND (t, 3), convert_local_reference_op, wi, 1488 NULL); 1489 } 1490 else if (TREE_CODE (t) == BIT_FIELD_REF) 1491 { 1492 walk_tree (&TREE_OPERAND (t, 1), convert_local_reference_op, wi, 1493 NULL); 1494 walk_tree (&TREE_OPERAND (t, 2), convert_local_reference_op, wi, 1495 NULL); 1496 } 1497 } 1498 wi->val_only = false; 1499 walk_tree (tp, convert_local_reference_op, wi, NULL); 1500 wi->val_only = save_val_only; 1501 break; 1502 1503 case VIEW_CONVERT_EXPR: 1504 /* Just request to look at the subtrees, leaving val_only and lhs 1505 untouched. This might actually be for !val_only + lhs, in which 1506 case we don't want to force a replacement by a temporary. */ 1507 *walk_subtrees = 1; 1508 break; 1509 1510 default: 1511 if (!IS_TYPE_OR_DECL_P (t)) 1512 { 1513 *walk_subtrees = 1; 1514 wi->val_only = true; 1515 wi->is_lhs = false; 1516 } 1517 break; 1518 } 1519 1520 return NULL_TREE; 1521} 1522 1523static tree convert_local_reference_stmt (gimple_stmt_iterator *, bool *, 1524 struct walk_stmt_info *); 1525 1526/* Helper for convert_local_reference. Convert all the references in 1527 the chain of clauses at *PCLAUSES. WI is as in convert_local_reference. */ 1528 1529static bool 1530convert_local_omp_clauses (tree *pclauses, struct walk_stmt_info *wi) 1531{ 1532 struct nesting_info *const info = (struct nesting_info *) wi->info; 1533 bool need_frame = false, need_stmts = false; 1534 tree clause, decl; 1535 int dummy; 1536 bitmap new_suppress; 1537 1538 new_suppress = BITMAP_GGC_ALLOC (); 1539 bitmap_copy (new_suppress, info->suppress_expansion); 1540 1541 for (clause = *pclauses; clause ; clause = OMP_CLAUSE_CHAIN (clause)) 1542 { 1543 switch (OMP_CLAUSE_CODE (clause)) 1544 { 1545 case OMP_CLAUSE_REDUCTION: 1546 if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause)) 1547 need_stmts = true; 1548 goto do_decl_clause; 1549 1550 case OMP_CLAUSE_LASTPRIVATE: 1551 if (OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (clause)) 1552 need_stmts = true; 1553 goto do_decl_clause; 1554 1555 case OMP_CLAUSE_PRIVATE: 1556 case OMP_CLAUSE_FIRSTPRIVATE: 1557 case OMP_CLAUSE_COPYPRIVATE: 1558 case OMP_CLAUSE_SHARED: 1559 do_decl_clause: 1560 decl = OMP_CLAUSE_DECL (clause); 1561 if (TREE_CODE (decl) == VAR_DECL 1562 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))) 1563 break; 1564 if (decl_function_context (decl) == info->context 1565 && !use_pointer_in_frame (decl)) 1566 { 1567 tree field = lookup_field_for_decl (info, decl, NO_INSERT); 1568 if (field) 1569 { 1570 bitmap_set_bit (new_suppress, DECL_UID (decl)); 1571 OMP_CLAUSE_DECL (clause) 1572 = get_local_debug_decl (info, decl, field); 1573 need_frame = true; 1574 } 1575 } 1576 break; 1577 1578 case OMP_CLAUSE_SCHEDULE: 1579 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause) == NULL) 1580 break; 1581 /* FALLTHRU */ 1582 case OMP_CLAUSE_IF: 1583 case OMP_CLAUSE_NUM_THREADS: 1584 wi->val_only = true; 1585 wi->is_lhs = false; 1586 convert_local_reference_op (&OMP_CLAUSE_OPERAND (clause, 0), &dummy, 1587 wi); 1588 break; 1589 1590 case OMP_CLAUSE_NOWAIT: 1591 case OMP_CLAUSE_ORDERED: 1592 case OMP_CLAUSE_DEFAULT: 1593 case OMP_CLAUSE_COPYIN: 1594 case OMP_CLAUSE_COLLAPSE: 1595 case OMP_CLAUSE_UNTIED: 1596 break; 1597 1598 default: 1599 gcc_unreachable (); 1600 } 1601 } 1602 1603 info->suppress_expansion = new_suppress; 1604 1605 if (need_stmts) 1606 for (clause = *pclauses; clause ; clause = OMP_CLAUSE_CHAIN (clause)) 1607 switch (OMP_CLAUSE_CODE (clause)) 1608 { 1609 case OMP_CLAUSE_REDUCTION: 1610 if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause)) 1611 { 1612 tree old_context 1613 = DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause)); 1614 DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause)) 1615 = info->context; 1616 walk_body (convert_local_reference_stmt, 1617 convert_local_reference_op, info, 1618 OMP_CLAUSE_REDUCTION_GIMPLE_INIT (clause)); 1619 walk_body (convert_local_reference_stmt, 1620 convert_local_reference_op, info, 1621 OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (clause)); 1622 DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause)) 1623 = old_context; 1624 } 1625 break; 1626 1627 case OMP_CLAUSE_LASTPRIVATE: 1628 walk_body (convert_local_reference_stmt, 1629 convert_local_reference_op, info, 1630 OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (clause)); 1631 break; 1632 1633 default: 1634 break; 1635 } 1636 1637 return need_frame; 1638} 1639 1640 1641/* Called via walk_function+walk_gimple_stmt, rewrite all references to VAR 1642 and PARM_DECLs that were referenced by inner nested functions. 1643 The rewrite will be a structure reference to the local frame variable. */ 1644 1645static tree 1646convert_local_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p, 1647 struct walk_stmt_info *wi) 1648{ 1649 struct nesting_info *info = (struct nesting_info *) wi->info; 1650 tree save_local_var_chain; 1651 bitmap save_suppress; 1652 gimple stmt = gsi_stmt (*gsi); 1653 1654 switch (gimple_code (stmt)) 1655 { 1656 case GIMPLE_OMP_PARALLEL: 1657 case GIMPLE_OMP_TASK: 1658 save_suppress = info->suppress_expansion; 1659 if (convert_local_omp_clauses (gimple_omp_taskreg_clauses_ptr (stmt), 1660 wi)) 1661 { 1662 tree c; 1663 (void) get_frame_type (info); 1664 c = build_omp_clause (gimple_location (stmt), 1665 OMP_CLAUSE_SHARED); 1666 OMP_CLAUSE_DECL (c) = info->frame_decl; 1667 OMP_CLAUSE_CHAIN (c) = gimple_omp_taskreg_clauses (stmt); 1668 gimple_omp_taskreg_set_clauses (stmt, c); 1669 } 1670 1671 save_local_var_chain = info->new_local_var_chain; 1672 info->new_local_var_chain = NULL; 1673 1674 walk_body (convert_local_reference_stmt, convert_local_reference_op, info, 1675 gimple_omp_body (stmt)); 1676 1677 if (info->new_local_var_chain) 1678 declare_vars (info->new_local_var_chain, 1679 gimple_seq_first_stmt (gimple_omp_body (stmt)), false); 1680 info->new_local_var_chain = save_local_var_chain; 1681 info->suppress_expansion = save_suppress; 1682 break; 1683 1684 case GIMPLE_OMP_FOR: 1685 save_suppress = info->suppress_expansion; 1686 convert_local_omp_clauses (gimple_omp_for_clauses_ptr (stmt), wi); 1687 walk_gimple_omp_for (stmt, convert_local_reference_stmt, 1688 convert_local_reference_op, info); 1689 walk_body (convert_local_reference_stmt, convert_local_reference_op, 1690 info, gimple_omp_body (stmt)); 1691 info->suppress_expansion = save_suppress; 1692 break; 1693 1694 case GIMPLE_OMP_SECTIONS: 1695 save_suppress = info->suppress_expansion; 1696 convert_local_omp_clauses (gimple_omp_sections_clauses_ptr (stmt), wi); 1697 walk_body (convert_local_reference_stmt, convert_local_reference_op, 1698 info, gimple_omp_body (stmt)); 1699 info->suppress_expansion = save_suppress; 1700 break; 1701 1702 case GIMPLE_OMP_SINGLE: 1703 save_suppress = info->suppress_expansion; 1704 convert_local_omp_clauses (gimple_omp_single_clauses_ptr (stmt), wi); 1705 walk_body (convert_local_reference_stmt, convert_local_reference_op, 1706 info, gimple_omp_body (stmt)); 1707 info->suppress_expansion = save_suppress; 1708 break; 1709 1710 case GIMPLE_OMP_SECTION: 1711 case GIMPLE_OMP_MASTER: 1712 case GIMPLE_OMP_ORDERED: 1713 walk_body (convert_local_reference_stmt, convert_local_reference_op, 1714 info, gimple_omp_body (stmt)); 1715 break; 1716 1717 case GIMPLE_COND: 1718 wi->val_only = true; 1719 wi->is_lhs = false; 1720 *handled_ops_p = false; 1721 return NULL_TREE; 1722 1723 default: 1724 /* For every other statement that we are not interested in 1725 handling here, let the walker traverse the operands. */ 1726 *handled_ops_p = false; 1727 return NULL_TREE; 1728 } 1729 1730 /* Indicate that we have handled all the operands ourselves. */ 1731 *handled_ops_p = true; 1732 return NULL_TREE; 1733} 1734 1735 1736/* Called via walk_function+walk_gimple_stmt, rewrite all GIMPLE_GOTOs 1737 that reference labels from outer functions. The rewrite will be a 1738 call to __builtin_nonlocal_goto. */ 1739 1740static tree 1741convert_nl_goto_reference (gimple_stmt_iterator *gsi, bool *handled_ops_p, 1742 struct walk_stmt_info *wi) 1743{ 1744 struct nesting_info *const info = (struct nesting_info *) wi->info, *i; 1745 tree label, new_label, target_context, x, field; 1746 void **slot; 1747 gimple call; 1748 gimple stmt = gsi_stmt (*gsi); 1749 1750 if (gimple_code (stmt) != GIMPLE_GOTO) 1751 { 1752 *handled_ops_p = false; 1753 return NULL_TREE; 1754 } 1755 1756 label = gimple_goto_dest (stmt); 1757 if (TREE_CODE (label) != LABEL_DECL) 1758 { 1759 *handled_ops_p = false; 1760 return NULL_TREE; 1761 } 1762 1763 target_context = decl_function_context (label); 1764 if (target_context == info->context) 1765 { 1766 *handled_ops_p = false; 1767 return NULL_TREE; 1768 } 1769 1770 for (i = info->outer; target_context != i->context; i = i->outer) 1771 continue; 1772 1773 /* The original user label may also be use for a normal goto, therefore 1774 we must create a new label that will actually receive the abnormal 1775 control transfer. This new label will be marked LABEL_NONLOCAL; this 1776 mark will trigger proper behavior in the cfg, as well as cause the 1777 (hairy target-specific) non-local goto receiver code to be generated 1778 when we expand rtl. Enter this association into var_map so that we 1779 can insert the new label into the IL during a second pass. */ 1780 slot = pointer_map_insert (i->var_map, label); 1781 if (*slot == NULL) 1782 { 1783 new_label = create_artificial_label (UNKNOWN_LOCATION); 1784 DECL_NONLOCAL (new_label) = 1; 1785 *slot = new_label; 1786 } 1787 else 1788 new_label = (tree) *slot; 1789 1790 /* Build: __builtin_nl_goto(new_label, &chain->nl_goto_field). */ 1791 field = get_nl_goto_field (i); 1792 x = get_frame_field (info, target_context, field, &wi->gsi); 1793 x = build_addr (x, target_context); 1794 x = gsi_gimplify_val (info, x, &wi->gsi); 1795 call = gimple_build_call (implicit_built_in_decls[BUILT_IN_NONLOCAL_GOTO], 2, 1796 build_addr (new_label, target_context), x); 1797 gsi_replace (&wi->gsi, call, false); 1798 1799 /* We have handled all of STMT's operands, no need to keep going. */ 1800 *handled_ops_p = true; 1801 return NULL_TREE; 1802} 1803 1804 1805/* Called via walk_function+walk_tree, rewrite all GIMPLE_LABELs whose labels 1806 are referenced via nonlocal goto from a nested function. The rewrite 1807 will involve installing a newly generated DECL_NONLOCAL label, and 1808 (potentially) a branch around the rtl gunk that is assumed to be 1809 attached to such a label. */ 1810 1811static tree 1812convert_nl_goto_receiver (gimple_stmt_iterator *gsi, bool *handled_ops_p, 1813 struct walk_stmt_info *wi) 1814{ 1815 struct nesting_info *const info = (struct nesting_info *) wi->info; 1816 tree label, new_label; 1817 gimple_stmt_iterator tmp_gsi; 1818 void **slot; 1819 gimple stmt = gsi_stmt (*gsi); 1820 1821 if (gimple_code (stmt) != GIMPLE_LABEL) 1822 { 1823 *handled_ops_p = false; 1824 return NULL_TREE; 1825 } 1826 1827 label = gimple_label_label (stmt); 1828 1829 slot = pointer_map_contains (info->var_map, label); 1830 if (!slot) 1831 { 1832 *handled_ops_p = false; 1833 return NULL_TREE; 1834 } 1835 1836 /* If there's any possibility that the previous statement falls through, 1837 then we must branch around the new non-local label. */ 1838 tmp_gsi = wi->gsi; 1839 gsi_prev (&tmp_gsi); 1840 if (gsi_end_p (tmp_gsi) || gimple_stmt_may_fallthru (gsi_stmt (tmp_gsi))) 1841 { 1842 gimple stmt = gimple_build_goto (label); 1843 gsi_insert_before (gsi, stmt, GSI_SAME_STMT); 1844 } 1845 1846 new_label = (tree) *slot; 1847 stmt = gimple_build_label (new_label); 1848 gsi_insert_before (gsi, stmt, GSI_SAME_STMT); 1849 1850 *handled_ops_p = true; 1851 return NULL_TREE; 1852} 1853 1854 1855/* Called via walk_function+walk_stmt, rewrite all references to addresses 1856 of nested functions that require the use of trampolines. The rewrite 1857 will involve a reference a trampoline generated for the occasion. */ 1858 1859static tree 1860convert_tramp_reference_op (tree *tp, int *walk_subtrees, void *data) 1861{ 1862 struct walk_stmt_info *wi = (struct walk_stmt_info *) data; 1863 struct nesting_info *const info = (struct nesting_info *) wi->info, *i; 1864 tree t = *tp, decl, target_context, x, builtin; 1865 gimple call; 1866 1867 *walk_subtrees = 0; 1868 switch (TREE_CODE (t)) 1869 { 1870 case ADDR_EXPR: 1871 /* Build 1872 T.1 = &CHAIN->tramp; 1873 T.2 = __builtin_adjust_trampoline (T.1); 1874 T.3 = (func_type)T.2; 1875 */ 1876 1877 decl = TREE_OPERAND (t, 0); 1878 if (TREE_CODE (decl) != FUNCTION_DECL) 1879 break; 1880 1881 /* Only need to process nested functions. */ 1882 target_context = decl_function_context (decl); 1883 if (!target_context) 1884 break; 1885 1886 /* If the nested function doesn't use a static chain, then 1887 it doesn't need a trampoline. */ 1888 if (!DECL_STATIC_CHAIN (decl)) 1889 break; 1890 1891 /* If we don't want a trampoline, then don't build one. */ 1892 if (TREE_NO_TRAMPOLINE (t)) 1893 break; 1894 1895 /* Lookup the immediate parent of the callee, as that's where 1896 we need to insert the trampoline. */ 1897 for (i = info; i->context != target_context; i = i->outer) 1898 continue; 1899 x = lookup_tramp_for_decl (i, decl, INSERT); 1900 1901 /* Compute the address of the field holding the trampoline. */ 1902 x = get_frame_field (info, target_context, x, &wi->gsi); 1903 x = build_addr (x, target_context); 1904 x = gsi_gimplify_val (info, x, &wi->gsi); 1905 1906 /* Do machine-specific ugliness. Normally this will involve 1907 computing extra alignment, but it can really be anything. */ 1908 builtin = implicit_built_in_decls[BUILT_IN_ADJUST_TRAMPOLINE]; 1909 call = gimple_build_call (builtin, 1, x); 1910 x = init_tmp_var_with_call (info, &wi->gsi, call); 1911 1912 /* Cast back to the proper function type. */ 1913 x = build1 (NOP_EXPR, TREE_TYPE (t), x); 1914 x = init_tmp_var (info, x, &wi->gsi); 1915 1916 *tp = x; 1917 break; 1918 1919 default: 1920 if (!IS_TYPE_OR_DECL_P (t)) 1921 *walk_subtrees = 1; 1922 break; 1923 } 1924 1925 return NULL_TREE; 1926} 1927 1928 1929/* Called via walk_function+walk_gimple_stmt, rewrite all references 1930 to addresses of nested functions that require the use of 1931 trampolines. The rewrite will involve a reference a trampoline 1932 generated for the occasion. */ 1933 1934static tree 1935convert_tramp_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p, 1936 struct walk_stmt_info *wi) 1937{ 1938 gimple stmt = gsi_stmt (*gsi); 1939 1940 switch (gimple_code (stmt)) 1941 { 1942 case GIMPLE_CALL: 1943 { 1944 /* Only walk call arguments, lest we generate trampolines for 1945 direct calls. */ 1946 unsigned long i, nargs = gimple_call_num_args (stmt); 1947 for (i = 0; i < nargs; i++) 1948 walk_tree (gimple_call_arg_ptr (stmt, i), convert_tramp_reference_op, 1949 wi, NULL); 1950 1951 *handled_ops_p = true; 1952 return NULL_TREE; 1953 } 1954 1955 default: 1956 break; 1957 } 1958 1959 *handled_ops_p = false; 1960 return NULL_TREE; 1961} 1962 1963 1964 1965/* Called via walk_function+walk_gimple_stmt, rewrite all GIMPLE_CALLs 1966 that reference nested functions to make sure that the static chain 1967 is set up properly for the call. */ 1968 1969static tree 1970convert_gimple_call (gimple_stmt_iterator *gsi, bool *handled_ops_p, 1971 struct walk_stmt_info *wi) 1972{ 1973 struct nesting_info *const info = (struct nesting_info *) wi->info; 1974 tree decl, target_context; 1975 char save_static_chain_added; 1976 int i; 1977 gimple stmt = gsi_stmt (*gsi); 1978 1979 switch (gimple_code (stmt)) 1980 { 1981 case GIMPLE_CALL: 1982 if (gimple_call_chain (stmt)) 1983 break; 1984 decl = gimple_call_fndecl (stmt); 1985 if (!decl) 1986 break; 1987 target_context = decl_function_context (decl); 1988 if (target_context && DECL_STATIC_CHAIN (decl)) 1989 { 1990 gimple_call_set_chain (stmt, get_static_chain (info, target_context, 1991 &wi->gsi)); 1992 info->static_chain_added |= (1 << (info->context != target_context)); 1993 } 1994 break; 1995 1996 case GIMPLE_OMP_PARALLEL: 1997 case GIMPLE_OMP_TASK: 1998 save_static_chain_added = info->static_chain_added; 1999 info->static_chain_added = 0; 2000 walk_body (convert_gimple_call, NULL, info, gimple_omp_body (stmt)); 2001 for (i = 0; i < 2; i++) 2002 { 2003 tree c, decl; 2004 if ((info->static_chain_added & (1 << i)) == 0) 2005 continue; 2006 decl = i ? get_chain_decl (info) : info->frame_decl; 2007 /* Don't add CHAIN.* or FRAME.* twice. */ 2008 for (c = gimple_omp_taskreg_clauses (stmt); 2009 c; 2010 c = OMP_CLAUSE_CHAIN (c)) 2011 if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE 2012 || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED) 2013 && OMP_CLAUSE_DECL (c) == decl) 2014 break; 2015 if (c == NULL) 2016 { 2017 c = build_omp_clause (gimple_location (stmt), 2018 i ? OMP_CLAUSE_FIRSTPRIVATE 2019 : OMP_CLAUSE_SHARED); 2020 OMP_CLAUSE_DECL (c) = decl; 2021 OMP_CLAUSE_CHAIN (c) = gimple_omp_taskreg_clauses (stmt); 2022 gimple_omp_taskreg_set_clauses (stmt, c); 2023 } 2024 } 2025 info->static_chain_added |= save_static_chain_added; 2026 break; 2027 2028 case GIMPLE_OMP_FOR: 2029 walk_body (convert_gimple_call, NULL, info, 2030 gimple_omp_for_pre_body (stmt)); 2031 /* FALLTHRU */ 2032 case GIMPLE_OMP_SECTIONS: 2033 case GIMPLE_OMP_SECTION: 2034 case GIMPLE_OMP_SINGLE: 2035 case GIMPLE_OMP_MASTER: 2036 case GIMPLE_OMP_ORDERED: 2037 case GIMPLE_OMP_CRITICAL: 2038 walk_body (convert_gimple_call, NULL, info, gimple_omp_body (stmt)); 2039 break; 2040 2041 default: 2042 /* Keep looking for other operands. */ 2043 *handled_ops_p = false; 2044 return NULL_TREE; 2045 } 2046 2047 *handled_ops_p = true; 2048 return NULL_TREE; 2049} 2050 2051/* Walk the nesting tree starting with ROOT. Convert all trampolines and 2052 call expressions. At the same time, determine if a nested function 2053 actually uses its static chain; if not, remember that. */ 2054 2055static void 2056convert_all_function_calls (struct nesting_info *root) 2057{ 2058 unsigned int chain_count = 0, old_chain_count, iter_count; 2059 struct nesting_info *n; 2060 2061 /* First, optimistically clear static_chain for all decls that haven't 2062 used the static chain already for variable access. */ 2063 FOR_EACH_NEST_INFO (n, root) 2064 { 2065 tree decl = n->context; 2066 if (!n->outer || (!n->chain_decl && !n->chain_field)) 2067 { 2068 DECL_STATIC_CHAIN (decl) = 0; 2069 if (dump_file && (dump_flags & TDF_DETAILS)) 2070 fprintf (dump_file, "Guessing no static-chain for %s\n", 2071 lang_hooks.decl_printable_name (decl, 2)); 2072 } 2073 else 2074 DECL_STATIC_CHAIN (decl) = 1; 2075 chain_count += DECL_STATIC_CHAIN (decl); 2076 } 2077 2078 /* Walk the functions and perform transformations. Note that these 2079 transformations can induce new uses of the static chain, which in turn 2080 require re-examining all users of the decl. */ 2081 /* ??? It would make sense to try to use the call graph to speed this up, 2082 but the call graph hasn't really been built yet. Even if it did, we 2083 would still need to iterate in this loop since address-of references 2084 wouldn't show up in the callgraph anyway. */ 2085 iter_count = 0; 2086 do 2087 { 2088 old_chain_count = chain_count; 2089 chain_count = 0; 2090 iter_count++; 2091 2092 if (dump_file && (dump_flags & TDF_DETAILS)) 2093 fputc ('\n', dump_file); 2094 2095 FOR_EACH_NEST_INFO (n, root) 2096 { 2097 tree decl = n->context; 2098 walk_function (convert_tramp_reference_stmt, 2099 convert_tramp_reference_op, n); 2100 walk_function (convert_gimple_call, NULL, n); 2101 chain_count += DECL_STATIC_CHAIN (decl); 2102 } 2103 } 2104 while (chain_count != old_chain_count); 2105 2106 if (dump_file && (dump_flags & TDF_DETAILS)) 2107 fprintf (dump_file, "convert_all_function_calls iterations: %u\n\n", 2108 iter_count); 2109} 2110 2111struct nesting_copy_body_data 2112{ 2113 copy_body_data cb; 2114 struct nesting_info *root; 2115}; 2116 2117/* A helper subroutine for debug_var_chain type remapping. */ 2118 2119static tree 2120nesting_copy_decl (tree decl, copy_body_data *id) 2121{ 2122 struct nesting_copy_body_data *nid = (struct nesting_copy_body_data *) id; 2123 void **slot = pointer_map_contains (nid->root->var_map, decl); 2124 2125 if (slot) 2126 return (tree) *slot; 2127 2128 if (TREE_CODE (decl) == TYPE_DECL && DECL_ORIGINAL_TYPE (decl)) 2129 { 2130 tree new_decl = copy_decl_no_change (decl, id); 2131 DECL_ORIGINAL_TYPE (new_decl) 2132 = remap_type (DECL_ORIGINAL_TYPE (decl), id); 2133 return new_decl; 2134 } 2135 2136 if (TREE_CODE (decl) == VAR_DECL 2137 || TREE_CODE (decl) == PARM_DECL 2138 || TREE_CODE (decl) == RESULT_DECL) 2139 return decl; 2140 2141 return copy_decl_no_change (decl, id); 2142} 2143 2144/* A helper function for remap_vla_decls. See if *TP contains 2145 some remapped variables. */ 2146 2147static tree 2148contains_remapped_vars (tree *tp, int *walk_subtrees, void *data) 2149{ 2150 struct nesting_info *root = (struct nesting_info *) data; 2151 tree t = *tp; 2152 void **slot; 2153 2154 if (DECL_P (t)) 2155 { 2156 *walk_subtrees = 0; 2157 slot = pointer_map_contains (root->var_map, t); 2158 2159 if (slot) 2160 return (tree) *slot; 2161 } 2162 return NULL; 2163} 2164 2165/* Remap VLA decls in BLOCK and subblocks if remapped variables are 2166 involved. */ 2167 2168static void 2169remap_vla_decls (tree block, struct nesting_info *root) 2170{ 2171 tree var, subblock, val, type; 2172 struct nesting_copy_body_data id; 2173 2174 for (subblock = BLOCK_SUBBLOCKS (block); 2175 subblock; 2176 subblock = BLOCK_CHAIN (subblock)) 2177 remap_vla_decls (subblock, root); 2178 2179 for (var = BLOCK_VARS (block); var; var = TREE_CHAIN (var)) 2180 { 2181 if (TREE_CODE (var) == VAR_DECL 2182 && variably_modified_type_p (TREE_TYPE (var), NULL) 2183 && DECL_HAS_VALUE_EXPR_P (var)) 2184 { 2185 type = TREE_TYPE (var); 2186 val = DECL_VALUE_EXPR (var); 2187 if (walk_tree (&type, contains_remapped_vars, root, NULL) != NULL 2188 || walk_tree (&val, contains_remapped_vars, root, NULL) != NULL) 2189 break; 2190 } 2191 } 2192 if (var == NULL_TREE) 2193 return; 2194 2195 memset (&id, 0, sizeof (id)); 2196 id.cb.copy_decl = nesting_copy_decl; 2197 id.cb.decl_map = pointer_map_create (); 2198 id.root = root; 2199 2200 for (; var; var = TREE_CHAIN (var)) 2201 if (TREE_CODE (var) == VAR_DECL 2202 && variably_modified_type_p (TREE_TYPE (var), NULL) 2203 && DECL_HAS_VALUE_EXPR_P (var)) 2204 { 2205 struct nesting_info *i; 2206 tree newt, t, context; 2207 2208 t = type = TREE_TYPE (var); 2209 val = DECL_VALUE_EXPR (var); 2210 if (walk_tree (&type, contains_remapped_vars, root, NULL) == NULL 2211 && walk_tree (&val, contains_remapped_vars, root, NULL) == NULL) 2212 continue; 2213 2214 context = decl_function_context (var); 2215 for (i = root; i; i = i->outer) 2216 if (i->context == context) 2217 break; 2218 2219 if (i == NULL) 2220 continue; 2221 2222 id.cb.src_fn = i->context; 2223 id.cb.dst_fn = i->context; 2224 id.cb.src_cfun = DECL_STRUCT_FUNCTION (root->context); 2225 2226 TREE_TYPE (var) = newt = remap_type (type, &id.cb); 2227 while (POINTER_TYPE_P (newt) && !TYPE_NAME (newt)) 2228 { 2229 newt = TREE_TYPE (newt); 2230 t = TREE_TYPE (t); 2231 } 2232 if (TYPE_NAME (newt) 2233 && TREE_CODE (TYPE_NAME (newt)) == TYPE_DECL 2234 && DECL_ORIGINAL_TYPE (TYPE_NAME (newt)) 2235 && newt != t 2236 && TYPE_NAME (newt) == TYPE_NAME (t)) 2237 TYPE_NAME (newt) = remap_decl (TYPE_NAME (newt), &id.cb); 2238 2239 walk_tree (&val, copy_tree_body_r, &id.cb, NULL); 2240 if (val != DECL_VALUE_EXPR (var)) 2241 SET_DECL_VALUE_EXPR (var, val); 2242 } 2243 2244 pointer_map_destroy (id.cb.decl_map); 2245} 2246 2247/* Do "everything else" to clean up or complete state collected by the 2248 various walking passes -- lay out the types and decls, generate code 2249 to initialize the frame decl, store critical expressions in the 2250 struct function for rtl to find. */ 2251 2252static void 2253finalize_nesting_tree_1 (struct nesting_info *root) 2254{ 2255 gimple_seq stmt_list; 2256 gimple stmt; 2257 tree context = root->context; 2258 struct function *sf; 2259 2260 stmt_list = NULL; 2261 2262 /* If we created a non-local frame type or decl, we need to lay them 2263 out at this time. */ 2264 if (root->frame_type) 2265 { 2266 /* In some cases the frame type will trigger the -Wpadded warning. 2267 This is not helpful; suppress it. */ 2268 int save_warn_padded = warn_padded; 2269 tree *adjust; 2270 2271 warn_padded = 0; 2272 layout_type (root->frame_type); 2273 warn_padded = save_warn_padded; 2274 layout_decl (root->frame_decl, 0); 2275 2276 /* Remove root->frame_decl from root->new_local_var_chain, so 2277 that we can declare it also in the lexical blocks, which 2278 helps ensure virtual regs that end up appearing in its RTL 2279 expression get substituted in instantiate_virtual_regs(). */ 2280 for (adjust = &root->new_local_var_chain; 2281 *adjust != root->frame_decl; 2282 adjust = &TREE_CHAIN (*adjust)) 2283 gcc_assert (TREE_CHAIN (*adjust)); 2284 *adjust = TREE_CHAIN (*adjust); 2285 2286 TREE_CHAIN (root->frame_decl) = NULL_TREE; 2287 declare_vars (root->frame_decl, 2288 gimple_seq_first_stmt (gimple_body (context)), true); 2289 } 2290 2291 /* If any parameters were referenced non-locally, then we need to 2292 insert a copy. Likewise, if any variables were referenced by 2293 pointer, we need to initialize the address. */ 2294 if (root->any_parm_remapped) 2295 { 2296 tree p; 2297 for (p = DECL_ARGUMENTS (context); p ; p = TREE_CHAIN (p)) 2298 { 2299 tree field, x, y; 2300 2301 field = lookup_field_for_decl (root, p, NO_INSERT); 2302 if (!field) 2303 continue; 2304 2305 if (use_pointer_in_frame (p)) 2306 x = build_addr (p, context); 2307 else 2308 x = p; 2309 2310 y = build3 (COMPONENT_REF, TREE_TYPE (field), 2311 root->frame_decl, field, NULL_TREE); 2312 stmt = gimple_build_assign (y, x); 2313 gimple_seq_add_stmt (&stmt_list, stmt); 2314 /* If the assignment is from a non-register the stmt is 2315 not valid gimple. Make it so by using a temporary instead. */ 2316 if (!is_gimple_reg (x) 2317 && is_gimple_reg_type (TREE_TYPE (x))) 2318 { 2319 gimple_stmt_iterator gsi = gsi_last (stmt_list); 2320 x = init_tmp_var (root, x, &gsi); 2321 gimple_assign_set_rhs1 (stmt, x); 2322 } 2323 } 2324 } 2325 2326 /* If a chain_field was created, then it needs to be initialized 2327 from chain_decl. */ 2328 if (root->chain_field) 2329 { 2330 tree x = build3 (COMPONENT_REF, TREE_TYPE (root->chain_field), 2331 root->frame_decl, root->chain_field, NULL_TREE); 2332 stmt = gimple_build_assign (x, get_chain_decl (root)); 2333 gimple_seq_add_stmt (&stmt_list, stmt); 2334 } 2335 2336 /* If trampolines were created, then we need to initialize them. */ 2337 if (root->any_tramp_created) 2338 { 2339 struct nesting_info *i; 2340 for (i = root->inner; i ; i = i->next) 2341 { 2342 tree arg1, arg2, arg3, x, field; 2343 2344 field = lookup_tramp_for_decl (root, i->context, NO_INSERT); 2345 if (!field) 2346 continue; 2347 2348 gcc_assert (DECL_STATIC_CHAIN (i->context)); 2349 arg3 = build_addr (root->frame_decl, context); 2350 2351 arg2 = build_addr (i->context, context); 2352 2353 x = build3 (COMPONENT_REF, TREE_TYPE (field), 2354 root->frame_decl, field, NULL_TREE); 2355 arg1 = build_addr (x, context); 2356 2357 x = implicit_built_in_decls[BUILT_IN_INIT_TRAMPOLINE]; 2358 stmt = gimple_build_call (x, 3, arg1, arg2, arg3); 2359 gimple_seq_add_stmt (&stmt_list, stmt); 2360 } 2361 } 2362 2363 /* If we created initialization statements, insert them. */ 2364 if (stmt_list) 2365 { 2366 gimple bind; 2367 annotate_all_with_location (stmt_list, DECL_SOURCE_LOCATION (context)); 2368 bind = gimple_seq_first_stmt (gimple_body (context)); 2369 gimple_seq_add_seq (&stmt_list, gimple_bind_body (bind)); 2370 gimple_bind_set_body (bind, stmt_list); 2371 } 2372 2373 /* If a chain_decl was created, then it needs to be registered with 2374 struct function so that it gets initialized from the static chain 2375 register at the beginning of the function. */ 2376 sf = DECL_STRUCT_FUNCTION (root->context); 2377 sf->static_chain_decl = root->chain_decl; 2378 2379 /* Similarly for the non-local goto save area. */ 2380 if (root->nl_goto_field) 2381 { 2382 sf->nonlocal_goto_save_area 2383 = get_frame_field (root, context, root->nl_goto_field, NULL); 2384 sf->has_nonlocal_label = 1; 2385 } 2386 2387 /* Make sure all new local variables get inserted into the 2388 proper BIND_EXPR. */ 2389 if (root->new_local_var_chain) 2390 declare_vars (root->new_local_var_chain, 2391 gimple_seq_first_stmt (gimple_body (root->context)), 2392 false); 2393 2394 if (root->debug_var_chain) 2395 { 2396 tree debug_var; 2397 gimple scope; 2398 2399 remap_vla_decls (DECL_INITIAL (root->context), root); 2400 2401 for (debug_var = root->debug_var_chain; debug_var; 2402 debug_var = TREE_CHAIN (debug_var)) 2403 if (variably_modified_type_p (TREE_TYPE (debug_var), NULL)) 2404 break; 2405 2406 /* If there are any debug decls with variable length types, 2407 remap those types using other debug_var_chain variables. */ 2408 if (debug_var) 2409 { 2410 struct nesting_copy_body_data id; 2411 2412 memset (&id, 0, sizeof (id)); 2413 id.cb.copy_decl = nesting_copy_decl; 2414 id.cb.decl_map = pointer_map_create (); 2415 id.root = root; 2416 2417 for (; debug_var; debug_var = TREE_CHAIN (debug_var)) 2418 if (variably_modified_type_p (TREE_TYPE (debug_var), NULL)) 2419 { 2420 tree type = TREE_TYPE (debug_var); 2421 tree newt, t = type; 2422 struct nesting_info *i; 2423 2424 for (i = root; i; i = i->outer) 2425 if (variably_modified_type_p (type, i->context)) 2426 break; 2427 2428 if (i == NULL) 2429 continue; 2430 2431 id.cb.src_fn = i->context; 2432 id.cb.dst_fn = i->context; 2433 id.cb.src_cfun = DECL_STRUCT_FUNCTION (root->context); 2434 2435 TREE_TYPE (debug_var) = newt = remap_type (type, &id.cb); 2436 while (POINTER_TYPE_P (newt) && !TYPE_NAME (newt)) 2437 { 2438 newt = TREE_TYPE (newt); 2439 t = TREE_TYPE (t); 2440 } 2441 if (TYPE_NAME (newt) 2442 && TREE_CODE (TYPE_NAME (newt)) == TYPE_DECL 2443 && DECL_ORIGINAL_TYPE (TYPE_NAME (newt)) 2444 && newt != t 2445 && TYPE_NAME (newt) == TYPE_NAME (t)) 2446 TYPE_NAME (newt) = remap_decl (TYPE_NAME (newt), &id.cb); 2447 } 2448 2449 pointer_map_destroy (id.cb.decl_map); 2450 } 2451 2452 scope = gimple_seq_first_stmt (gimple_body (root->context)); 2453 if (gimple_bind_block (scope)) 2454 declare_vars (root->debug_var_chain, scope, true); 2455 else 2456 BLOCK_VARS (DECL_INITIAL (root->context)) 2457 = chainon (BLOCK_VARS (DECL_INITIAL (root->context)), 2458 root->debug_var_chain); 2459 } 2460 2461 /* Dump the translated tree function. */ 2462 if (dump_file) 2463 { 2464 fputs ("\n\n", dump_file); 2465 dump_function_to_file (root->context, dump_file, dump_flags); 2466 } 2467} 2468 2469static void 2470finalize_nesting_tree (struct nesting_info *root) 2471{ 2472 struct nesting_info *n; 2473 FOR_EACH_NEST_INFO (n, root) 2474 finalize_nesting_tree_1 (n); 2475} 2476 2477/* Unnest the nodes and pass them to cgraph. */ 2478 2479static void 2480unnest_nesting_tree_1 (struct nesting_info *root) 2481{ 2482 struct cgraph_node *node = cgraph_node (root->context); 2483 2484 /* For nested functions update the cgraph to reflect unnesting. 2485 We also delay finalizing of these functions up to this point. */ 2486 if (node->origin) 2487 { 2488 cgraph_unnest_node (cgraph_node (root->context)); 2489 cgraph_finalize_function (root->context, true); 2490 } 2491} 2492 2493static void 2494unnest_nesting_tree (struct nesting_info *root) 2495{ 2496 struct nesting_info *n; 2497 FOR_EACH_NEST_INFO (n, root) 2498 unnest_nesting_tree_1 (n); 2499} 2500 2501/* Free the data structures allocated during this pass. */ 2502 2503static void 2504free_nesting_tree (struct nesting_info *root) 2505{ 2506 struct nesting_info *node, *next; 2507 2508 node = iter_nestinfo_start (root); 2509 do 2510 { 2511 next = iter_nestinfo_next (node); 2512 pointer_map_destroy (node->var_map); 2513 pointer_map_destroy (node->field_map); 2514 free (node); 2515 node = next; 2516 } 2517 while (node); 2518} 2519 2520/* Gimplify a function and all its nested functions. */ 2521static void 2522gimplify_all_functions (struct cgraph_node *root) 2523{ 2524 struct cgraph_node *iter; 2525 if (!gimple_body (root->decl)) 2526 gimplify_function_tree (root->decl); 2527 for (iter = root->nested; iter; iter = iter->next_nested) 2528 gimplify_all_functions (iter); 2529} 2530 2531/* Main entry point for this pass. Process FNDECL and all of its nested 2532 subroutines and turn them into something less tightly bound. */ 2533 2534void 2535lower_nested_functions (tree fndecl) 2536{ 2537 struct cgraph_node *cgn; 2538 struct nesting_info *root; 2539 2540 /* If there are no nested functions, there's nothing to do. */ 2541 cgn = cgraph_node (fndecl); 2542 if (!cgn->nested) 2543 return; 2544 2545 gimplify_all_functions (cgn); 2546 2547 dump_file = dump_begin (TDI_nested, &dump_flags); 2548 if (dump_file) 2549 fprintf (dump_file, "\n;; Function %s\n\n", 2550 lang_hooks.decl_printable_name (fndecl, 2)); 2551 2552 bitmap_obstack_initialize (&nesting_info_bitmap_obstack); 2553 root = create_nesting_tree (cgn); 2554 2555 walk_all_functions (convert_nonlocal_reference_stmt, 2556 convert_nonlocal_reference_op, 2557 root); 2558 walk_all_functions (convert_local_reference_stmt, 2559 convert_local_reference_op, 2560 root); 2561 walk_all_functions (convert_nl_goto_reference, NULL, root); 2562 walk_all_functions (convert_nl_goto_receiver, NULL, root); 2563 2564 convert_all_function_calls (root); 2565 finalize_nesting_tree (root); 2566 unnest_nesting_tree (root); 2567 2568 free_nesting_tree (root); 2569 bitmap_obstack_release (&nesting_info_bitmap_obstack); 2570 2571 if (dump_file) 2572 { 2573 dump_end (TDI_nested, dump_file); 2574 dump_file = NULL; 2575 } 2576} 2577 2578#include "gt-tree-nested.h" 2579