1 /* Nested function decomposition for GIMPLE.
2 Copyright (C) 2004-2018 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
22 #include "coretypes.h"
30 #include "stringpool.h"
32 #include "fold-const.h"
33 #include "stor-layout.h"
35 #include "tree-inline.h"
37 #include "gimple-iterator.h"
38 #include "gimple-walk.h"
41 #include "langhooks.h"
42 #include "gimple-low.h"
43 #include "gomp-constants.h"
44 #include "diagnostic.h"
47 /* The object of this pass is to lower the representation of a set of nested
48 functions in order to expose all of the gory details of the various
49 nonlocal references. We want to do this sooner rather than later, in
50 order to give us more freedom in emitting all of the functions in question.
52 Back in olden times, when gcc was young, we developed an insanely
53 complicated scheme whereby variables which were referenced nonlocally
54 were forced to live in the stack of the declaring function, and then
55 the nested functions magically discovered where these variables were
56 placed. In order for this scheme to function properly, it required
57 that the outer function be partially expanded, then we switch to
58 compiling the inner function, and once done with those we switch back
59 to compiling the outer function. Such delicate ordering requirements
60 makes it difficult to do whole translation unit optimizations
61 involving such functions.
63 The implementation here is much more direct. Everything that can be
64 referenced by an inner function is a member of an explicitly created
65 structure herein called the "nonlocal frame struct". The incoming
66 static chain for a nested function is a pointer to this struct in
67 the parent. In this way, we settle on known offsets from a known
68 base, and so are decoupled from the logic that places objects in the
69 function's stack frame. More importantly, we don't have to wait for
70 that to happen -- since the compilation of the inner function is no
71 longer tied to a real stack frame, the nonlocal frame struct can be
72 allocated anywhere. Which means that the outer function is now
75 Theory of operation here is very simple. Iterate over all the
76 statements in all the functions (depth first) several times,
77 allocating structures and fields on demand. In general we want to
78 examine inner functions first, so that we can avoid making changes
79 to outer functions which are unnecessary.
81 The order of the passes matters a bit, in that later passes will be
82 skipped if it is discovered that the functions don't actually interact
83 at all. That is, they're nested in the lexical sense but could have
84 been written as independent functions without change. */
89 struct nesting_info
*outer
;
90 struct nesting_info
*inner
;
91 struct nesting_info
*next
;
93 hash_map
<tree
, tree
> *field_map
;
94 hash_map
<tree
, tree
> *var_map
;
95 hash_set
<tree
*> *mem_refs
;
96 bitmap suppress_expansion
;
99 tree new_local_var_chain
;
100 tree debug_var_chain
;
107 bool any_parm_remapped
;
108 bool any_tramp_created
;
109 bool any_descr_created
;
110 char static_chain_added
;
114 /* Iterate over the nesting tree, starting with ROOT, depth first. */
116 static inline struct nesting_info
*
117 iter_nestinfo_start (struct nesting_info
*root
)
124 static inline struct nesting_info
*
125 iter_nestinfo_next (struct nesting_info
*node
)
128 return iter_nestinfo_start (node
->next
);
132 #define FOR_EACH_NEST_INFO(I, ROOT) \
133 for ((I) = iter_nestinfo_start (ROOT); (I); (I) = iter_nestinfo_next (I))
135 /* Obstack used for the bitmaps in the struct above. */
136 static struct bitmap_obstack nesting_info_bitmap_obstack
;
139 /* We're working in so many different function contexts simultaneously,
140 that create_tmp_var is dangerous. Prevent mishap. */
141 #define create_tmp_var cant_use_create_tmp_var_here_dummy
143 /* Like create_tmp_var, except record the variable for registration at
144 the given nesting level. */
147 create_tmp_var_for (struct nesting_info
*info
, tree type
, const char *prefix
)
151 /* If the type is of variable size or a type which must be created by the
152 frontend, something is wrong. Note that we explicitly allow
153 incomplete types here, since we create them ourselves here. */
154 gcc_assert (!TREE_ADDRESSABLE (type
));
155 gcc_assert (!TYPE_SIZE_UNIT (type
)
156 || TREE_CODE (TYPE_SIZE_UNIT (type
)) == INTEGER_CST
);
158 tmp_var
= create_tmp_var_raw (type
, prefix
);
159 DECL_CONTEXT (tmp_var
) = info
->context
;
160 DECL_CHAIN (tmp_var
) = info
->new_local_var_chain
;
161 DECL_SEEN_IN_BIND_EXPR_P (tmp_var
) = 1;
162 if (TREE_CODE (type
) == COMPLEX_TYPE
163 || TREE_CODE (type
) == VECTOR_TYPE
)
164 DECL_GIMPLE_REG_P (tmp_var
) = 1;
166 info
->new_local_var_chain
= tmp_var
;
171 /* Take the address of EXP to be used within function CONTEXT.
172 Mark it for addressability as necessary. */
175 build_addr (tree exp
)
177 mark_addressable (exp
);
178 return build_fold_addr_expr (exp
);
181 /* Insert FIELD into TYPE, sorted by alignment requirements. */
184 insert_field_into_struct (tree type
, tree field
)
188 DECL_CONTEXT (field
) = type
;
190 for (p
= &TYPE_FIELDS (type
); *p
; p
= &DECL_CHAIN (*p
))
191 if (DECL_ALIGN (field
) >= DECL_ALIGN (*p
))
194 DECL_CHAIN (field
) = *p
;
197 /* Set correct alignment for frame struct type. */
198 if (TYPE_ALIGN (type
) < DECL_ALIGN (field
))
199 SET_TYPE_ALIGN (type
, DECL_ALIGN (field
));
202 /* Build or return the RECORD_TYPE that describes the frame state that is
203 shared between INFO->CONTEXT and its nested functions. This record will
204 not be complete until finalize_nesting_tree; up until that point we'll
205 be adding fields as necessary.
207 We also build the DECL that represents this frame in the function. */
210 get_frame_type (struct nesting_info
*info
)
212 tree type
= info
->frame_type
;
217 type
= make_node (RECORD_TYPE
);
219 name
= concat ("FRAME.",
220 IDENTIFIER_POINTER (DECL_NAME (info
->context
)),
222 TYPE_NAME (type
) = get_identifier (name
);
225 info
->frame_type
= type
;
227 /* Do not put info->frame_decl on info->new_local_var_chain,
228 so that we can declare it in the lexical blocks, which
229 makes sure virtual regs that end up appearing in its RTL
230 expression get substituted in instantiate_virtual_regs. */
231 info
->frame_decl
= create_tmp_var_raw (type
, "FRAME");
232 DECL_CONTEXT (info
->frame_decl
) = info
->context
;
233 DECL_NONLOCAL_FRAME (info
->frame_decl
) = 1;
234 DECL_SEEN_IN_BIND_EXPR_P (info
->frame_decl
) = 1;
236 /* ??? Always make it addressable for now, since it is meant to
237 be pointed to by the static chain pointer. This pessimizes
238 when it turns out that no static chains are needed because
239 the nested functions referencing non-local variables are not
240 reachable, but the true pessimization is to create the non-
241 local frame structure in the first place. */
242 TREE_ADDRESSABLE (info
->frame_decl
) = 1;
248 /* Return true if DECL should be referenced by pointer in the non-local frame
252 use_pointer_in_frame (tree decl
)
254 if (TREE_CODE (decl
) == PARM_DECL
)
256 /* It's illegal to copy TREE_ADDRESSABLE, impossible to copy variable-
257 sized DECLs, and inefficient to copy large aggregates. Don't bother
258 moving anything but scalar parameters. */
259 return AGGREGATE_TYPE_P (TREE_TYPE (decl
));
263 /* Variable-sized DECLs can only come from OMP clauses at this point
264 since the gimplifier has already turned the regular variables into
265 pointers. Do the same as the gimplifier. */
266 return !DECL_SIZE (decl
) || TREE_CODE (DECL_SIZE (decl
)) != INTEGER_CST
;
270 /* Given DECL, a non-locally accessed variable, find or create a field
271 in the non-local frame structure for the given nesting context. */
274 lookup_field_for_decl (struct nesting_info
*info
, tree decl
,
275 enum insert_option insert
)
277 gcc_checking_assert (decl_function_context (decl
) == info
->context
);
279 if (insert
== NO_INSERT
)
281 tree
*slot
= info
->field_map
->get (decl
);
282 return slot
? *slot
: NULL_TREE
;
285 tree
*slot
= &info
->field_map
->get_or_insert (decl
);
288 tree type
= get_frame_type (info
);
289 tree field
= make_node (FIELD_DECL
);
290 DECL_NAME (field
) = DECL_NAME (decl
);
292 if (use_pointer_in_frame (decl
))
294 TREE_TYPE (field
) = build_pointer_type (TREE_TYPE (decl
));
295 SET_DECL_ALIGN (field
, TYPE_ALIGN (TREE_TYPE (field
)));
296 DECL_NONADDRESSABLE_P (field
) = 1;
300 TREE_TYPE (field
) = TREE_TYPE (decl
);
301 DECL_SOURCE_LOCATION (field
) = DECL_SOURCE_LOCATION (decl
);
302 SET_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
);
308 /* Declare the transformation and adjust the original DECL. For a
309 variable or for a parameter when not optimizing, we make it point
310 to the field in the frame directly. For a parameter, we don't do
311 it when optimizing because the variable tracking pass will already
313 if (VAR_P (decl
) || !optimize
)
316 = build3 (COMPONENT_REF
, TREE_TYPE (field
), info
->frame_decl
,
319 /* If the next declaration is a PARM_DECL pointing to the DECL,
320 we need to adjust its VALUE_EXPR directly, since chains of
321 VALUE_EXPRs run afoul of garbage collection. This occurs
322 in Ada for Out parameters that aren't copied in. */
323 tree next
= DECL_CHAIN (decl
);
325 && TREE_CODE (next
) == PARM_DECL
326 && DECL_HAS_VALUE_EXPR_P (next
)
327 && DECL_VALUE_EXPR (next
) == decl
)
328 SET_DECL_VALUE_EXPR (next
, x
);
330 SET_DECL_VALUE_EXPR (decl
, x
);
331 DECL_HAS_VALUE_EXPR_P (decl
) = 1;
335 insert_field_into_struct (type
, field
);
338 if (TREE_CODE (decl
) == PARM_DECL
)
339 info
->any_parm_remapped
= true;
345 /* Build or return the variable that holds the static chain within
346 INFO->CONTEXT. This variable may only be used within INFO->CONTEXT. */
349 get_chain_decl (struct nesting_info
*info
)
351 tree decl
= info
->chain_decl
;
357 type
= get_frame_type (info
->outer
);
358 type
= build_pointer_type (type
);
360 /* Note that this variable is *not* entered into any BIND_EXPR;
361 the construction of this variable is handled specially in
362 expand_function_start and initialize_inlined_parameters.
363 Note also that it's represented as a parameter. This is more
364 close to the truth, since the initial value does come from
366 decl
= build_decl (DECL_SOURCE_LOCATION (info
->context
),
367 PARM_DECL
, create_tmp_var_name ("CHAIN"), type
);
368 DECL_ARTIFICIAL (decl
) = 1;
369 DECL_IGNORED_P (decl
) = 1;
370 TREE_USED (decl
) = 1;
371 DECL_CONTEXT (decl
) = info
->context
;
372 DECL_ARG_TYPE (decl
) = type
;
374 /* Tell tree-inline.c that we never write to this variable, so
375 it can copy-prop the replacement value immediately. */
376 TREE_READONLY (decl
) = 1;
378 info
->chain_decl
= decl
;
381 && (dump_flags
& TDF_DETAILS
)
382 && !DECL_STATIC_CHAIN (info
->context
))
383 fprintf (dump_file
, "Setting static-chain for %s\n",
384 lang_hooks
.decl_printable_name (info
->context
, 2));
386 DECL_STATIC_CHAIN (info
->context
) = 1;
391 /* Build or return the field within the non-local frame state that holds
392 the static chain for INFO->CONTEXT. This is the way to walk back up
393 multiple nesting levels. */
396 get_chain_field (struct nesting_info
*info
)
398 tree field
= info
->chain_field
;
402 tree type
= build_pointer_type (get_frame_type (info
->outer
));
404 field
= make_node (FIELD_DECL
);
405 DECL_NAME (field
) = get_identifier ("__chain");
406 TREE_TYPE (field
) = type
;
407 SET_DECL_ALIGN (field
, TYPE_ALIGN (type
));
408 DECL_NONADDRESSABLE_P (field
) = 1;
410 insert_field_into_struct (get_frame_type (info
), field
);
412 info
->chain_field
= field
;
415 && (dump_flags
& TDF_DETAILS
)
416 && !DECL_STATIC_CHAIN (info
->context
))
417 fprintf (dump_file
, "Setting static-chain for %s\n",
418 lang_hooks
.decl_printable_name (info
->context
, 2));
420 DECL_STATIC_CHAIN (info
->context
) = 1;
425 /* Initialize a new temporary with the GIMPLE_CALL STMT. */
428 init_tmp_var_with_call (struct nesting_info
*info
, gimple_stmt_iterator
*gsi
,
433 t
= create_tmp_var_for (info
, gimple_call_return_type (call
), NULL
);
434 gimple_call_set_lhs (call
, t
);
435 if (! gsi_end_p (*gsi
))
436 gimple_set_location (call
, gimple_location (gsi_stmt (*gsi
)));
437 gsi_insert_before (gsi
, call
, GSI_SAME_STMT
);
443 /* Copy EXP into a temporary. Allocate the temporary in the context of
444 INFO and insert the initialization statement before GSI. */
447 init_tmp_var (struct nesting_info
*info
, tree exp
, gimple_stmt_iterator
*gsi
)
452 t
= create_tmp_var_for (info
, TREE_TYPE (exp
), NULL
);
453 stmt
= gimple_build_assign (t
, exp
);
454 if (! gsi_end_p (*gsi
))
455 gimple_set_location (stmt
, gimple_location (gsi_stmt (*gsi
)));
456 gsi_insert_before_without_update (gsi
, stmt
, GSI_SAME_STMT
);
462 /* Similarly, but only do so to force EXP to satisfy is_gimple_val. */
465 gsi_gimplify_val (struct nesting_info
*info
, tree exp
,
466 gimple_stmt_iterator
*gsi
)
468 if (is_gimple_val (exp
))
471 return init_tmp_var (info
, exp
, gsi
);
474 /* Similarly, but copy from the temporary and insert the statement
475 after the iterator. */
478 save_tmp_var (struct nesting_info
*info
, tree exp
, gimple_stmt_iterator
*gsi
)
483 t
= create_tmp_var_for (info
, TREE_TYPE (exp
), NULL
);
484 stmt
= gimple_build_assign (exp
, t
);
485 if (! gsi_end_p (*gsi
))
486 gimple_set_location (stmt
, gimple_location (gsi_stmt (*gsi
)));
487 gsi_insert_after_without_update (gsi
, stmt
, GSI_SAME_STMT
);
492 /* Build or return the type used to represent a nested function trampoline. */
494 static GTY(()) tree trampoline_type
;
497 get_trampoline_type (struct nesting_info
*info
)
499 unsigned align
, size
;
503 return trampoline_type
;
505 align
= TRAMPOLINE_ALIGNMENT
;
506 size
= TRAMPOLINE_SIZE
;
508 /* If we won't be able to guarantee alignment simply via TYPE_ALIGN,
509 then allocate extra space so that we can do dynamic alignment. */
510 if (align
> STACK_BOUNDARY
)
512 size
+= ((align
/BITS_PER_UNIT
) - 1) & -(STACK_BOUNDARY
/BITS_PER_UNIT
);
513 align
= STACK_BOUNDARY
;
516 t
= build_index_type (size_int (size
- 1));
517 t
= build_array_type (char_type_node
, t
);
518 t
= build_decl (DECL_SOURCE_LOCATION (info
->context
),
519 FIELD_DECL
, get_identifier ("__data"), t
);
520 SET_DECL_ALIGN (t
, align
);
521 DECL_USER_ALIGN (t
) = 1;
523 trampoline_type
= make_node (RECORD_TYPE
);
524 TYPE_NAME (trampoline_type
) = get_identifier ("__builtin_trampoline");
525 TYPE_FIELDS (trampoline_type
) = t
;
526 layout_type (trampoline_type
);
527 DECL_CONTEXT (t
) = trampoline_type
;
529 return trampoline_type
;
532 /* Build or return the type used to represent a nested function descriptor. */
534 static GTY(()) tree descriptor_type
;
537 get_descriptor_type (struct nesting_info
*info
)
539 /* The base alignment is that of a function. */
540 const unsigned align
= FUNCTION_ALIGNMENT (FUNCTION_BOUNDARY
);
544 return descriptor_type
;
546 t
= build_index_type (integer_one_node
);
547 t
= build_array_type (ptr_type_node
, t
);
548 t
= build_decl (DECL_SOURCE_LOCATION (info
->context
),
549 FIELD_DECL
, get_identifier ("__data"), t
);
550 SET_DECL_ALIGN (t
, MAX (TYPE_ALIGN (ptr_type_node
), align
));
551 DECL_USER_ALIGN (t
) = 1;
553 descriptor_type
= make_node (RECORD_TYPE
);
554 TYPE_NAME (descriptor_type
) = get_identifier ("__builtin_descriptor");
555 TYPE_FIELDS (descriptor_type
) = t
;
556 layout_type (descriptor_type
);
557 DECL_CONTEXT (t
) = descriptor_type
;
559 return descriptor_type
;
562 /* Given DECL, a nested function, find or create an element in the
563 var map for this function. */
566 lookup_element_for_decl (struct nesting_info
*info
, tree decl
,
567 enum insert_option insert
)
569 if (insert
== NO_INSERT
)
571 tree
*slot
= info
->var_map
->get (decl
);
572 return slot
? *slot
: NULL_TREE
;
575 tree
*slot
= &info
->var_map
->get_or_insert (decl
);
577 *slot
= build_tree_list (NULL_TREE
, NULL_TREE
);
582 /* Given DECL, a nested function, create a field in the non-local
583 frame structure for this function. */
586 create_field_for_decl (struct nesting_info
*info
, tree decl
, tree type
)
588 tree field
= make_node (FIELD_DECL
);
589 DECL_NAME (field
) = DECL_NAME (decl
);
590 TREE_TYPE (field
) = type
;
591 TREE_ADDRESSABLE (field
) = 1;
592 insert_field_into_struct (get_frame_type (info
), field
);
596 /* Given DECL, a nested function, find or create a field in the non-local
597 frame structure for a trampoline for this function. */
600 lookup_tramp_for_decl (struct nesting_info
*info
, tree decl
,
601 enum insert_option insert
)
605 elt
= lookup_element_for_decl (info
, decl
, insert
);
609 field
= TREE_PURPOSE (elt
);
611 if (!field
&& insert
== INSERT
)
613 field
= create_field_for_decl (info
, decl
, get_trampoline_type (info
));
614 TREE_PURPOSE (elt
) = field
;
615 info
->any_tramp_created
= true;
621 /* Given DECL, a nested function, find or create a field in the non-local
622 frame structure for a descriptor for this function. */
625 lookup_descr_for_decl (struct nesting_info
*info
, tree decl
,
626 enum insert_option insert
)
630 elt
= lookup_element_for_decl (info
, decl
, insert
);
634 field
= TREE_VALUE (elt
);
636 if (!field
&& insert
== INSERT
)
638 field
= create_field_for_decl (info
, decl
, get_descriptor_type (info
));
639 TREE_VALUE (elt
) = field
;
640 info
->any_descr_created
= true;
646 /* Build or return the field within the non-local frame state that holds
647 the non-local goto "jmp_buf". The buffer itself is maintained by the
648 rtl middle-end as dynamic stack space is allocated. */
651 get_nl_goto_field (struct nesting_info
*info
)
653 tree field
= info
->nl_goto_field
;
659 /* For __builtin_nonlocal_goto, we need N words. The first is the
660 frame pointer, the rest is for the target's stack pointer save
661 area. The number of words is controlled by STACK_SAVEAREA_MODE;
662 not the best interface, but it'll do for now. */
663 if (Pmode
== ptr_mode
)
664 type
= ptr_type_node
;
666 type
= lang_hooks
.types
.type_for_mode (Pmode
, 1);
669 = as_a
<scalar_int_mode
> (STACK_SAVEAREA_MODE (SAVE_NONLOCAL
));
670 size
= GET_MODE_SIZE (mode
);
671 size
= size
/ GET_MODE_SIZE (Pmode
);
674 type
= build_array_type
675 (type
, build_index_type (size_int (size
)));
677 field
= make_node (FIELD_DECL
);
678 DECL_NAME (field
) = get_identifier ("__nl_goto_buf");
679 TREE_TYPE (field
) = type
;
680 SET_DECL_ALIGN (field
, TYPE_ALIGN (type
));
681 TREE_ADDRESSABLE (field
) = 1;
683 insert_field_into_struct (get_frame_type (info
), field
);
685 info
->nl_goto_field
= field
;
691 /* Invoke CALLBACK on all statements of GIMPLE sequence *PSEQ. */
694 walk_body (walk_stmt_fn callback_stmt
, walk_tree_fn callback_op
,
695 struct nesting_info
*info
, gimple_seq
*pseq
)
697 struct walk_stmt_info wi
;
699 memset (&wi
, 0, sizeof (wi
));
702 walk_gimple_seq_mod (pseq
, callback_stmt
, callback_op
, &wi
);
706 /* Invoke CALLBACK_STMT/CALLBACK_OP on all statements of INFO->CONTEXT. */
709 walk_function (walk_stmt_fn callback_stmt
, walk_tree_fn callback_op
,
710 struct nesting_info
*info
)
712 gimple_seq body
= gimple_body (info
->context
);
713 walk_body (callback_stmt
, callback_op
, info
, &body
);
714 gimple_set_body (info
->context
, body
);
717 /* Invoke CALLBACK on a GIMPLE_OMP_FOR's init, cond, incr and pre-body. */
720 walk_gimple_omp_for (gomp_for
*for_stmt
,
721 walk_stmt_fn callback_stmt
, walk_tree_fn callback_op
,
722 struct nesting_info
*info
)
724 struct walk_stmt_info wi
;
729 walk_body (callback_stmt
, callback_op
, info
, gimple_omp_for_pre_body_ptr (for_stmt
));
732 memset (&wi
, 0, sizeof (wi
));
734 wi
.gsi
= gsi_last (seq
);
736 for (i
= 0; i
< gimple_omp_for_collapse (for_stmt
); i
++)
739 walk_tree (gimple_omp_for_index_ptr (for_stmt
, i
), callback_op
,
743 walk_tree (gimple_omp_for_initial_ptr (for_stmt
, i
), callback_op
,
748 walk_tree (gimple_omp_for_final_ptr (for_stmt
, i
), callback_op
,
751 t
= gimple_omp_for_incr (for_stmt
, i
);
752 gcc_assert (BINARY_CLASS_P (t
));
754 walk_tree (&TREE_OPERAND (t
, 0), callback_op
, &wi
, NULL
);
757 walk_tree (&TREE_OPERAND (t
, 1), callback_op
, &wi
, NULL
);
760 seq
= gsi_seq (wi
.gsi
);
761 if (!gimple_seq_empty_p (seq
))
763 gimple_seq pre_body
= gimple_omp_for_pre_body (for_stmt
);
764 annotate_all_with_location (seq
, gimple_location (for_stmt
));
765 gimple_seq_add_seq (&pre_body
, seq
);
766 gimple_omp_for_set_pre_body (for_stmt
, pre_body
);
770 /* Similarly for ROOT and all functions nested underneath, depth first. */
773 walk_all_functions (walk_stmt_fn callback_stmt
, walk_tree_fn callback_op
,
774 struct nesting_info
*root
)
776 struct nesting_info
*n
;
777 FOR_EACH_NEST_INFO (n
, root
)
778 walk_function (callback_stmt
, callback_op
, n
);
782 /* We have to check for a fairly pathological case. The operands of function
783 nested function are to be interpreted in the context of the enclosing
784 function. So if any are variably-sized, they will get remapped when the
785 enclosing function is inlined. But that remapping would also have to be
786 done in the types of the PARM_DECLs of the nested function, meaning the
787 argument types of that function will disagree with the arguments in the
788 calls to that function. So we'd either have to make a copy of the nested
789 function corresponding to each time the enclosing function was inlined or
790 add a VIEW_CONVERT_EXPR to each such operand for each call to the nested
791 function. The former is not practical. The latter would still require
792 detecting this case to know when to add the conversions. So, for now at
793 least, we don't inline such an enclosing function.
795 We have to do that check recursively, so here return indicating whether
796 FNDECL has such a nested function. ORIG_FN is the function we were
797 trying to inline to use for checking whether any argument is variably
798 modified by anything in it.
800 It would be better to do this in tree-inline.c so that we could give
801 the appropriate warning for why a function can't be inlined, but that's
802 too late since the nesting structure has already been flattened and
803 adding a flag just to record this fact seems a waste of a flag. */
806 check_for_nested_with_variably_modified (tree fndecl
, tree orig_fndecl
)
808 struct cgraph_node
*cgn
= cgraph_node::get (fndecl
);
811 for (cgn
= cgn
->nested
; cgn
; cgn
= cgn
->next_nested
)
813 for (arg
= DECL_ARGUMENTS (cgn
->decl
); arg
; arg
= DECL_CHAIN (arg
))
814 if (variably_modified_type_p (TREE_TYPE (arg
), orig_fndecl
))
817 if (check_for_nested_with_variably_modified (cgn
->decl
,
825 /* Construct our local datastructure describing the function nesting
826 tree rooted by CGN. */
828 static struct nesting_info
*
829 create_nesting_tree (struct cgraph_node
*cgn
)
831 struct nesting_info
*info
= XCNEW (struct nesting_info
);
832 info
->field_map
= new hash_map
<tree
, tree
>;
833 info
->var_map
= new hash_map
<tree
, tree
>;
834 info
->mem_refs
= new hash_set
<tree
*>;
835 info
->suppress_expansion
= BITMAP_ALLOC (&nesting_info_bitmap_obstack
);
836 info
->context
= cgn
->decl
;
838 for (cgn
= cgn
->nested
; cgn
; cgn
= cgn
->next_nested
)
840 struct nesting_info
*sub
= create_nesting_tree (cgn
);
842 sub
->next
= info
->inner
;
846 /* See discussion at check_for_nested_with_variably_modified for a
847 discussion of why this has to be here. */
848 if (check_for_nested_with_variably_modified (info
->context
, info
->context
))
849 DECL_UNINLINABLE (info
->context
) = true;
854 /* Return an expression computing the static chain for TARGET_CONTEXT
855 from INFO->CONTEXT. Insert any necessary computations before TSI. */
858 get_static_chain (struct nesting_info
*info
, tree target_context
,
859 gimple_stmt_iterator
*gsi
)
861 struct nesting_info
*i
;
864 if (info
->context
== target_context
)
866 x
= build_addr (info
->frame_decl
);
867 info
->static_chain_added
|= 1;
871 x
= get_chain_decl (info
);
872 info
->static_chain_added
|= 2;
874 for (i
= info
->outer
; i
->context
!= target_context
; i
= i
->outer
)
876 tree field
= get_chain_field (i
);
878 x
= build_simple_mem_ref (x
);
879 x
= build3 (COMPONENT_REF
, TREE_TYPE (field
), x
, field
, NULL_TREE
);
880 x
= init_tmp_var (info
, x
, gsi
);
888 /* Return an expression referencing FIELD from TARGET_CONTEXT's non-local
889 frame as seen from INFO->CONTEXT. Insert any necessary computations
893 get_frame_field (struct nesting_info
*info
, tree target_context
,
894 tree field
, gimple_stmt_iterator
*gsi
)
896 struct nesting_info
*i
;
899 if (info
->context
== target_context
)
901 /* Make sure frame_decl gets created. */
902 (void) get_frame_type (info
);
903 x
= info
->frame_decl
;
904 info
->static_chain_added
|= 1;
908 x
= get_chain_decl (info
);
909 info
->static_chain_added
|= 2;
911 for (i
= info
->outer
; i
->context
!= target_context
; i
= i
->outer
)
913 tree field
= get_chain_field (i
);
915 x
= build_simple_mem_ref (x
);
916 x
= build3 (COMPONENT_REF
, TREE_TYPE (field
), x
, field
, NULL_TREE
);
917 x
= init_tmp_var (info
, x
, gsi
);
920 x
= build_simple_mem_ref (x
);
923 x
= build3 (COMPONENT_REF
, TREE_TYPE (field
), x
, field
, NULL_TREE
);
927 static void note_nonlocal_vla_type (struct nesting_info
*info
, tree type
);
929 /* A subroutine of convert_nonlocal_reference_op. Create a local variable
930 in the nested function with DECL_VALUE_EXPR set to reference the true
931 variable in the parent function. This is used both for debug info
932 and in OMP lowering. */
935 get_nonlocal_debug_decl (struct nesting_info
*info
, tree decl
)
938 struct nesting_info
*i
;
939 tree x
, field
, new_decl
;
941 tree
*slot
= &info
->var_map
->get_or_insert (decl
);
946 target_context
= decl_function_context (decl
);
948 /* A copy of the code in get_frame_field, but without the temporaries. */
949 if (info
->context
== target_context
)
951 /* Make sure frame_decl gets created. */
952 (void) get_frame_type (info
);
953 x
= info
->frame_decl
;
955 info
->static_chain_added
|= 1;
959 x
= get_chain_decl (info
);
960 info
->static_chain_added
|= 2;
961 for (i
= info
->outer
; i
->context
!= target_context
; i
= i
->outer
)
963 field
= get_chain_field (i
);
964 x
= build_simple_mem_ref (x
);
965 x
= build3 (COMPONENT_REF
, TREE_TYPE (field
), x
, field
, NULL_TREE
);
967 x
= build_simple_mem_ref (x
);
970 field
= lookup_field_for_decl (i
, decl
, INSERT
);
971 x
= build3 (COMPONENT_REF
, TREE_TYPE (field
), x
, field
, NULL_TREE
);
972 if (use_pointer_in_frame (decl
))
973 x
= build_simple_mem_ref (x
);
975 /* ??? We should be remapping types as well, surely. */
976 new_decl
= build_decl (DECL_SOURCE_LOCATION (decl
),
977 VAR_DECL
, DECL_NAME (decl
), TREE_TYPE (decl
));
978 DECL_CONTEXT (new_decl
) = info
->context
;
979 DECL_ARTIFICIAL (new_decl
) = DECL_ARTIFICIAL (decl
);
980 DECL_IGNORED_P (new_decl
) = DECL_IGNORED_P (decl
);
981 TREE_THIS_VOLATILE (new_decl
) = TREE_THIS_VOLATILE (decl
);
982 TREE_SIDE_EFFECTS (new_decl
) = TREE_SIDE_EFFECTS (decl
);
983 TREE_READONLY (new_decl
) = TREE_READONLY (decl
);
984 TREE_ADDRESSABLE (new_decl
) = TREE_ADDRESSABLE (decl
);
985 DECL_SEEN_IN_BIND_EXPR_P (new_decl
) = 1;
986 if ((TREE_CODE (decl
) == PARM_DECL
987 || TREE_CODE (decl
) == RESULT_DECL
989 && DECL_BY_REFERENCE (decl
))
990 DECL_BY_REFERENCE (new_decl
) = 1;
992 SET_DECL_VALUE_EXPR (new_decl
, x
);
993 DECL_HAS_VALUE_EXPR_P (new_decl
) = 1;
996 DECL_CHAIN (new_decl
) = info
->debug_var_chain
;
997 info
->debug_var_chain
= new_decl
;
1000 && info
->context
!= target_context
1001 && variably_modified_type_p (TREE_TYPE (decl
), NULL
))
1002 note_nonlocal_vla_type (info
, TREE_TYPE (decl
));
1008 /* Callback for walk_gimple_stmt, rewrite all references to VAR
1009 and PARM_DECLs that belong to outer functions.
1011 The rewrite will involve some number of structure accesses back up
1012 the static chain. E.g. for a variable FOO up one nesting level it'll
1013 be CHAIN->FOO. For two levels it'll be CHAIN->__chain->FOO. Further
1014 indirections apply to decls for which use_pointer_in_frame is true. */
1017 convert_nonlocal_reference_op (tree
*tp
, int *walk_subtrees
, void *data
)
1019 struct walk_stmt_info
*wi
= (struct walk_stmt_info
*) data
;
1020 struct nesting_info
*const info
= (struct nesting_info
*) wi
->info
;
1024 switch (TREE_CODE (t
))
1027 /* Non-automatic variables are never processed. */
1028 if (TREE_STATIC (t
) || DECL_EXTERNAL (t
))
1034 tree x
, target_context
= decl_function_context (t
);
1036 if (info
->context
== target_context
)
1041 if (bitmap_bit_p (info
->suppress_expansion
, DECL_UID (t
)))
1042 x
= get_nonlocal_debug_decl (info
, t
);
1045 struct nesting_info
*i
= info
;
1046 while (i
&& i
->context
!= target_context
)
1048 /* If none of the outer contexts is the target context, this means
1049 that the VAR or PARM_DECL is referenced in a wrong context. */
1051 internal_error ("%s from %s referenced in %s",
1052 IDENTIFIER_POINTER (DECL_NAME (t
)),
1053 IDENTIFIER_POINTER (DECL_NAME (target_context
)),
1054 IDENTIFIER_POINTER (DECL_NAME (info
->context
)));
1056 x
= lookup_field_for_decl (i
, t
, INSERT
);
1057 x
= get_frame_field (info
, target_context
, x
, &wi
->gsi
);
1058 if (use_pointer_in_frame (t
))
1060 x
= init_tmp_var (info
, x
, &wi
->gsi
);
1061 x
= build_simple_mem_ref (x
);
1068 x
= save_tmp_var (info
, x
, &wi
->gsi
);
1070 x
= init_tmp_var (info
, x
, &wi
->gsi
);
1078 /* We're taking the address of a label from a parent function, but
1079 this is not itself a non-local goto. Mark the label such that it
1080 will not be deleted, much as we would with a label address in
1082 if (decl_function_context (t
) != info
->context
)
1083 FORCED_LABEL (t
) = 1;
1088 bool save_val_only
= wi
->val_only
;
1090 wi
->val_only
= false;
1092 wi
->changed
= false;
1093 walk_tree (&TREE_OPERAND (t
, 0), convert_nonlocal_reference_op
, wi
, 0);
1094 wi
->val_only
= true;
1100 /* If we changed anything, we might no longer be directly
1101 referencing a decl. */
1102 save_context
= current_function_decl
;
1103 current_function_decl
= info
->context
;
1104 recompute_tree_invariant_for_addr_expr (t
);
1105 current_function_decl
= save_context
;
1107 /* If the callback converted the address argument in a context
1108 where we only accept variables (and min_invariant, presumably),
1109 then compute the address into a temporary. */
1111 *tp
= gsi_gimplify_val ((struct nesting_info
*) wi
->info
,
1121 case ARRAY_RANGE_REF
:
1123 /* Go down this entire nest and just look at the final prefix and
1124 anything that describes the references. Otherwise, we lose track
1125 of whether a NOP_EXPR or VIEW_CONVERT_EXPR needs a simple value. */
1126 wi
->val_only
= true;
1128 for (; handled_component_p (t
); tp
= &TREE_OPERAND (t
, 0), t
= *tp
)
1130 if (TREE_CODE (t
) == COMPONENT_REF
)
1131 walk_tree (&TREE_OPERAND (t
, 2), convert_nonlocal_reference_op
, wi
,
1133 else if (TREE_CODE (t
) == ARRAY_REF
1134 || TREE_CODE (t
) == ARRAY_RANGE_REF
)
1136 walk_tree (&TREE_OPERAND (t
, 1), convert_nonlocal_reference_op
,
1138 walk_tree (&TREE_OPERAND (t
, 2), convert_nonlocal_reference_op
,
1140 walk_tree (&TREE_OPERAND (t
, 3), convert_nonlocal_reference_op
,
1144 wi
->val_only
= false;
1145 walk_tree (tp
, convert_nonlocal_reference_op
, wi
, NULL
);
1148 case VIEW_CONVERT_EXPR
:
1149 /* Just request to look at the subtrees, leaving val_only and lhs
1150 untouched. This might actually be for !val_only + lhs, in which
1151 case we don't want to force a replacement by a temporary. */
1156 if (!IS_TYPE_OR_DECL_P (t
))
1159 wi
->val_only
= true;
1168 static tree
convert_nonlocal_reference_stmt (gimple_stmt_iterator
*, bool *,
1169 struct walk_stmt_info
*);
1171 /* Helper for convert_nonlocal_references, rewrite all references to VAR
1172 and PARM_DECLs that belong to outer functions. */
1175 convert_nonlocal_omp_clauses (tree
*pclauses
, struct walk_stmt_info
*wi
)
1177 struct nesting_info
*const info
= (struct nesting_info
*) wi
->info
;
1178 bool need_chain
= false, need_stmts
= false;
1181 bitmap new_suppress
;
1183 new_suppress
= BITMAP_GGC_ALLOC ();
1184 bitmap_copy (new_suppress
, info
->suppress_expansion
);
1186 for (clause
= *pclauses
; clause
; clause
= OMP_CLAUSE_CHAIN (clause
))
1188 switch (OMP_CLAUSE_CODE (clause
))
1190 case OMP_CLAUSE_REDUCTION
:
1191 if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause
))
1193 goto do_decl_clause
;
1195 case OMP_CLAUSE_LASTPRIVATE
:
1196 if (OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (clause
))
1198 goto do_decl_clause
;
1200 case OMP_CLAUSE_LINEAR
:
1201 if (OMP_CLAUSE_LINEAR_GIMPLE_SEQ (clause
))
1203 wi
->val_only
= true;
1205 convert_nonlocal_reference_op (&OMP_CLAUSE_LINEAR_STEP (clause
),
1207 goto do_decl_clause
;
1209 case OMP_CLAUSE_PRIVATE
:
1210 case OMP_CLAUSE_FIRSTPRIVATE
:
1211 case OMP_CLAUSE_COPYPRIVATE
:
1212 case OMP_CLAUSE_SHARED
:
1213 case OMP_CLAUSE_TO_DECLARE
:
1214 case OMP_CLAUSE_LINK
:
1215 case OMP_CLAUSE_USE_DEVICE_PTR
:
1216 case OMP_CLAUSE_IS_DEVICE_PTR
:
1218 decl
= OMP_CLAUSE_DECL (clause
);
1220 && (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
)))
1222 if (decl_function_context (decl
) != info
->context
)
1224 if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_SHARED
)
1225 OMP_CLAUSE_SHARED_READONLY (clause
) = 0;
1226 bitmap_set_bit (new_suppress
, DECL_UID (decl
));
1227 OMP_CLAUSE_DECL (clause
) = get_nonlocal_debug_decl (info
, decl
);
1228 if (OMP_CLAUSE_CODE (clause
) != OMP_CLAUSE_PRIVATE
)
1233 case OMP_CLAUSE_SCHEDULE
:
1234 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
) == NULL
)
1237 case OMP_CLAUSE_FINAL
:
1239 case OMP_CLAUSE_NUM_THREADS
:
1240 case OMP_CLAUSE_DEPEND
:
1241 case OMP_CLAUSE_DEVICE
:
1242 case OMP_CLAUSE_NUM_TEAMS
:
1243 case OMP_CLAUSE_THREAD_LIMIT
:
1244 case OMP_CLAUSE_SAFELEN
:
1245 case OMP_CLAUSE_SIMDLEN
:
1246 case OMP_CLAUSE_PRIORITY
:
1247 case OMP_CLAUSE_GRAINSIZE
:
1248 case OMP_CLAUSE_NUM_TASKS
:
1249 case OMP_CLAUSE_HINT
:
1250 case OMP_CLAUSE_NUM_GANGS
:
1251 case OMP_CLAUSE_NUM_WORKERS
:
1252 case OMP_CLAUSE_VECTOR_LENGTH
:
1253 case OMP_CLAUSE_GANG
:
1254 case OMP_CLAUSE_WORKER
:
1255 case OMP_CLAUSE_VECTOR
:
1256 case OMP_CLAUSE_ASYNC
:
1257 case OMP_CLAUSE_WAIT
:
1258 /* Several OpenACC clauses have optional arguments. Check if they
1260 if (OMP_CLAUSE_OPERAND (clause
, 0))
1262 wi
->val_only
= true;
1264 convert_nonlocal_reference_op (&OMP_CLAUSE_OPERAND (clause
, 0),
1268 /* The gang clause accepts two arguments. */
1269 if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_GANG
1270 && OMP_CLAUSE_GANG_STATIC_EXPR (clause
))
1272 wi
->val_only
= true;
1274 convert_nonlocal_reference_op
1275 (&OMP_CLAUSE_GANG_STATIC_EXPR (clause
), &dummy
, wi
);
1279 case OMP_CLAUSE_DIST_SCHEDULE
:
1280 if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
) != NULL
)
1282 wi
->val_only
= true;
1284 convert_nonlocal_reference_op (&OMP_CLAUSE_OPERAND (clause
, 0),
1289 case OMP_CLAUSE_MAP
:
1291 case OMP_CLAUSE_FROM
:
1292 if (OMP_CLAUSE_SIZE (clause
))
1294 wi
->val_only
= true;
1296 convert_nonlocal_reference_op (&OMP_CLAUSE_SIZE (clause
),
1299 if (DECL_P (OMP_CLAUSE_DECL (clause
)))
1300 goto do_decl_clause
;
1301 wi
->val_only
= true;
1303 walk_tree (&OMP_CLAUSE_DECL (clause
), convert_nonlocal_reference_op
,
1307 case OMP_CLAUSE_ALIGNED
:
1308 if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
))
1310 wi
->val_only
= true;
1312 convert_nonlocal_reference_op
1313 (&OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
), &dummy
, wi
);
1315 /* Like do_decl_clause, but don't add any suppression. */
1316 decl
= OMP_CLAUSE_DECL (clause
);
1318 && (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
)))
1320 if (decl_function_context (decl
) != info
->context
)
1322 OMP_CLAUSE_DECL (clause
) = get_nonlocal_debug_decl (info
, decl
);
1323 if (OMP_CLAUSE_CODE (clause
) != OMP_CLAUSE_PRIVATE
)
1328 case OMP_CLAUSE_NOWAIT
:
1329 case OMP_CLAUSE_ORDERED
:
1330 case OMP_CLAUSE_DEFAULT
:
1331 case OMP_CLAUSE_COPYIN
:
1332 case OMP_CLAUSE_COLLAPSE
:
1333 case OMP_CLAUSE_TILE
:
1334 case OMP_CLAUSE_UNTIED
:
1335 case OMP_CLAUSE_MERGEABLE
:
1336 case OMP_CLAUSE_PROC_BIND
:
1337 case OMP_CLAUSE_NOGROUP
:
1338 case OMP_CLAUSE_THREADS
:
1339 case OMP_CLAUSE_SIMD
:
1340 case OMP_CLAUSE_DEFAULTMAP
:
1341 case OMP_CLAUSE_SEQ
:
1342 case OMP_CLAUSE_INDEPENDENT
:
1343 case OMP_CLAUSE_AUTO
:
1344 case OMP_CLAUSE_IF_PRESENT
:
1345 case OMP_CLAUSE_FINALIZE
:
1348 /* The following clause belongs to the OpenACC cache directive, which
1349 is discarded during gimplification. */
1350 case OMP_CLAUSE__CACHE_
:
1351 /* The following clauses are only allowed in the OpenMP declare simd
1352 directive, so not seen here. */
1353 case OMP_CLAUSE_UNIFORM
:
1354 case OMP_CLAUSE_INBRANCH
:
1355 case OMP_CLAUSE_NOTINBRANCH
:
1356 /* The following clauses are only allowed on OpenMP cancel and
1357 cancellation point directives, which at this point have already
1358 been lowered into a function call. */
1359 case OMP_CLAUSE_FOR
:
1360 case OMP_CLAUSE_PARALLEL
:
1361 case OMP_CLAUSE_SECTIONS
:
1362 case OMP_CLAUSE_TASKGROUP
:
1363 /* The following clauses are only added during OMP lowering; nested
1364 function decomposition happens before that. */
1365 case OMP_CLAUSE__LOOPTEMP_
:
1366 case OMP_CLAUSE__SIMDUID_
:
1367 case OMP_CLAUSE__GRIDDIM_
:
1368 /* Anything else. */
1374 info
->suppress_expansion
= new_suppress
;
1377 for (clause
= *pclauses
; clause
; clause
= OMP_CLAUSE_CHAIN (clause
))
1378 switch (OMP_CLAUSE_CODE (clause
))
1380 case OMP_CLAUSE_REDUCTION
:
1381 if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause
))
1384 = DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause
));
1385 DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause
))
1387 if (OMP_CLAUSE_REDUCTION_DECL_PLACEHOLDER (clause
))
1388 DECL_CONTEXT (OMP_CLAUSE_REDUCTION_DECL_PLACEHOLDER (clause
))
1390 walk_body (convert_nonlocal_reference_stmt
,
1391 convert_nonlocal_reference_op
, info
,
1392 &OMP_CLAUSE_REDUCTION_GIMPLE_INIT (clause
));
1393 walk_body (convert_nonlocal_reference_stmt
,
1394 convert_nonlocal_reference_op
, info
,
1395 &OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (clause
));
1396 DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause
))
1398 if (OMP_CLAUSE_REDUCTION_DECL_PLACEHOLDER (clause
))
1399 DECL_CONTEXT (OMP_CLAUSE_REDUCTION_DECL_PLACEHOLDER (clause
))
1404 case OMP_CLAUSE_LASTPRIVATE
:
1405 walk_body (convert_nonlocal_reference_stmt
,
1406 convert_nonlocal_reference_op
, info
,
1407 &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (clause
));
1410 case OMP_CLAUSE_LINEAR
:
1411 walk_body (convert_nonlocal_reference_stmt
,
1412 convert_nonlocal_reference_op
, info
,
1413 &OMP_CLAUSE_LINEAR_GIMPLE_SEQ (clause
));
1423 /* Create nonlocal debug decls for nonlocal VLA array bounds. */
1426 note_nonlocal_vla_type (struct nesting_info
*info
, tree type
)
1428 while (POINTER_TYPE_P (type
) && !TYPE_NAME (type
))
1429 type
= TREE_TYPE (type
);
1431 if (TYPE_NAME (type
)
1432 && TREE_CODE (TYPE_NAME (type
)) == TYPE_DECL
1433 && DECL_ORIGINAL_TYPE (TYPE_NAME (type
)))
1434 type
= DECL_ORIGINAL_TYPE (TYPE_NAME (type
));
1436 while (POINTER_TYPE_P (type
)
1437 || TREE_CODE (type
) == VECTOR_TYPE
1438 || TREE_CODE (type
) == FUNCTION_TYPE
1439 || TREE_CODE (type
) == METHOD_TYPE
)
1440 type
= TREE_TYPE (type
);
1442 if (TREE_CODE (type
) == ARRAY_TYPE
)
1446 note_nonlocal_vla_type (info
, TREE_TYPE (type
));
1447 domain
= TYPE_DOMAIN (type
);
1450 t
= TYPE_MIN_VALUE (domain
);
1451 if (t
&& (VAR_P (t
) || TREE_CODE (t
) == PARM_DECL
)
1452 && decl_function_context (t
) != info
->context
)
1453 get_nonlocal_debug_decl (info
, t
);
1454 t
= TYPE_MAX_VALUE (domain
);
1455 if (t
&& (VAR_P (t
) || TREE_CODE (t
) == PARM_DECL
)
1456 && decl_function_context (t
) != info
->context
)
1457 get_nonlocal_debug_decl (info
, t
);
1462 /* Callback for walk_gimple_stmt. Rewrite all references to VAR and
1463 PARM_DECLs that belong to outer functions. This handles statements
1464 that are not handled via the standard recursion done in
1465 walk_gimple_stmt. STMT is the statement to examine, DATA is as in
1466 convert_nonlocal_reference_op. Set *HANDLED_OPS_P to true if all the
1467 operands of STMT have been handled by this function. */
1470 convert_nonlocal_reference_stmt (gimple_stmt_iterator
*gsi
, bool *handled_ops_p
,
1471 struct walk_stmt_info
*wi
)
1473 struct nesting_info
*info
= (struct nesting_info
*) wi
->info
;
1474 tree save_local_var_chain
;
1475 bitmap save_suppress
;
1476 gimple
*stmt
= gsi_stmt (*gsi
);
1478 switch (gimple_code (stmt
))
1481 /* Don't walk non-local gotos for now. */
1482 if (TREE_CODE (gimple_goto_dest (stmt
)) != LABEL_DECL
)
1484 wi
->val_only
= true;
1486 *handled_ops_p
= false;
1491 case GIMPLE_OMP_PARALLEL
:
1492 case GIMPLE_OMP_TASK
:
1493 save_suppress
= info
->suppress_expansion
;
1494 if (convert_nonlocal_omp_clauses (gimple_omp_taskreg_clauses_ptr (stmt
),
1498 decl
= get_chain_decl (info
);
1499 c
= build_omp_clause (gimple_location (stmt
),
1500 OMP_CLAUSE_FIRSTPRIVATE
);
1501 OMP_CLAUSE_DECL (c
) = decl
;
1502 OMP_CLAUSE_CHAIN (c
) = gimple_omp_taskreg_clauses (stmt
);
1503 gimple_omp_taskreg_set_clauses (stmt
, c
);
1506 save_local_var_chain
= info
->new_local_var_chain
;
1507 info
->new_local_var_chain
= NULL
;
1509 walk_body (convert_nonlocal_reference_stmt
, convert_nonlocal_reference_op
,
1510 info
, gimple_omp_body_ptr (stmt
));
1512 if (info
->new_local_var_chain
)
1513 declare_vars (info
->new_local_var_chain
,
1514 gimple_seq_first_stmt (gimple_omp_body (stmt
)),
1516 info
->new_local_var_chain
= save_local_var_chain
;
1517 info
->suppress_expansion
= save_suppress
;
1520 case GIMPLE_OMP_FOR
:
1521 save_suppress
= info
->suppress_expansion
;
1522 convert_nonlocal_omp_clauses (gimple_omp_for_clauses_ptr (stmt
), wi
);
1523 walk_gimple_omp_for (as_a
<gomp_for
*> (stmt
),
1524 convert_nonlocal_reference_stmt
,
1525 convert_nonlocal_reference_op
, info
);
1526 walk_body (convert_nonlocal_reference_stmt
,
1527 convert_nonlocal_reference_op
, info
, gimple_omp_body_ptr (stmt
));
1528 info
->suppress_expansion
= save_suppress
;
1531 case GIMPLE_OMP_SECTIONS
:
1532 save_suppress
= info
->suppress_expansion
;
1533 convert_nonlocal_omp_clauses (gimple_omp_sections_clauses_ptr (stmt
), wi
);
1534 walk_body (convert_nonlocal_reference_stmt
, convert_nonlocal_reference_op
,
1535 info
, gimple_omp_body_ptr (stmt
));
1536 info
->suppress_expansion
= save_suppress
;
1539 case GIMPLE_OMP_SINGLE
:
1540 save_suppress
= info
->suppress_expansion
;
1541 convert_nonlocal_omp_clauses (gimple_omp_single_clauses_ptr (stmt
), wi
);
1542 walk_body (convert_nonlocal_reference_stmt
, convert_nonlocal_reference_op
,
1543 info
, gimple_omp_body_ptr (stmt
));
1544 info
->suppress_expansion
= save_suppress
;
1547 case GIMPLE_OMP_TARGET
:
1548 if (!is_gimple_omp_offloaded (stmt
))
1550 save_suppress
= info
->suppress_expansion
;
1551 convert_nonlocal_omp_clauses (gimple_omp_target_clauses_ptr (stmt
),
1553 info
->suppress_expansion
= save_suppress
;
1554 walk_body (convert_nonlocal_reference_stmt
,
1555 convert_nonlocal_reference_op
, info
,
1556 gimple_omp_body_ptr (stmt
));
1559 save_suppress
= info
->suppress_expansion
;
1560 if (convert_nonlocal_omp_clauses (gimple_omp_target_clauses_ptr (stmt
),
1564 decl
= get_chain_decl (info
);
1565 c
= build_omp_clause (gimple_location (stmt
), OMP_CLAUSE_MAP
);
1566 OMP_CLAUSE_DECL (c
) = decl
;
1567 OMP_CLAUSE_SET_MAP_KIND (c
, GOMP_MAP_TO
);
1568 OMP_CLAUSE_SIZE (c
) = DECL_SIZE_UNIT (decl
);
1569 OMP_CLAUSE_CHAIN (c
) = gimple_omp_target_clauses (stmt
);
1570 gimple_omp_target_set_clauses (as_a
<gomp_target
*> (stmt
), c
);
1573 save_local_var_chain
= info
->new_local_var_chain
;
1574 info
->new_local_var_chain
= NULL
;
1576 walk_body (convert_nonlocal_reference_stmt
, convert_nonlocal_reference_op
,
1577 info
, gimple_omp_body_ptr (stmt
));
1579 if (info
->new_local_var_chain
)
1580 declare_vars (info
->new_local_var_chain
,
1581 gimple_seq_first_stmt (gimple_omp_body (stmt
)),
1583 info
->new_local_var_chain
= save_local_var_chain
;
1584 info
->suppress_expansion
= save_suppress
;
1587 case GIMPLE_OMP_TEAMS
:
1588 save_suppress
= info
->suppress_expansion
;
1589 convert_nonlocal_omp_clauses (gimple_omp_teams_clauses_ptr (stmt
), wi
);
1590 walk_body (convert_nonlocal_reference_stmt
, convert_nonlocal_reference_op
,
1591 info
, gimple_omp_body_ptr (stmt
));
1592 info
->suppress_expansion
= save_suppress
;
1595 case GIMPLE_OMP_SECTION
:
1596 case GIMPLE_OMP_MASTER
:
1597 case GIMPLE_OMP_TASKGROUP
:
1598 case GIMPLE_OMP_ORDERED
:
1599 walk_body (convert_nonlocal_reference_stmt
, convert_nonlocal_reference_op
,
1600 info
, gimple_omp_body_ptr (stmt
));
1605 gbind
*bind_stmt
= as_a
<gbind
*> (stmt
);
1607 for (tree var
= gimple_bind_vars (bind_stmt
); var
; var
= DECL_CHAIN (var
))
1608 if (TREE_CODE (var
) == NAMELIST_DECL
)
1610 /* Adjust decls mentioned in NAMELIST_DECL. */
1611 tree decls
= NAMELIST_DECL_ASSOCIATED_DECL (var
);
1615 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (decls
), i
, decl
)
1618 && (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
)))
1620 if (decl_function_context (decl
) != info
->context
)
1621 CONSTRUCTOR_ELT (decls
, i
)->value
1622 = get_nonlocal_debug_decl (info
, decl
);
1626 *handled_ops_p
= false;
1630 wi
->val_only
= true;
1632 *handled_ops_p
= false;
1636 /* For every other statement that we are not interested in
1637 handling here, let the walker traverse the operands. */
1638 *handled_ops_p
= false;
1642 /* We have handled all of STMT operands, no need to traverse the operands. */
1643 *handled_ops_p
= true;
1648 /* A subroutine of convert_local_reference. Create a local variable
1649 in the parent function with DECL_VALUE_EXPR set to reference the
1650 field in FRAME. This is used both for debug info and in OMP
1654 get_local_debug_decl (struct nesting_info
*info
, tree decl
, tree field
)
1658 tree
*slot
= &info
->var_map
->get_or_insert (decl
);
1662 /* Make sure frame_decl gets created. */
1663 (void) get_frame_type (info
);
1664 x
= info
->frame_decl
;
1665 x
= build3 (COMPONENT_REF
, TREE_TYPE (field
), x
, field
, NULL_TREE
);
1667 new_decl
= build_decl (DECL_SOURCE_LOCATION (decl
),
1668 VAR_DECL
, DECL_NAME (decl
), TREE_TYPE (decl
));
1669 DECL_CONTEXT (new_decl
) = info
->context
;
1670 DECL_ARTIFICIAL (new_decl
) = DECL_ARTIFICIAL (decl
);
1671 DECL_IGNORED_P (new_decl
) = DECL_IGNORED_P (decl
);
1672 TREE_THIS_VOLATILE (new_decl
) = TREE_THIS_VOLATILE (decl
);
1673 TREE_SIDE_EFFECTS (new_decl
) = TREE_SIDE_EFFECTS (decl
);
1674 TREE_READONLY (new_decl
) = TREE_READONLY (decl
);
1675 TREE_ADDRESSABLE (new_decl
) = TREE_ADDRESSABLE (decl
);
1676 DECL_SEEN_IN_BIND_EXPR_P (new_decl
) = 1;
1677 if ((TREE_CODE (decl
) == PARM_DECL
1678 || TREE_CODE (decl
) == RESULT_DECL
1680 && DECL_BY_REFERENCE (decl
))
1681 DECL_BY_REFERENCE (new_decl
) = 1;
1683 SET_DECL_VALUE_EXPR (new_decl
, x
);
1684 DECL_HAS_VALUE_EXPR_P (new_decl
) = 1;
1687 DECL_CHAIN (new_decl
) = info
->debug_var_chain
;
1688 info
->debug_var_chain
= new_decl
;
1690 /* Do not emit debug info twice. */
1691 DECL_IGNORED_P (decl
) = 1;
1697 /* Called via walk_function+walk_gimple_stmt, rewrite all references to VAR
1698 and PARM_DECLs that were referenced by inner nested functions.
1699 The rewrite will be a structure reference to the local frame variable. */
1701 static bool convert_local_omp_clauses (tree
*, struct walk_stmt_info
*);
1704 convert_local_reference_op (tree
*tp
, int *walk_subtrees
, void *data
)
1706 struct walk_stmt_info
*wi
= (struct walk_stmt_info
*) data
;
1707 struct nesting_info
*const info
= (struct nesting_info
*) wi
->info
;
1708 tree t
= *tp
, field
, x
;
1712 switch (TREE_CODE (t
))
1715 /* Non-automatic variables are never processed. */
1716 if (TREE_STATIC (t
) || DECL_EXTERNAL (t
))
1721 if (t
!= info
->frame_decl
&& decl_function_context (t
) == info
->context
)
1723 /* If we copied a pointer to the frame, then the original decl
1724 is used unchanged in the parent function. */
1725 if (use_pointer_in_frame (t
))
1728 /* No need to transform anything if no child references the
1730 field
= lookup_field_for_decl (info
, t
, NO_INSERT
);
1735 if (bitmap_bit_p (info
->suppress_expansion
, DECL_UID (t
)))
1736 x
= get_local_debug_decl (info
, t
, field
);
1738 x
= get_frame_field (info
, info
->context
, field
, &wi
->gsi
);
1743 x
= save_tmp_var (info
, x
, &wi
->gsi
);
1745 x
= init_tmp_var (info
, x
, &wi
->gsi
);
1753 save_val_only
= wi
->val_only
;
1754 wi
->val_only
= false;
1756 wi
->changed
= false;
1757 walk_tree (&TREE_OPERAND (t
, 0), convert_local_reference_op
, wi
, NULL
);
1758 wi
->val_only
= save_val_only
;
1760 /* If we converted anything ... */
1765 /* Then the frame decl is now addressable. */
1766 TREE_ADDRESSABLE (info
->frame_decl
) = 1;
1768 save_context
= current_function_decl
;
1769 current_function_decl
= info
->context
;
1770 recompute_tree_invariant_for_addr_expr (t
);
1771 current_function_decl
= save_context
;
1773 /* If we are in a context where we only accept values, then
1774 compute the address into a temporary. */
1776 *tp
= gsi_gimplify_val ((struct nesting_info
*) wi
->info
,
1785 case ARRAY_RANGE_REF
:
1787 /* Go down this entire nest and just look at the final prefix and
1788 anything that describes the references. Otherwise, we lose track
1789 of whether a NOP_EXPR or VIEW_CONVERT_EXPR needs a simple value. */
1790 save_val_only
= wi
->val_only
;
1791 wi
->val_only
= true;
1793 for (; handled_component_p (t
); tp
= &TREE_OPERAND (t
, 0), t
= *tp
)
1795 if (TREE_CODE (t
) == COMPONENT_REF
)
1796 walk_tree (&TREE_OPERAND (t
, 2), convert_local_reference_op
, wi
,
1798 else if (TREE_CODE (t
) == ARRAY_REF
1799 || TREE_CODE (t
) == ARRAY_RANGE_REF
)
1801 walk_tree (&TREE_OPERAND (t
, 1), convert_local_reference_op
, wi
,
1803 walk_tree (&TREE_OPERAND (t
, 2), convert_local_reference_op
, wi
,
1805 walk_tree (&TREE_OPERAND (t
, 3), convert_local_reference_op
, wi
,
1809 wi
->val_only
= false;
1810 walk_tree (tp
, convert_local_reference_op
, wi
, NULL
);
1811 wi
->val_only
= save_val_only
;
1815 save_val_only
= wi
->val_only
;
1816 wi
->val_only
= true;
1818 walk_tree (&TREE_OPERAND (t
, 0), convert_local_reference_op
,
1820 /* We need to re-fold the MEM_REF as component references as
1821 part of a ADDR_EXPR address are not allowed. But we cannot
1822 fold here, as the chain record type is not yet finalized. */
1823 if (TREE_CODE (TREE_OPERAND (t
, 0)) == ADDR_EXPR
1824 && !DECL_P (TREE_OPERAND (TREE_OPERAND (t
, 0), 0)))
1825 info
->mem_refs
->add (tp
);
1826 wi
->val_only
= save_val_only
;
1829 case VIEW_CONVERT_EXPR
:
1830 /* Just request to look at the subtrees, leaving val_only and lhs
1831 untouched. This might actually be for !val_only + lhs, in which
1832 case we don't want to force a replacement by a temporary. */
1837 if (!IS_TYPE_OR_DECL_P (t
))
1840 wi
->val_only
= true;
1849 static tree
convert_local_reference_stmt (gimple_stmt_iterator
*, bool *,
1850 struct walk_stmt_info
*);
1852 /* Helper for convert_local_reference. Convert all the references in
1853 the chain of clauses at *PCLAUSES. WI is as in convert_local_reference. */
1856 convert_local_omp_clauses (tree
*pclauses
, struct walk_stmt_info
*wi
)
1858 struct nesting_info
*const info
= (struct nesting_info
*) wi
->info
;
1859 bool need_frame
= false, need_stmts
= false;
1862 bitmap new_suppress
;
1864 new_suppress
= BITMAP_GGC_ALLOC ();
1865 bitmap_copy (new_suppress
, info
->suppress_expansion
);
1867 for (clause
= *pclauses
; clause
; clause
= OMP_CLAUSE_CHAIN (clause
))
1869 switch (OMP_CLAUSE_CODE (clause
))
1871 case OMP_CLAUSE_REDUCTION
:
1872 if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause
))
1874 goto do_decl_clause
;
1876 case OMP_CLAUSE_LASTPRIVATE
:
1877 if (OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (clause
))
1879 goto do_decl_clause
;
1881 case OMP_CLAUSE_LINEAR
:
1882 if (OMP_CLAUSE_LINEAR_GIMPLE_SEQ (clause
))
1884 wi
->val_only
= true;
1886 convert_local_reference_op (&OMP_CLAUSE_LINEAR_STEP (clause
), &dummy
,
1888 goto do_decl_clause
;
1890 case OMP_CLAUSE_PRIVATE
:
1891 case OMP_CLAUSE_FIRSTPRIVATE
:
1892 case OMP_CLAUSE_COPYPRIVATE
:
1893 case OMP_CLAUSE_SHARED
:
1894 case OMP_CLAUSE_TO_DECLARE
:
1895 case OMP_CLAUSE_LINK
:
1896 case OMP_CLAUSE_USE_DEVICE_PTR
:
1897 case OMP_CLAUSE_IS_DEVICE_PTR
:
1899 decl
= OMP_CLAUSE_DECL (clause
);
1901 && (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
)))
1903 if (decl_function_context (decl
) == info
->context
1904 && !use_pointer_in_frame (decl
))
1906 tree field
= lookup_field_for_decl (info
, decl
, NO_INSERT
);
1909 if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_SHARED
)
1910 OMP_CLAUSE_SHARED_READONLY (clause
) = 0;
1911 bitmap_set_bit (new_suppress
, DECL_UID (decl
));
1912 OMP_CLAUSE_DECL (clause
)
1913 = get_local_debug_decl (info
, decl
, field
);
1919 case OMP_CLAUSE_SCHEDULE
:
1920 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
) == NULL
)
1923 case OMP_CLAUSE_FINAL
:
1925 case OMP_CLAUSE_NUM_THREADS
:
1926 case OMP_CLAUSE_DEPEND
:
1927 case OMP_CLAUSE_DEVICE
:
1928 case OMP_CLAUSE_NUM_TEAMS
:
1929 case OMP_CLAUSE_THREAD_LIMIT
:
1930 case OMP_CLAUSE_SAFELEN
:
1931 case OMP_CLAUSE_SIMDLEN
:
1932 case OMP_CLAUSE_PRIORITY
:
1933 case OMP_CLAUSE_GRAINSIZE
:
1934 case OMP_CLAUSE_NUM_TASKS
:
1935 case OMP_CLAUSE_HINT
:
1936 case OMP_CLAUSE_NUM_GANGS
:
1937 case OMP_CLAUSE_NUM_WORKERS
:
1938 case OMP_CLAUSE_VECTOR_LENGTH
:
1939 case OMP_CLAUSE_GANG
:
1940 case OMP_CLAUSE_WORKER
:
1941 case OMP_CLAUSE_VECTOR
:
1942 case OMP_CLAUSE_ASYNC
:
1943 case OMP_CLAUSE_WAIT
:
1944 /* Several OpenACC clauses have optional arguments. Check if they
1946 if (OMP_CLAUSE_OPERAND (clause
, 0))
1948 wi
->val_only
= true;
1950 convert_local_reference_op (&OMP_CLAUSE_OPERAND (clause
, 0),
1954 /* The gang clause accepts two arguments. */
1955 if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_GANG
1956 && OMP_CLAUSE_GANG_STATIC_EXPR (clause
))
1958 wi
->val_only
= true;
1960 convert_nonlocal_reference_op
1961 (&OMP_CLAUSE_GANG_STATIC_EXPR (clause
), &dummy
, wi
);
1965 case OMP_CLAUSE_DIST_SCHEDULE
:
1966 if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
) != NULL
)
1968 wi
->val_only
= true;
1970 convert_local_reference_op (&OMP_CLAUSE_OPERAND (clause
, 0),
1975 case OMP_CLAUSE_MAP
:
1977 case OMP_CLAUSE_FROM
:
1978 if (OMP_CLAUSE_SIZE (clause
))
1980 wi
->val_only
= true;
1982 convert_local_reference_op (&OMP_CLAUSE_SIZE (clause
),
1985 if (DECL_P (OMP_CLAUSE_DECL (clause
)))
1986 goto do_decl_clause
;
1987 wi
->val_only
= true;
1989 walk_tree (&OMP_CLAUSE_DECL (clause
), convert_local_reference_op
,
1993 case OMP_CLAUSE_ALIGNED
:
1994 if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
))
1996 wi
->val_only
= true;
1998 convert_local_reference_op
1999 (&OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
), &dummy
, wi
);
2001 /* Like do_decl_clause, but don't add any suppression. */
2002 decl
= OMP_CLAUSE_DECL (clause
);
2004 && (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
)))
2006 if (decl_function_context (decl
) == info
->context
2007 && !use_pointer_in_frame (decl
))
2009 tree field
= lookup_field_for_decl (info
, decl
, NO_INSERT
);
2012 OMP_CLAUSE_DECL (clause
)
2013 = get_local_debug_decl (info
, decl
, field
);
2019 case OMP_CLAUSE_NOWAIT
:
2020 case OMP_CLAUSE_ORDERED
:
2021 case OMP_CLAUSE_DEFAULT
:
2022 case OMP_CLAUSE_COPYIN
:
2023 case OMP_CLAUSE_COLLAPSE
:
2024 case OMP_CLAUSE_TILE
:
2025 case OMP_CLAUSE_UNTIED
:
2026 case OMP_CLAUSE_MERGEABLE
:
2027 case OMP_CLAUSE_PROC_BIND
:
2028 case OMP_CLAUSE_NOGROUP
:
2029 case OMP_CLAUSE_THREADS
:
2030 case OMP_CLAUSE_SIMD
:
2031 case OMP_CLAUSE_DEFAULTMAP
:
2032 case OMP_CLAUSE_SEQ
:
2033 case OMP_CLAUSE_INDEPENDENT
:
2034 case OMP_CLAUSE_AUTO
:
2035 case OMP_CLAUSE_IF_PRESENT
:
2036 case OMP_CLAUSE_FINALIZE
:
2039 /* The following clause belongs to the OpenACC cache directive, which
2040 is discarded during gimplification. */
2041 case OMP_CLAUSE__CACHE_
:
2042 /* The following clauses are only allowed in the OpenMP declare simd
2043 directive, so not seen here. */
2044 case OMP_CLAUSE_UNIFORM
:
2045 case OMP_CLAUSE_INBRANCH
:
2046 case OMP_CLAUSE_NOTINBRANCH
:
2047 /* The following clauses are only allowed on OpenMP cancel and
2048 cancellation point directives, which at this point have already
2049 been lowered into a function call. */
2050 case OMP_CLAUSE_FOR
:
2051 case OMP_CLAUSE_PARALLEL
:
2052 case OMP_CLAUSE_SECTIONS
:
2053 case OMP_CLAUSE_TASKGROUP
:
2054 /* The following clauses are only added during OMP lowering; nested
2055 function decomposition happens before that. */
2056 case OMP_CLAUSE__LOOPTEMP_
:
2057 case OMP_CLAUSE__SIMDUID_
:
2058 case OMP_CLAUSE__GRIDDIM_
:
2059 /* Anything else. */
2065 info
->suppress_expansion
= new_suppress
;
2068 for (clause
= *pclauses
; clause
; clause
= OMP_CLAUSE_CHAIN (clause
))
2069 switch (OMP_CLAUSE_CODE (clause
))
2071 case OMP_CLAUSE_REDUCTION
:
2072 if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause
))
2075 = DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause
));
2076 DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause
))
2078 if (OMP_CLAUSE_REDUCTION_DECL_PLACEHOLDER (clause
))
2079 DECL_CONTEXT (OMP_CLAUSE_REDUCTION_DECL_PLACEHOLDER (clause
))
2081 walk_body (convert_local_reference_stmt
,
2082 convert_local_reference_op
, info
,
2083 &OMP_CLAUSE_REDUCTION_GIMPLE_INIT (clause
));
2084 walk_body (convert_local_reference_stmt
,
2085 convert_local_reference_op
, info
,
2086 &OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (clause
));
2087 DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause
))
2089 if (OMP_CLAUSE_REDUCTION_DECL_PLACEHOLDER (clause
))
2090 DECL_CONTEXT (OMP_CLAUSE_REDUCTION_DECL_PLACEHOLDER (clause
))
2095 case OMP_CLAUSE_LASTPRIVATE
:
2096 walk_body (convert_local_reference_stmt
,
2097 convert_local_reference_op
, info
,
2098 &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (clause
));
2101 case OMP_CLAUSE_LINEAR
:
2102 walk_body (convert_local_reference_stmt
,
2103 convert_local_reference_op
, info
,
2104 &OMP_CLAUSE_LINEAR_GIMPLE_SEQ (clause
));
2115 /* Called via walk_function+walk_gimple_stmt, rewrite all references to VAR
2116 and PARM_DECLs that were referenced by inner nested functions.
2117 The rewrite will be a structure reference to the local frame variable. */
2120 convert_local_reference_stmt (gimple_stmt_iterator
*gsi
, bool *handled_ops_p
,
2121 struct walk_stmt_info
*wi
)
2123 struct nesting_info
*info
= (struct nesting_info
*) wi
->info
;
2124 tree save_local_var_chain
;
2125 bitmap save_suppress
;
2126 char save_static_chain_added
;
2127 bool frame_decl_added
;
2128 gimple
*stmt
= gsi_stmt (*gsi
);
2130 switch (gimple_code (stmt
))
2132 case GIMPLE_OMP_PARALLEL
:
2133 case GIMPLE_OMP_TASK
:
2134 save_suppress
= info
->suppress_expansion
;
2135 frame_decl_added
= false;
2136 if (convert_local_omp_clauses (gimple_omp_taskreg_clauses_ptr (stmt
),
2139 tree c
= build_omp_clause (gimple_location (stmt
),
2141 (void) get_frame_type (info
);
2142 OMP_CLAUSE_DECL (c
) = info
->frame_decl
;
2143 OMP_CLAUSE_CHAIN (c
) = gimple_omp_taskreg_clauses (stmt
);
2144 gimple_omp_taskreg_set_clauses (stmt
, c
);
2145 info
->static_chain_added
|= 4;
2146 frame_decl_added
= true;
2149 save_local_var_chain
= info
->new_local_var_chain
;
2150 save_static_chain_added
= info
->static_chain_added
;
2151 info
->new_local_var_chain
= NULL
;
2152 info
->static_chain_added
= 0;
2154 walk_body (convert_local_reference_stmt
, convert_local_reference_op
, info
,
2155 gimple_omp_body_ptr (stmt
));
2157 if ((info
->static_chain_added
& 4) != 0 && !frame_decl_added
)
2159 tree c
= build_omp_clause (gimple_location (stmt
),
2161 (void) get_frame_type (info
);
2162 OMP_CLAUSE_DECL (c
) = info
->frame_decl
;
2163 OMP_CLAUSE_CHAIN (c
) = gimple_omp_taskreg_clauses (stmt
);
2164 info
->static_chain_added
|= 4;
2165 gimple_omp_taskreg_set_clauses (stmt
, c
);
2167 if (info
->new_local_var_chain
)
2168 declare_vars (info
->new_local_var_chain
,
2169 gimple_seq_first_stmt (gimple_omp_body (stmt
)), false);
2170 info
->new_local_var_chain
= save_local_var_chain
;
2171 info
->suppress_expansion
= save_suppress
;
2172 info
->static_chain_added
|= save_static_chain_added
;
2175 case GIMPLE_OMP_FOR
:
2176 save_suppress
= info
->suppress_expansion
;
2177 convert_local_omp_clauses (gimple_omp_for_clauses_ptr (stmt
), wi
);
2178 walk_gimple_omp_for (as_a
<gomp_for
*> (stmt
),
2179 convert_local_reference_stmt
,
2180 convert_local_reference_op
, info
);
2181 walk_body (convert_local_reference_stmt
, convert_local_reference_op
,
2182 info
, gimple_omp_body_ptr (stmt
));
2183 info
->suppress_expansion
= save_suppress
;
2186 case GIMPLE_OMP_SECTIONS
:
2187 save_suppress
= info
->suppress_expansion
;
2188 convert_local_omp_clauses (gimple_omp_sections_clauses_ptr (stmt
), wi
);
2189 walk_body (convert_local_reference_stmt
, convert_local_reference_op
,
2190 info
, gimple_omp_body_ptr (stmt
));
2191 info
->suppress_expansion
= save_suppress
;
2194 case GIMPLE_OMP_SINGLE
:
2195 save_suppress
= info
->suppress_expansion
;
2196 convert_local_omp_clauses (gimple_omp_single_clauses_ptr (stmt
), wi
);
2197 walk_body (convert_local_reference_stmt
, convert_local_reference_op
,
2198 info
, gimple_omp_body_ptr (stmt
));
2199 info
->suppress_expansion
= save_suppress
;
2202 case GIMPLE_OMP_TARGET
:
2203 if (!is_gimple_omp_offloaded (stmt
))
2205 save_suppress
= info
->suppress_expansion
;
2206 convert_local_omp_clauses (gimple_omp_target_clauses_ptr (stmt
), wi
);
2207 info
->suppress_expansion
= save_suppress
;
2208 walk_body (convert_local_reference_stmt
, convert_local_reference_op
,
2209 info
, gimple_omp_body_ptr (stmt
));
2212 save_suppress
= info
->suppress_expansion
;
2213 frame_decl_added
= false;
2214 if (convert_local_omp_clauses (gimple_omp_target_clauses_ptr (stmt
), wi
))
2216 tree c
= build_omp_clause (gimple_location (stmt
), OMP_CLAUSE_MAP
);
2217 (void) get_frame_type (info
);
2218 OMP_CLAUSE_DECL (c
) = info
->frame_decl
;
2219 OMP_CLAUSE_SET_MAP_KIND (c
, GOMP_MAP_TOFROM
);
2220 OMP_CLAUSE_SIZE (c
) = DECL_SIZE_UNIT (info
->frame_decl
);
2221 OMP_CLAUSE_CHAIN (c
) = gimple_omp_target_clauses (stmt
);
2222 gimple_omp_target_set_clauses (as_a
<gomp_target
*> (stmt
), c
);
2223 info
->static_chain_added
|= 4;
2224 frame_decl_added
= true;
2227 save_local_var_chain
= info
->new_local_var_chain
;
2228 save_static_chain_added
= info
->static_chain_added
;
2229 info
->new_local_var_chain
= NULL
;
2230 info
->static_chain_added
= 0;
2232 walk_body (convert_local_reference_stmt
, convert_local_reference_op
, info
,
2233 gimple_omp_body_ptr (stmt
));
2235 if ((info
->static_chain_added
& 4) != 0 && !frame_decl_added
)
2237 tree c
= build_omp_clause (gimple_location (stmt
), OMP_CLAUSE_MAP
);
2238 (void) get_frame_type (info
);
2239 OMP_CLAUSE_DECL (c
) = info
->frame_decl
;
2240 OMP_CLAUSE_SET_MAP_KIND (c
, GOMP_MAP_TOFROM
);
2241 OMP_CLAUSE_SIZE (c
) = DECL_SIZE_UNIT (info
->frame_decl
);
2242 OMP_CLAUSE_CHAIN (c
) = gimple_omp_target_clauses (stmt
);
2243 gimple_omp_target_set_clauses (as_a
<gomp_target
*> (stmt
), c
);
2244 info
->static_chain_added
|= 4;
2247 if (info
->new_local_var_chain
)
2248 declare_vars (info
->new_local_var_chain
,
2249 gimple_seq_first_stmt (gimple_omp_body (stmt
)), false);
2250 info
->new_local_var_chain
= save_local_var_chain
;
2251 info
->suppress_expansion
= save_suppress
;
2252 info
->static_chain_added
|= save_static_chain_added
;
2255 case GIMPLE_OMP_TEAMS
:
2256 save_suppress
= info
->suppress_expansion
;
2257 convert_local_omp_clauses (gimple_omp_teams_clauses_ptr (stmt
), wi
);
2258 walk_body (convert_local_reference_stmt
, convert_local_reference_op
,
2259 info
, gimple_omp_body_ptr (stmt
));
2260 info
->suppress_expansion
= save_suppress
;
2263 case GIMPLE_OMP_SECTION
:
2264 case GIMPLE_OMP_MASTER
:
2265 case GIMPLE_OMP_TASKGROUP
:
2266 case GIMPLE_OMP_ORDERED
:
2267 walk_body (convert_local_reference_stmt
, convert_local_reference_op
,
2268 info
, gimple_omp_body_ptr (stmt
));
2272 wi
->val_only
= true;
2274 *handled_ops_p
= false;
2278 if (gimple_clobber_p (stmt
))
2280 tree lhs
= gimple_assign_lhs (stmt
);
2281 if (!use_pointer_in_frame (lhs
)
2282 && lookup_field_for_decl (info
, lhs
, NO_INSERT
))
2284 gsi_replace (gsi
, gimple_build_nop (), true);
2288 *handled_ops_p
= false;
2292 for (tree var
= gimple_bind_vars (as_a
<gbind
*> (stmt
));
2294 var
= DECL_CHAIN (var
))
2295 if (TREE_CODE (var
) == NAMELIST_DECL
)
2297 /* Adjust decls mentioned in NAMELIST_DECL. */
2298 tree decls
= NAMELIST_DECL_ASSOCIATED_DECL (var
);
2302 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (decls
), i
, decl
)
2305 && (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
)))
2307 if (decl_function_context (decl
) == info
->context
2308 && !use_pointer_in_frame (decl
))
2310 tree field
= lookup_field_for_decl (info
, decl
, NO_INSERT
);
2313 CONSTRUCTOR_ELT (decls
, i
)->value
2314 = get_local_debug_decl (info
, decl
, field
);
2320 *handled_ops_p
= false;
2324 /* For every other statement that we are not interested in
2325 handling here, let the walker traverse the operands. */
2326 *handled_ops_p
= false;
2330 /* Indicate that we have handled all the operands ourselves. */
2331 *handled_ops_p
= true;
2336 /* Called via walk_function+walk_gimple_stmt, rewrite all GIMPLE_GOTOs
2337 that reference labels from outer functions. The rewrite will be a
2338 call to __builtin_nonlocal_goto. */
2341 convert_nl_goto_reference (gimple_stmt_iterator
*gsi
, bool *handled_ops_p
,
2342 struct walk_stmt_info
*wi
)
2344 struct nesting_info
*const info
= (struct nesting_info
*) wi
->info
, *i
;
2345 tree label
, new_label
, target_context
, x
, field
;
2347 gimple
*stmt
= gsi_stmt (*gsi
);
2349 if (gimple_code (stmt
) != GIMPLE_GOTO
)
2351 *handled_ops_p
= false;
2355 label
= gimple_goto_dest (stmt
);
2356 if (TREE_CODE (label
) != LABEL_DECL
)
2358 *handled_ops_p
= false;
2362 target_context
= decl_function_context (label
);
2363 if (target_context
== info
->context
)
2365 *handled_ops_p
= false;
2369 for (i
= info
->outer
; target_context
!= i
->context
; i
= i
->outer
)
2372 /* The original user label may also be use for a normal goto, therefore
2373 we must create a new label that will actually receive the abnormal
2374 control transfer. This new label will be marked LABEL_NONLOCAL; this
2375 mark will trigger proper behavior in the cfg, as well as cause the
2376 (hairy target-specific) non-local goto receiver code to be generated
2377 when we expand rtl. Enter this association into var_map so that we
2378 can insert the new label into the IL during a second pass. */
2379 tree
*slot
= &i
->var_map
->get_or_insert (label
);
2382 new_label
= create_artificial_label (UNKNOWN_LOCATION
);
2383 DECL_NONLOCAL (new_label
) = 1;
2389 /* Build: __builtin_nl_goto(new_label, &chain->nl_goto_field). */
2390 field
= get_nl_goto_field (i
);
2391 x
= get_frame_field (info
, target_context
, field
, gsi
);
2393 x
= gsi_gimplify_val (info
, x
, gsi
);
2394 call
= gimple_build_call (builtin_decl_implicit (BUILT_IN_NONLOCAL_GOTO
),
2395 2, build_addr (new_label
), x
);
2396 gsi_replace (gsi
, call
, false);
2398 /* We have handled all of STMT's operands, no need to keep going. */
2399 *handled_ops_p
= true;
2404 /* Called via walk_function+walk_tree, rewrite all GIMPLE_LABELs whose labels
2405 are referenced via nonlocal goto from a nested function. The rewrite
2406 will involve installing a newly generated DECL_NONLOCAL label, and
2407 (potentially) a branch around the rtl gunk that is assumed to be
2408 attached to such a label. */
2411 convert_nl_goto_receiver (gimple_stmt_iterator
*gsi
, bool *handled_ops_p
,
2412 struct walk_stmt_info
*wi
)
2414 struct nesting_info
*const info
= (struct nesting_info
*) wi
->info
;
2415 tree label
, new_label
;
2416 gimple_stmt_iterator tmp_gsi
;
2417 glabel
*stmt
= dyn_cast
<glabel
*> (gsi_stmt (*gsi
));
2421 *handled_ops_p
= false;
2425 label
= gimple_label_label (stmt
);
2427 tree
*slot
= info
->var_map
->get (label
);
2430 *handled_ops_p
= false;
2434 /* If there's any possibility that the previous statement falls through,
2435 then we must branch around the new non-local label. */
2437 gsi_prev (&tmp_gsi
);
2438 if (gsi_end_p (tmp_gsi
) || gimple_stmt_may_fallthru (gsi_stmt (tmp_gsi
)))
2440 gimple
*stmt
= gimple_build_goto (label
);
2441 gsi_insert_before (gsi
, stmt
, GSI_SAME_STMT
);
2444 new_label
= (tree
) *slot
;
2445 stmt
= gimple_build_label (new_label
);
2446 gsi_insert_before (gsi
, stmt
, GSI_SAME_STMT
);
2448 *handled_ops_p
= true;
2453 /* Called via walk_function+walk_stmt, rewrite all references to addresses
2454 of nested functions that require the use of trampolines. The rewrite
2455 will involve a reference a trampoline generated for the occasion. */
2458 convert_tramp_reference_op (tree
*tp
, int *walk_subtrees
, void *data
)
2460 struct walk_stmt_info
*wi
= (struct walk_stmt_info
*) data
;
2461 struct nesting_info
*const info
= (struct nesting_info
*) wi
->info
, *i
;
2462 tree t
= *tp
, decl
, target_context
, x
, builtin
;
2467 switch (TREE_CODE (t
))
2471 T.1 = &CHAIN->tramp;
2472 T.2 = __builtin_adjust_trampoline (T.1);
2473 T.3 = (func_type)T.2;
2476 decl
= TREE_OPERAND (t
, 0);
2477 if (TREE_CODE (decl
) != FUNCTION_DECL
)
2480 /* Only need to process nested functions. */
2481 target_context
= decl_function_context (decl
);
2482 if (!target_context
)
2485 /* If the nested function doesn't use a static chain, then
2486 it doesn't need a trampoline. */
2487 if (!DECL_STATIC_CHAIN (decl
))
2490 /* If we don't want a trampoline, then don't build one. */
2491 if (TREE_NO_TRAMPOLINE (t
))
2494 /* Lookup the immediate parent of the callee, as that's where
2495 we need to insert the trampoline. */
2496 for (i
= info
; i
->context
!= target_context
; i
= i
->outer
)
2499 /* Decide whether to generate a descriptor or a trampoline. */
2500 descr
= FUNC_ADDR_BY_DESCRIPTOR (t
) && !flag_trampolines
;
2503 x
= lookup_descr_for_decl (i
, decl
, INSERT
);
2505 x
= lookup_tramp_for_decl (i
, decl
, INSERT
);
2507 /* Compute the address of the field holding the trampoline. */
2508 x
= get_frame_field (info
, target_context
, x
, &wi
->gsi
);
2510 x
= gsi_gimplify_val (info
, x
, &wi
->gsi
);
2512 /* Do machine-specific ugliness. Normally this will involve
2513 computing extra alignment, but it can really be anything. */
2515 builtin
= builtin_decl_implicit (BUILT_IN_ADJUST_DESCRIPTOR
);
2517 builtin
= builtin_decl_implicit (BUILT_IN_ADJUST_TRAMPOLINE
);
2518 call
= gimple_build_call (builtin
, 1, x
);
2519 x
= init_tmp_var_with_call (info
, &wi
->gsi
, call
);
2521 /* Cast back to the proper function type. */
2522 x
= build1 (NOP_EXPR
, TREE_TYPE (t
), x
);
2523 x
= init_tmp_var (info
, x
, &wi
->gsi
);
2529 if (!IS_TYPE_OR_DECL_P (t
))
2538 /* Called via walk_function+walk_gimple_stmt, rewrite all references
2539 to addresses of nested functions that require the use of
2540 trampolines. The rewrite will involve a reference a trampoline
2541 generated for the occasion. */
2544 convert_tramp_reference_stmt (gimple_stmt_iterator
*gsi
, bool *handled_ops_p
,
2545 struct walk_stmt_info
*wi
)
2547 struct nesting_info
*info
= (struct nesting_info
*) wi
->info
;
2548 gimple
*stmt
= gsi_stmt (*gsi
);
2550 switch (gimple_code (stmt
))
2554 /* Only walk call arguments, lest we generate trampolines for
2556 unsigned long i
, nargs
= gimple_call_num_args (stmt
);
2557 for (i
= 0; i
< nargs
; i
++)
2558 walk_tree (gimple_call_arg_ptr (stmt
, i
), convert_tramp_reference_op
,
2563 case GIMPLE_OMP_TARGET
:
2564 if (!is_gimple_omp_offloaded (stmt
))
2566 *handled_ops_p
= false;
2570 case GIMPLE_OMP_PARALLEL
:
2571 case GIMPLE_OMP_TASK
:
2573 tree save_local_var_chain
= info
->new_local_var_chain
;
2574 walk_gimple_op (stmt
, convert_tramp_reference_op
, wi
);
2575 info
->new_local_var_chain
= NULL
;
2576 char save_static_chain_added
= info
->static_chain_added
;
2577 info
->static_chain_added
= 0;
2578 walk_body (convert_tramp_reference_stmt
, convert_tramp_reference_op
,
2579 info
, gimple_omp_body_ptr (stmt
));
2580 if (info
->new_local_var_chain
)
2581 declare_vars (info
->new_local_var_chain
,
2582 gimple_seq_first_stmt (gimple_omp_body (stmt
)),
2584 for (int i
= 0; i
< 2; i
++)
2587 if ((info
->static_chain_added
& (1 << i
)) == 0)
2589 decl
= i
? get_chain_decl (info
) : info
->frame_decl
;
2590 /* Don't add CHAIN.* or FRAME.* twice. */
2591 for (c
= gimple_omp_taskreg_clauses (stmt
);
2593 c
= OMP_CLAUSE_CHAIN (c
))
2594 if ((OMP_CLAUSE_CODE (c
) == OMP_CLAUSE_FIRSTPRIVATE
2595 || OMP_CLAUSE_CODE (c
) == OMP_CLAUSE_SHARED
)
2596 && OMP_CLAUSE_DECL (c
) == decl
)
2598 if (c
== NULL
&& gimple_code (stmt
) != GIMPLE_OMP_TARGET
)
2600 c
= build_omp_clause (gimple_location (stmt
),
2601 i
? OMP_CLAUSE_FIRSTPRIVATE
2602 : OMP_CLAUSE_SHARED
);
2603 OMP_CLAUSE_DECL (c
) = decl
;
2604 OMP_CLAUSE_CHAIN (c
) = gimple_omp_taskreg_clauses (stmt
);
2605 gimple_omp_taskreg_set_clauses (stmt
, c
);
2609 c
= build_omp_clause (gimple_location (stmt
),
2611 OMP_CLAUSE_DECL (c
) = decl
;
2612 OMP_CLAUSE_SET_MAP_KIND (c
,
2613 i
? GOMP_MAP_TO
: GOMP_MAP_TOFROM
);
2614 OMP_CLAUSE_SIZE (c
) = DECL_SIZE_UNIT (decl
);
2615 OMP_CLAUSE_CHAIN (c
) = gimple_omp_target_clauses (stmt
);
2616 gimple_omp_target_set_clauses (as_a
<gomp_target
*> (stmt
),
2620 info
->new_local_var_chain
= save_local_var_chain
;
2621 info
->static_chain_added
|= save_static_chain_added
;
2626 *handled_ops_p
= false;
2630 *handled_ops_p
= true;
2636 /* Called via walk_function+walk_gimple_stmt, rewrite all GIMPLE_CALLs
2637 that reference nested functions to make sure that the static chain
2638 is set up properly for the call. */
2641 convert_gimple_call (gimple_stmt_iterator
*gsi
, bool *handled_ops_p
,
2642 struct walk_stmt_info
*wi
)
2644 struct nesting_info
*const info
= (struct nesting_info
*) wi
->info
;
2645 tree decl
, target_context
;
2646 char save_static_chain_added
;
2648 gimple
*stmt
= gsi_stmt (*gsi
);
2650 switch (gimple_code (stmt
))
2653 if (gimple_call_chain (stmt
))
2655 decl
= gimple_call_fndecl (stmt
);
2658 target_context
= decl_function_context (decl
);
2659 if (target_context
&& DECL_STATIC_CHAIN (decl
))
2661 struct nesting_info
*i
= info
;
2662 while (i
&& i
->context
!= target_context
)
2664 /* If none of the outer contexts is the target context, this means
2665 that the function is called in a wrong context. */
2667 internal_error ("%s from %s called in %s",
2668 IDENTIFIER_POINTER (DECL_NAME (decl
)),
2669 IDENTIFIER_POINTER (DECL_NAME (target_context
)),
2670 IDENTIFIER_POINTER (DECL_NAME (info
->context
)));
2672 gimple_call_set_chain (as_a
<gcall
*> (stmt
),
2673 get_static_chain (info
, target_context
,
2675 info
->static_chain_added
|= (1 << (info
->context
!= target_context
));
2679 case GIMPLE_OMP_PARALLEL
:
2680 case GIMPLE_OMP_TASK
:
2681 save_static_chain_added
= info
->static_chain_added
;
2682 info
->static_chain_added
= 0;
2683 walk_body (convert_gimple_call
, NULL
, info
, gimple_omp_body_ptr (stmt
));
2684 for (i
= 0; i
< 2; i
++)
2687 if ((info
->static_chain_added
& (1 << i
)) == 0)
2689 decl
= i
? get_chain_decl (info
) : info
->frame_decl
;
2690 /* Don't add CHAIN.* or FRAME.* twice. */
2691 for (c
= gimple_omp_taskreg_clauses (stmt
);
2693 c
= OMP_CLAUSE_CHAIN (c
))
2694 if ((OMP_CLAUSE_CODE (c
) == OMP_CLAUSE_FIRSTPRIVATE
2695 || OMP_CLAUSE_CODE (c
) == OMP_CLAUSE_SHARED
)
2696 && OMP_CLAUSE_DECL (c
) == decl
)
2700 c
= build_omp_clause (gimple_location (stmt
),
2701 i
? OMP_CLAUSE_FIRSTPRIVATE
2702 : OMP_CLAUSE_SHARED
);
2703 OMP_CLAUSE_DECL (c
) = decl
;
2704 OMP_CLAUSE_CHAIN (c
) = gimple_omp_taskreg_clauses (stmt
);
2705 gimple_omp_taskreg_set_clauses (stmt
, c
);
2708 info
->static_chain_added
|= save_static_chain_added
;
2711 case GIMPLE_OMP_TARGET
:
2712 if (!is_gimple_omp_offloaded (stmt
))
2714 walk_body (convert_gimple_call
, NULL
, info
, gimple_omp_body_ptr (stmt
));
2717 save_static_chain_added
= info
->static_chain_added
;
2718 info
->static_chain_added
= 0;
2719 walk_body (convert_gimple_call
, NULL
, info
, gimple_omp_body_ptr (stmt
));
2720 for (i
= 0; i
< 2; i
++)
2723 if ((info
->static_chain_added
& (1 << i
)) == 0)
2725 decl
= i
? get_chain_decl (info
) : info
->frame_decl
;
2726 /* Don't add CHAIN.* or FRAME.* twice. */
2727 for (c
= gimple_omp_target_clauses (stmt
);
2729 c
= OMP_CLAUSE_CHAIN (c
))
2730 if (OMP_CLAUSE_CODE (c
) == OMP_CLAUSE_MAP
2731 && OMP_CLAUSE_DECL (c
) == decl
)
2735 c
= build_omp_clause (gimple_location (stmt
), OMP_CLAUSE_MAP
);
2736 OMP_CLAUSE_DECL (c
) = decl
;
2737 OMP_CLAUSE_SET_MAP_KIND (c
, i
? GOMP_MAP_TO
: GOMP_MAP_TOFROM
);
2738 OMP_CLAUSE_SIZE (c
) = DECL_SIZE_UNIT (decl
);
2739 OMP_CLAUSE_CHAIN (c
) = gimple_omp_target_clauses (stmt
);
2740 gimple_omp_target_set_clauses (as_a
<gomp_target
*> (stmt
),
2744 info
->static_chain_added
|= save_static_chain_added
;
2747 case GIMPLE_OMP_FOR
:
2748 walk_body (convert_gimple_call
, NULL
, info
,
2749 gimple_omp_for_pre_body_ptr (stmt
));
2751 case GIMPLE_OMP_SECTIONS
:
2752 case GIMPLE_OMP_SECTION
:
2753 case GIMPLE_OMP_SINGLE
:
2754 case GIMPLE_OMP_TEAMS
:
2755 case GIMPLE_OMP_MASTER
:
2756 case GIMPLE_OMP_TASKGROUP
:
2757 case GIMPLE_OMP_ORDERED
:
2758 case GIMPLE_OMP_CRITICAL
:
2759 walk_body (convert_gimple_call
, NULL
, info
, gimple_omp_body_ptr (stmt
));
2763 /* Keep looking for other operands. */
2764 *handled_ops_p
= false;
2768 *handled_ops_p
= true;
2772 /* Walk the nesting tree starting with ROOT. Convert all trampolines and
2773 call expressions. At the same time, determine if a nested function
2774 actually uses its static chain; if not, remember that. */
2777 convert_all_function_calls (struct nesting_info
*root
)
2779 unsigned int chain_count
= 0, old_chain_count
, iter_count
;
2780 struct nesting_info
*n
;
2782 /* First, optimistically clear static_chain for all decls that haven't
2783 used the static chain already for variable access. But always create
2784 it if not optimizing. This makes it possible to reconstruct the static
2785 nesting tree at run time and thus to resolve up-level references from
2786 within the debugger. */
2787 FOR_EACH_NEST_INFO (n
, root
)
2789 tree decl
= n
->context
;
2793 (void) get_frame_type (n
);
2795 (void) get_chain_decl (n
);
2797 else if (!n
->outer
|| (!n
->chain_decl
&& !n
->chain_field
))
2799 DECL_STATIC_CHAIN (decl
) = 0;
2800 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2801 fprintf (dump_file
, "Guessing no static-chain for %s\n",
2802 lang_hooks
.decl_printable_name (decl
, 2));
2805 DECL_STATIC_CHAIN (decl
) = 1;
2806 chain_count
+= DECL_STATIC_CHAIN (decl
);
2809 /* Walk the functions and perform transformations. Note that these
2810 transformations can induce new uses of the static chain, which in turn
2811 require re-examining all users of the decl. */
2812 /* ??? It would make sense to try to use the call graph to speed this up,
2813 but the call graph hasn't really been built yet. Even if it did, we
2814 would still need to iterate in this loop since address-of references
2815 wouldn't show up in the callgraph anyway. */
2819 old_chain_count
= chain_count
;
2823 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2824 fputc ('\n', dump_file
);
2826 FOR_EACH_NEST_INFO (n
, root
)
2828 tree decl
= n
->context
;
2829 walk_function (convert_tramp_reference_stmt
,
2830 convert_tramp_reference_op
, n
);
2831 walk_function (convert_gimple_call
, NULL
, n
);
2832 chain_count
+= DECL_STATIC_CHAIN (decl
);
2835 while (chain_count
!= old_chain_count
);
2837 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2838 fprintf (dump_file
, "convert_all_function_calls iterations: %u\n\n",
2842 struct nesting_copy_body_data
2845 struct nesting_info
*root
;
2848 /* A helper subroutine for debug_var_chain type remapping. */
2851 nesting_copy_decl (tree decl
, copy_body_data
*id
)
2853 struct nesting_copy_body_data
*nid
= (struct nesting_copy_body_data
*) id
;
2854 tree
*slot
= nid
->root
->var_map
->get (decl
);
2857 return (tree
) *slot
;
2859 if (TREE_CODE (decl
) == TYPE_DECL
&& DECL_ORIGINAL_TYPE (decl
))
2861 tree new_decl
= copy_decl_no_change (decl
, id
);
2862 DECL_ORIGINAL_TYPE (new_decl
)
2863 = remap_type (DECL_ORIGINAL_TYPE (decl
), id
);
2868 || TREE_CODE (decl
) == PARM_DECL
2869 || TREE_CODE (decl
) == RESULT_DECL
)
2872 return copy_decl_no_change (decl
, id
);
2875 /* A helper function for remap_vla_decls. See if *TP contains
2876 some remapped variables. */
2879 contains_remapped_vars (tree
*tp
, int *walk_subtrees
, void *data
)
2881 struct nesting_info
*root
= (struct nesting_info
*) data
;
2887 tree
*slot
= root
->var_map
->get (t
);
2895 /* Remap VLA decls in BLOCK and subblocks if remapped variables are
2899 remap_vla_decls (tree block
, struct nesting_info
*root
)
2901 tree var
, subblock
, val
, type
;
2902 struct nesting_copy_body_data id
;
2904 for (subblock
= BLOCK_SUBBLOCKS (block
);
2906 subblock
= BLOCK_CHAIN (subblock
))
2907 remap_vla_decls (subblock
, root
);
2909 for (var
= BLOCK_VARS (block
); var
; var
= DECL_CHAIN (var
))
2910 if (VAR_P (var
) && DECL_HAS_VALUE_EXPR_P (var
))
2912 val
= DECL_VALUE_EXPR (var
);
2913 type
= TREE_TYPE (var
);
2915 if (!(TREE_CODE (val
) == INDIRECT_REF
2916 && TREE_CODE (TREE_OPERAND (val
, 0)) == VAR_DECL
2917 && variably_modified_type_p (type
, NULL
)))
2920 if (root
->var_map
->get (TREE_OPERAND (val
, 0))
2921 || walk_tree (&type
, contains_remapped_vars
, root
, NULL
))
2925 if (var
== NULL_TREE
)
2928 memset (&id
, 0, sizeof (id
));
2929 id
.cb
.copy_decl
= nesting_copy_decl
;
2930 id
.cb
.decl_map
= new hash_map
<tree
, tree
>;
2933 for (; var
; var
= DECL_CHAIN (var
))
2934 if (VAR_P (var
) && DECL_HAS_VALUE_EXPR_P (var
))
2936 struct nesting_info
*i
;
2939 val
= DECL_VALUE_EXPR (var
);
2940 type
= TREE_TYPE (var
);
2942 if (!(TREE_CODE (val
) == INDIRECT_REF
2943 && TREE_CODE (TREE_OPERAND (val
, 0)) == VAR_DECL
2944 && variably_modified_type_p (type
, NULL
)))
2947 tree
*slot
= root
->var_map
->get (TREE_OPERAND (val
, 0));
2948 if (!slot
&& !walk_tree (&type
, contains_remapped_vars
, root
, NULL
))
2951 context
= decl_function_context (var
);
2952 for (i
= root
; i
; i
= i
->outer
)
2953 if (i
->context
== context
)
2959 /* Fully expand value expressions. This avoids having debug variables
2960 only referenced from them and that can be swept during GC. */
2963 tree t
= (tree
) *slot
;
2964 gcc_assert (DECL_P (t
) && DECL_HAS_VALUE_EXPR_P (t
));
2965 val
= build1 (INDIRECT_REF
, TREE_TYPE (val
), DECL_VALUE_EXPR (t
));
2968 id
.cb
.src_fn
= i
->context
;
2969 id
.cb
.dst_fn
= i
->context
;
2970 id
.cb
.src_cfun
= DECL_STRUCT_FUNCTION (root
->context
);
2972 TREE_TYPE (var
) = newt
= remap_type (type
, &id
.cb
);
2973 while (POINTER_TYPE_P (newt
) && !TYPE_NAME (newt
))
2975 newt
= TREE_TYPE (newt
);
2976 type
= TREE_TYPE (type
);
2978 if (TYPE_NAME (newt
)
2979 && TREE_CODE (TYPE_NAME (newt
)) == TYPE_DECL
2980 && DECL_ORIGINAL_TYPE (TYPE_NAME (newt
))
2982 && TYPE_NAME (newt
) == TYPE_NAME (type
))
2983 TYPE_NAME (newt
) = remap_decl (TYPE_NAME (newt
), &id
.cb
);
2985 walk_tree (&val
, copy_tree_body_r
, &id
.cb
, NULL
);
2986 if (val
!= DECL_VALUE_EXPR (var
))
2987 SET_DECL_VALUE_EXPR (var
, val
);
2990 delete id
.cb
.decl_map
;
2993 /* Fixup VLA decls in BLOCK and subblocks if remapped variables are
2997 fixup_vla_decls (tree block
)
2999 for (tree var
= BLOCK_VARS (block
); var
; var
= DECL_CHAIN (var
))
3000 if (VAR_P (var
) && DECL_HAS_VALUE_EXPR_P (var
))
3002 tree val
= DECL_VALUE_EXPR (var
);
3004 if (!(TREE_CODE (val
) == INDIRECT_REF
3005 && VAR_P (TREE_OPERAND (val
, 0))
3006 && DECL_HAS_VALUE_EXPR_P (TREE_OPERAND (val
, 0))))
3009 /* Fully expand value expressions. This avoids having debug variables
3010 only referenced from them and that can be swept during GC. */
3011 val
= build1 (INDIRECT_REF
, TREE_TYPE (val
),
3012 DECL_VALUE_EXPR (TREE_OPERAND (val
, 0)));
3013 SET_DECL_VALUE_EXPR (var
, val
);
3016 for (tree sub
= BLOCK_SUBBLOCKS (block
); sub
; sub
= BLOCK_CHAIN (sub
))
3017 fixup_vla_decls (sub
);
3020 /* Fold the MEM_REF *E. */
3022 fold_mem_refs (tree
*const &e
, void *data ATTRIBUTE_UNUSED
)
3024 tree
*ref_p
= CONST_CAST2 (tree
*, const tree
*, (const tree
*)e
);
3025 *ref_p
= fold (*ref_p
);
3029 /* Given DECL, a nested function, build an initialization call for FIELD,
3030 the trampoline or descriptor for DECL, using FUNC as the function. */
3033 build_init_call_stmt (struct nesting_info
*info
, tree decl
, tree field
,
3036 tree arg1
, arg2
, arg3
, x
;
3038 gcc_assert (DECL_STATIC_CHAIN (decl
));
3039 arg3
= build_addr (info
->frame_decl
);
3041 arg2
= build_addr (decl
);
3043 x
= build3 (COMPONENT_REF
, TREE_TYPE (field
),
3044 info
->frame_decl
, field
, NULL_TREE
);
3045 arg1
= build_addr (x
);
3047 return gimple_build_call (func
, 3, arg1
, arg2
, arg3
);
3050 /* Do "everything else" to clean up or complete state collected by the various
3051 walking passes -- create a field to hold the frame base address, lay out the
3052 types and decls, generate code to initialize the frame decl, store critical
3053 expressions in the struct function for rtl to find. */
3056 finalize_nesting_tree_1 (struct nesting_info
*root
)
3058 gimple_seq stmt_list
;
3060 tree context
= root
->context
;
3061 struct function
*sf
;
3065 /* If we created a non-local frame type or decl, we need to lay them
3066 out at this time. */
3067 if (root
->frame_type
)
3069 /* Debugging information needs to compute the frame base address of the
3070 parent frame out of the static chain from the nested frame.
3072 The static chain is the address of the FRAME record, so one could
3073 imagine it would be possible to compute the frame base address just
3074 adding a constant offset to this address. Unfortunately, this is not
3075 possible: if the FRAME object has alignment constraints that are
3076 stronger than the stack, then the offset between the frame base and
3077 the FRAME object will be dynamic.
3079 What we do instead is to append a field to the FRAME object that holds
3080 the frame base address: then debug info just has to fetch this
3083 /* Debugging information will refer to the CFA as the frame base
3084 address: we will do the same here. */
3085 const tree frame_addr_fndecl
3086 = builtin_decl_explicit (BUILT_IN_DWARF_CFA
);
3088 /* Create a field in the FRAME record to hold the frame base address for
3089 this stack frame. Since it will be used only by the debugger, put it
3090 at the end of the record in order not to shift all other offsets. */
3091 tree fb_decl
= make_node (FIELD_DECL
);
3093 DECL_NAME (fb_decl
) = get_identifier ("FRAME_BASE.PARENT");
3094 TREE_TYPE (fb_decl
) = ptr_type_node
;
3095 TREE_ADDRESSABLE (fb_decl
) = 1;
3096 DECL_CONTEXT (fb_decl
) = root
->frame_type
;
3097 TYPE_FIELDS (root
->frame_type
) = chainon (TYPE_FIELDS (root
->frame_type
),
3100 /* In some cases the frame type will trigger the -Wpadded warning.
3101 This is not helpful; suppress it. */
3102 int save_warn_padded
= warn_padded
;
3104 layout_type (root
->frame_type
);
3105 warn_padded
= save_warn_padded
;
3106 layout_decl (root
->frame_decl
, 0);
3108 /* Initialize the frame base address field. If the builtin we need is
3109 not available, set it to NULL so that debugging information does not
3111 tree fb_ref
= build3 (COMPONENT_REF
, TREE_TYPE (fb_decl
),
3112 root
->frame_decl
, fb_decl
, NULL_TREE
);
3115 if (frame_addr_fndecl
!= NULL_TREE
)
3117 gcall
*fb_gimple
= gimple_build_call (frame_addr_fndecl
, 1,
3119 gimple_stmt_iterator gsi
= gsi_last (stmt_list
);
3121 fb_tmp
= init_tmp_var_with_call (root
, &gsi
, fb_gimple
);
3124 fb_tmp
= build_int_cst (TREE_TYPE (fb_ref
), 0);
3125 gimple_seq_add_stmt (&stmt_list
,
3126 gimple_build_assign (fb_ref
, fb_tmp
));
3128 declare_vars (root
->frame_decl
,
3129 gimple_seq_first_stmt (gimple_body (context
)), true);
3132 /* If any parameters were referenced non-locally, then we need to insert
3133 a copy or a pointer. */
3134 if (root
->any_parm_remapped
)
3137 for (p
= DECL_ARGUMENTS (context
); p
; p
= DECL_CHAIN (p
))
3141 field
= lookup_field_for_decl (root
, p
, NO_INSERT
);
3145 if (use_pointer_in_frame (p
))
3150 /* If the assignment is from a non-register the stmt is
3151 not valid gimple. Make it so by using a temporary instead. */
3152 if (!is_gimple_reg (x
)
3153 && is_gimple_reg_type (TREE_TYPE (x
)))
3155 gimple_stmt_iterator gsi
= gsi_last (stmt_list
);
3156 x
= init_tmp_var (root
, x
, &gsi
);
3159 y
= build3 (COMPONENT_REF
, TREE_TYPE (field
),
3160 root
->frame_decl
, field
, NULL_TREE
);
3161 stmt
= gimple_build_assign (y
, x
);
3162 gimple_seq_add_stmt (&stmt_list
, stmt
);
3166 /* If a chain_field was created, then it needs to be initialized
3168 if (root
->chain_field
)
3170 tree x
= build3 (COMPONENT_REF
, TREE_TYPE (root
->chain_field
),
3171 root
->frame_decl
, root
->chain_field
, NULL_TREE
);
3172 stmt
= gimple_build_assign (x
, get_chain_decl (root
));
3173 gimple_seq_add_stmt (&stmt_list
, stmt
);
3176 /* If trampolines were created, then we need to initialize them. */
3177 if (root
->any_tramp_created
)
3179 struct nesting_info
*i
;
3180 for (i
= root
->inner
; i
; i
= i
->next
)
3184 field
= lookup_tramp_for_decl (root
, i
->context
, NO_INSERT
);
3188 x
= builtin_decl_implicit (BUILT_IN_INIT_TRAMPOLINE
);
3189 stmt
= build_init_call_stmt (root
, i
->context
, field
, x
);
3190 gimple_seq_add_stmt (&stmt_list
, stmt
);
3194 /* If descriptors were created, then we need to initialize them. */
3195 if (root
->any_descr_created
)
3197 struct nesting_info
*i
;
3198 for (i
= root
->inner
; i
; i
= i
->next
)
3202 field
= lookup_descr_for_decl (root
, i
->context
, NO_INSERT
);
3206 x
= builtin_decl_implicit (BUILT_IN_INIT_DESCRIPTOR
);
3207 stmt
= build_init_call_stmt (root
, i
->context
, field
, x
);
3208 gimple_seq_add_stmt (&stmt_list
, stmt
);
3212 /* If we created initialization statements, insert them. */
3216 annotate_all_with_location (stmt_list
, DECL_SOURCE_LOCATION (context
));
3217 bind
= gimple_seq_first_stmt_as_a_bind (gimple_body (context
));
3218 gimple_seq_add_seq (&stmt_list
, gimple_bind_body (bind
));
3219 gimple_bind_set_body (bind
, stmt_list
);
3222 /* If a chain_decl was created, then it needs to be registered with
3223 struct function so that it gets initialized from the static chain
3224 register at the beginning of the function. */
3225 sf
= DECL_STRUCT_FUNCTION (root
->context
);
3226 sf
->static_chain_decl
= root
->chain_decl
;
3228 /* Similarly for the non-local goto save area. */
3229 if (root
->nl_goto_field
)
3231 sf
->nonlocal_goto_save_area
3232 = get_frame_field (root
, context
, root
->nl_goto_field
, NULL
);
3233 sf
->has_nonlocal_label
= 1;
3236 /* Make sure all new local variables get inserted into the
3237 proper BIND_EXPR. */
3238 if (root
->new_local_var_chain
)
3239 declare_vars (root
->new_local_var_chain
,
3240 gimple_seq_first_stmt (gimple_body (root
->context
)),
3243 if (root
->debug_var_chain
)
3248 remap_vla_decls (DECL_INITIAL (root
->context
), root
);
3250 for (debug_var
= root
->debug_var_chain
; debug_var
;
3251 debug_var
= DECL_CHAIN (debug_var
))
3252 if (variably_modified_type_p (TREE_TYPE (debug_var
), NULL
))
3255 /* If there are any debug decls with variable length types,
3256 remap those types using other debug_var_chain variables. */
3259 struct nesting_copy_body_data id
;
3261 memset (&id
, 0, sizeof (id
));
3262 id
.cb
.copy_decl
= nesting_copy_decl
;
3263 id
.cb
.decl_map
= new hash_map
<tree
, tree
>;
3266 for (; debug_var
; debug_var
= DECL_CHAIN (debug_var
))
3267 if (variably_modified_type_p (TREE_TYPE (debug_var
), NULL
))
3269 tree type
= TREE_TYPE (debug_var
);
3270 tree newt
, t
= type
;
3271 struct nesting_info
*i
;
3273 for (i
= root
; i
; i
= i
->outer
)
3274 if (variably_modified_type_p (type
, i
->context
))
3280 id
.cb
.src_fn
= i
->context
;
3281 id
.cb
.dst_fn
= i
->context
;
3282 id
.cb
.src_cfun
= DECL_STRUCT_FUNCTION (root
->context
);
3284 TREE_TYPE (debug_var
) = newt
= remap_type (type
, &id
.cb
);
3285 while (POINTER_TYPE_P (newt
) && !TYPE_NAME (newt
))
3287 newt
= TREE_TYPE (newt
);
3290 if (TYPE_NAME (newt
)
3291 && TREE_CODE (TYPE_NAME (newt
)) == TYPE_DECL
3292 && DECL_ORIGINAL_TYPE (TYPE_NAME (newt
))
3294 && TYPE_NAME (newt
) == TYPE_NAME (t
))
3295 TYPE_NAME (newt
) = remap_decl (TYPE_NAME (newt
), &id
.cb
);
3298 delete id
.cb
.decl_map
;
3301 scope
= gimple_seq_first_stmt_as_a_bind (gimple_body (root
->context
));
3302 if (gimple_bind_block (scope
))
3303 declare_vars (root
->debug_var_chain
, scope
, true);
3305 BLOCK_VARS (DECL_INITIAL (root
->context
))
3306 = chainon (BLOCK_VARS (DECL_INITIAL (root
->context
)),
3307 root
->debug_var_chain
);
3310 fixup_vla_decls (DECL_INITIAL (root
->context
));
3312 /* Fold the rewritten MEM_REF trees. */
3313 root
->mem_refs
->traverse
<void *, fold_mem_refs
> (NULL
);
3315 /* Dump the translated tree function. */
3318 fputs ("\n\n", dump_file
);
3319 dump_function_to_file (root
->context
, dump_file
, dump_flags
);
3324 finalize_nesting_tree (struct nesting_info
*root
)
3326 struct nesting_info
*n
;
3327 FOR_EACH_NEST_INFO (n
, root
)
3328 finalize_nesting_tree_1 (n
);
3331 /* Unnest the nodes and pass them to cgraph. */
3334 unnest_nesting_tree_1 (struct nesting_info
*root
)
3336 struct cgraph_node
*node
= cgraph_node::get (root
->context
);
3338 /* For nested functions update the cgraph to reflect unnesting.
3339 We also delay finalizing of these functions up to this point. */
3343 cgraph_node::finalize_function (root
->context
, true);
3348 unnest_nesting_tree (struct nesting_info
*root
)
3350 struct nesting_info
*n
;
3351 FOR_EACH_NEST_INFO (n
, root
)
3352 unnest_nesting_tree_1 (n
);
3355 /* Free the data structures allocated during this pass. */
3358 free_nesting_tree (struct nesting_info
*root
)
3360 struct nesting_info
*node
, *next
;
3362 node
= iter_nestinfo_start (root
);
3365 next
= iter_nestinfo_next (node
);
3366 delete node
->var_map
;
3367 delete node
->field_map
;
3368 delete node
->mem_refs
;
3375 /* Gimplify a function and all its nested functions. */
3377 gimplify_all_functions (struct cgraph_node
*root
)
3379 struct cgraph_node
*iter
;
3380 if (!gimple_body (root
->decl
))
3381 gimplify_function_tree (root
->decl
);
3382 for (iter
= root
->nested
; iter
; iter
= iter
->next_nested
)
3383 gimplify_all_functions (iter
);
3386 /* Main entry point for this pass. Process FNDECL and all of its nested
3387 subroutines and turn them into something less tightly bound. */
3390 lower_nested_functions (tree fndecl
)
3392 struct cgraph_node
*cgn
;
3393 struct nesting_info
*root
;
3395 /* If there are no nested functions, there's nothing to do. */
3396 cgn
= cgraph_node::get (fndecl
);
3400 gimplify_all_functions (cgn
);
3402 set_dump_file (dump_begin (TDI_nested
, &dump_flags
));
3404 fprintf (dump_file
, "\n;; Function %s\n\n",
3405 lang_hooks
.decl_printable_name (fndecl
, 2));
3407 bitmap_obstack_initialize (&nesting_info_bitmap_obstack
);
3408 root
= create_nesting_tree (cgn
);
3410 walk_all_functions (convert_nonlocal_reference_stmt
,
3411 convert_nonlocal_reference_op
,
3413 walk_all_functions (convert_local_reference_stmt
,
3414 convert_local_reference_op
,
3416 walk_all_functions (convert_nl_goto_reference
, NULL
, root
);
3417 walk_all_functions (convert_nl_goto_receiver
, NULL
, root
);
3419 convert_all_function_calls (root
);
3420 finalize_nesting_tree (root
);
3421 unnest_nesting_tree (root
);
3423 free_nesting_tree (root
);
3424 bitmap_obstack_release (&nesting_info_bitmap_obstack
);
3428 dump_end (TDI_nested
, dump_file
);
3429 set_dump_file (NULL
);
3433 #include "gt-tree-nested.h"