OSDN Git Service

9e3d8ceee1f7a026b23624b00f92703df5663f78
[pf3gnuchains/gcc-fork.git] / gcc / tree-nested.c
1 /* Nested function decomposition for trees.
2    Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
3
4    This file is part of GCC.
5
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)
9    any later version.
10
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.
15
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/>.  */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tm.h"
24 #include "tree.h"
25 #include "rtl.h"
26 #include "tm_p.h"
27 #include "function.h"
28 #include "tree-dump.h"
29 #include "tree-inline.h"
30 #include "tree-gimple.h"
31 #include "tree-iterator.h"
32 #include "tree-flow.h"
33 #include "cgraph.h"
34 #include "expr.h"
35 #include "langhooks.h"
36 #include "pointer-set.h"
37 #include "ggc.h"
38
39
40 /* The object of this pass is to lower the representation of a set of nested
41    functions in order to expose all of the gory details of the various
42    nonlocal references.  We want to do this sooner rather than later, in
43    order to give us more freedom in emitting all of the functions in question.
44
45    Back in olden times, when gcc was young, we developed an insanely 
46    complicated scheme whereby variables which were referenced nonlocally
47    were forced to live in the stack of the declaring function, and then
48    the nested functions magically discovered where these variables were
49    placed.  In order for this scheme to function properly, it required
50    that the outer function be partially expanded, then we switch to 
51    compiling the inner function, and once done with those we switch back
52    to compiling the outer function.  Such delicate ordering requirements
53    makes it difficult to do whole translation unit optimizations 
54    involving such functions.
55
56    The implementation here is much more direct.  Everything that can be
57    referenced by an inner function is a member of an explicitly created
58    structure herein called the "nonlocal frame struct".  The incoming
59    static chain for a nested function is a pointer to this struct in 
60    the parent.  In this way, we settle on known offsets from a known
61    base, and so are decoupled from the logic that places objects in the
62    function's stack frame.  More importantly, we don't have to wait for
63    that to happen -- since the compilation of the inner function is no
64    longer tied to a real stack frame, the nonlocal frame struct can be
65    allocated anywhere.  Which means that the outer function is now
66    inlinable.
67
68    Theory of operation here is very simple.  Iterate over all the 
69    statements in all the functions (depth first) several times, 
70    allocating structures and fields on demand.  In general we want to
71    examine inner functions first, so that we can avoid making changes
72    to outer functions which are unnecessary.
73
74    The order of the passes matters a bit, in that later passes will be
75    skipped if it is discovered that the functions don't actually interact
76    at all.  That is, they're nested in the lexical sense but could have
77    been written as independent functions without change.  */
78
79
80 struct nesting_info
81 {
82   struct nesting_info *outer;
83   struct nesting_info *inner;
84   struct nesting_info *next;
85   
86   struct pointer_map_t *field_map;
87   struct pointer_map_t *var_map;
88   bitmap suppress_expansion;
89
90   tree context;
91   tree new_local_var_chain;
92   tree debug_var_chain;
93   tree frame_type;
94   tree frame_decl;
95   tree chain_field;
96   tree chain_decl;
97   tree nl_goto_field;
98
99   bool any_parm_remapped;
100   bool any_tramp_created;
101   char static_chain_added;
102 };
103
104
105 /* Obstack used for the bitmaps in the struct above.  */
106 static struct bitmap_obstack nesting_info_bitmap_obstack;
107
108
109 /* We're working in so many different function contexts simultaneously,
110    that create_tmp_var is dangerous.  Prevent mishap.  */
111 #define create_tmp_var cant_use_create_tmp_var_here_dummy
112
113 /* Like create_tmp_var, except record the variable for registration at
114    the given nesting level.  */
115
116 static tree
117 create_tmp_var_for (struct nesting_info *info, tree type, const char *prefix)
118 {
119   tree tmp_var;
120
121   /* If the type is of variable size or a type which must be created by the
122      frontend, something is wrong.  Note that we explicitly allow
123      incomplete types here, since we create them ourselves here.  */
124   gcc_assert (!TREE_ADDRESSABLE (type));
125   gcc_assert (!TYPE_SIZE_UNIT (type)
126               || TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST);
127
128   tmp_var = create_tmp_var_raw (type, prefix);
129   DECL_CONTEXT (tmp_var) = info->context;
130   TREE_CHAIN (tmp_var) = info->new_local_var_chain;
131   DECL_SEEN_IN_BIND_EXPR_P (tmp_var) = 1;
132   if (TREE_CODE (type) == COMPLEX_TYPE
133       || TREE_CODE (type) == VECTOR_TYPE)
134     DECL_GIMPLE_REG_P (tmp_var) = 1;
135
136   info->new_local_var_chain = tmp_var;
137
138   return tmp_var;
139 }
140
141 /* Take the address of EXP to be used within function CONTEXT.
142    Mark it for addressability as necessary.  */
143
144 tree
145 build_addr (tree exp, tree context)
146 {
147   tree base = exp;
148   tree save_context;
149   tree retval;
150
151   while (handled_component_p (base))
152     base = TREE_OPERAND (base, 0);
153
154   if (DECL_P (base))
155     TREE_ADDRESSABLE (base) = 1;
156
157   /* Building the ADDR_EXPR will compute a set of properties for
158      that ADDR_EXPR.  Those properties are unfortunately context
159      specific.  ie, they are dependent on CURRENT_FUNCTION_DECL.
160
161      Temporarily set CURRENT_FUNCTION_DECL to the desired context,
162      build the ADDR_EXPR, then restore CURRENT_FUNCTION_DECL.  That
163      way the properties are for the ADDR_EXPR are computed properly.  */
164   save_context = current_function_decl;
165   current_function_decl = context;
166   retval = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (exp)), exp);
167   current_function_decl = save_context;
168   return retval;
169 }
170
171 /* Insert FIELD into TYPE, sorted by alignment requirements.  */
172
173 void
174 insert_field_into_struct (tree type, tree field)
175 {
176   tree *p;
177
178   DECL_CONTEXT (field) = type;
179
180   for (p = &TYPE_FIELDS (type); *p ; p = &TREE_CHAIN (*p))
181     if (DECL_ALIGN (field) >= DECL_ALIGN (*p))
182       break;
183
184   TREE_CHAIN (field) = *p;
185   *p = field;
186
187   /* Set correct alignment for frame struct type.  */
188   if (TYPE_ALIGN (type) < DECL_ALIGN (field))
189     TYPE_ALIGN (type) = DECL_ALIGN (field);
190 }
191
192 /* Build or return the RECORD_TYPE that describes the frame state that is
193    shared between INFO->CONTEXT and its nested functions.  This record will
194    not be complete until finalize_nesting_tree; up until that point we'll
195    be adding fields as necessary.
196
197    We also build the DECL that represents this frame in the function.  */
198
199 static tree
200 get_frame_type (struct nesting_info *info)
201 {
202   tree type = info->frame_type;
203   if (!type)
204     {
205       char *name;
206
207       type = make_node (RECORD_TYPE);
208
209       name = concat ("FRAME.",
210                      IDENTIFIER_POINTER (DECL_NAME (info->context)),
211                      NULL);
212       TYPE_NAME (type) = get_identifier (name);
213       free (name);
214
215       info->frame_type = type;
216       info->frame_decl = create_tmp_var_for (info, type, "FRAME");
217
218       /* ??? Always make it addressable for now, since it is meant to
219          be pointed to by the static chain pointer.  This pessimizes
220          when it turns out that no static chains are needed because
221          the nested functions referencing non-local variables are not
222          reachable, but the true pessimization is to create the non-
223          local frame structure in the first place.  */
224       TREE_ADDRESSABLE (info->frame_decl) = 1;
225     }
226   return type;
227 }
228
229 /* Return true if DECL should be referenced by pointer in the non-local
230    frame structure.  */
231
232 static bool
233 use_pointer_in_frame (tree decl)
234 {
235   if (TREE_CODE (decl) == PARM_DECL)
236     {
237       /* It's illegal to copy TREE_ADDRESSABLE, impossible to copy variable
238          sized decls, and inefficient to copy large aggregates.  Don't bother
239          moving anything but scalar variables.  */
240       return AGGREGATE_TYPE_P (TREE_TYPE (decl));
241     }
242   else
243     {
244       /* Variable sized types make things "interesting" in the frame.  */
245       return DECL_SIZE (decl) == NULL || !TREE_CONSTANT (DECL_SIZE (decl));
246     }
247 }
248
249 /* Given DECL, a non-locally accessed variable, find or create a field
250    in the non-local frame structure for the given nesting context.  */
251
252 static tree
253 lookup_field_for_decl (struct nesting_info *info, tree decl,
254                        enum insert_option insert)
255 {
256   void **slot;
257
258   if (insert == NO_INSERT)
259     {
260       slot = pointer_map_contains (info->field_map, decl);
261       return slot ? *slot : NULL;
262     }
263
264   slot = pointer_map_insert (info->field_map, decl);
265   if (!*slot)
266     {
267       tree field = make_node (FIELD_DECL);
268       DECL_NAME (field) = DECL_NAME (decl);
269
270       if (use_pointer_in_frame (decl))
271         {
272           TREE_TYPE (field) = build_pointer_type (TREE_TYPE (decl));
273           DECL_ALIGN (field) = TYPE_ALIGN (TREE_TYPE (field));
274           DECL_NONADDRESSABLE_P (field) = 1;
275         }
276       else
277         {
278           TREE_TYPE (field) = TREE_TYPE (decl);
279           DECL_SOURCE_LOCATION (field) = DECL_SOURCE_LOCATION (decl);
280           DECL_ALIGN (field) = DECL_ALIGN (decl);
281           DECL_USER_ALIGN (field) = DECL_USER_ALIGN (decl);
282           TREE_ADDRESSABLE (field) = TREE_ADDRESSABLE (decl);
283           DECL_NONADDRESSABLE_P (field) = !TREE_ADDRESSABLE (decl);
284           TREE_THIS_VOLATILE (field) = TREE_THIS_VOLATILE (decl);
285         }
286
287       insert_field_into_struct (get_frame_type (info), field);
288       *slot = field;
289
290       if (TREE_CODE (decl) == PARM_DECL)
291         info->any_parm_remapped = true;
292     }
293
294   return *slot;
295 }
296
297 /* Build or return the variable that holds the static chain within
298    INFO->CONTEXT.  This variable may only be used within INFO->CONTEXT.  */
299
300 static tree
301 get_chain_decl (struct nesting_info *info)
302 {
303   tree decl = info->chain_decl;
304   if (!decl)
305     {
306       tree type;
307
308       type = get_frame_type (info->outer);
309       type = build_pointer_type (type);
310
311       /* Note that this variable is *not* entered into any BIND_EXPR;
312          the construction of this variable is handled specially in
313          expand_function_start and initialize_inlined_parameters.
314          Note also that it's represented as a parameter.  This is more
315          close to the truth, since the initial value does come from 
316          the caller.  */
317       decl = build_decl (PARM_DECL, create_tmp_var_name ("CHAIN"), type);
318       DECL_ARTIFICIAL (decl) = 1;
319       DECL_IGNORED_P (decl) = 1;
320       TREE_USED (decl) = 1;
321       DECL_CONTEXT (decl) = info->context;
322       DECL_ARG_TYPE (decl) = type;
323
324       /* Tell tree-inline.c that we never write to this variable, so
325          it can copy-prop the replacement value immediately.  */
326       TREE_READONLY (decl) = 1;
327
328       info->chain_decl = decl;
329     }
330   return decl;
331 }
332
333 /* Build or return the field within the non-local frame state that holds
334    the static chain for INFO->CONTEXT.  This is the way to walk back up
335    multiple nesting levels.  */
336
337 static tree
338 get_chain_field (struct nesting_info *info)
339 {
340   tree field = info->chain_field;
341   if (!field)
342     {
343       tree type = build_pointer_type (get_frame_type (info->outer));
344
345       field = make_node (FIELD_DECL);
346       DECL_NAME (field) = get_identifier ("__chain");
347       TREE_TYPE (field) = type;
348       DECL_ALIGN (field) = TYPE_ALIGN (type);
349       DECL_NONADDRESSABLE_P (field) = 1;
350
351       insert_field_into_struct (get_frame_type (info), field);
352
353       info->chain_field = field;
354     }
355   return field;
356 }
357
358 /* Copy EXP into a temporary.  Allocate the temporary in the context of
359    INFO and insert the initialization statement before TSI.  */
360
361 static tree
362 init_tmp_var (struct nesting_info *info, tree exp, tree_stmt_iterator *tsi)
363 {
364   tree t, stmt;
365
366   t = create_tmp_var_for (info, TREE_TYPE (exp), NULL);
367   stmt = build_gimple_modify_stmt (t, exp);
368   SET_EXPR_LOCUS (stmt, EXPR_LOCUS (tsi_stmt (*tsi)));
369   tsi_link_before (tsi, stmt, TSI_SAME_STMT);
370
371   return t;
372 }
373
374 /* Similarly, but only do so to force EXP to satisfy is_gimple_val.  */
375
376 static tree
377 tsi_gimplify_val (struct nesting_info *info, tree exp, tree_stmt_iterator *tsi)
378 {
379   if (is_gimple_val (exp))
380     return exp;
381   else
382     return init_tmp_var (info, exp, tsi);
383 }
384
385 /* Similarly, but copy from the temporary and insert the statement
386    after the iterator.  */
387
388 static tree
389 save_tmp_var (struct nesting_info *info, tree exp,
390               tree_stmt_iterator *tsi)
391 {
392   tree t, stmt;
393
394   t = create_tmp_var_for (info, TREE_TYPE (exp), NULL);
395   stmt = build_gimple_modify_stmt (exp, t);
396   SET_EXPR_LOCUS (stmt, EXPR_LOCUS (tsi_stmt (*tsi)));
397   tsi_link_after (tsi, stmt, TSI_SAME_STMT);
398
399   return t;
400 }
401
402 /* Build or return the type used to represent a nested function trampoline.  */
403
404 static GTY(()) tree trampoline_type;
405
406 static tree
407 get_trampoline_type (void)
408 {
409   unsigned align, size;
410   tree t;
411
412   if (trampoline_type)
413     return trampoline_type;
414
415   align = TRAMPOLINE_ALIGNMENT;
416   size = TRAMPOLINE_SIZE;
417
418   /* If we won't be able to guarantee alignment simply via TYPE_ALIGN,
419      then allocate extra space so that we can do dynamic alignment.  */
420   if (align > STACK_BOUNDARY)
421     {
422       size += ((align/BITS_PER_UNIT) - 1) & -(STACK_BOUNDARY/BITS_PER_UNIT);
423       align = STACK_BOUNDARY;
424     }
425
426   t = build_index_type (build_int_cst (NULL_TREE, size - 1));
427   t = build_array_type (char_type_node, t);
428   t = build_decl (FIELD_DECL, get_identifier ("__data"), t);
429   DECL_ALIGN (t) = align;
430   DECL_USER_ALIGN (t) = 1;
431
432   trampoline_type = make_node (RECORD_TYPE);
433   TYPE_NAME (trampoline_type) = get_identifier ("__builtin_trampoline");
434   TYPE_FIELDS (trampoline_type) = t;
435   layout_type (trampoline_type);
436   DECL_CONTEXT (t) = trampoline_type;
437
438   return trampoline_type;
439 }
440
441 /* Given DECL, a nested function, find or create a field in the non-local
442    frame structure for a trampoline for this function.  */
443
444 static tree
445 lookup_tramp_for_decl (struct nesting_info *info, tree decl,
446                        enum insert_option insert)
447 {
448   void **slot;
449
450   if (insert == NO_INSERT)
451     {
452       slot = pointer_map_contains (info->var_map, decl);
453       return slot ? *slot : NULL;
454     }
455
456   slot = pointer_map_insert (info->var_map, decl);
457   if (!*slot)
458     {
459       tree field = make_node (FIELD_DECL);
460       DECL_NAME (field) = DECL_NAME (decl);
461       TREE_TYPE (field) = get_trampoline_type ();
462       TREE_ADDRESSABLE (field) = 1;
463
464       insert_field_into_struct (get_frame_type (info), field);
465       *slot = field;
466
467       info->any_tramp_created = true;
468     }
469
470   return *slot;
471
472
473 /* Build or return the field within the non-local frame state that holds
474    the non-local goto "jmp_buf".  The buffer itself is maintained by the
475    rtl middle-end as dynamic stack space is allocated.  */
476
477 static tree
478 get_nl_goto_field (struct nesting_info *info)
479 {
480   tree field = info->nl_goto_field;
481   if (!field)
482     {
483       unsigned size;
484       tree type;
485
486       /* For __builtin_nonlocal_goto, we need N words.  The first is the
487          frame pointer, the rest is for the target's stack pointer save
488          area.  The number of words is controlled by STACK_SAVEAREA_MODE;
489          not the best interface, but it'll do for now.  */
490       if (Pmode == ptr_mode)
491         type = ptr_type_node;
492       else
493         type = lang_hooks.types.type_for_mode (Pmode, 1);
494
495       size = GET_MODE_SIZE (STACK_SAVEAREA_MODE (SAVE_NONLOCAL));
496       size = size / GET_MODE_SIZE (Pmode);
497       size = size + 1;
498
499       type = build_array_type
500         (type, build_index_type (build_int_cst (NULL_TREE, size)));
501
502       field = make_node (FIELD_DECL);
503       DECL_NAME (field) = get_identifier ("__nl_goto_buf");
504       TREE_TYPE (field) = type;
505       DECL_ALIGN (field) = TYPE_ALIGN (type);
506       TREE_ADDRESSABLE (field) = 1;
507
508       insert_field_into_struct (get_frame_type (info), field);
509
510       info->nl_goto_field = field;
511     }
512
513   return field;
514 }
515 \f
516 /* Helper function for walk_stmts.  Walk output operands of an ASM_EXPR.  */
517
518 static void
519 walk_asm_expr (struct walk_stmt_info *wi, tree stmt)
520 {
521   int noutputs = list_length (ASM_OUTPUTS (stmt));
522   const char **oconstraints
523     = (const char **) alloca ((noutputs) * sizeof (const char *));
524   int i;
525   tree link;
526   const char *constraint;
527   bool allows_mem, allows_reg, is_inout;
528
529   wi->is_lhs = true;
530   for (i=0, link = ASM_OUTPUTS (stmt); link; ++i, link = TREE_CHAIN (link))
531     {
532       constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
533       oconstraints[i] = constraint;
534       parse_output_constraint (&constraint, i, 0, 0, &allows_mem,
535                                &allows_reg, &is_inout);
536
537       wi->val_only = (allows_reg || !allows_mem);
538       walk_tree (&TREE_VALUE (link), wi->callback, wi, NULL);
539     }
540
541   for (link = ASM_INPUTS (stmt); link; link = TREE_CHAIN (link))
542     {
543       constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
544       parse_input_constraint (&constraint, 0, 0, noutputs, 0,
545                               oconstraints, &allows_mem, &allows_reg);
546
547       wi->val_only = (allows_reg || !allows_mem);
548       /* Although input "m" is not really a LHS, we need a lvalue.  */
549       wi->is_lhs = !wi->val_only;
550       walk_tree (&TREE_VALUE (link), wi->callback, wi, NULL);
551     }
552
553   wi->is_lhs = false;
554   wi->val_only = true;
555 }
556
557 /* Iterate over all sub-statements of *TP calling walk_tree with
558    WI->CALLBACK for every sub-expression in each statement found.  */
559
560 void
561 walk_stmts (struct walk_stmt_info *wi, tree *tp)
562 {
563   tree t = *tp;
564   int walk_subtrees;
565
566   if (!t)
567     return;
568
569   if (wi->want_locations && EXPR_HAS_LOCATION (t))
570     input_location = EXPR_LOCATION (t);
571
572   switch (TREE_CODE (t))
573     {
574     case STATEMENT_LIST:
575       {
576         tree_stmt_iterator i;
577         for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
578           {
579             wi->tsi = i;
580             walk_stmts (wi, tsi_stmt_ptr (i));
581           }
582       }
583       break;
584
585     case COND_EXPR:
586       walk_tree (&COND_EXPR_COND (t), wi->callback, wi, NULL);
587       walk_stmts (wi, &COND_EXPR_THEN (t));
588       walk_stmts (wi, &COND_EXPR_ELSE (t));
589       break;
590     case CATCH_EXPR:
591       walk_stmts (wi, &CATCH_BODY (t));
592       break;
593     case EH_FILTER_EXPR:
594       walk_stmts (wi, &EH_FILTER_FAILURE (t));
595       break;
596     case TRY_CATCH_EXPR:
597     case TRY_FINALLY_EXPR:
598       walk_stmts (wi, &TREE_OPERAND (t, 0));
599       walk_stmts (wi, &TREE_OPERAND (t, 1));
600       break;
601
602     case BIND_EXPR:
603       if (wi->want_bind_expr)
604         {
605           walk_subtrees = 1;
606           wi->callback (tp, &walk_subtrees, wi);
607           if (!walk_subtrees)
608             break;
609         }
610       walk_stmts (wi, &BIND_EXPR_BODY (t));
611       break;
612
613     case RETURN_EXPR:
614       if (wi->want_return_expr)
615         {
616           walk_subtrees = 1;
617           wi->callback (tp, &walk_subtrees, wi);
618           if (!walk_subtrees)
619             break;
620         }
621       walk_stmts (wi, &TREE_OPERAND (t, 0));
622       break;
623
624     case GIMPLE_MODIFY_STMT:
625       /* A formal temporary lhs may use a COMPONENT_REF rhs.  */
626       wi->val_only = !is_gimple_formal_tmp_var (GIMPLE_STMT_OPERAND (t, 0));
627       walk_tree (&GIMPLE_STMT_OPERAND (t, 1), wi->callback, wi, NULL);
628
629       /* If the rhs is appropriate for a memory, we may use a
630          COMPONENT_REF on the lhs.  */
631       wi->val_only = !is_gimple_mem_rhs (GIMPLE_STMT_OPERAND (t, 1));
632       wi->is_lhs = true;
633       walk_tree (&GIMPLE_STMT_OPERAND (t, 0), wi->callback, wi, NULL);
634
635       wi->val_only = true;
636       wi->is_lhs = false;
637       break;
638
639     case ASM_EXPR:
640       walk_asm_expr (wi, *tp);
641       break;
642
643     default:
644       wi->val_only = true;
645       walk_tree (tp, wi->callback, wi, NULL);
646       break;
647     }
648 }
649
650 /* Invoke CALLBACK on all statements of *STMT_P.  */
651
652 static void
653 walk_body (walk_tree_fn callback, struct nesting_info *info, tree *stmt_p)
654 {
655   struct walk_stmt_info wi;
656
657   memset (&wi, 0, sizeof (wi));
658   wi.callback = callback;
659   wi.info = info;
660   wi.val_only = true;
661
662   walk_stmts (&wi, stmt_p);
663 }
664
665 /* Invoke CALLBACK on all statements of INFO->CONTEXT.  */
666
667 static inline void
668 walk_function (walk_tree_fn callback, struct nesting_info *info)
669 {
670   walk_body (callback, info, &DECL_SAVED_TREE (info->context));
671 }
672
673 /* Invoke CALLBACK on OMP_FOR init, cond, incr and pre-body.  */
674
675 static void
676 walk_omp_for (walk_tree_fn callback, struct nesting_info *info, tree for_stmt)
677 {
678   struct walk_stmt_info wi;
679   tree t, list = NULL, empty;
680
681   walk_body (callback, info, &OMP_FOR_PRE_BODY (for_stmt));
682
683   empty = build_empty_stmt ();
684   append_to_statement_list_force (empty, &list);
685   memset (&wi, 0, sizeof (wi));
686   wi.callback = callback;
687   wi.info = info;
688   wi.tsi = tsi_last (list);
689
690   t = OMP_FOR_INIT (for_stmt);
691   gcc_assert (TREE_CODE (t) == GIMPLE_MODIFY_STMT);
692   SET_EXPR_LOCUS (empty, EXPR_LOCUS (t));
693   wi.val_only = false;
694   walk_tree (&GIMPLE_STMT_OPERAND (t, 0), callback, &wi, NULL);
695   wi.val_only = true;
696   wi.is_lhs = false;
697   walk_tree (&GIMPLE_STMT_OPERAND (t, 1), callback, &wi, NULL);
698
699   t = OMP_FOR_COND (for_stmt);
700   gcc_assert (COMPARISON_CLASS_P (t));
701   SET_EXPR_LOCUS (empty, EXPR_LOCUS (t));
702   wi.val_only = false;
703   walk_tree (&TREE_OPERAND (t, 0), callback, &wi, NULL);
704   wi.val_only = true;
705   wi.is_lhs = false;
706   walk_tree (&TREE_OPERAND (t, 1), callback, &wi, NULL);
707
708   t = OMP_FOR_INCR (for_stmt);
709   gcc_assert (TREE_CODE (t) == GIMPLE_MODIFY_STMT);
710   SET_EXPR_LOCUS (empty, EXPR_LOCUS (t));
711   wi.val_only = false;
712   walk_tree (&GIMPLE_STMT_OPERAND (t, 0), callback, &wi, NULL);
713   t = GIMPLE_STMT_OPERAND (t, 1);
714   gcc_assert (BINARY_CLASS_P (t));
715   wi.val_only = false;
716   walk_tree (&TREE_OPERAND (t, 0), callback, &wi, NULL);
717   wi.val_only = true;
718   wi.is_lhs = false;
719   walk_tree (&TREE_OPERAND (t, 1), callback, &wi, NULL);
720
721   /* Remove empty statement added above from the end of statement list.  */
722   tsi_delink (&wi.tsi);
723   append_to_statement_list (list, &OMP_FOR_PRE_BODY (for_stmt));
724 }
725
726 /* Similarly for ROOT and all functions nested underneath, depth first.  */
727     
728 static void
729 walk_all_functions (walk_tree_fn callback, struct nesting_info *root)
730 {
731   do
732     {
733       if (root->inner)
734         walk_all_functions (callback, root->inner);
735       walk_function (callback, root);
736       root = root->next;
737     }
738   while (root);
739 }
740 \f
741 /* We have to check for a fairly pathological case.  The operands of function
742    nested function are to be interpreted in the context of the enclosing
743    function.  So if any are variably-sized, they will get remapped when the
744    enclosing function is inlined.  But that remapping would also have to be
745    done in the types of the PARM_DECLs of the nested function, meaning the
746    argument types of that function will disagree with the arguments in the
747    calls to that function.  So we'd either have to make a copy of the nested
748    function corresponding to each time the enclosing function was inlined or
749    add a VIEW_CONVERT_EXPR to each such operand for each call to the nested
750    function.  The former is not practical.  The latter would still require
751    detecting this case to know when to add the conversions.  So, for now at
752    least, we don't inline such an enclosing function.
753
754    We have to do that check recursively, so here return indicating whether
755    FNDECL has such a nested function.  ORIG_FN is the function we were
756    trying to inline to use for checking whether any argument is variably
757    modified by anything in it.
758
759    It would be better to do this in tree-inline.c so that we could give
760    the appropriate warning for why a function can't be inlined, but that's
761    too late since the nesting structure has already been flattened and
762    adding a flag just to record this fact seems a waste of a flag.  */
763
764 static bool
765 check_for_nested_with_variably_modified (tree fndecl, tree orig_fndecl)
766 {
767   struct cgraph_node *cgn = cgraph_node (fndecl);
768   tree arg;
769
770   for (cgn = cgn->nested; cgn ; cgn = cgn->next_nested)
771     {
772       for (arg = DECL_ARGUMENTS (cgn->decl); arg; arg = TREE_CHAIN (arg))
773         if (variably_modified_type_p (TREE_TYPE (arg), orig_fndecl))
774           return true;
775
776       if (check_for_nested_with_variably_modified (cgn->decl, orig_fndecl))
777         return true;
778     }
779
780   return false;
781 }
782
783 /* Construct our local datastructure describing the function nesting
784    tree rooted by CGN.  */
785
786 static struct nesting_info *
787 create_nesting_tree (struct cgraph_node *cgn)
788 {
789   struct nesting_info *info = XCNEW (struct nesting_info);
790   info->field_map = pointer_map_create ();
791   info->var_map = pointer_map_create ();
792   info->suppress_expansion = BITMAP_ALLOC (&nesting_info_bitmap_obstack);
793   info->context = cgn->decl;
794
795   for (cgn = cgn->nested; cgn ; cgn = cgn->next_nested)
796     {
797       struct nesting_info *sub = create_nesting_tree (cgn);
798       sub->outer = info;
799       sub->next = info->inner;
800       info->inner = sub;
801     }
802
803   /* See discussion at check_for_nested_with_variably_modified for a
804      discussion of why this has to be here.  */
805   if (check_for_nested_with_variably_modified (info->context, info->context))
806     DECL_UNINLINABLE (info->context) = true;
807
808   return info;
809 }
810
811 /* Return an expression computing the static chain for TARGET_CONTEXT
812    from INFO->CONTEXT.  Insert any necessary computations before TSI.  */
813
814 static tree
815 get_static_chain (struct nesting_info *info, tree target_context,
816                   tree_stmt_iterator *tsi)
817 {
818   struct nesting_info *i;
819   tree x;
820
821   if (info->context == target_context)
822     {
823       x = build_addr (info->frame_decl, target_context);
824     }
825   else
826     {
827       x = get_chain_decl (info);
828
829       for (i = info->outer; i->context != target_context; i = i->outer)
830         {
831           tree field = get_chain_field (i);
832
833           x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x);
834           x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE);
835           x = init_tmp_var (info, x, tsi);
836         }
837     }
838
839   return x;
840 }
841
842 /* Return an expression referencing FIELD from TARGET_CONTEXT's non-local
843    frame as seen from INFO->CONTEXT.  Insert any necessary computations
844    before TSI.  */
845
846 static tree
847 get_frame_field (struct nesting_info *info, tree target_context,
848                  tree field, tree_stmt_iterator *tsi)
849 {
850   struct nesting_info *i;
851   tree x;
852
853   if (info->context == target_context)
854     {
855       /* Make sure frame_decl gets created.  */
856       (void) get_frame_type (info);
857       x = info->frame_decl;
858     }
859   else
860     {
861       x = get_chain_decl (info);
862
863       for (i = info->outer; i->context != target_context; i = i->outer)
864         {
865           tree field = get_chain_field (i);
866
867           x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x);
868           x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE);
869           x = init_tmp_var (info, x, tsi);
870         }
871
872       x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x);
873     }
874
875   x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE);
876   return x;
877 }
878
879 /* A subroutine of convert_nonlocal_reference.  Create a local variable
880    in the nested function with DECL_VALUE_EXPR set to reference the true
881    variable in the parent function.  This is used both for debug info 
882    and in OpenMP lowering.  */
883
884 static tree
885 get_nonlocal_debug_decl (struct nesting_info *info, tree decl)
886 {
887   tree target_context;
888   struct nesting_info *i;
889   tree x, field, new_decl;
890   void **slot;
891
892   slot = pointer_map_insert (info->var_map, decl);
893
894   if (*slot)
895     return *slot;
896
897   target_context = decl_function_context (decl);
898
899   /* A copy of the code in get_frame_field, but without the temporaries.  */
900   if (info->context == target_context)
901     {
902       /* Make sure frame_decl gets created.  */
903       (void) get_frame_type (info);
904       x = info->frame_decl;
905       i = info;
906     }
907   else
908     {
909       x = get_chain_decl (info);
910       for (i = info->outer; i->context != target_context; i = i->outer)
911         {
912           field = get_chain_field (i);
913           x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x);
914           x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE);
915         }
916       x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x);
917     }
918
919   field = lookup_field_for_decl (i, decl, INSERT);
920   x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE);
921   if (use_pointer_in_frame (decl))
922     x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x);
923
924   /* ??? We should be remapping types as well, surely.  */
925   new_decl = build_decl (VAR_DECL, DECL_NAME (decl), TREE_TYPE (decl));
926   DECL_CONTEXT (new_decl) = info->context;
927   DECL_SOURCE_LOCATION (new_decl) = DECL_SOURCE_LOCATION (decl);
928   DECL_ARTIFICIAL (new_decl) = DECL_ARTIFICIAL (decl);
929   DECL_IGNORED_P (new_decl) = DECL_IGNORED_P (decl);
930   TREE_THIS_VOLATILE (new_decl) = TREE_THIS_VOLATILE (decl);
931   TREE_SIDE_EFFECTS (new_decl) = TREE_SIDE_EFFECTS (decl);
932   TREE_READONLY (new_decl) = TREE_READONLY (decl);
933   TREE_ADDRESSABLE (new_decl) = TREE_ADDRESSABLE (decl);
934   DECL_SEEN_IN_BIND_EXPR_P (new_decl) = 1;
935
936   SET_DECL_VALUE_EXPR (new_decl, x);
937   DECL_HAS_VALUE_EXPR_P (new_decl) = 1;
938
939   *slot = new_decl;
940   TREE_CHAIN (new_decl) = info->debug_var_chain;
941   info->debug_var_chain = new_decl;
942
943   return new_decl;
944 }
945
946 /* Called via walk_function+walk_tree, rewrite all references to VAR
947    and PARM_DECLs that belong to outer functions.
948
949    The rewrite will involve some number of structure accesses back up
950    the static chain.  E.g. for a variable FOO up one nesting level it'll
951    be CHAIN->FOO.  For two levels it'll be CHAIN->__chain->FOO.  Further
952    indirections apply to decls for which use_pointer_in_frame is true.  */
953
954 static bool convert_nonlocal_omp_clauses (tree *, struct walk_stmt_info *);
955
956 static tree
957 convert_nonlocal_reference (tree *tp, int *walk_subtrees, void *data)
958 {
959   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
960   struct nesting_info *info = wi->info;
961   tree t = *tp;
962   tree save_local_var_chain;
963   bitmap save_suppress;
964
965   *walk_subtrees = 0;
966   switch (TREE_CODE (t))
967     {
968     case VAR_DECL:
969       /* Non-automatic variables are never processed.  */
970       if (TREE_STATIC (t) || DECL_EXTERNAL (t))
971         break;
972       /* FALLTHRU */
973
974     case PARM_DECL:
975       if (decl_function_context (t) != info->context)
976         {
977           tree x;
978           wi->changed = true;
979
980           x = get_nonlocal_debug_decl (info, t);
981           if (!bitmap_bit_p (info->suppress_expansion, DECL_UID (t)))
982             {
983               tree target_context = decl_function_context (t);
984               struct nesting_info *i;
985               for (i = info->outer; i->context != target_context; i = i->outer)
986                 continue;
987               x = lookup_field_for_decl (i, t, INSERT);
988               x = get_frame_field (info, target_context, x, &wi->tsi);
989               if (use_pointer_in_frame (t))
990                 {
991                   x = init_tmp_var (info, x, &wi->tsi);
992                   x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x);
993                 }
994             }
995
996           if (wi->val_only)
997             {
998               if (wi->is_lhs)
999                 x = save_tmp_var (info, x, &wi->tsi);
1000               else
1001                 x = init_tmp_var (info, x, &wi->tsi);
1002             }
1003
1004           *tp = x;
1005         }
1006       break;
1007
1008     case GOTO_EXPR:
1009       /* Don't walk non-local gotos for now.  */
1010       if (TREE_CODE (GOTO_DESTINATION (t)) != LABEL_DECL)
1011         {
1012           *walk_subtrees = 1;
1013           wi->val_only = true;
1014           wi->is_lhs = false;
1015         }
1016       break;
1017
1018     case LABEL_DECL:
1019       /* We're taking the address of a label from a parent function, but
1020          this is not itself a non-local goto.  Mark the label such that it
1021          will not be deleted, much as we would with a label address in
1022          static storage.  */
1023       if (decl_function_context (t) != info->context)
1024         FORCED_LABEL (t) = 1;
1025       break;
1026
1027     case ADDR_EXPR:
1028       {
1029         bool save_val_only = wi->val_only;
1030
1031         wi->val_only = false;
1032         wi->is_lhs = false;
1033         wi->changed = false;
1034         walk_tree (&TREE_OPERAND (t, 0), convert_nonlocal_reference, wi, NULL);
1035         wi->val_only = true;
1036
1037         if (wi->changed)
1038           {
1039             tree save_context;
1040
1041             /* If we changed anything, we might no longer be directly
1042                referencing a decl.  */
1043             save_context = current_function_decl;
1044             current_function_decl = info->context;
1045             recompute_tree_invariant_for_addr_expr (t);
1046             current_function_decl = save_context;
1047
1048             /* If the callback converted the address argument in a context
1049                where we only accept variables (and min_invariant, presumably),
1050                then compute the address into a temporary.  */
1051             if (save_val_only)
1052               *tp = tsi_gimplify_val (wi->info, t, &wi->tsi);
1053           }
1054       }
1055       break;
1056
1057     case REALPART_EXPR:
1058     case IMAGPART_EXPR:
1059     case COMPONENT_REF:
1060     case ARRAY_REF:
1061     case ARRAY_RANGE_REF:
1062     case BIT_FIELD_REF:
1063       /* Go down this entire nest and just look at the final prefix and
1064          anything that describes the references.  Otherwise, we lose track
1065          of whether a NOP_EXPR or VIEW_CONVERT_EXPR needs a simple value.  */
1066       wi->val_only = true;
1067       wi->is_lhs = false;
1068       for (; handled_component_p (t); tp = &TREE_OPERAND (t, 0), t = *tp)
1069         {
1070           if (TREE_CODE (t) == COMPONENT_REF)
1071             walk_tree (&TREE_OPERAND (t, 2), convert_nonlocal_reference, wi,
1072                        NULL);
1073           else if (TREE_CODE (t) == ARRAY_REF
1074                    || TREE_CODE (t) == ARRAY_RANGE_REF)
1075             {
1076               walk_tree (&TREE_OPERAND (t, 1), convert_nonlocal_reference, wi,
1077                          NULL);
1078               walk_tree (&TREE_OPERAND (t, 2), convert_nonlocal_reference, wi,
1079                          NULL);
1080               walk_tree (&TREE_OPERAND (t, 3), convert_nonlocal_reference, wi,
1081                          NULL);
1082             }
1083           else if (TREE_CODE (t) == BIT_FIELD_REF)
1084             {
1085               walk_tree (&TREE_OPERAND (t, 1), convert_nonlocal_reference, wi,
1086                          NULL);
1087               walk_tree (&TREE_OPERAND (t, 2), convert_nonlocal_reference, wi,
1088                          NULL);
1089             }
1090         }
1091       wi->val_only = false;
1092       walk_tree (tp, convert_nonlocal_reference, wi, NULL);
1093       break;
1094
1095     case VIEW_CONVERT_EXPR:
1096       /* Just request to look at the subtrees, leaving val_only and lhs
1097          untouched.  This might actually be for !val_only + lhs, in which
1098          case we don't want to force a replacement by a temporary.  */
1099       *walk_subtrees = 1;
1100       break;
1101
1102     case OMP_PARALLEL:
1103       save_suppress = info->suppress_expansion;
1104       if (convert_nonlocal_omp_clauses (&OMP_PARALLEL_CLAUSES (t), wi))
1105         {
1106           tree c, decl;
1107           decl = get_chain_decl (info);
1108           c = build_omp_clause (OMP_CLAUSE_FIRSTPRIVATE);
1109           OMP_CLAUSE_DECL (c) = decl;
1110           OMP_CLAUSE_CHAIN (c) = OMP_PARALLEL_CLAUSES (t);
1111           OMP_PARALLEL_CLAUSES (t) = c;
1112         }
1113
1114       save_local_var_chain = info->new_local_var_chain;
1115       info->new_local_var_chain = NULL;
1116
1117       walk_body (convert_nonlocal_reference, info, &OMP_PARALLEL_BODY (t));
1118
1119       if (info->new_local_var_chain)
1120         declare_vars (info->new_local_var_chain, OMP_PARALLEL_BODY (t), false);
1121       info->new_local_var_chain = save_local_var_chain;
1122       info->suppress_expansion = save_suppress;
1123       break;
1124
1125     case OMP_FOR:
1126       save_suppress = info->suppress_expansion;
1127       convert_nonlocal_omp_clauses (&OMP_FOR_CLAUSES (t), wi);
1128       walk_omp_for (convert_nonlocal_reference, info, t);
1129       walk_body (convert_nonlocal_reference, info, &OMP_FOR_BODY (t));
1130       info->suppress_expansion = save_suppress;
1131       break;
1132
1133     case OMP_SECTIONS:
1134     case OMP_SINGLE:
1135       save_suppress = info->suppress_expansion;
1136       convert_nonlocal_omp_clauses (&OMP_CLAUSES (t), wi);
1137       walk_body (convert_nonlocal_reference, info, &OMP_BODY (t));
1138       info->suppress_expansion = save_suppress;
1139       break;
1140
1141     case OMP_SECTION:
1142     case OMP_MASTER:
1143     case OMP_ORDERED:
1144       walk_body (convert_nonlocal_reference, info, &OMP_BODY (t));
1145       break;
1146
1147     default:
1148       if (!IS_TYPE_OR_DECL_P (t))
1149         {
1150           *walk_subtrees = 1;
1151           wi->val_only = true;
1152           wi->is_lhs = false;
1153         }
1154       break;
1155     }
1156
1157   return NULL_TREE;
1158 }
1159
1160 static bool
1161 convert_nonlocal_omp_clauses (tree *pclauses, struct walk_stmt_info *wi)
1162 {
1163   struct nesting_info *info = wi->info;
1164   bool need_chain = false;
1165   tree clause, decl;
1166   int dummy;
1167   bitmap new_suppress;
1168
1169   new_suppress = BITMAP_GGC_ALLOC ();
1170   bitmap_copy (new_suppress, info->suppress_expansion);
1171
1172   for (clause = *pclauses; clause ; clause = OMP_CLAUSE_CHAIN (clause))
1173     {
1174       switch (OMP_CLAUSE_CODE (clause))
1175         {
1176         case OMP_CLAUSE_PRIVATE:
1177         case OMP_CLAUSE_FIRSTPRIVATE:
1178         case OMP_CLAUSE_LASTPRIVATE:
1179         case OMP_CLAUSE_REDUCTION:
1180         case OMP_CLAUSE_COPYPRIVATE:
1181         case OMP_CLAUSE_SHARED:
1182           decl = OMP_CLAUSE_DECL (clause);
1183           if (decl_function_context (decl) != info->context)
1184             {
1185               bitmap_set_bit (new_suppress, DECL_UID (decl));
1186               OMP_CLAUSE_DECL (clause) = get_nonlocal_debug_decl (info, decl);
1187               need_chain = true;
1188             }
1189           break;
1190
1191         case OMP_CLAUSE_SCHEDULE:
1192           if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause) == NULL)
1193             break;
1194           /* FALLTHRU */
1195         case OMP_CLAUSE_IF:
1196         case OMP_CLAUSE_NUM_THREADS:
1197           wi->val_only = true;
1198           wi->is_lhs = false;
1199           convert_nonlocal_reference (&OMP_CLAUSE_OPERAND (clause, 0), &dummy,
1200                                       wi);
1201           break;
1202
1203         case OMP_CLAUSE_NOWAIT:
1204         case OMP_CLAUSE_ORDERED:
1205         case OMP_CLAUSE_DEFAULT:
1206         case OMP_CLAUSE_COPYIN:
1207           break;
1208
1209         default:
1210           gcc_unreachable ();
1211         }
1212     }
1213
1214   info->suppress_expansion = new_suppress;
1215
1216   return need_chain;
1217 }
1218
1219 /* A subroutine of convert_local_reference.  Create a local variable
1220    in the parent function with DECL_VALUE_EXPR set to reference the
1221    field in FRAME.  This is used both for debug info and in OpenMP
1222    lowering.  */
1223
1224 static tree
1225 get_local_debug_decl (struct nesting_info *info, tree decl, tree field)
1226 {
1227   tree x, new_decl;
1228   void **slot;
1229
1230   slot = pointer_map_insert (info->var_map, decl);
1231   if (*slot)
1232     return *slot;
1233
1234   /* Make sure frame_decl gets created.  */
1235   (void) get_frame_type (info);
1236   x = info->frame_decl;
1237   x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE);
1238
1239   new_decl = build_decl (VAR_DECL, DECL_NAME (decl), TREE_TYPE (decl));
1240   DECL_CONTEXT (new_decl) = info->context;
1241   DECL_SOURCE_LOCATION (new_decl) = DECL_SOURCE_LOCATION (decl);
1242   DECL_ARTIFICIAL (new_decl) = DECL_ARTIFICIAL (decl);
1243   DECL_IGNORED_P (new_decl) = DECL_IGNORED_P (decl);
1244   TREE_THIS_VOLATILE (new_decl) = TREE_THIS_VOLATILE (decl);
1245   TREE_SIDE_EFFECTS (new_decl) = TREE_SIDE_EFFECTS (decl);
1246   TREE_READONLY (new_decl) = TREE_READONLY (decl);
1247   TREE_ADDRESSABLE (new_decl) = TREE_ADDRESSABLE (decl);
1248   DECL_SEEN_IN_BIND_EXPR_P (new_decl) = 1;
1249
1250   SET_DECL_VALUE_EXPR (new_decl, x);
1251   DECL_HAS_VALUE_EXPR_P (new_decl) = 1;
1252   *slot = new_decl;
1253
1254   TREE_CHAIN (new_decl) = info->debug_var_chain;
1255   info->debug_var_chain = new_decl;
1256
1257   /* Do not emit debug info twice.  */
1258   DECL_IGNORED_P (decl) = 1;
1259
1260   return new_decl;
1261 }
1262
1263 /* Called via walk_function+walk_tree, rewrite all references to VAR
1264    and PARM_DECLs that were referenced by inner nested functions.
1265    The rewrite will be a structure reference to the local frame variable.  */
1266
1267 static bool convert_local_omp_clauses (tree *, struct walk_stmt_info *);
1268
1269 static tree
1270 convert_local_reference (tree *tp, int *walk_subtrees, void *data)
1271 {
1272   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
1273   struct nesting_info *info = wi->info;
1274   tree t = *tp, field, x;
1275   bool save_val_only;
1276   tree save_local_var_chain;
1277   bitmap save_suppress;
1278
1279   *walk_subtrees = 0;
1280   switch (TREE_CODE (t))
1281     {
1282     case VAR_DECL:
1283       /* Non-automatic variables are never processed.  */
1284       if (TREE_STATIC (t) || DECL_EXTERNAL (t))
1285         break;
1286       /* FALLTHRU */
1287
1288     case PARM_DECL:
1289       if (decl_function_context (t) == info->context)
1290         {
1291           /* If we copied a pointer to the frame, then the original decl
1292              is used unchanged in the parent function.  */
1293           if (use_pointer_in_frame (t))
1294             break;
1295
1296           /* No need to transform anything if no child references the
1297              variable.  */
1298           field = lookup_field_for_decl (info, t, NO_INSERT);
1299           if (!field)
1300             break;
1301           wi->changed = true;
1302
1303           x = get_local_debug_decl (info, t, field);
1304           if (!bitmap_bit_p (info->suppress_expansion, DECL_UID (t)))
1305             x = get_frame_field (info, info->context, field, &wi->tsi);
1306
1307           if (wi->val_only)
1308             {
1309               if (wi->is_lhs)
1310                 x = save_tmp_var (info, x, &wi->tsi);
1311               else
1312                 x = init_tmp_var (info, x, &wi->tsi);
1313             }
1314
1315           *tp = x;
1316         }
1317       break;
1318
1319     case ADDR_EXPR:
1320       save_val_only = wi->val_only;
1321       wi->val_only = false;
1322       wi->is_lhs = false;
1323       wi->changed = false;
1324       walk_tree (&TREE_OPERAND (t, 0), convert_local_reference, wi, NULL);
1325       wi->val_only = save_val_only;
1326
1327       /* If we converted anything ... */
1328       if (wi->changed)
1329         {
1330           tree save_context;
1331
1332           /* Then the frame decl is now addressable.  */
1333           TREE_ADDRESSABLE (info->frame_decl) = 1;
1334             
1335           save_context = current_function_decl;
1336           current_function_decl = info->context;
1337           recompute_tree_invariant_for_addr_expr (t);
1338           current_function_decl = save_context;
1339
1340           /* If we are in a context where we only accept values, then
1341              compute the address into a temporary.  */
1342           if (save_val_only)
1343             *tp = tsi_gimplify_val (wi->info, t, &wi->tsi);
1344         }
1345       break;
1346
1347     case REALPART_EXPR:
1348     case IMAGPART_EXPR:
1349     case COMPONENT_REF:
1350     case ARRAY_REF:
1351     case ARRAY_RANGE_REF:
1352     case BIT_FIELD_REF:
1353       /* Go down this entire nest and just look at the final prefix and
1354          anything that describes the references.  Otherwise, we lose track
1355          of whether a NOP_EXPR or VIEW_CONVERT_EXPR needs a simple value.  */
1356       save_val_only = wi->val_only;
1357       wi->val_only = true;
1358       wi->is_lhs = false;
1359       for (; handled_component_p (t); tp = &TREE_OPERAND (t, 0), t = *tp)
1360         {
1361           if (TREE_CODE (t) == COMPONENT_REF)
1362             walk_tree (&TREE_OPERAND (t, 2), convert_local_reference, wi,
1363                        NULL);
1364           else if (TREE_CODE (t) == ARRAY_REF
1365                    || TREE_CODE (t) == ARRAY_RANGE_REF)
1366             {
1367               walk_tree (&TREE_OPERAND (t, 1), convert_local_reference, wi,
1368                          NULL);
1369               walk_tree (&TREE_OPERAND (t, 2), convert_local_reference, wi,
1370                          NULL);
1371               walk_tree (&TREE_OPERAND (t, 3), convert_local_reference, wi,
1372                          NULL);
1373             }
1374           else if (TREE_CODE (t) == BIT_FIELD_REF)
1375             {
1376               walk_tree (&TREE_OPERAND (t, 1), convert_local_reference, wi,
1377                          NULL);
1378               walk_tree (&TREE_OPERAND (t, 2), convert_local_reference, wi,
1379                          NULL);
1380             }
1381         }
1382       wi->val_only = false;
1383       walk_tree (tp, convert_local_reference, wi, NULL);
1384       wi->val_only = save_val_only;
1385       break;
1386
1387     case VIEW_CONVERT_EXPR:
1388       /* Just request to look at the subtrees, leaving val_only and lhs
1389          untouched.  This might actually be for !val_only + lhs, in which
1390          case we don't want to force a replacement by a temporary.  */
1391       *walk_subtrees = 1;
1392       break;
1393
1394     case OMP_PARALLEL:
1395       save_suppress = info->suppress_expansion;
1396       if (convert_local_omp_clauses (&OMP_PARALLEL_CLAUSES (t), wi))
1397         {
1398           tree c;
1399           (void) get_frame_type (info);
1400           c = build_omp_clause (OMP_CLAUSE_SHARED);
1401           OMP_CLAUSE_DECL (c) = info->frame_decl;
1402           OMP_CLAUSE_CHAIN (c) = OMP_PARALLEL_CLAUSES (t);
1403           OMP_PARALLEL_CLAUSES (t) = c;
1404         }
1405
1406       save_local_var_chain = info->new_local_var_chain;
1407       info->new_local_var_chain = NULL;
1408
1409       walk_body (convert_local_reference, info, &OMP_PARALLEL_BODY (t));
1410
1411       if (info->new_local_var_chain)
1412         declare_vars (info->new_local_var_chain, OMP_PARALLEL_BODY (t), false);
1413       info->new_local_var_chain = save_local_var_chain;
1414       info->suppress_expansion = save_suppress;
1415       break;
1416
1417     case OMP_FOR:
1418       save_suppress = info->suppress_expansion;
1419       convert_local_omp_clauses (&OMP_FOR_CLAUSES (t), wi);
1420       walk_omp_for (convert_local_reference, info, t);
1421       walk_body (convert_local_reference, info, &OMP_FOR_BODY (t));
1422       info->suppress_expansion = save_suppress;
1423       break;
1424
1425     case OMP_SECTIONS:
1426     case OMP_SINGLE:
1427       save_suppress = info->suppress_expansion;
1428       convert_local_omp_clauses (&OMP_CLAUSES (t), wi);
1429       walk_body (convert_local_reference, info, &OMP_BODY (t));
1430       info->suppress_expansion = save_suppress;
1431       break;
1432
1433     case OMP_SECTION:
1434     case OMP_MASTER:
1435     case OMP_ORDERED:
1436       walk_body (convert_local_reference, info, &OMP_BODY (t));
1437       break;
1438
1439     default:
1440       if (!IS_TYPE_OR_DECL_P (t))
1441         {
1442           *walk_subtrees = 1;
1443           wi->val_only = true;
1444           wi->is_lhs = false;
1445         }
1446       break;
1447     }
1448
1449   return NULL_TREE;
1450 }
1451
1452 static bool
1453 convert_local_omp_clauses (tree *pclauses, struct walk_stmt_info *wi)
1454 {
1455   struct nesting_info *info = wi->info;
1456   bool need_frame = false;
1457   tree clause, decl;
1458   int dummy;
1459   bitmap new_suppress;
1460
1461   new_suppress = BITMAP_GGC_ALLOC ();
1462   bitmap_copy (new_suppress, info->suppress_expansion);
1463
1464   for (clause = *pclauses; clause ; clause = OMP_CLAUSE_CHAIN (clause))
1465     {
1466       switch (OMP_CLAUSE_CODE (clause))
1467         {
1468         case OMP_CLAUSE_PRIVATE:
1469         case OMP_CLAUSE_FIRSTPRIVATE:
1470         case OMP_CLAUSE_LASTPRIVATE:
1471         case OMP_CLAUSE_REDUCTION:
1472         case OMP_CLAUSE_COPYPRIVATE:
1473         case OMP_CLAUSE_SHARED:
1474           decl = OMP_CLAUSE_DECL (clause);
1475           if (decl_function_context (decl) == info->context
1476               && !use_pointer_in_frame (decl))
1477             {
1478               tree field = lookup_field_for_decl (info, decl, NO_INSERT);
1479               if (field)
1480                 {
1481                   bitmap_set_bit (new_suppress, DECL_UID (decl));
1482                   OMP_CLAUSE_DECL (clause)
1483                     = get_local_debug_decl (info, decl, field);
1484                   need_frame = true;
1485                 }
1486             }
1487           break;
1488
1489         case OMP_CLAUSE_SCHEDULE:
1490           if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause) == NULL)
1491             break;
1492           /* FALLTHRU */
1493         case OMP_CLAUSE_IF:
1494         case OMP_CLAUSE_NUM_THREADS:
1495           wi->val_only = true;
1496           wi->is_lhs = false;
1497           convert_local_reference (&OMP_CLAUSE_OPERAND (clause, 0), &dummy, wi);
1498           break;
1499
1500         case OMP_CLAUSE_NOWAIT:
1501         case OMP_CLAUSE_ORDERED:
1502         case OMP_CLAUSE_DEFAULT:
1503         case OMP_CLAUSE_COPYIN:
1504           break;
1505
1506         default:
1507           gcc_unreachable ();
1508         }
1509     }
1510
1511   info->suppress_expansion = new_suppress;
1512
1513   return need_frame;
1514 }
1515
1516 /* Called via walk_function+walk_tree, rewrite all GOTO_EXPRs that 
1517    reference labels from outer functions.  The rewrite will be a 
1518    call to __builtin_nonlocal_goto.  */
1519
1520 static tree
1521 convert_nl_goto_reference (tree *tp, int *walk_subtrees, void *data)
1522 {
1523   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
1524   struct nesting_info *info = wi->info, *i;
1525   tree t = *tp, label, new_label, target_context, x, field;
1526   void **slot;
1527
1528   *walk_subtrees = 0;
1529   if (TREE_CODE (t) != GOTO_EXPR)
1530     return NULL_TREE;
1531   label = GOTO_DESTINATION (t);
1532   if (TREE_CODE (label) != LABEL_DECL)
1533     return NULL_TREE;
1534   target_context = decl_function_context (label);
1535   if (target_context == info->context)
1536     return NULL_TREE;
1537
1538   for (i = info->outer; target_context != i->context; i = i->outer)
1539     continue;
1540
1541   /* The original user label may also be use for a normal goto, therefore
1542      we must create a new label that will actually receive the abnormal
1543      control transfer.  This new label will be marked LABEL_NONLOCAL; this
1544      mark will trigger proper behavior in the cfg, as well as cause the
1545      (hairy target-specific) non-local goto receiver code to be generated
1546      when we expand rtl.  Enter this association into var_map so that we
1547      can insert the new label into the IL during a second pass.  */
1548   slot = pointer_map_insert (i->var_map, label);
1549   if (*slot == NULL)
1550     {
1551       new_label = create_artificial_label ();
1552       DECL_NONLOCAL (new_label) = 1;
1553       *slot = new_label;
1554     }
1555   else
1556     new_label = *slot;
1557   
1558   /* Build: __builtin_nl_goto(new_label, &chain->nl_goto_field).  */
1559   field = get_nl_goto_field (i);
1560   x = get_frame_field (info, target_context, field, &wi->tsi);
1561   x = build_addr (x, target_context);
1562   x = tsi_gimplify_val (info, x, &wi->tsi);
1563   x = build_call_expr (implicit_built_in_decls[BUILT_IN_NONLOCAL_GOTO], 2,
1564                        build_addr (new_label, target_context), x);
1565
1566   SET_EXPR_LOCUS (x, EXPR_LOCUS (tsi_stmt (wi->tsi)));
1567   *tsi_stmt_ptr (wi->tsi) = x;
1568
1569   return NULL_TREE;
1570 }
1571
1572 /* Called via walk_function+walk_tree, rewrite all LABEL_EXPRs that 
1573    are referenced via nonlocal goto from a nested function.  The rewrite
1574    will involve installing a newly generated DECL_NONLOCAL label, and
1575    (potentially) a branch around the rtl gunk that is assumed to be 
1576    attached to such a label.  */
1577
1578 static tree
1579 convert_nl_goto_receiver (tree *tp, int *walk_subtrees, void *data)
1580 {
1581   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
1582   struct nesting_info *info = wi->info;
1583   tree t = *tp, label, new_label, x;
1584   tree_stmt_iterator tmp_tsi;
1585   void **slot;
1586
1587   *walk_subtrees = 0;
1588   if (TREE_CODE (t) != LABEL_EXPR)
1589     return NULL_TREE;
1590   label = LABEL_EXPR_LABEL (t);
1591
1592   slot = pointer_map_contains (info->var_map, label);
1593   if (!slot)
1594     return NULL_TREE;
1595
1596   /* If there's any possibility that the previous statement falls through,
1597      then we must branch around the new non-local label.  */
1598   tmp_tsi = wi->tsi;
1599   tsi_prev (&tmp_tsi);
1600   if (tsi_end_p (tmp_tsi) || block_may_fallthru (tsi_stmt (tmp_tsi)))
1601     {
1602       x = build1 (GOTO_EXPR, void_type_node, label);
1603       tsi_link_before (&wi->tsi, x, TSI_SAME_STMT);
1604     }
1605
1606   new_label = (tree) *slot;
1607   x = build1 (LABEL_EXPR, void_type_node, new_label);
1608   tsi_link_before (&wi->tsi, x, TSI_SAME_STMT);
1609
1610   return NULL_TREE;
1611 }
1612
1613 /* Called via walk_function+walk_tree, rewrite all references to addresses
1614    of nested functions that require the use of trampolines.  The rewrite
1615    will involve a reference a trampoline generated for the occasion.  */
1616
1617 static tree
1618 convert_tramp_reference (tree *tp, int *walk_subtrees, void *data)
1619 {
1620   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
1621   struct nesting_info *info = wi->info, *i;
1622   tree t = *tp, decl, target_context, x;
1623
1624   *walk_subtrees = 0;
1625   switch (TREE_CODE (t))
1626     {
1627     case ADDR_EXPR:
1628       /* Build
1629            T.1 = &CHAIN->tramp;
1630            T.2 = __builtin_adjust_trampoline (T.1);
1631            T.3 = (func_type)T.2;
1632       */
1633
1634       decl = TREE_OPERAND (t, 0);
1635       if (TREE_CODE (decl) != FUNCTION_DECL)
1636         break;
1637
1638       /* Only need to process nested functions.  */
1639       target_context = decl_function_context (decl);
1640       if (!target_context)
1641         break;
1642
1643       /* If the nested function doesn't use a static chain, then
1644          it doesn't need a trampoline.  */
1645       if (DECL_NO_STATIC_CHAIN (decl))
1646         break;
1647
1648       /* If we don't want a trampoline, then don't build one.  */
1649       if (TREE_NO_TRAMPOLINE (t))
1650         break;
1651
1652       /* Lookup the immediate parent of the callee, as that's where
1653          we need to insert the trampoline.  */
1654       for (i = info; i->context != target_context; i = i->outer)
1655         continue;
1656       x = lookup_tramp_for_decl (i, decl, INSERT);
1657
1658       /* Compute the address of the field holding the trampoline.  */
1659       x = get_frame_field (info, target_context, x, &wi->tsi);
1660       x = build_addr (x, target_context);
1661       x = tsi_gimplify_val (info, x, &wi->tsi);
1662
1663       /* Do machine-specific ugliness.  Normally this will involve
1664          computing extra alignment, but it can really be anything.  */
1665       x = build_call_expr (implicit_built_in_decls[BUILT_IN_ADJUST_TRAMPOLINE],
1666                            1, x);
1667       x = init_tmp_var (info, x, &wi->tsi);
1668
1669       /* Cast back to the proper function type.  */
1670       x = build1 (NOP_EXPR, TREE_TYPE (t), x);
1671       x = init_tmp_var (info, x, &wi->tsi);
1672
1673       *tp = x;
1674       break;
1675
1676     case CALL_EXPR:
1677       /* Only walk call arguments, lest we generate trampolines for
1678          direct calls.  */
1679       {
1680         int nargs = call_expr_nargs (t);
1681         int i;
1682         for (i = 0; i < nargs; i++)
1683           walk_tree (&CALL_EXPR_ARG (t, i), convert_tramp_reference, wi, NULL);
1684       }
1685       break;
1686
1687     default:
1688       if (!IS_TYPE_OR_DECL_P (t))
1689         *walk_subtrees = 1;
1690       break;
1691     }
1692
1693   return NULL_TREE;
1694 }
1695
1696 /* Called via walk_function+walk_tree, rewrite all CALL_EXPRs that 
1697    reference nested functions to make sure that the static chain is
1698    set up properly for the call.  */
1699
1700 static tree
1701 convert_call_expr (tree *tp, int *walk_subtrees, void *data)
1702 {
1703   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
1704   struct nesting_info *info = wi->info;
1705   tree t = *tp, decl, target_context;
1706   char save_static_chain_added;
1707   int i;
1708
1709   *walk_subtrees = 0;
1710   switch (TREE_CODE (t))
1711     {
1712     case CALL_EXPR:
1713       decl = get_callee_fndecl (t);
1714       if (!decl)
1715         break;
1716       target_context = decl_function_context (decl);
1717       if (target_context && !DECL_NO_STATIC_CHAIN (decl))
1718         {
1719           CALL_EXPR_STATIC_CHAIN (t)
1720             = get_static_chain (info, target_context, &wi->tsi);
1721           info->static_chain_added
1722             |= (1 << (info->context != target_context));
1723         }
1724       break;
1725
1726     case RETURN_EXPR:
1727     case GIMPLE_MODIFY_STMT:
1728     case WITH_SIZE_EXPR:
1729       /* Only return modify and with_size_expr may contain calls.  */
1730       *walk_subtrees = 1;
1731       break;
1732
1733     case OMP_PARALLEL:
1734       save_static_chain_added = info->static_chain_added;
1735       info->static_chain_added = 0;
1736       walk_body (convert_call_expr, info, &OMP_PARALLEL_BODY (t));
1737       for (i = 0; i < 2; i++)
1738         {
1739           tree c, decl;
1740           if ((info->static_chain_added & (1 << i)) == 0)
1741             continue;
1742           decl = i ? get_chain_decl (info) : info->frame_decl;
1743           /* Don't add CHAIN.* or FRAME.* twice.  */
1744           for (c = OMP_PARALLEL_CLAUSES (t); c; c = OMP_CLAUSE_CHAIN (c))
1745             if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE
1746                  || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED)
1747                 && OMP_CLAUSE_DECL (c) == decl)
1748               break;
1749           if (c == NULL)
1750             {
1751               c = build_omp_clause (i ? OMP_CLAUSE_FIRSTPRIVATE
1752                                       : OMP_CLAUSE_SHARED);
1753               OMP_CLAUSE_DECL (c) = decl;
1754               OMP_CLAUSE_CHAIN (c) = OMP_PARALLEL_CLAUSES (t);
1755               OMP_PARALLEL_CLAUSES (t) = c;
1756             }
1757         }
1758       info->static_chain_added |= save_static_chain_added;
1759       break;
1760
1761     case OMP_FOR:
1762       walk_body (convert_call_expr, info, &OMP_FOR_PRE_BODY (t));
1763       /* FALLTHRU */
1764     case OMP_SECTIONS:
1765     case OMP_SECTION:
1766     case OMP_SINGLE:
1767     case OMP_MASTER:
1768     case OMP_ORDERED:
1769     case OMP_CRITICAL:
1770       walk_body (convert_call_expr, info, &OMP_BODY (t));
1771       break;
1772
1773     default:
1774       break;
1775     }
1776
1777   return NULL_TREE;
1778 }
1779
1780 /* Walk the nesting tree starting with ROOT, depth first.  Convert all
1781    trampolines and call expressions.  On the way back up, determine if
1782    a nested function actually uses its static chain; if not, remember that.  */
1783
1784 static void
1785 convert_all_function_calls (struct nesting_info *root)
1786 {
1787   do
1788     {
1789       if (root->inner)
1790         convert_all_function_calls (root->inner);
1791
1792       walk_function (convert_tramp_reference, root);
1793       walk_function (convert_call_expr, root);
1794
1795       /* If the function does not use a static chain, then remember that.  */
1796       if (root->outer && !root->chain_decl && !root->chain_field)
1797         DECL_NO_STATIC_CHAIN (root->context) = 1;
1798       else
1799         gcc_assert (!DECL_NO_STATIC_CHAIN (root->context));
1800
1801       root = root->next;
1802     }
1803   while (root);
1804 }
1805
1806 /* Do "everything else" to clean up or complete state collected by the
1807    various walking passes -- lay out the types and decls, generate code
1808    to initialize the frame decl, store critical expressions in the
1809    struct function for rtl to find.  */
1810
1811 static void
1812 finalize_nesting_tree_1 (struct nesting_info *root)
1813 {
1814   tree stmt_list = NULL;
1815   tree context = root->context;
1816   struct function *sf;
1817
1818   /* If we created a non-local frame type or decl, we need to lay them
1819      out at this time.  */
1820   if (root->frame_type)
1821     {
1822       /* In some cases the frame type will trigger the -Wpadded warning.
1823          This is not helpful; suppress it. */
1824       int save_warn_padded = warn_padded;
1825       warn_padded = 0;
1826       layout_type (root->frame_type);
1827       warn_padded = save_warn_padded;
1828       layout_decl (root->frame_decl, 0);
1829     }
1830
1831   /* If any parameters were referenced non-locally, then we need to 
1832      insert a copy.  Likewise, if any variables were referenced by
1833      pointer, we need to initialize the address.  */
1834   if (root->any_parm_remapped)
1835     {
1836       tree p;
1837       for (p = DECL_ARGUMENTS (context); p ; p = TREE_CHAIN (p))
1838         {
1839           tree field, x, y;
1840
1841           field = lookup_field_for_decl (root, p, NO_INSERT);
1842           if (!field)
1843             continue;
1844
1845           if (use_pointer_in_frame (p))
1846             x = build_addr (p, context);
1847           else
1848             x = p;
1849
1850           y = build3 (COMPONENT_REF, TREE_TYPE (field),
1851                       root->frame_decl, field, NULL_TREE);
1852           x = build_gimple_modify_stmt (y, x);
1853           append_to_statement_list (x, &stmt_list);
1854         }
1855     }
1856
1857   /* If a chain_field was created, then it needs to be initialized
1858      from chain_decl.  */
1859   if (root->chain_field)
1860     {
1861       tree x = build3 (COMPONENT_REF, TREE_TYPE (root->chain_field),
1862                        root->frame_decl, root->chain_field, NULL_TREE);
1863       x = build_gimple_modify_stmt (x, get_chain_decl (root));
1864       append_to_statement_list (x, &stmt_list);
1865     }
1866
1867   /* If trampolines were created, then we need to initialize them.  */
1868   if (root->any_tramp_created)
1869     {
1870       struct nesting_info *i;
1871       for (i = root->inner; i ; i = i->next)
1872         {
1873           tree arg1, arg2, arg3, x, field;
1874
1875           field = lookup_tramp_for_decl (root, i->context, NO_INSERT);
1876           if (!field)
1877             continue;
1878
1879           if (DECL_NO_STATIC_CHAIN (i->context))
1880             arg3 = null_pointer_node;
1881           else
1882             arg3 = build_addr (root->frame_decl, context);
1883
1884           arg2 = build_addr (i->context, context);
1885
1886           x = build3 (COMPONENT_REF, TREE_TYPE (field),
1887                       root->frame_decl, field, NULL_TREE);
1888           arg1 = build_addr (x, context);
1889
1890           x = implicit_built_in_decls[BUILT_IN_INIT_TRAMPOLINE];
1891           x = build_call_expr (x, 3, arg1, arg2, arg3);
1892           append_to_statement_list (x, &stmt_list);
1893         }
1894     }
1895
1896   /* If we created initialization statements, insert them.  */
1897   if (stmt_list)
1898     {
1899       annotate_all_with_locus (&stmt_list,
1900                                DECL_SOURCE_LOCATION (context));
1901       append_to_statement_list (BIND_EXPR_BODY (DECL_SAVED_TREE (context)),
1902                                 &stmt_list);
1903       BIND_EXPR_BODY (DECL_SAVED_TREE (context)) = stmt_list;
1904     }
1905
1906   /* If a chain_decl was created, then it needs to be registered with
1907      struct function so that it gets initialized from the static chain
1908      register at the beginning of the function.  */
1909   sf = DECL_STRUCT_FUNCTION (root->context);
1910   sf->static_chain_decl = root->chain_decl;
1911
1912   /* Similarly for the non-local goto save area.  */
1913   if (root->nl_goto_field)
1914     {
1915       sf->nonlocal_goto_save_area
1916         = get_frame_field (root, context, root->nl_goto_field, NULL);
1917       sf->has_nonlocal_label = 1;
1918     }
1919
1920   /* Make sure all new local variables get inserted into the
1921      proper BIND_EXPR.  */
1922   if (root->new_local_var_chain)
1923     declare_vars (root->new_local_var_chain, DECL_SAVED_TREE (root->context),
1924                   false);
1925   if (root->debug_var_chain)
1926     declare_vars (root->debug_var_chain, DECL_SAVED_TREE (root->context),
1927                   true);
1928
1929   /* Dump the translated tree function.  */
1930   dump_function (TDI_nested, root->context);
1931 }
1932
1933 static void
1934 finalize_nesting_tree (struct nesting_info *root)
1935 {
1936   do
1937     {
1938       if (root->inner)
1939         finalize_nesting_tree (root->inner);
1940       finalize_nesting_tree_1 (root);
1941       root = root->next;
1942     }
1943   while (root);
1944 }
1945
1946 /* Unnest the nodes and pass them to cgraph.  */
1947
1948 static void
1949 unnest_nesting_tree_1 (struct nesting_info *root)
1950 {
1951   struct cgraph_node *node = cgraph_node (root->context);
1952
1953   /* For nested functions update the cgraph to reflect unnesting.
1954      We also delay finalizing of these functions up to this point.  */
1955   if (node->origin)
1956     {
1957        cgraph_unnest_node (cgraph_node (root->context));
1958        cgraph_finalize_function (root->context, true);
1959     }
1960 }
1961
1962 static void
1963 unnest_nesting_tree (struct nesting_info *root)
1964 {
1965   do
1966     {
1967       if (root->inner)
1968         unnest_nesting_tree (root->inner);
1969       unnest_nesting_tree_1 (root);
1970       root = root->next;
1971     }
1972   while (root);
1973 }
1974
1975 /* Free the data structures allocated during this pass.  */
1976
1977 static void
1978 free_nesting_tree (struct nesting_info *root)
1979 {
1980   struct nesting_info *next;
1981   do
1982     {
1983       if (root->inner)
1984         free_nesting_tree (root->inner);
1985       pointer_map_destroy (root->var_map);
1986       pointer_map_destroy (root->field_map);
1987       next = root->next;
1988       free (root);
1989       root = next;
1990     }
1991   while (root);
1992 }
1993
1994 /* Main entry point for this pass.  Process FNDECL and all of its nested
1995    subroutines and turn them into something less tightly bound.  */
1996
1997 void
1998 lower_nested_functions (tree fndecl)
1999 {
2000   struct cgraph_node *cgn;
2001   struct nesting_info *root;
2002
2003   /* If there are no nested functions, there's nothing to do.  */
2004   cgn = cgraph_node (fndecl);
2005   if (!cgn->nested)
2006     return;
2007
2008   bitmap_obstack_initialize (&nesting_info_bitmap_obstack);
2009   root = create_nesting_tree (cgn);
2010   walk_all_functions (convert_nonlocal_reference, root);
2011   walk_all_functions (convert_local_reference, root);
2012   walk_all_functions (convert_nl_goto_reference, root);
2013   walk_all_functions (convert_nl_goto_receiver, root);
2014   convert_all_function_calls (root);
2015   finalize_nesting_tree (root);
2016   unnest_nesting_tree (root);
2017   free_nesting_tree (root);
2018   bitmap_obstack_release (&nesting_info_bitmap_obstack);
2019 }
2020
2021 #include "gt-tree-nested.h"