1 /* Nested function decomposition for GIMPLE.
2 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010
3 Free Software Foundation, Inc.
5 This file is part of GCC.
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)
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.
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/>. */
23 #include "coretypes.h"
29 #include "tree-dump.h"
30 #include "tree-inline.h"
32 #include "tree-iterator.h"
33 #include "tree-flow.h"
36 #include "langhooks.h"
37 #include "pointer-set.h"
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.
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.
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
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.
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. */
83 struct nesting_info *outer;
84 struct nesting_info *inner;
85 struct nesting_info *next;
87 struct pointer_map_t *field_map;
88 struct pointer_map_t *var_map;
89 bitmap suppress_expansion;
92 tree new_local_var_chain;
100 bool any_parm_remapped;
101 bool any_tramp_created;
102 char static_chain_added;
106 /* Obstack used for the bitmaps in the struct above. */
107 static struct bitmap_obstack nesting_info_bitmap_obstack;
110 /* We're working in so many different function contexts simultaneously,
111 that create_tmp_var is dangerous. Prevent mishap. */
112 #define create_tmp_var cant_use_create_tmp_var_here_dummy
114 /* Like create_tmp_var, except record the variable for registration at
115 the given nesting level. */
118 create_tmp_var_for (struct nesting_info *info, tree type, const char *prefix)
122 /* If the type is of variable size or a type which must be created by the
123 frontend, something is wrong. Note that we explicitly allow
124 incomplete types here, since we create them ourselves here. */
125 gcc_assert (!TREE_ADDRESSABLE (type));
126 gcc_assert (!TYPE_SIZE_UNIT (type)
127 || TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST);
129 tmp_var = create_tmp_var_raw (type, prefix);
130 DECL_CONTEXT (tmp_var) = info->context;
131 TREE_CHAIN (tmp_var) = info->new_local_var_chain;
132 DECL_SEEN_IN_BIND_EXPR_P (tmp_var) = 1;
133 if (TREE_CODE (type) == COMPLEX_TYPE
134 || TREE_CODE (type) == VECTOR_TYPE)
135 DECL_GIMPLE_REG_P (tmp_var) = 1;
137 info->new_local_var_chain = tmp_var;
142 /* Take the address of EXP to be used within function CONTEXT.
143 Mark it for addressability as necessary. */
146 build_addr (tree exp, tree context)
152 while (handled_component_p (base))
153 base = TREE_OPERAND (base, 0);
156 TREE_ADDRESSABLE (base) = 1;
158 /* Building the ADDR_EXPR will compute a set of properties for
159 that ADDR_EXPR. Those properties are unfortunately context
160 specific, i.e., they are dependent on CURRENT_FUNCTION_DECL.
162 Temporarily set CURRENT_FUNCTION_DECL to the desired context,
163 build the ADDR_EXPR, then restore CURRENT_FUNCTION_DECL. That
164 way the properties are for the ADDR_EXPR are computed properly. */
165 save_context = current_function_decl;
166 current_function_decl = context;
167 retval = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (exp)), exp);
168 current_function_decl = save_context;
172 /* Insert FIELD into TYPE, sorted by alignment requirements. */
175 insert_field_into_struct (tree type, tree field)
179 DECL_CONTEXT (field) = type;
181 for (p = &TYPE_FIELDS (type); *p ; p = &TREE_CHAIN (*p))
182 if (DECL_ALIGN (field) >= DECL_ALIGN (*p))
185 TREE_CHAIN (field) = *p;
188 /* Set correct alignment for frame struct type. */
189 if (TYPE_ALIGN (type) < DECL_ALIGN (field))
190 TYPE_ALIGN (type) = DECL_ALIGN (field);
193 /* Build or return the RECORD_TYPE that describes the frame state that is
194 shared between INFO->CONTEXT and its nested functions. This record will
195 not be complete until finalize_nesting_tree; up until that point we'll
196 be adding fields as necessary.
198 We also build the DECL that represents this frame in the function. */
201 get_frame_type (struct nesting_info *info)
203 tree type = info->frame_type;
208 type = make_node (RECORD_TYPE);
210 name = concat ("FRAME.",
211 IDENTIFIER_POINTER (DECL_NAME (info->context)),
213 TYPE_NAME (type) = get_identifier (name);
216 info->frame_type = type;
217 info->frame_decl = create_tmp_var_for (info, type, "FRAME");
219 /* ??? Always make it addressable for now, since it is meant to
220 be pointed to by the static chain pointer. This pessimizes
221 when it turns out that no static chains are needed because
222 the nested functions referencing non-local variables are not
223 reachable, but the true pessimization is to create the non-
224 local frame structure in the first place. */
225 TREE_ADDRESSABLE (info->frame_decl) = 1;
230 /* Return true if DECL should be referenced by pointer in the non-local
234 use_pointer_in_frame (tree decl)
236 if (TREE_CODE (decl) == PARM_DECL)
238 /* It's illegal to copy TREE_ADDRESSABLE, impossible to copy variable
239 sized decls, and inefficient to copy large aggregates. Don't bother
240 moving anything but scalar variables. */
241 return AGGREGATE_TYPE_P (TREE_TYPE (decl));
245 /* Variable sized types make things "interesting" in the frame. */
246 return DECL_SIZE (decl) == NULL || !TREE_CONSTANT (DECL_SIZE (decl));
250 /* Given DECL, a non-locally accessed variable, find or create a field
251 in the non-local frame structure for the given nesting context. */
254 lookup_field_for_decl (struct nesting_info *info, tree decl,
255 enum insert_option insert)
259 if (insert == NO_INSERT)
261 slot = pointer_map_contains (info->field_map, decl);
262 return slot ? (tree) *slot : NULL_TREE;
265 slot = pointer_map_insert (info->field_map, decl);
268 tree field = make_node (FIELD_DECL);
269 DECL_NAME (field) = DECL_NAME (decl);
271 if (use_pointer_in_frame (decl))
273 TREE_TYPE (field) = build_pointer_type (TREE_TYPE (decl));
274 DECL_ALIGN (field) = TYPE_ALIGN (TREE_TYPE (field));
275 DECL_NONADDRESSABLE_P (field) = 1;
279 TREE_TYPE (field) = TREE_TYPE (decl);
280 DECL_SOURCE_LOCATION (field) = DECL_SOURCE_LOCATION (decl);
281 DECL_ALIGN (field) = DECL_ALIGN (decl);
282 DECL_USER_ALIGN (field) = DECL_USER_ALIGN (decl);
283 TREE_ADDRESSABLE (field) = TREE_ADDRESSABLE (decl);
284 DECL_NONADDRESSABLE_P (field) = !TREE_ADDRESSABLE (decl);
285 TREE_THIS_VOLATILE (field) = TREE_THIS_VOLATILE (decl);
288 insert_field_into_struct (get_frame_type (info), field);
291 if (TREE_CODE (decl) == PARM_DECL)
292 info->any_parm_remapped = true;
298 /* Build or return the variable that holds the static chain within
299 INFO->CONTEXT. This variable may only be used within INFO->CONTEXT. */
302 get_chain_decl (struct nesting_info *info)
304 tree decl = info->chain_decl;
309 type = get_frame_type (info->outer);
310 type = build_pointer_type (type);
312 /* Note that this variable is *not* entered into any BIND_EXPR;
313 the construction of this variable is handled specially in
314 expand_function_start and initialize_inlined_parameters.
315 Note also that it's represented as a parameter. This is more
316 close to the truth, since the initial value does come from
318 decl = build_decl (PARM_DECL, create_tmp_var_name ("CHAIN"), type);
319 DECL_ARTIFICIAL (decl) = 1;
320 DECL_IGNORED_P (decl) = 1;
321 TREE_USED (decl) = 1;
322 DECL_CONTEXT (decl) = info->context;
323 DECL_ARG_TYPE (decl) = type;
325 /* Tell tree-inline.c that we never write to this variable, so
326 it can copy-prop the replacement value immediately. */
327 TREE_READONLY (decl) = 1;
329 info->chain_decl = decl;
334 /* Build or return the field within the non-local frame state that holds
335 the static chain for INFO->CONTEXT. This is the way to walk back up
336 multiple nesting levels. */
339 get_chain_field (struct nesting_info *info)
341 tree field = info->chain_field;
344 tree type = build_pointer_type (get_frame_type (info->outer));
346 field = make_node (FIELD_DECL);
347 DECL_NAME (field) = get_identifier ("__chain");
348 TREE_TYPE (field) = type;
349 DECL_ALIGN (field) = TYPE_ALIGN (type);
350 DECL_NONADDRESSABLE_P (field) = 1;
352 insert_field_into_struct (get_frame_type (info), field);
354 info->chain_field = field;
359 /* Initialize a new temporary with the GIMPLE_CALL STMT. */
362 init_tmp_var_with_call (struct nesting_info *info, gimple_stmt_iterator *gsi,
367 t = create_tmp_var_for (info, gimple_call_return_type (call), NULL);
368 gimple_call_set_lhs (call, t);
369 if (! gsi_end_p (*gsi))
370 gimple_set_location (call, gimple_location (gsi_stmt (*gsi)));
371 gsi_insert_before (gsi, call, GSI_SAME_STMT);
377 /* Copy EXP into a temporary. Allocate the temporary in the context of
378 INFO and insert the initialization statement before GSI. */
381 init_tmp_var (struct nesting_info *info, tree exp, gimple_stmt_iterator *gsi)
386 t = create_tmp_var_for (info, TREE_TYPE (exp), NULL);
387 stmt = gimple_build_assign (t, exp);
388 if (! gsi_end_p (*gsi))
389 gimple_set_location (stmt, gimple_location (gsi_stmt (*gsi)));
390 gsi_insert_before_without_update (gsi, stmt, GSI_SAME_STMT);
396 /* Similarly, but only do so to force EXP to satisfy is_gimple_val. */
399 gsi_gimplify_val (struct nesting_info *info, tree exp,
400 gimple_stmt_iterator *gsi)
402 if (is_gimple_val (exp))
405 return init_tmp_var (info, exp, gsi);
408 /* Similarly, but copy from the temporary and insert the statement
409 after the iterator. */
412 save_tmp_var (struct nesting_info *info, tree exp, gimple_stmt_iterator *gsi)
417 t = create_tmp_var_for (info, TREE_TYPE (exp), NULL);
418 stmt = gimple_build_assign (exp, t);
419 if (! gsi_end_p (*gsi))
420 gimple_set_location (stmt, gimple_location (gsi_stmt (*gsi)));
421 gsi_insert_after_without_update (gsi, stmt, GSI_SAME_STMT);
426 /* Build or return the type used to represent a nested function trampoline. */
428 static GTY(()) tree trampoline_type;
431 get_trampoline_type (void)
433 unsigned align, size;
437 return trampoline_type;
439 align = TRAMPOLINE_ALIGNMENT;
440 size = TRAMPOLINE_SIZE;
442 /* If we won't be able to guarantee alignment simply via TYPE_ALIGN,
443 then allocate extra space so that we can do dynamic alignment. */
444 if (align > STACK_BOUNDARY)
446 size += ((align/BITS_PER_UNIT) - 1) & -(STACK_BOUNDARY/BITS_PER_UNIT);
447 align = STACK_BOUNDARY;
450 t = build_index_type (build_int_cst (NULL_TREE, size - 1));
451 t = build_array_type (char_type_node, t);
452 t = build_decl (FIELD_DECL, get_identifier ("__data"), t);
453 DECL_ALIGN (t) = align;
454 DECL_USER_ALIGN (t) = 1;
456 trampoline_type = make_node (RECORD_TYPE);
457 TYPE_NAME (trampoline_type) = get_identifier ("__builtin_trampoline");
458 TYPE_FIELDS (trampoline_type) = t;
459 layout_type (trampoline_type);
460 DECL_CONTEXT (t) = trampoline_type;
462 return trampoline_type;
465 /* Given DECL, a nested function, find or create a field in the non-local
466 frame structure for a trampoline for this function. */
469 lookup_tramp_for_decl (struct nesting_info *info, tree decl,
470 enum insert_option insert)
474 if (insert == NO_INSERT)
476 slot = pointer_map_contains (info->var_map, decl);
477 return slot ? (tree) *slot : NULL_TREE;
480 slot = pointer_map_insert (info->var_map, decl);
483 tree field = make_node (FIELD_DECL);
484 DECL_NAME (field) = DECL_NAME (decl);
485 TREE_TYPE (field) = get_trampoline_type ();
486 TREE_ADDRESSABLE (field) = 1;
488 insert_field_into_struct (get_frame_type (info), field);
491 info->any_tramp_created = true;
497 /* Build or return the field within the non-local frame state that holds
498 the non-local goto "jmp_buf". The buffer itself is maintained by the
499 rtl middle-end as dynamic stack space is allocated. */
502 get_nl_goto_field (struct nesting_info *info)
504 tree field = info->nl_goto_field;
510 /* For __builtin_nonlocal_goto, we need N words. The first is the
511 frame pointer, the rest is for the target's stack pointer save
512 area. The number of words is controlled by STACK_SAVEAREA_MODE;
513 not the best interface, but it'll do for now. */
514 if (Pmode == ptr_mode)
515 type = ptr_type_node;
517 type = lang_hooks.types.type_for_mode (Pmode, 1);
519 size = GET_MODE_SIZE (STACK_SAVEAREA_MODE (SAVE_NONLOCAL));
520 size = size / GET_MODE_SIZE (Pmode);
523 type = build_array_type
524 (type, build_index_type (build_int_cst (NULL_TREE, size)));
526 field = make_node (FIELD_DECL);
527 DECL_NAME (field) = get_identifier ("__nl_goto_buf");
528 TREE_TYPE (field) = type;
529 DECL_ALIGN (field) = TYPE_ALIGN (type);
530 TREE_ADDRESSABLE (field) = 1;
532 insert_field_into_struct (get_frame_type (info), field);
534 info->nl_goto_field = field;
540 /* Invoke CALLBACK on all statements of GIMPLE sequence SEQ. */
543 walk_body (walk_stmt_fn callback_stmt, walk_tree_fn callback_op,
544 struct nesting_info *info, gimple_seq seq)
546 struct walk_stmt_info wi;
548 memset (&wi, 0, sizeof (wi));
551 walk_gimple_seq (seq, callback_stmt, callback_op, &wi);
555 /* Invoke CALLBACK_STMT/CALLBACK_OP on all statements of INFO->CONTEXT. */
558 walk_function (walk_stmt_fn callback_stmt, walk_tree_fn callback_op,
559 struct nesting_info *info)
561 walk_body (callback_stmt, callback_op, info, gimple_body (info->context));
564 /* Invoke CALLBACK on a GIMPLE_OMP_FOR's init, cond, incr and pre-body. */
567 walk_gimple_omp_for (gimple for_stmt,
568 walk_stmt_fn callback_stmt, walk_tree_fn callback_op,
569 struct nesting_info *info)
571 struct walk_stmt_info wi;
576 walk_body (callback_stmt, callback_op, info, gimple_omp_for_pre_body (for_stmt));
578 seq = gimple_seq_alloc ();
579 memset (&wi, 0, sizeof (wi));
581 wi.gsi = gsi_last (seq);
583 for (i = 0; i < gimple_omp_for_collapse (for_stmt); i++)
586 walk_tree (gimple_omp_for_index_ptr (for_stmt, i), callback_op,
590 walk_tree (gimple_omp_for_initial_ptr (for_stmt, i), callback_op,
595 walk_tree (gimple_omp_for_final_ptr (for_stmt, i), callback_op,
598 t = gimple_omp_for_incr (for_stmt, i);
599 gcc_assert (BINARY_CLASS_P (t));
601 walk_tree (&TREE_OPERAND (t, 0), callback_op, &wi, NULL);
604 walk_tree (&TREE_OPERAND (t, 1), callback_op, &wi, NULL);
607 if (gimple_seq_empty_p (seq))
608 gimple_seq_free (seq);
611 gimple_seq pre_body = gimple_omp_for_pre_body (for_stmt);
612 annotate_all_with_location (seq, gimple_location (for_stmt));
613 gimple_seq_add_seq (&pre_body, seq);
614 gimple_omp_for_set_pre_body (for_stmt, pre_body);
618 /* Similarly for ROOT and all functions nested underneath, depth first. */
621 walk_all_functions (walk_stmt_fn callback_stmt, walk_tree_fn callback_op,
622 struct nesting_info *root)
627 walk_all_functions (callback_stmt, callback_op, root->inner);
628 walk_function (callback_stmt, callback_op, root);
635 /* We have to check for a fairly pathological case. The operands of function
636 nested function are to be interpreted in the context of the enclosing
637 function. So if any are variably-sized, they will get remapped when the
638 enclosing function is inlined. But that remapping would also have to be
639 done in the types of the PARM_DECLs of the nested function, meaning the
640 argument types of that function will disagree with the arguments in the
641 calls to that function. So we'd either have to make a copy of the nested
642 function corresponding to each time the enclosing function was inlined or
643 add a VIEW_CONVERT_EXPR to each such operand for each call to the nested
644 function. The former is not practical. The latter would still require
645 detecting this case to know when to add the conversions. So, for now at
646 least, we don't inline such an enclosing function.
648 We have to do that check recursively, so here return indicating whether
649 FNDECL has such a nested function. ORIG_FN is the function we were
650 trying to inline to use for checking whether any argument is variably
651 modified by anything in it.
653 It would be better to do this in tree-inline.c so that we could give
654 the appropriate warning for why a function can't be inlined, but that's
655 too late since the nesting structure has already been flattened and
656 adding a flag just to record this fact seems a waste of a flag. */
659 check_for_nested_with_variably_modified (tree fndecl, tree orig_fndecl)
661 struct cgraph_node *cgn = cgraph_node (fndecl);
664 for (cgn = cgn->nested; cgn ; cgn = cgn->next_nested)
666 for (arg = DECL_ARGUMENTS (cgn->decl); arg; arg = TREE_CHAIN (arg))
667 if (variably_modified_type_p (TREE_TYPE (arg), orig_fndecl))
670 if (check_for_nested_with_variably_modified (cgn->decl, orig_fndecl))
677 /* Construct our local datastructure describing the function nesting
678 tree rooted by CGN. */
680 static struct nesting_info *
681 create_nesting_tree (struct cgraph_node *cgn)
683 struct nesting_info *info = XCNEW (struct nesting_info);
684 info->field_map = pointer_map_create ();
685 info->var_map = pointer_map_create ();
686 info->suppress_expansion = BITMAP_ALLOC (&nesting_info_bitmap_obstack);
687 info->context = cgn->decl;
689 for (cgn = cgn->nested; cgn ; cgn = cgn->next_nested)
691 struct nesting_info *sub = create_nesting_tree (cgn);
693 sub->next = info->inner;
697 /* See discussion at check_for_nested_with_variably_modified for a
698 discussion of why this has to be here. */
699 if (check_for_nested_with_variably_modified (info->context, info->context))
700 DECL_UNINLINABLE (info->context) = true;
705 /* Return an expression computing the static chain for TARGET_CONTEXT
706 from INFO->CONTEXT. Insert any necessary computations before TSI. */
709 get_static_chain (struct nesting_info *info, tree target_context,
710 gimple_stmt_iterator *gsi)
712 struct nesting_info *i;
715 if (info->context == target_context)
717 x = build_addr (info->frame_decl, target_context);
721 x = get_chain_decl (info);
723 for (i = info->outer; i->context != target_context; i = i->outer)
725 tree field = get_chain_field (i);
727 x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x);
728 x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE);
729 x = init_tmp_var (info, x, gsi);
737 /* Return an expression referencing FIELD from TARGET_CONTEXT's non-local
738 frame as seen from INFO->CONTEXT. Insert any necessary computations
742 get_frame_field (struct nesting_info *info, tree target_context,
743 tree field, gimple_stmt_iterator *gsi)
745 struct nesting_info *i;
748 if (info->context == target_context)
750 /* Make sure frame_decl gets created. */
751 (void) get_frame_type (info);
752 x = info->frame_decl;
756 x = get_chain_decl (info);
758 for (i = info->outer; i->context != target_context; i = i->outer)
760 tree field = get_chain_field (i);
762 x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x);
763 x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE);
764 x = init_tmp_var (info, x, gsi);
767 x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x);
770 x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE);
775 /* A subroutine of convert_nonlocal_reference_op. Create a local variable
776 in the nested function with DECL_VALUE_EXPR set to reference the true
777 variable in the parent function. This is used both for debug info
778 and in OpenMP lowering. */
781 get_nonlocal_debug_decl (struct nesting_info *info, tree decl)
784 struct nesting_info *i;
785 tree x, field, new_decl;
788 slot = pointer_map_insert (info->var_map, decl);
793 target_context = decl_function_context (decl);
795 /* A copy of the code in get_frame_field, but without the temporaries. */
796 if (info->context == target_context)
798 /* Make sure frame_decl gets created. */
799 (void) get_frame_type (info);
800 x = info->frame_decl;
805 x = get_chain_decl (info);
806 for (i = info->outer; i->context != target_context; i = i->outer)
808 field = get_chain_field (i);
809 x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x);
810 x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE);
812 x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x);
815 field = lookup_field_for_decl (i, decl, INSERT);
816 x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE);
817 if (use_pointer_in_frame (decl))
818 x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x);
820 /* ??? We should be remapping types as well, surely. */
821 new_decl = build_decl (VAR_DECL, DECL_NAME (decl), TREE_TYPE (decl));
822 DECL_CONTEXT (new_decl) = info->context;
823 DECL_SOURCE_LOCATION (new_decl) = DECL_SOURCE_LOCATION (decl);
824 DECL_ARTIFICIAL (new_decl) = DECL_ARTIFICIAL (decl);
825 DECL_IGNORED_P (new_decl) = DECL_IGNORED_P (decl);
826 TREE_THIS_VOLATILE (new_decl) = TREE_THIS_VOLATILE (decl);
827 TREE_SIDE_EFFECTS (new_decl) = TREE_SIDE_EFFECTS (decl);
828 TREE_READONLY (new_decl) = TREE_READONLY (decl);
829 TREE_ADDRESSABLE (new_decl) = TREE_ADDRESSABLE (decl);
830 DECL_SEEN_IN_BIND_EXPR_P (new_decl) = 1;
832 SET_DECL_VALUE_EXPR (new_decl, x);
833 DECL_HAS_VALUE_EXPR_P (new_decl) = 1;
836 TREE_CHAIN (new_decl) = info->debug_var_chain;
837 info->debug_var_chain = new_decl;
843 /* Callback for walk_gimple_stmt, rewrite all references to VAR
844 and PARM_DECLs that belong to outer functions.
846 The rewrite will involve some number of structure accesses back up
847 the static chain. E.g. for a variable FOO up one nesting level it'll
848 be CHAIN->FOO. For two levels it'll be CHAIN->__chain->FOO. Further
849 indirections apply to decls for which use_pointer_in_frame is true. */
852 convert_nonlocal_reference_op (tree *tp, int *walk_subtrees, void *data)
854 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
855 struct nesting_info *const info = (struct nesting_info *) wi->info;
859 switch (TREE_CODE (t))
862 /* Non-automatic variables are never processed. */
863 if (TREE_STATIC (t) || DECL_EXTERNAL (t))
868 if (decl_function_context (t) != info->context)
873 x = get_nonlocal_debug_decl (info, t);
874 if (!bitmap_bit_p (info->suppress_expansion, DECL_UID (t)))
876 tree target_context = decl_function_context (t);
877 struct nesting_info *i;
878 for (i = info->outer; i->context != target_context; i = i->outer)
880 x = lookup_field_for_decl (i, t, INSERT);
881 x = get_frame_field (info, target_context, x, &wi->gsi);
882 if (use_pointer_in_frame (t))
884 x = init_tmp_var (info, x, &wi->gsi);
885 x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x);
892 x = save_tmp_var (info, x, &wi->gsi);
894 x = init_tmp_var (info, x, &wi->gsi);
902 /* We're taking the address of a label from a parent function, but
903 this is not itself a non-local goto. Mark the label such that it
904 will not be deleted, much as we would with a label address in
906 if (decl_function_context (t) != info->context)
907 FORCED_LABEL (t) = 1;
912 bool save_val_only = wi->val_only;
914 wi->val_only = false;
917 walk_tree (&TREE_OPERAND (t, 0), convert_nonlocal_reference_op, wi, 0);
924 /* If we changed anything, we might no longer be directly
925 referencing a decl. */
926 save_context = current_function_decl;
927 current_function_decl = info->context;
928 recompute_tree_invariant_for_addr_expr (t);
929 current_function_decl = save_context;
931 /* If the callback converted the address argument in a context
932 where we only accept variables (and min_invariant, presumably),
933 then compute the address into a temporary. */
935 *tp = gsi_gimplify_val ((struct nesting_info *) wi->info,
945 case ARRAY_RANGE_REF:
947 /* Go down this entire nest and just look at the final prefix and
948 anything that describes the references. Otherwise, we lose track
949 of whether a NOP_EXPR or VIEW_CONVERT_EXPR needs a simple value. */
952 for (; handled_component_p (t); tp = &TREE_OPERAND (t, 0), t = *tp)
954 if (TREE_CODE (t) == COMPONENT_REF)
955 walk_tree (&TREE_OPERAND (t, 2), convert_nonlocal_reference_op, wi,
957 else if (TREE_CODE (t) == ARRAY_REF
958 || TREE_CODE (t) == ARRAY_RANGE_REF)
960 walk_tree (&TREE_OPERAND (t, 1), convert_nonlocal_reference_op,
962 walk_tree (&TREE_OPERAND (t, 2), convert_nonlocal_reference_op,
964 walk_tree (&TREE_OPERAND (t, 3), convert_nonlocal_reference_op,
967 else if (TREE_CODE (t) == BIT_FIELD_REF)
969 walk_tree (&TREE_OPERAND (t, 1), convert_nonlocal_reference_op,
971 walk_tree (&TREE_OPERAND (t, 2), convert_nonlocal_reference_op,
975 wi->val_only = false;
976 walk_tree (tp, convert_nonlocal_reference_op, wi, NULL);
979 case VIEW_CONVERT_EXPR:
980 /* Just request to look at the subtrees, leaving val_only and lhs
981 untouched. This might actually be for !val_only + lhs, in which
982 case we don't want to force a replacement by a temporary. */
987 if (!IS_TYPE_OR_DECL_P (t))
999 static tree convert_nonlocal_reference_stmt (gimple_stmt_iterator *, bool *,
1000 struct walk_stmt_info *);
1002 /* Helper for convert_nonlocal_references, rewrite all references to VAR
1003 and PARM_DECLs that belong to outer functions. */
1006 convert_nonlocal_omp_clauses (tree *pclauses, struct walk_stmt_info *wi)
1008 struct nesting_info *const info = (struct nesting_info *) wi->info;
1009 bool need_chain = false, need_stmts = false;
1012 bitmap new_suppress;
1014 new_suppress = BITMAP_GGC_ALLOC ();
1015 bitmap_copy (new_suppress, info->suppress_expansion);
1017 for (clause = *pclauses; clause ; clause = OMP_CLAUSE_CHAIN (clause))
1019 switch (OMP_CLAUSE_CODE (clause))
1021 case OMP_CLAUSE_REDUCTION:
1022 if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause))
1024 goto do_decl_clause;
1026 case OMP_CLAUSE_LASTPRIVATE:
1027 if (OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (clause))
1029 goto do_decl_clause;
1031 case OMP_CLAUSE_PRIVATE:
1032 case OMP_CLAUSE_FIRSTPRIVATE:
1033 case OMP_CLAUSE_COPYPRIVATE:
1034 case OMP_CLAUSE_SHARED:
1036 decl = OMP_CLAUSE_DECL (clause);
1037 if (TREE_CODE (decl) == VAR_DECL
1038 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
1040 if (decl_function_context (decl) != info->context)
1042 bitmap_set_bit (new_suppress, DECL_UID (decl));
1043 OMP_CLAUSE_DECL (clause) = get_nonlocal_debug_decl (info, decl);
1044 if (OMP_CLAUSE_CODE (clause) != OMP_CLAUSE_PRIVATE)
1049 case OMP_CLAUSE_SCHEDULE:
1050 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause) == NULL)
1054 case OMP_CLAUSE_NUM_THREADS:
1055 wi->val_only = true;
1057 convert_nonlocal_reference_op (&OMP_CLAUSE_OPERAND (clause, 0),
1061 case OMP_CLAUSE_NOWAIT:
1062 case OMP_CLAUSE_ORDERED:
1063 case OMP_CLAUSE_DEFAULT:
1064 case OMP_CLAUSE_COPYIN:
1065 case OMP_CLAUSE_COLLAPSE:
1066 case OMP_CLAUSE_UNTIED:
1074 info->suppress_expansion = new_suppress;
1077 for (clause = *pclauses; clause ; clause = OMP_CLAUSE_CHAIN (clause))
1078 switch (OMP_CLAUSE_CODE (clause))
1080 case OMP_CLAUSE_REDUCTION:
1081 if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause))
1084 = DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause));
1085 DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause))
1087 walk_body (convert_nonlocal_reference_stmt,
1088 convert_nonlocal_reference_op, info,
1089 OMP_CLAUSE_REDUCTION_GIMPLE_INIT (clause));
1090 walk_body (convert_nonlocal_reference_stmt,
1091 convert_nonlocal_reference_op, info,
1092 OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (clause));
1093 DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause))
1098 case OMP_CLAUSE_LASTPRIVATE:
1099 walk_body (convert_nonlocal_reference_stmt,
1100 convert_nonlocal_reference_op, info,
1101 OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (clause));
1112 /* Callback for walk_gimple_stmt. Rewrite all references to VAR and
1113 PARM_DECLs that belong to outer functions. This handles statements
1114 that are not handled via the standard recursion done in
1115 walk_gimple_stmt. STMT is the statement to examine, DATA is as in
1116 convert_nonlocal_reference_op. Set *HANDLED_OPS_P to true if all the
1117 operands of STMT have been handled by this function. */
1120 convert_nonlocal_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
1121 struct walk_stmt_info *wi)
1123 struct nesting_info *info = (struct nesting_info *) wi->info;
1124 tree save_local_var_chain;
1125 bitmap save_suppress;
1126 gimple stmt = gsi_stmt (*gsi);
1128 switch (gimple_code (stmt))
1131 /* Don't walk non-local gotos for now. */
1132 if (TREE_CODE (gimple_goto_dest (stmt)) != LABEL_DECL)
1134 wi->val_only = true;
1136 *handled_ops_p = true;
1141 case GIMPLE_OMP_PARALLEL:
1142 case GIMPLE_OMP_TASK:
1143 save_suppress = info->suppress_expansion;
1144 if (convert_nonlocal_omp_clauses (gimple_omp_taskreg_clauses_ptr (stmt),
1148 decl = get_chain_decl (info);
1149 c = build_omp_clause (OMP_CLAUSE_FIRSTPRIVATE);
1150 OMP_CLAUSE_DECL (c) = decl;
1151 OMP_CLAUSE_CHAIN (c) = gimple_omp_taskreg_clauses (stmt);
1152 gimple_omp_taskreg_set_clauses (stmt, c);
1155 save_local_var_chain = info->new_local_var_chain;
1156 info->new_local_var_chain = NULL;
1158 walk_body (convert_nonlocal_reference_stmt, convert_nonlocal_reference_op,
1159 info, gimple_omp_body (stmt));
1161 if (info->new_local_var_chain)
1162 declare_vars (info->new_local_var_chain,
1163 gimple_seq_first_stmt (gimple_omp_body (stmt)),
1165 info->new_local_var_chain = save_local_var_chain;
1166 info->suppress_expansion = save_suppress;
1169 case GIMPLE_OMP_FOR:
1170 save_suppress = info->suppress_expansion;
1171 convert_nonlocal_omp_clauses (gimple_omp_for_clauses_ptr (stmt), wi);
1172 walk_gimple_omp_for (stmt, convert_nonlocal_reference_stmt,
1173 convert_nonlocal_reference_op, info);
1174 walk_body (convert_nonlocal_reference_stmt,
1175 convert_nonlocal_reference_op, info, gimple_omp_body (stmt));
1176 info->suppress_expansion = save_suppress;
1179 case GIMPLE_OMP_SECTIONS:
1180 save_suppress = info->suppress_expansion;
1181 convert_nonlocal_omp_clauses (gimple_omp_sections_clauses_ptr (stmt), wi);
1182 walk_body (convert_nonlocal_reference_stmt, convert_nonlocal_reference_op,
1183 info, gimple_omp_body (stmt));
1184 info->suppress_expansion = save_suppress;
1187 case GIMPLE_OMP_SINGLE:
1188 save_suppress = info->suppress_expansion;
1189 convert_nonlocal_omp_clauses (gimple_omp_single_clauses_ptr (stmt), wi);
1190 walk_body (convert_nonlocal_reference_stmt, convert_nonlocal_reference_op,
1191 info, gimple_omp_body (stmt));
1192 info->suppress_expansion = save_suppress;
1195 case GIMPLE_OMP_SECTION:
1196 case GIMPLE_OMP_MASTER:
1197 case GIMPLE_OMP_ORDERED:
1198 walk_body (convert_nonlocal_reference_stmt, convert_nonlocal_reference_op,
1199 info, gimple_omp_body (stmt));
1203 /* For every other statement that we are not interested in
1204 handling here, let the walker traverse the operands. */
1205 *handled_ops_p = false;
1209 /* We have handled all of STMT operands, no need to traverse the operands. */
1210 *handled_ops_p = true;
1215 /* A subroutine of convert_local_reference. Create a local variable
1216 in the parent function with DECL_VALUE_EXPR set to reference the
1217 field in FRAME. This is used both for debug info and in OpenMP
1221 get_local_debug_decl (struct nesting_info *info, tree decl, tree field)
1226 slot = pointer_map_insert (info->var_map, decl);
1228 return (tree) *slot;
1230 /* Make sure frame_decl gets created. */
1231 (void) get_frame_type (info);
1232 x = info->frame_decl;
1233 x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE);
1235 new_decl = build_decl (VAR_DECL, DECL_NAME (decl), TREE_TYPE (decl));
1236 DECL_CONTEXT (new_decl) = info->context;
1237 DECL_SOURCE_LOCATION (new_decl) = DECL_SOURCE_LOCATION (decl);
1238 DECL_ARTIFICIAL (new_decl) = DECL_ARTIFICIAL (decl);
1239 DECL_IGNORED_P (new_decl) = DECL_IGNORED_P (decl);
1240 TREE_THIS_VOLATILE (new_decl) = TREE_THIS_VOLATILE (decl);
1241 TREE_SIDE_EFFECTS (new_decl) = TREE_SIDE_EFFECTS (decl);
1242 TREE_READONLY (new_decl) = TREE_READONLY (decl);
1243 TREE_ADDRESSABLE (new_decl) = TREE_ADDRESSABLE (decl);
1244 DECL_SEEN_IN_BIND_EXPR_P (new_decl) = 1;
1246 SET_DECL_VALUE_EXPR (new_decl, x);
1247 DECL_HAS_VALUE_EXPR_P (new_decl) = 1;
1250 TREE_CHAIN (new_decl) = info->debug_var_chain;
1251 info->debug_var_chain = new_decl;
1253 /* Do not emit debug info twice. */
1254 DECL_IGNORED_P (decl) = 1;
1260 /* Called via walk_function+walk_gimple_stmt, rewrite all references to VAR
1261 and PARM_DECLs that were referenced by inner nested functions.
1262 The rewrite will be a structure reference to the local frame variable. */
1264 static bool convert_local_omp_clauses (tree *, struct walk_stmt_info *);
1267 convert_local_reference_op (tree *tp, int *walk_subtrees, void *data)
1269 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
1270 struct nesting_info *const info = (struct nesting_info *) wi->info;
1271 tree t = *tp, field, x;
1275 switch (TREE_CODE (t))
1278 /* Non-automatic variables are never processed. */
1279 if (TREE_STATIC (t) || DECL_EXTERNAL (t))
1284 if (decl_function_context (t) == info->context)
1286 /* If we copied a pointer to the frame, then the original decl
1287 is used unchanged in the parent function. */
1288 if (use_pointer_in_frame (t))
1291 /* No need to transform anything if no child references the
1293 field = lookup_field_for_decl (info, t, NO_INSERT);
1298 x = get_local_debug_decl (info, t, field);
1299 if (!bitmap_bit_p (info->suppress_expansion, DECL_UID (t)))
1300 x = get_frame_field (info, info->context, field, &wi->gsi);
1305 x = save_tmp_var (info, x, &wi->gsi);
1307 x = init_tmp_var (info, x, &wi->gsi);
1315 save_val_only = wi->val_only;
1316 wi->val_only = false;
1318 wi->changed = false;
1319 walk_tree (&TREE_OPERAND (t, 0), convert_local_reference_op, wi, NULL);
1320 wi->val_only = save_val_only;
1322 /* If we converted anything ... */
1327 /* Then the frame decl is now addressable. */
1328 TREE_ADDRESSABLE (info->frame_decl) = 1;
1330 save_context = current_function_decl;
1331 current_function_decl = info->context;
1332 recompute_tree_invariant_for_addr_expr (t);
1333 current_function_decl = save_context;
1335 /* If we are in a context where we only accept values, then
1336 compute the address into a temporary. */
1338 *tp = gsi_gimplify_val ((struct nesting_info *) wi->info,
1347 case ARRAY_RANGE_REF:
1349 /* Go down this entire nest and just look at the final prefix and
1350 anything that describes the references. Otherwise, we lose track
1351 of whether a NOP_EXPR or VIEW_CONVERT_EXPR needs a simple value. */
1352 save_val_only = wi->val_only;
1353 wi->val_only = true;
1355 for (; handled_component_p (t); tp = &TREE_OPERAND (t, 0), t = *tp)
1357 if (TREE_CODE (t) == COMPONENT_REF)
1358 walk_tree (&TREE_OPERAND (t, 2), convert_local_reference_op, wi,
1360 else if (TREE_CODE (t) == ARRAY_REF
1361 || TREE_CODE (t) == ARRAY_RANGE_REF)
1363 walk_tree (&TREE_OPERAND (t, 1), convert_local_reference_op, wi,
1365 walk_tree (&TREE_OPERAND (t, 2), convert_local_reference_op, wi,
1367 walk_tree (&TREE_OPERAND (t, 3), convert_local_reference_op, wi,
1370 else if (TREE_CODE (t) == BIT_FIELD_REF)
1372 walk_tree (&TREE_OPERAND (t, 1), convert_local_reference_op, wi,
1374 walk_tree (&TREE_OPERAND (t, 2), convert_local_reference_op, wi,
1378 wi->val_only = false;
1379 walk_tree (tp, convert_local_reference_op, wi, NULL);
1380 wi->val_only = save_val_only;
1383 case VIEW_CONVERT_EXPR:
1384 /* Just request to look at the subtrees, leaving val_only and lhs
1385 untouched. This might actually be for !val_only + lhs, in which
1386 case we don't want to force a replacement by a temporary. */
1391 if (!IS_TYPE_OR_DECL_P (t))
1394 wi->val_only = true;
1403 static tree convert_local_reference_stmt (gimple_stmt_iterator *, bool *,
1404 struct walk_stmt_info *);
1406 /* Helper for convert_local_reference. Convert all the references in
1407 the chain of clauses at *PCLAUSES. WI is as in convert_local_reference. */
1410 convert_local_omp_clauses (tree *pclauses, struct walk_stmt_info *wi)
1412 struct nesting_info *const info = (struct nesting_info *) wi->info;
1413 bool need_frame = false, need_stmts = false;
1416 bitmap new_suppress;
1418 new_suppress = BITMAP_GGC_ALLOC ();
1419 bitmap_copy (new_suppress, info->suppress_expansion);
1421 for (clause = *pclauses; clause ; clause = OMP_CLAUSE_CHAIN (clause))
1423 switch (OMP_CLAUSE_CODE (clause))
1425 case OMP_CLAUSE_REDUCTION:
1426 if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause))
1428 goto do_decl_clause;
1430 case OMP_CLAUSE_LASTPRIVATE:
1431 if (OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (clause))
1433 goto do_decl_clause;
1435 case OMP_CLAUSE_PRIVATE:
1436 case OMP_CLAUSE_FIRSTPRIVATE:
1437 case OMP_CLAUSE_COPYPRIVATE:
1438 case OMP_CLAUSE_SHARED:
1440 decl = OMP_CLAUSE_DECL (clause);
1441 if (TREE_CODE (decl) == VAR_DECL
1442 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
1444 if (decl_function_context (decl) == info->context
1445 && !use_pointer_in_frame (decl))
1447 tree field = lookup_field_for_decl (info, decl, NO_INSERT);
1450 bitmap_set_bit (new_suppress, DECL_UID (decl));
1451 OMP_CLAUSE_DECL (clause)
1452 = get_local_debug_decl (info, decl, field);
1458 case OMP_CLAUSE_SCHEDULE:
1459 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause) == NULL)
1463 case OMP_CLAUSE_NUM_THREADS:
1464 wi->val_only = true;
1466 convert_local_reference_op (&OMP_CLAUSE_OPERAND (clause, 0), &dummy,
1470 case OMP_CLAUSE_NOWAIT:
1471 case OMP_CLAUSE_ORDERED:
1472 case OMP_CLAUSE_DEFAULT:
1473 case OMP_CLAUSE_COPYIN:
1474 case OMP_CLAUSE_COLLAPSE:
1475 case OMP_CLAUSE_UNTIED:
1483 info->suppress_expansion = new_suppress;
1486 for (clause = *pclauses; clause ; clause = OMP_CLAUSE_CHAIN (clause))
1487 switch (OMP_CLAUSE_CODE (clause))
1489 case OMP_CLAUSE_REDUCTION:
1490 if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause))
1493 = DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause));
1494 DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause))
1496 walk_body (convert_local_reference_stmt,
1497 convert_local_reference_op, info,
1498 OMP_CLAUSE_REDUCTION_GIMPLE_INIT (clause));
1499 walk_body (convert_local_reference_stmt,
1500 convert_local_reference_op, info,
1501 OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (clause));
1502 DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause))
1507 case OMP_CLAUSE_LASTPRIVATE:
1508 walk_body (convert_local_reference_stmt,
1509 convert_local_reference_op, info,
1510 OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (clause));
1521 /* Called via walk_function+walk_gimple_stmt, rewrite all references to VAR
1522 and PARM_DECLs that were referenced by inner nested functions.
1523 The rewrite will be a structure reference to the local frame variable. */
1526 convert_local_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
1527 struct walk_stmt_info *wi)
1529 struct nesting_info *info = (struct nesting_info *) wi->info;
1530 tree save_local_var_chain;
1531 bitmap save_suppress;
1532 gimple stmt = gsi_stmt (*gsi);
1534 switch (gimple_code (stmt))
1536 case GIMPLE_OMP_PARALLEL:
1537 case GIMPLE_OMP_TASK:
1538 save_suppress = info->suppress_expansion;
1539 if (convert_local_omp_clauses (gimple_omp_taskreg_clauses_ptr (stmt),
1543 (void) get_frame_type (info);
1544 c = build_omp_clause (OMP_CLAUSE_SHARED);
1545 OMP_CLAUSE_DECL (c) = info->frame_decl;
1546 OMP_CLAUSE_CHAIN (c) = gimple_omp_taskreg_clauses (stmt);
1547 gimple_omp_taskreg_set_clauses (stmt, c);
1550 save_local_var_chain = info->new_local_var_chain;
1551 info->new_local_var_chain = NULL;
1553 walk_body (convert_local_reference_stmt, convert_local_reference_op, info,
1554 gimple_omp_body (stmt));
1556 if (info->new_local_var_chain)
1557 declare_vars (info->new_local_var_chain,
1558 gimple_seq_first_stmt (gimple_omp_body (stmt)), false);
1559 info->new_local_var_chain = save_local_var_chain;
1560 info->suppress_expansion = save_suppress;
1563 case GIMPLE_OMP_FOR:
1564 save_suppress = info->suppress_expansion;
1565 convert_local_omp_clauses (gimple_omp_for_clauses_ptr (stmt), wi);
1566 walk_gimple_omp_for (stmt, convert_local_reference_stmt,
1567 convert_local_reference_op, info);
1568 walk_body (convert_local_reference_stmt, convert_local_reference_op,
1569 info, gimple_omp_body (stmt));
1570 info->suppress_expansion = save_suppress;
1573 case GIMPLE_OMP_SECTIONS:
1574 save_suppress = info->suppress_expansion;
1575 convert_local_omp_clauses (gimple_omp_sections_clauses_ptr (stmt), wi);
1576 walk_body (convert_local_reference_stmt, convert_local_reference_op,
1577 info, gimple_omp_body (stmt));
1578 info->suppress_expansion = save_suppress;
1581 case GIMPLE_OMP_SINGLE:
1582 save_suppress = info->suppress_expansion;
1583 convert_local_omp_clauses (gimple_omp_single_clauses_ptr (stmt), wi);
1584 walk_body (convert_local_reference_stmt, convert_local_reference_op,
1585 info, gimple_omp_body (stmt));
1586 info->suppress_expansion = save_suppress;
1589 case GIMPLE_OMP_SECTION:
1590 case GIMPLE_OMP_MASTER:
1591 case GIMPLE_OMP_ORDERED:
1592 walk_body (convert_local_reference_stmt, convert_local_reference_op,
1593 info, gimple_omp_body (stmt));
1597 /* For every other statement that we are not interested in
1598 handling here, let the walker traverse the operands. */
1599 *handled_ops_p = false;
1603 /* Indicate that we have handled all the operands ourselves. */
1604 *handled_ops_p = true;
1609 /* Called via walk_function+walk_gimple_stmt, rewrite all GIMPLE_GOTOs
1610 that reference labels from outer functions. The rewrite will be a
1611 call to __builtin_nonlocal_goto. */
1614 convert_nl_goto_reference (gimple_stmt_iterator *gsi, bool *handled_ops_p,
1615 struct walk_stmt_info *wi)
1617 struct nesting_info *const info = (struct nesting_info *) wi->info, *i;
1618 tree label, new_label, target_context, x, field;
1621 gimple stmt = gsi_stmt (*gsi);
1623 if (gimple_code (stmt) != GIMPLE_GOTO)
1625 *handled_ops_p = false;
1629 label = gimple_goto_dest (stmt);
1630 if (TREE_CODE (label) != LABEL_DECL)
1632 *handled_ops_p = false;
1636 target_context = decl_function_context (label);
1637 if (target_context == info->context)
1639 *handled_ops_p = false;
1643 for (i = info->outer; target_context != i->context; i = i->outer)
1646 /* The original user label may also be use for a normal goto, therefore
1647 we must create a new label that will actually receive the abnormal
1648 control transfer. This new label will be marked LABEL_NONLOCAL; this
1649 mark will trigger proper behavior in the cfg, as well as cause the
1650 (hairy target-specific) non-local goto receiver code to be generated
1651 when we expand rtl. Enter this association into var_map so that we
1652 can insert the new label into the IL during a second pass. */
1653 slot = pointer_map_insert (i->var_map, label);
1656 new_label = create_artificial_label ();
1657 DECL_NONLOCAL (new_label) = 1;
1661 new_label = (tree) *slot;
1663 /* Build: __builtin_nl_goto(new_label, &chain->nl_goto_field). */
1664 field = get_nl_goto_field (i);
1665 x = get_frame_field (info, target_context, field, &wi->gsi);
1666 x = build_addr (x, target_context);
1667 x = gsi_gimplify_val (info, x, &wi->gsi);
1668 call = gimple_build_call (implicit_built_in_decls[BUILT_IN_NONLOCAL_GOTO], 2,
1669 build_addr (new_label, target_context), x);
1670 gsi_replace (&wi->gsi, call, false);
1672 /* We have handled all of STMT's operands, no need to keep going. */
1673 *handled_ops_p = true;
1678 /* Called via walk_function+walk_tree, rewrite all GIMPLE_LABELs whose labels
1679 are referenced via nonlocal goto from a nested function. The rewrite
1680 will involve installing a newly generated DECL_NONLOCAL label, and
1681 (potentially) a branch around the rtl gunk that is assumed to be
1682 attached to such a label. */
1685 convert_nl_goto_receiver (gimple_stmt_iterator *gsi, bool *handled_ops_p,
1686 struct walk_stmt_info *wi)
1688 struct nesting_info *const info = (struct nesting_info *) wi->info;
1689 tree label, new_label;
1690 gimple_stmt_iterator tmp_gsi;
1692 gimple stmt = gsi_stmt (*gsi);
1694 if (gimple_code (stmt) != GIMPLE_LABEL)
1696 *handled_ops_p = false;
1700 label = gimple_label_label (stmt);
1702 slot = pointer_map_contains (info->var_map, label);
1705 *handled_ops_p = false;
1709 /* If there's any possibility that the previous statement falls through,
1710 then we must branch around the new non-local label. */
1712 gsi_prev (&tmp_gsi);
1713 if (gsi_end_p (tmp_gsi) || gimple_stmt_may_fallthru (gsi_stmt (tmp_gsi)))
1715 gimple stmt = gimple_build_goto (label);
1716 gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
1719 new_label = (tree) *slot;
1720 stmt = gimple_build_label (new_label);
1721 gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
1723 *handled_ops_p = true;
1728 /* Called via walk_function+walk_stmt, rewrite all references to addresses
1729 of nested functions that require the use of trampolines. The rewrite
1730 will involve a reference a trampoline generated for the occasion. */
1733 convert_tramp_reference_op (tree *tp, int *walk_subtrees, void *data)
1735 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
1736 struct nesting_info *const info = (struct nesting_info *) wi->info, *i;
1737 tree t = *tp, decl, target_context, x, builtin;
1741 switch (TREE_CODE (t))
1745 T.1 = &CHAIN->tramp;
1746 T.2 = __builtin_adjust_trampoline (T.1);
1747 T.3 = (func_type)T.2;
1750 decl = TREE_OPERAND (t, 0);
1751 if (TREE_CODE (decl) != FUNCTION_DECL)
1754 /* Only need to process nested functions. */
1755 target_context = decl_function_context (decl);
1756 if (!target_context)
1759 /* If the nested function doesn't use a static chain, then
1760 it doesn't need a trampoline. */
1761 if (DECL_NO_STATIC_CHAIN (decl))
1764 /* If we don't want a trampoline, then don't build one. */
1765 if (TREE_NO_TRAMPOLINE (t))
1768 /* Lookup the immediate parent of the callee, as that's where
1769 we need to insert the trampoline. */
1770 for (i = info; i->context != target_context; i = i->outer)
1772 x = lookup_tramp_for_decl (i, decl, INSERT);
1774 /* Compute the address of the field holding the trampoline. */
1775 x = get_frame_field (info, target_context, x, &wi->gsi);
1776 x = build_addr (x, target_context);
1777 x = gsi_gimplify_val (info, x, &wi->gsi);
1779 /* Do machine-specific ugliness. Normally this will involve
1780 computing extra alignment, but it can really be anything. */
1781 builtin = implicit_built_in_decls[BUILT_IN_ADJUST_TRAMPOLINE];
1782 call = gimple_build_call (builtin, 1, x);
1783 x = init_tmp_var_with_call (info, &wi->gsi, call);
1785 /* Cast back to the proper function type. */
1786 x = build1 (NOP_EXPR, TREE_TYPE (t), x);
1787 x = init_tmp_var (info, x, &wi->gsi);
1793 if (!IS_TYPE_OR_DECL_P (t))
1802 /* Called via walk_function+walk_gimple_stmt, rewrite all references
1803 to addresses of nested functions that require the use of
1804 trampolines. The rewrite will involve a reference a trampoline
1805 generated for the occasion. */
1808 convert_tramp_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
1809 struct walk_stmt_info *wi)
1811 gimple stmt = gsi_stmt (*gsi);
1813 switch (gimple_code (stmt))
1817 /* Only walk call arguments, lest we generate trampolines for
1819 unsigned long i, nargs = gimple_call_num_args (stmt);
1820 for (i = 0; i < nargs; i++)
1821 walk_tree (gimple_call_arg_ptr (stmt, i), convert_tramp_reference_op,
1824 *handled_ops_p = true;
1832 *handled_ops_p = false;
1838 /* Called via walk_function+walk_gimple_stmt, rewrite all GIMPLE_CALLs
1839 that reference nested functions to make sure that the static chain
1840 is set up properly for the call. */
1843 convert_gimple_call (gimple_stmt_iterator *gsi, bool *handled_ops_p,
1844 struct walk_stmt_info *wi)
1846 struct nesting_info *const info = (struct nesting_info *) wi->info;
1847 tree decl, target_context;
1848 char save_static_chain_added;
1850 gimple stmt = gsi_stmt (*gsi);
1852 switch (gimple_code (stmt))
1855 decl = gimple_call_fndecl (stmt);
1858 target_context = decl_function_context (decl);
1859 if (target_context && !DECL_NO_STATIC_CHAIN (decl))
1861 gimple_call_set_chain (stmt, get_static_chain (info, target_context,
1863 info->static_chain_added |= (1 << (info->context != target_context));
1867 case GIMPLE_OMP_PARALLEL:
1868 case GIMPLE_OMP_TASK:
1869 save_static_chain_added = info->static_chain_added;
1870 info->static_chain_added = 0;
1871 walk_body (convert_gimple_call, NULL, info, gimple_omp_body (stmt));
1872 for (i = 0; i < 2; i++)
1875 if ((info->static_chain_added & (1 << i)) == 0)
1877 decl = i ? get_chain_decl (info) : info->frame_decl;
1878 /* Don't add CHAIN.* or FRAME.* twice. */
1879 for (c = gimple_omp_taskreg_clauses (stmt);
1881 c = OMP_CLAUSE_CHAIN (c))
1882 if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE
1883 || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED)
1884 && OMP_CLAUSE_DECL (c) == decl)
1888 c = build_omp_clause (i ? OMP_CLAUSE_FIRSTPRIVATE
1889 : OMP_CLAUSE_SHARED);
1890 OMP_CLAUSE_DECL (c) = decl;
1891 OMP_CLAUSE_CHAIN (c) = gimple_omp_taskreg_clauses (stmt);
1892 gimple_omp_taskreg_set_clauses (stmt, c);
1895 info->static_chain_added |= save_static_chain_added;
1898 case GIMPLE_OMP_FOR:
1899 walk_body (convert_gimple_call, NULL, info,
1900 gimple_omp_for_pre_body (stmt));
1902 case GIMPLE_OMP_SECTIONS:
1903 case GIMPLE_OMP_SECTION:
1904 case GIMPLE_OMP_SINGLE:
1905 case GIMPLE_OMP_MASTER:
1906 case GIMPLE_OMP_ORDERED:
1907 case GIMPLE_OMP_CRITICAL:
1908 walk_body (convert_gimple_call, NULL, info, gimple_omp_body (stmt));
1912 /* Keep looking for other operands. */
1913 *handled_ops_p = false;
1917 *handled_ops_p = true;
1922 /* Walk the nesting tree starting with ROOT, depth first. Convert all
1923 trampolines and call expressions. On the way back up, determine if
1924 a nested function actually uses its static chain; if not, remember that. */
1927 convert_all_function_calls (struct nesting_info *root)
1932 convert_all_function_calls (root->inner);
1934 walk_function (convert_tramp_reference_stmt, convert_tramp_reference_op,
1936 walk_function (convert_gimple_call, NULL, root);
1938 /* If the function does not use a static chain, then remember that. */
1939 if (root->outer && !root->chain_decl && !root->chain_field)
1940 DECL_NO_STATIC_CHAIN (root->context) = 1;
1942 gcc_assert (!DECL_NO_STATIC_CHAIN (root->context));
1949 /* Do "everything else" to clean up or complete state collected by the
1950 various walking passes -- lay out the types and decls, generate code
1951 to initialize the frame decl, store critical expressions in the
1952 struct function for rtl to find. */
1955 finalize_nesting_tree_1 (struct nesting_info *root)
1957 gimple_seq stmt_list;
1959 tree context = root->context;
1960 struct function *sf;
1964 /* If we created a non-local frame type or decl, we need to lay them
1965 out at this time. */
1966 if (root->frame_type)
1968 /* In some cases the frame type will trigger the -Wpadded warning.
1969 This is not helpful; suppress it. */
1970 int save_warn_padded = warn_padded;
1972 layout_type (root->frame_type);
1973 warn_padded = save_warn_padded;
1974 layout_decl (root->frame_decl, 0);
1977 /* If any parameters were referenced non-locally, then we need to
1978 insert a copy. Likewise, if any variables were referenced by
1979 pointer, we need to initialize the address. */
1980 if (root->any_parm_remapped)
1983 for (p = DECL_ARGUMENTS (context); p ; p = TREE_CHAIN (p))
1987 field = lookup_field_for_decl (root, p, NO_INSERT);
1991 if (use_pointer_in_frame (p))
1992 x = build_addr (p, context);
1996 y = build3 (COMPONENT_REF, TREE_TYPE (field),
1997 root->frame_decl, field, NULL_TREE);
1998 stmt = gimple_build_assign (y, x);
1999 gimple_seq_add_stmt (&stmt_list, stmt);
2000 /* If the assignment is from a non-register the stmt is
2001 not valid gimple. Make it so by using a temporary instead. */
2002 if (!is_gimple_reg (x)
2003 && is_gimple_reg_type (TREE_TYPE (x)))
2005 gimple_stmt_iterator gsi = gsi_last (stmt_list);
2006 x = init_tmp_var (root, x, &gsi);
2007 gimple_assign_set_rhs1 (stmt, x);
2012 /* If a chain_field was created, then it needs to be initialized
2014 if (root->chain_field)
2016 tree x = build3 (COMPONENT_REF, TREE_TYPE (root->chain_field),
2017 root->frame_decl, root->chain_field, NULL_TREE);
2018 stmt = gimple_build_assign (x, get_chain_decl (root));
2019 gimple_seq_add_stmt (&stmt_list, stmt);
2022 /* If trampolines were created, then we need to initialize them. */
2023 if (root->any_tramp_created)
2025 struct nesting_info *i;
2026 for (i = root->inner; i ; i = i->next)
2028 tree arg1, arg2, arg3, x, field;
2030 field = lookup_tramp_for_decl (root, i->context, NO_INSERT);
2034 if (DECL_NO_STATIC_CHAIN (i->context))
2035 arg3 = null_pointer_node;
2037 arg3 = build_addr (root->frame_decl, context);
2039 arg2 = build_addr (i->context, context);
2041 x = build3 (COMPONENT_REF, TREE_TYPE (field),
2042 root->frame_decl, field, NULL_TREE);
2043 arg1 = build_addr (x, context);
2045 x = implicit_built_in_decls[BUILT_IN_INIT_TRAMPOLINE];
2046 stmt = gimple_build_call (x, 3, arg1, arg2, arg3);
2047 gimple_seq_add_stmt (&stmt_list, stmt);
2051 /* If we created initialization statements, insert them. */
2055 annotate_all_with_location (stmt_list, DECL_SOURCE_LOCATION (context));
2056 bind = gimple_seq_first_stmt (gimple_body (context));
2057 gimple_seq_add_seq (&stmt_list, gimple_bind_body (bind));
2058 gimple_bind_set_body (bind, stmt_list);
2061 /* If a chain_decl was created, then it needs to be registered with
2062 struct function so that it gets initialized from the static chain
2063 register at the beginning of the function. */
2064 sf = DECL_STRUCT_FUNCTION (root->context);
2065 sf->static_chain_decl = root->chain_decl;
2067 /* Similarly for the non-local goto save area. */
2068 if (root->nl_goto_field)
2070 sf->nonlocal_goto_save_area
2071 = get_frame_field (root, context, root->nl_goto_field, NULL);
2072 sf->has_nonlocal_label = 1;
2075 /* Make sure all new local variables get inserted into the
2076 proper BIND_EXPR. */
2077 if (root->new_local_var_chain)
2078 declare_vars (root->new_local_var_chain,
2079 gimple_seq_first_stmt (gimple_body (root->context)),
2081 if (root->debug_var_chain)
2082 declare_vars (root->debug_var_chain,
2083 gimple_seq_first_stmt (gimple_body (root->context)),
2086 /* Dump the translated tree function. */
2087 dump_function (TDI_nested, root->context);
2091 finalize_nesting_tree (struct nesting_info *root)
2096 finalize_nesting_tree (root->inner);
2097 finalize_nesting_tree_1 (root);
2103 /* Unnest the nodes and pass them to cgraph. */
2106 unnest_nesting_tree_1 (struct nesting_info *root)
2108 struct cgraph_node *node = cgraph_node (root->context);
2110 /* For nested functions update the cgraph to reflect unnesting.
2111 We also delay finalizing of these functions up to this point. */
2114 cgraph_unnest_node (cgraph_node (root->context));
2115 cgraph_finalize_function (root->context, true);
2120 unnest_nesting_tree (struct nesting_info *root)
2125 unnest_nesting_tree (root->inner);
2126 unnest_nesting_tree_1 (root);
2132 /* Free the data structures allocated during this pass. */
2135 free_nesting_tree (struct nesting_info *root)
2137 struct nesting_info *next;
2141 free_nesting_tree (root->inner);
2142 pointer_map_destroy (root->var_map);
2143 pointer_map_destroy (root->field_map);
2151 /* Main entry point for this pass. Process FNDECL and all of its nested
2152 subroutines and turn them into something less tightly bound. */
2155 lower_nested_functions (tree fndecl)
2157 struct cgraph_node *cgn;
2158 struct nesting_info *root;
2160 /* If there are no nested functions, there's nothing to do. */
2161 cgn = cgraph_node (fndecl);
2165 bitmap_obstack_initialize (&nesting_info_bitmap_obstack);
2166 root = create_nesting_tree (cgn);
2167 walk_all_functions (convert_nonlocal_reference_stmt,
2168 convert_nonlocal_reference_op,
2170 walk_all_functions (convert_local_reference_stmt,
2171 convert_local_reference_op,
2173 walk_all_functions (convert_nl_goto_reference, NULL, root);
2174 walk_all_functions (convert_nl_goto_receiver, NULL, root);
2175 convert_all_function_calls (root);
2176 finalize_nesting_tree (root);
2177 unnest_nesting_tree (root);
2178 free_nesting_tree (root);
2179 bitmap_obstack_release (&nesting_info_bitmap_obstack);
2182 #include "gt-tree-nested.h"