OSDN Git Service

a7960fde376733c7105ce4aa0c62c847739a71e7
[pf3gnuchains/gcc-fork.git] / gcc / gimplify.c
1 /* Tree lowering pass.  This pass converts the GENERIC functions-as-trees
2    tree representation into the GIMPLE form.
3    Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
4    Major work done by Sebastian Pop <s.pop@laposte.net>,
5    Diego Novillo <dnovillo@redhat.com> and Jason Merrill <jason@redhat.com>.
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 2, or (at your option) any later
12 version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING.  If not, write to the Free
21 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 02111-1307, USA.  */
23
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "tree.h"
29 #include "rtl.h"
30 #include "errors.h"
31 #include "varray.h"
32 #include "tree-gimple.h"
33 #include "tree-inline.h"
34 #include "diagnostic.h"
35 #include "langhooks.h"
36 #include "langhooks-def.h"
37 #include "tree-flow.h"
38 #include "cgraph.h"
39 #include "timevar.h"
40 #include "except.h"
41 #include "hashtab.h"
42 #include "flags.h"
43 #include "real.h"
44 #include "function.h"
45 #include "output.h"
46 #include "expr.h"
47 #include "ggc.h"
48 #include "target.h"
49
50 static struct gimplify_ctx
51 {
52   tree current_bind_expr;
53   bool save_stack;
54   tree temps;
55   tree conditional_cleanups;
56   int conditions;
57   tree exit_label;
58   tree return_temp;
59   varray_type case_labels;
60   /* The formal temporary table.  Should this be persistent?  */
61   htab_t temp_htab;
62 } *gimplify_ctxp;
63
64
65 /* Formal (expression) temporary table handling: Multiple occurrences of
66    the same scalar expression are evaluated into the same temporary.  */
67
68 typedef struct gimple_temp_hash_elt
69 {
70   tree val;   /* Key */
71   tree temp;  /* Value */
72 } elt_t;
73
74 /* Forward declarations.  */
75 static enum gimplify_status gimplify_modify_expr_rhs (tree *, tree *, tree *,
76                                                       tree *, tree *, bool);
77 static enum gimplify_status gimplify_compound_expr (tree *, tree *, bool);
78
79
80 /* Return a hash value for a formal temporary table entry.  */
81
82 static hashval_t
83 gimple_tree_hash (const void *p)
84 {
85   tree t = ((const elt_t *) p)->val;
86   return iterative_hash_expr (t, 0);
87 }
88
89 /* Compare two formal temporary table entries.  */
90
91 static int
92 gimple_tree_eq (const void *p1, const void *p2)
93 {
94   tree t1 = ((const elt_t *) p1)->val;
95   tree t2 = ((const elt_t *) p2)->val;
96   enum tree_code code = TREE_CODE (t1);
97
98   if (TREE_CODE (t2) != code
99       || TREE_TYPE (t1) != TREE_TYPE (t2))
100     return 0;
101
102   if (!operand_equal_p (t1, t2, 0))
103     return 0;
104
105   /* Only allow them to compare equal if they also hash equal; otherwise
106      results are nondeterminate, and we fail bootstrap comparison.  */
107   if (gimple_tree_hash (p1) != gimple_tree_hash (p2))
108     abort ();
109
110   return 1;
111 }
112
113 /* Set up a context for the gimplifier.  */
114
115 void
116 push_gimplify_context (void)
117 {
118   if (gimplify_ctxp)
119     abort ();
120   gimplify_ctxp
121     = (struct gimplify_ctx *) xcalloc (1, sizeof (struct gimplify_ctx));
122   gimplify_ctxp->temp_htab
123     = htab_create (1000, gimple_tree_hash, gimple_tree_eq, free);
124 }
125
126 /* Tear down a context for the gimplifier.  If BODY is non-null, then
127    put the temporaries into the outer BIND_EXPR.  Otherwise, put them
128    in the unexpanded_var_list.  */
129
130 void
131 pop_gimplify_context (tree body)
132 {
133   if (!gimplify_ctxp || gimplify_ctxp->current_bind_expr)
134     abort ();
135
136   if (body)
137     declare_tmp_vars (gimplify_ctxp->temps, body);
138   else
139     record_vars (gimplify_ctxp->temps);
140
141 #if 0
142   if (!quiet_flag)
143     fprintf (stderr, " collisions: %f ",
144              htab_collisions (gimplify_ctxp->temp_htab));
145 #endif
146
147   htab_delete (gimplify_ctxp->temp_htab);
148   free (gimplify_ctxp);
149   gimplify_ctxp = NULL;
150 }
151
152 void
153 gimple_push_bind_expr (tree bind)
154 {
155   TREE_CHAIN (bind) = gimplify_ctxp->current_bind_expr;
156   gimplify_ctxp->current_bind_expr = bind;
157 }
158
159 void
160 gimple_pop_bind_expr (void)
161 {
162   gimplify_ctxp->current_bind_expr
163     = TREE_CHAIN (gimplify_ctxp->current_bind_expr);
164 }
165
166 tree
167 gimple_current_bind_expr (void)
168 {
169   return gimplify_ctxp->current_bind_expr;
170 }
171
172 /* Returns true iff there is a COND_EXPR between us and the innermost
173    CLEANUP_POINT_EXPR.  This info is used by gimple_push_cleanup.  */
174
175 static bool
176 gimple_conditional_context (void)
177 {
178   return gimplify_ctxp->conditions > 0;
179 }
180
181 /* Note that we've entered a COND_EXPR.  */
182
183 static void
184 gimple_push_condition (void)
185 {
186   ++(gimplify_ctxp->conditions);
187 }
188
189 /* Note that we've left a COND_EXPR.  If we're back at unconditional scope
190    now, add any conditional cleanups we've seen to the prequeue.  */
191
192 static void
193 gimple_pop_condition (tree *pre_p)
194 {
195   int conds = --(gimplify_ctxp->conditions);
196
197   if (conds == 0)
198     {
199       append_to_statement_list (gimplify_ctxp->conditional_cleanups, pre_p);
200       gimplify_ctxp->conditional_cleanups = NULL_TREE;
201     }
202   else if (conds < 0)
203     abort ();
204 }
205
206 /* A subroutine of append_to_statement_list{,_force}.  */
207
208 static void
209 append_to_statement_list_1 (tree t, tree *list_p, bool side_effects)
210 {
211   tree list = *list_p;
212   tree_stmt_iterator i;
213
214   if (!side_effects)
215     return;
216
217   if (!list)
218     {
219       if (t && TREE_CODE (t) == STATEMENT_LIST)
220         {
221           *list_p = t;
222           return;
223         }
224       *list_p = list = alloc_stmt_list ();
225     }
226
227   i = tsi_last (list);
228   tsi_link_after (&i, t, TSI_CONTINUE_LINKING);
229 }
230
231 /* Add T to the end of the list container pointed by LIST_P.
232    If T is an expression with no effects, it is ignored.  */
233
234 void
235 append_to_statement_list (tree t, tree *list_p)
236 {
237   append_to_statement_list_1 (t, list_p, t ? TREE_SIDE_EFFECTS (t) : false);
238 }
239
240 /* Similar, but the statement is always added, regardless of side effects.  */
241
242 void
243 append_to_statement_list_force (tree t, tree *list_p)
244 {
245   append_to_statement_list_1 (t, list_p, t != NULL);
246 }
247
248 /* Both gimplify the statement T and append it to LIST_P.  */
249
250 void
251 gimplify_and_add (tree t, tree *list_p)
252 {
253   gimplify_stmt (&t);
254   append_to_statement_list (t, list_p);
255 }
256
257 /* Strip off a legitimate source ending from the input string NAME of
258    length LEN.  Rather than having to know the names used by all of
259    our front ends, we strip off an ending of a period followed by
260    up to five characters.  (Java uses ".class".)  */
261
262 static inline void
263 remove_suffix (char *name, int len)
264 {
265   int i;
266
267   for (i = 2;  i < 8 && len > i;  i++)
268     {
269       if (name[len - i] == '.')
270         {
271           name[len - i] = '\0';
272           break;
273         }
274     }
275 }
276
277 /* Create a nameless artificial label and put it in the current function
278    context.  Returns the newly created label.  */
279
280 tree
281 create_artificial_label (void)
282 {
283   tree lab = build_decl (LABEL_DECL, NULL_TREE, void_type_node);
284
285   DECL_ARTIFICIAL (lab) = 1;
286   DECL_CONTEXT (lab) = current_function_decl;
287   return lab;
288 }
289
290 /* Create a new temporary name with PREFIX.  Returns an identifier.  */
291
292 static GTY(()) unsigned int tmp_var_id_num;
293
294 tree
295 create_tmp_var_name (const char *prefix)
296 {
297   char *tmp_name;
298
299   if (prefix)
300     {
301       char *preftmp = ASTRDUP (prefix);
302
303       remove_suffix (preftmp, strlen (preftmp));
304       prefix = preftmp;
305     }
306
307   ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix ? prefix : "T", tmp_var_id_num++);
308   return get_identifier (tmp_name);
309 }
310
311
312 /* Create a new temporary variable declaration of type TYPE.
313    Does NOT push it into the current binding.  */
314
315 tree
316 create_tmp_var_raw (tree type, const char *prefix)
317 {
318   tree tmp_var;
319   tree new_type;
320
321   /* Make the type of the variable writable.  */
322   new_type = build_type_variant (type, 0, 0);
323   TYPE_ATTRIBUTES (new_type) = TYPE_ATTRIBUTES (type);
324
325   tmp_var = build_decl (VAR_DECL, create_tmp_var_name (prefix), type);
326
327   /* The variable was declared by the compiler.  */
328   DECL_ARTIFICIAL (tmp_var) = 1;
329   /* And we don't want debug info for it.  */
330   DECL_IGNORED_P (tmp_var) = 1;
331
332   /* Make the variable writable.  */
333   TREE_READONLY (tmp_var) = 0;
334
335   DECL_EXTERNAL (tmp_var) = 0;
336   TREE_STATIC (tmp_var) = 0;
337   TREE_USED (tmp_var) = 1;
338
339   return tmp_var;
340 }
341
342 /* Create a new temporary variable declaration of type TYPE.  DOES push the
343    variable into the current binding.  Further, assume that this is called
344    only from gimplification or optimization, at which point the creation of
345    certain types are bugs.  */
346
347 tree
348 create_tmp_var (tree type, const char *prefix)
349 {
350   tree tmp_var;
351
352 #if defined ENABLE_CHECKING
353   /* We don't allow types that are addressable (meaning we can't make copies),
354      incomplete, or of variable size.  */
355   if (TREE_ADDRESSABLE (type)
356       || !COMPLETE_TYPE_P (type)
357       || TREE_CODE (TYPE_SIZE_UNIT (type)) != INTEGER_CST)
358     abort ();
359 #endif
360
361   tmp_var = create_tmp_var_raw (type, prefix);
362   gimple_add_tmp_var (tmp_var);
363   return tmp_var;
364 }
365
366 /*  Given a tree, try to return a useful variable name that we can use
367     to prefix a temporary that is being assigned the value of the tree.
368     I.E. given  <temp> = &A, return A.  */
369
370 const char *
371 get_name (tree t)
372 {
373   tree stripped_decl;
374
375   stripped_decl = t;
376   STRIP_NOPS (stripped_decl);
377   if (DECL_P (stripped_decl) && DECL_NAME (stripped_decl))
378     return IDENTIFIER_POINTER (DECL_NAME (stripped_decl));
379   else
380     {
381       switch (TREE_CODE (stripped_decl))
382         {
383         case ADDR_EXPR:
384           return get_name (TREE_OPERAND (stripped_decl, 0));
385           break;
386         default:
387           return NULL;
388         }
389     }
390 }
391
392 /* Create a temporary with a name derived from VAL.  Subroutine of
393    lookup_tmp_var; nobody else should call this function.  */
394
395 static inline tree
396 create_tmp_from_val (tree val)
397 {
398   return create_tmp_var (TREE_TYPE (val), get_name (val));
399 }
400
401 /* Create a temporary to hold the value of VAL.  If IS_FORMAL, try to reuse
402    an existing expression temporary.  */
403
404 static tree
405 lookup_tmp_var (tree val, bool is_formal)
406 {
407   if (!is_formal || TREE_SIDE_EFFECTS (val))
408     return create_tmp_from_val (val);
409   else
410     {
411       elt_t elt, *elt_p;
412       void **slot;
413
414       elt.val = val;
415       slot = htab_find_slot (gimplify_ctxp->temp_htab, (void *)&elt, INSERT);
416       if (*slot == NULL)
417         {
418           elt_p = xmalloc (sizeof (*elt_p));
419           elt_p->val = val;
420           elt_p->temp = create_tmp_from_val (val);
421           *slot = (void *)elt_p;
422         }
423       else
424         elt_p = (elt_t *) *slot;
425
426       return elt_p->temp;
427     }
428 }
429
430 /* Returns a formal temporary variable initialized with VAL.  PRE_P is as
431    in gimplify_expr.  Only use this function if:
432
433    1) The value of the unfactored expression represented by VAL will not
434       change between the initialization and use of the temporary, and
435    2) The temporary will not be otherwise modified.
436
437    For instance, #1 means that this is inappropriate for SAVE_EXPR temps,
438    and #2 means it is inappropriate for && temps.
439
440    For other cases, use get_initialized_tmp_var instead.  */
441
442 static tree
443 internal_get_tmp_var (tree val, tree *pre_p, tree *post_p, bool is_formal)
444 {
445   tree t, mod;
446   char class;
447
448   gimplify_expr (&val, pre_p, post_p, is_gimple_rhs, fb_rvalue);
449
450   t = lookup_tmp_var (val, is_formal);
451
452   mod = build (MODIFY_EXPR, TREE_TYPE (t), t, val);
453
454   class = TREE_CODE_CLASS (TREE_CODE (val));
455   if (EXPR_LOCUS (val))
456     SET_EXPR_LOCUS (mod, EXPR_LOCUS (val));
457   else
458     annotate_with_locus (mod, input_location);
459
460   /* gimplify_modify_expr might want to reduce this further.  */
461   gimplify_and_add (mod, pre_p);
462   return t;
463 }
464
465 tree
466 get_formal_tmp_var (tree val, tree *pre_p)
467 {
468   return internal_get_tmp_var (val, pre_p, NULL, true);
469 }
470
471 /* Returns a temporary variable initialized with VAL.  PRE_P and POST_P
472    are as in gimplify_expr.  */
473
474 tree
475 get_initialized_tmp_var (tree val, tree *pre_p, tree *post_p)
476 {
477   return internal_get_tmp_var (val, pre_p, post_p, false);
478 }
479
480 /*  Returns true if T is a GIMPLE temporary variable, false otherwise.  */
481
482 bool
483 is_gimple_tmp_var (tree t)
484 {
485   /* FIXME this could trigger for other local artificials, too.  */
486   return (TREE_CODE (t) == VAR_DECL && DECL_ARTIFICIAL (t)
487           && !TREE_STATIC (t) && !DECL_EXTERNAL (t));
488 }
489
490 /* Declares all the variables in VARS in SCOPE.  */
491
492 void
493 declare_tmp_vars (tree vars, tree scope)
494 {
495   tree last = vars;
496   if (last)
497     {
498       tree temps;
499
500       /* C99 mode puts the default 'return 0;' for main outside the outer
501          braces.  So drill down until we find an actual scope.  */
502       while (TREE_CODE (scope) == COMPOUND_EXPR)
503         scope = TREE_OPERAND (scope, 0);
504
505       if (TREE_CODE (scope) != BIND_EXPR)
506         abort ();
507
508       temps = nreverse (last);
509       TREE_CHAIN (last) = BIND_EXPR_VARS (scope);
510       BIND_EXPR_VARS (scope) = temps;
511
512       /* We don't add the temps to the block for this BIND_EXPR, as we're
513          not interested in debugging info for them.  */
514     }
515 }
516
517 void
518 gimple_add_tmp_var (tree tmp)
519 {
520   if (TREE_CHAIN (tmp) || tmp->decl.seen_in_bind_expr)
521     abort ();
522
523   DECL_CONTEXT (tmp) = current_function_decl;
524   tmp->decl.seen_in_bind_expr = 1;
525
526   if (gimplify_ctxp)
527     {
528       TREE_CHAIN (tmp) = gimplify_ctxp->temps;
529       gimplify_ctxp->temps = tmp;
530     }
531   else if (cfun)
532     record_vars (tmp);
533   else
534     declare_tmp_vars (tmp, DECL_SAVED_TREE (current_function_decl));
535 }
536
537 /* Determines whether to assign a locus to the statement STMT.  */
538
539 static bool
540 should_carry_locus_p (tree stmt)
541 {
542   /* Don't emit a line note for a label.  We particularly don't want to
543      emit one for the break label, since it doesn't actually correspond
544      to the beginning of the loop/switch.  */
545   if (TREE_CODE (stmt) == LABEL_EXPR)
546     return false;
547
548   /* Do not annotate empty statements, since it confuses gcov.  */
549   if (!TREE_SIDE_EFFECTS (stmt))
550     return false;
551
552   return true;
553 }
554
555 static void
556 annotate_one_with_locus (tree t, location_t locus)
557 {
558   if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (t)))
559       && ! EXPR_HAS_LOCATION (t)
560       && should_carry_locus_p (t))
561     annotate_with_locus (t, locus);
562 }
563
564 void
565 annotate_all_with_locus (tree *stmt_p, location_t locus)
566 {
567   tree_stmt_iterator i;
568
569   if (!*stmt_p)
570     return;
571
572   for (i = tsi_start (*stmt_p); !tsi_end_p (i); tsi_next (&i))
573     {
574       tree t = tsi_stmt (i);
575
576 #ifdef ENABLE_CHECKING
577           /* Assuming we've already been gimplified, we shouldn't
578              see nested chaining constructs anymore.  */
579           if (TREE_CODE (t) == STATEMENT_LIST
580               || TREE_CODE (t) == COMPOUND_EXPR)
581             abort ();
582 #endif
583
584       annotate_one_with_locus (t, locus);
585     }
586 }
587
588 /* Similar to copy_tree_r() but do not copy SAVE_EXPR or TARGET_EXPR nodes.
589    These nodes model computations that should only be done once.  If we
590    were to unshare something like SAVE_EXPR(i++), the gimplification
591    process would create wrong code.  */
592
593 static tree
594 mostly_copy_tree_r (tree *tp, int *walk_subtrees, void *data)
595 {
596   enum tree_code code = TREE_CODE (*tp);
597   /* Don't unshare types, decls, constants and SAVE_EXPR nodes.  */
598   if (TREE_CODE_CLASS (code) == 't'
599       || TREE_CODE_CLASS (code) == 'd'
600       || TREE_CODE_CLASS (code) == 'c'
601       || code == SAVE_EXPR || code == TARGET_EXPR
602       /* We can't do anything sensible with a BLOCK used as an expression,
603          but we also can't abort when we see it because of non-expression
604          uses.  So just avert our eyes and cross our fingers.  Silly Java.  */
605       || code == BLOCK)
606     *walk_subtrees = 0;
607   else if (code == BIND_EXPR)
608     abort ();
609   else
610     copy_tree_r (tp, walk_subtrees, data);
611
612   return NULL_TREE;
613 }
614
615 /* Mark all the _DECL nodes under *TP as volatile.  FIXME: This must die
616    after VA_ARG_EXPRs are properly lowered.  */
617
618 static tree
619 mark_decls_volatile_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
620                        void *data ATTRIBUTE_UNUSED)
621 {
622   if (SSA_VAR_P (*tp))
623     TREE_THIS_VOLATILE (*tp) = 1;
624
625   return NULL_TREE;
626 }
627
628
629 /* Callback for walk_tree to unshare most of the shared trees rooted at
630    *TP.  If *TP has been visited already (i.e., TREE_VISITED (*TP) == 1),
631    then *TP is deep copied by calling copy_tree_r.
632
633    This unshares the same trees as copy_tree_r with the exception of
634    SAVE_EXPR nodes.  These nodes model computations that should only be
635    done once.  If we were to unshare something like SAVE_EXPR(i++), the
636    gimplification process would create wrong code.  */
637
638 static tree
639 copy_if_shared_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
640                   void *data ATTRIBUTE_UNUSED)
641 {
642   tree t = *tp;
643   enum tree_code code = TREE_CODE (t);
644
645   /* Skip types, decls, and constants.  But we do want to look at their
646      types and the bounds of types.  Mark them as visited so we properly
647      unmark their subtrees on the unmark pass.  If we've already seen them,
648      don't look down further.  */
649   if (TREE_CODE_CLASS (code) == 't'
650       || TREE_CODE_CLASS (code) == 'd'
651       || TREE_CODE_CLASS (code) == 'c')
652     {
653       if (TREE_VISITED (t))
654         *walk_subtrees = 0;
655       else
656         TREE_VISITED (t) = 1;
657     }
658
659   /* Special-case BIND_EXPR.  We should never be copying these, therefore
660      we can omit examining BIND_EXPR_VARS.  Which also avoids problems with
661      double processing of the DECL_INITIAL, which could be seen via both
662      the BIND_EXPR_VARS and a DECL_STMT.  */
663   else if (code == BIND_EXPR)
664     {
665       if (TREE_VISITED (t))
666         abort ();
667       TREE_VISITED (t) = 1;
668       *walk_subtrees = 0;
669       walk_tree (&BIND_EXPR_BODY (t), copy_if_shared_r, NULL, NULL);
670     }
671
672   /* If this node has been visited already, unshare it and don't look
673      any deeper.  */
674   else if (TREE_VISITED (t))
675     {
676       walk_tree (tp, mostly_copy_tree_r, NULL, NULL);
677       *walk_subtrees = 0;
678     }
679
680   /* Otherwise, mark the tree as visited and keep looking.  */
681   else
682     {
683       TREE_VISITED (t) = 1;
684       if (TREE_CODE (*tp) == VA_ARG_EXPR
685           && targetm.calls.gimplify_va_arg_expr == NULL)
686         {
687           /* Mark any _DECL inside the operand as volatile to avoid
688              the optimizers messing around with it. We have to do this
689              early, otherwise we might mark a variable as volatile
690              after we gimplify other statements that use the variable
691              assuming it's not volatile.  */
692
693           /* FIXME once most targets define the above hook, this should
694              go away (perhaps along with the #include "target.h").  */
695           walk_tree (&TREE_OPERAND (*tp, 0), mark_decls_volatile_r,
696                      NULL, NULL);
697         }
698     }
699
700   return NULL_TREE;
701 }
702
703 static tree
704 unmark_visited_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
705                   void *data ATTRIBUTE_UNUSED)
706 {
707   if (TREE_VISITED (*tp))
708     TREE_VISITED (*tp) = 0;
709   else
710     *walk_subtrees = 0;
711
712   return NULL_TREE;
713 }
714
715 /* Unshare all the trees in BODY_P, a pointer to the body of FNDECL, and the
716    bodies of any nested functions.  */
717
718 static void
719 unshare_body (tree *body_p, tree fndecl)
720 {
721   struct cgraph_node *cgn = cgraph_node (fndecl);
722
723   walk_tree (body_p, copy_if_shared_r, NULL, NULL);
724   for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
725     unshare_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl);
726 }
727
728 /* Likewise, but mark all trees as not visited.  */
729
730 static void
731 unvisit_body (tree *body_p, tree fndecl)
732 {
733   struct cgraph_node *cgn = cgraph_node (fndecl);
734
735   walk_tree (body_p, unmark_visited_r, NULL, NULL);
736   for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
737     unvisit_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl);
738 }
739
740 /* Unshare T and all the trees reached from T via TREE_CHAIN.  */
741
742 void
743 unshare_all_trees (tree t)
744 {
745   walk_tree (&t, copy_if_shared_r, NULL, NULL);
746   walk_tree (&t, unmark_visited_r, NULL, NULL);
747 }
748
749 /* Unconditionally make an unshared copy of EXPR.  This is used when using
750    stored expressions which span multiple functions, such as BINFO_VTABLE,
751    as the normal unsharing process can't tell that they're shared.  */
752
753 tree
754 unshare_expr (tree expr)
755 {
756   walk_tree (&expr, mostly_copy_tree_r, NULL, NULL);
757   return expr;
758 }
759
760 /* A terser interface for building a representation of a exception
761    specification.  */
762
763 tree
764 gimple_build_eh_filter (tree body, tree allowed, tree failure)
765 {
766   tree t;
767
768   /* FIXME should the allowed types go in TREE_TYPE?  */
769   t = build (EH_FILTER_EXPR, void_type_node, allowed, NULL_TREE);
770   append_to_statement_list (failure, &EH_FILTER_FAILURE (t));
771
772   t = build (TRY_CATCH_EXPR, void_type_node, NULL_TREE, t);
773   append_to_statement_list (body, &TREE_OPERAND (t, 0));
774
775   return t;
776 }
777
778 \f
779 /* WRAPPER is a code such as BIND_EXPR or CLEANUP_POINT_EXPR which can both
780    contain statements and have a value.  Assign its value to a temporary
781    and give it void_type_node.  Returns the temporary, or NULL_TREE if
782    WRAPPER was already void.  */
783
784 tree
785 voidify_wrapper_expr (tree wrapper, tree temp)
786 {
787   if (!VOID_TYPE_P (TREE_TYPE (wrapper)))
788     {
789       tree *p, sub = wrapper;
790
791     restart:
792       /* Set p to point to the body of the wrapper.  */
793       switch (TREE_CODE (sub))
794         {
795         case BIND_EXPR:
796           /* For a BIND_EXPR, the body is operand 1.  */
797           p = &BIND_EXPR_BODY (sub);
798           break;
799
800         default:
801           p = &TREE_OPERAND (sub, 0);
802           break;
803         }
804
805       /* Advance to the last statement.  Set all container types to void.  */
806       if (TREE_CODE (*p) == STATEMENT_LIST)
807         {
808           tree_stmt_iterator i = tsi_last (*p);
809           p = tsi_end_p (i) ? NULL : tsi_stmt_ptr (i);
810         }
811       else
812         { 
813           for (; TREE_CODE (*p) == COMPOUND_EXPR; p = &TREE_OPERAND (*p, 1))
814             {
815               TREE_SIDE_EFFECTS (*p) = 1;
816               TREE_TYPE (*p) = void_type_node;
817             }
818         }
819
820       if (p == NULL || IS_EMPTY_STMT (*p))
821         ;
822       /* Look through exception handling.  */
823       else if (TREE_CODE (*p) == TRY_FINALLY_EXPR
824                || TREE_CODE (*p) == TRY_CATCH_EXPR)
825         {
826           sub = *p;
827           goto restart;
828         }
829       /* The C++ frontend already did this for us.  */
830       else if (TREE_CODE (*p) == INIT_EXPR
831                || TREE_CODE (*p) == TARGET_EXPR)
832         temp = TREE_OPERAND (*p, 0);
833       /* If we're returning a dereference, move the dereference
834          outside the wrapper.  */
835       else if (TREE_CODE (*p) == INDIRECT_REF)
836         {
837           tree ptr = TREE_OPERAND (*p, 0);
838           temp = create_tmp_var (TREE_TYPE (ptr), "retval");
839           *p = build (MODIFY_EXPR, TREE_TYPE (ptr), temp, ptr);
840           temp = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (temp)), temp);
841           /* If this is a BIND_EXPR for a const inline function, it might not
842              have TREE_SIDE_EFFECTS set.  That is no longer accurate.  */
843           TREE_SIDE_EFFECTS (wrapper) = 1;
844         }
845       else
846         {
847           if (!temp)
848             temp = create_tmp_var (TREE_TYPE (wrapper), "retval");
849           *p = build (MODIFY_EXPR, TREE_TYPE (temp), temp, *p);
850           TREE_SIDE_EFFECTS (wrapper) = 1;
851         }
852
853       TREE_TYPE (wrapper) = void_type_node;
854       return temp;
855     }
856
857   return NULL_TREE;
858 }
859
860 /* Prepare calls to builtins to SAVE and RESTORE the stack as well as
861    a temporary through which they communicate.  */
862
863 static void
864 build_stack_save_restore (tree *save, tree *restore)
865 {
866   tree save_call, tmp_var;
867
868   save_call =
869       build_function_call_expr (implicit_built_in_decls[BUILT_IN_STACK_SAVE],
870                                 NULL_TREE);
871   tmp_var = create_tmp_var (ptr_type_node, "saved_stack");
872
873   *save = build (MODIFY_EXPR, ptr_type_node, tmp_var, save_call);
874   *restore =
875     build_function_call_expr (implicit_built_in_decls[BUILT_IN_STACK_RESTORE],
876                               tree_cons (NULL_TREE, tmp_var, NULL_TREE));
877 }
878
879 /* Gimplify a BIND_EXPR.  Just voidify and recurse.  */
880
881 static enum gimplify_status
882 gimplify_bind_expr (tree *expr_p, tree temp, tree *pre_p)
883 {
884   tree bind_expr = *expr_p;
885   bool old_save_stack = gimplify_ctxp->save_stack;
886   tree t;
887
888   temp = voidify_wrapper_expr (bind_expr, temp);
889
890   /* Mark variables seen in this bind expr.  */
891   for (t = BIND_EXPR_VARS (bind_expr); t ; t = TREE_CHAIN (t))
892     t->decl.seen_in_bind_expr = 1;
893
894   gimple_push_bind_expr (bind_expr);
895   gimplify_ctxp->save_stack = false;
896
897   gimplify_to_stmt_list (&BIND_EXPR_BODY (bind_expr));
898
899   if (gimplify_ctxp->save_stack)
900     {
901       tree stack_save, stack_restore;
902
903       /* Save stack on entry and restore it on exit.  Add a try_finally
904          block to achieve this.  Note that mudflap depends on the
905          format of the emitted code: see mx_register_decls().  */
906       build_stack_save_restore (&stack_save, &stack_restore);
907
908       t = build (TRY_FINALLY_EXPR, void_type_node,
909                  BIND_EXPR_BODY (bind_expr), NULL_TREE);
910       append_to_statement_list (stack_restore, &TREE_OPERAND (t, 1));
911
912       BIND_EXPR_BODY (bind_expr) = NULL_TREE;
913       append_to_statement_list (stack_save, &BIND_EXPR_BODY (bind_expr));
914       append_to_statement_list (t, &BIND_EXPR_BODY (bind_expr));
915     }
916
917   gimplify_ctxp->save_stack = old_save_stack;
918   gimple_pop_bind_expr ();
919
920   if (temp)
921     {
922       *expr_p = temp;
923       append_to_statement_list (bind_expr, pre_p);
924       return GS_OK;
925     }
926   else
927     return GS_ALL_DONE;
928 }
929
930 /* Gimplify a RETURN_EXPR.  If the expression to be returned is not a
931    GIMPLE value, it is assigned to a new temporary and the statement is
932    re-written to return the temporary.
933
934    PRE_P points to the list where side effects that must happen before
935    STMT should be stored.  */
936
937 static enum gimplify_status
938 gimplify_return_expr (tree stmt, tree *pre_p)
939 {
940   tree ret_expr = TREE_OPERAND (stmt, 0);
941   tree result_decl, result;
942
943   if (!ret_expr || TREE_CODE (ret_expr) == RESULT_DECL)
944     return GS_ALL_DONE;
945
946   if (ret_expr == error_mark_node)
947     return GS_ERROR;
948
949   if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (current_function_decl))))
950     result_decl = NULL_TREE;
951   else
952     {
953       result_decl = TREE_OPERAND (ret_expr, 0);
954 #ifdef ENABLE_CHECKING
955       if ((TREE_CODE (ret_expr) != MODIFY_EXPR
956            && TREE_CODE (ret_expr) != INIT_EXPR)
957           || TREE_CODE (result_decl) != RESULT_DECL)
958         abort ();
959 #endif
960     }
961
962   /* If aggregate_value_p is true, then we can return the bare RESULT_DECL.
963      Recall that aggregate_value_p is FALSE for any aggregate type that is
964      returned in registers.  If we're returning values in registers, then
965      we don't want to extend the lifetime of the RESULT_DECL, particularly
966      across another call.  In addition, for those aggregates for which 
967      hard_function_value generates a PARALLEL, we'll abort during normal
968      expansion of structure assignments; there's special code in expand_return
969      to handle this case that does not exist in expand_expr.  */
970   if (!result_decl
971       || aggregate_value_p (result_decl, TREE_TYPE (current_function_decl)))
972     result = result_decl;
973   else if (gimplify_ctxp->return_temp)
974     result = gimplify_ctxp->return_temp;
975   else
976     {
977       result = create_tmp_var (TREE_TYPE (result_decl), NULL);
978
979       /* ??? With complex control flow (usually involving abnormal edges),
980          we can wind up warning about an uninitialized value for this.  Due
981          to how this variable is constructed and initialized, this is never
982          true.  Give up and never warn.  */
983       TREE_NO_WARNING (result) = 1;
984
985       gimplify_ctxp->return_temp = result;
986     }
987
988   /* Smash the lhs of the MODIFY_EXPR to the temporary we plan to use.
989      Then gimplify the whole thing.  */
990   if (result != result_decl)
991     TREE_OPERAND (ret_expr, 0) = result;
992
993   gimplify_and_add (TREE_OPERAND (stmt, 0), pre_p);
994
995   /* If we didn't use a temporary, then the result is just the result_decl.
996      Otherwise we need a simple copy.  This should already be gimple.  */
997   if (result == result_decl)
998     ret_expr = result;
999   else
1000     ret_expr = build (MODIFY_EXPR, TREE_TYPE (result), result_decl, result);
1001   TREE_OPERAND (stmt, 0) = ret_expr;
1002
1003   return GS_ALL_DONE;
1004 }
1005
1006 /* Gimplify a LOOP_EXPR.  Normally this just involves gimplifying the body
1007    and replacing the LOOP_EXPR with goto, but if the loop contains an
1008    EXIT_EXPR, we need to append a label for it to jump to.  */
1009
1010 static enum gimplify_status
1011 gimplify_loop_expr (tree *expr_p, tree *pre_p)
1012 {
1013   tree saved_label = gimplify_ctxp->exit_label;
1014   tree start_label = build1 (LABEL_EXPR, void_type_node, NULL_TREE);
1015   tree jump_stmt = build_and_jump (&LABEL_EXPR_LABEL (start_label));
1016
1017   append_to_statement_list (start_label, pre_p);
1018
1019   gimplify_ctxp->exit_label = NULL_TREE;
1020
1021   gimplify_and_add (LOOP_EXPR_BODY (*expr_p), pre_p);
1022
1023   if (gimplify_ctxp->exit_label)
1024     {
1025       append_to_statement_list (jump_stmt, pre_p);
1026       *expr_p = build1 (LABEL_EXPR, void_type_node, gimplify_ctxp->exit_label);
1027     }
1028   else
1029     *expr_p = jump_stmt;
1030
1031   gimplify_ctxp->exit_label = saved_label;
1032
1033   return GS_ALL_DONE;
1034 }
1035
1036 /* Compare two case labels.  Because the front end should already have
1037    made sure that case ranges do not overlap, it is enough to only compare
1038    the CASE_LOW values of each case label.  */
1039
1040 static int
1041 compare_case_labels (const void *p1, const void *p2)
1042 {
1043   tree case1 = *(tree *)p1;
1044   tree case2 = *(tree *)p2;
1045
1046   return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
1047 }
1048
1049 /* Sort the case labels in LABEL_VEC in ascending order.  */
1050
1051 void
1052 sort_case_labels (tree label_vec)
1053 {
1054   size_t len = TREE_VEC_LENGTH (label_vec);
1055   tree default_case = TREE_VEC_ELT (label_vec, len - 1);
1056
1057   if (CASE_LOW (default_case))
1058     {
1059       size_t i;
1060
1061       /* The last label in the vector should be the default case
1062          but it is not.  */
1063       for (i = 0; i < len; ++i)
1064         {
1065           tree t = TREE_VEC_ELT (label_vec, i);
1066           if (!CASE_LOW (t))
1067             {
1068               default_case = t;
1069               TREE_VEC_ELT (label_vec, i) = TREE_VEC_ELT (label_vec, len - 1);
1070               TREE_VEC_ELT (label_vec, len - 1) = default_case;
1071               break;
1072             }
1073         }
1074     }
1075
1076   qsort (&TREE_VEC_ELT (label_vec, 0), len - 1, sizeof (tree),
1077          compare_case_labels);
1078 }
1079
1080 /* Gimplify a SWITCH_EXPR, and collect a TREE_VEC of the labels it can
1081    branch to.  */
1082
1083 static enum gimplify_status
1084 gimplify_switch_expr (tree *expr_p, tree *pre_p)
1085 {
1086   tree switch_expr = *expr_p;
1087   enum gimplify_status ret;
1088
1089   ret = gimplify_expr (&SWITCH_COND (switch_expr), pre_p, NULL,
1090                        is_gimple_val, fb_rvalue);
1091
1092   if (SWITCH_BODY (switch_expr))
1093     {
1094       varray_type labels, saved_labels;
1095       tree label_vec, default_case = NULL_TREE;
1096       size_t i, len;
1097
1098       /* If someone can be bothered to fill in the labels, they can
1099          be bothered to null out the body too.  */
1100       if (SWITCH_LABELS (switch_expr))
1101         abort ();
1102
1103       saved_labels = gimplify_ctxp->case_labels;
1104       VARRAY_TREE_INIT (gimplify_ctxp->case_labels, 8, "case_labels");
1105
1106       gimplify_to_stmt_list (&SWITCH_BODY (switch_expr));
1107
1108       labels = gimplify_ctxp->case_labels;
1109       gimplify_ctxp->case_labels = saved_labels;
1110
1111       len = VARRAY_ACTIVE_SIZE (labels);
1112
1113       for (i = 0; i < len; ++i)
1114         {
1115           tree t = VARRAY_TREE (labels, i);
1116           if (!CASE_LOW (t))
1117             {
1118               /* The default case must be the last label in the list.  */
1119               default_case = t;
1120               VARRAY_TREE (labels, i) = VARRAY_TREE (labels, len - 1);
1121               len--;
1122               break;
1123             }
1124         }
1125
1126       label_vec = make_tree_vec (len + 1);
1127       SWITCH_LABELS (*expr_p) = label_vec;
1128       append_to_statement_list (switch_expr, pre_p);
1129
1130       if (! default_case)
1131         {
1132           /* If the switch has no default label, add one, so that we jump
1133              around the switch body.  */
1134           default_case = build (CASE_LABEL_EXPR, void_type_node, NULL_TREE,
1135                                 NULL_TREE, create_artificial_label ());
1136           append_to_statement_list (SWITCH_BODY (switch_expr), pre_p);
1137           *expr_p = build (LABEL_EXPR, void_type_node,
1138                            CASE_LABEL (default_case));
1139         }
1140       else
1141         *expr_p = SWITCH_BODY (switch_expr);
1142
1143       for (i = 0; i < len; ++i)
1144         TREE_VEC_ELT (label_vec, i) = VARRAY_TREE (labels, i);
1145       TREE_VEC_ELT (label_vec, len) = default_case;
1146
1147       sort_case_labels (label_vec);
1148
1149       SWITCH_BODY (switch_expr) = NULL;
1150     }
1151   else if (!SWITCH_LABELS (switch_expr))
1152     abort ();
1153
1154   return ret;
1155 }
1156
1157 static enum gimplify_status
1158 gimplify_case_label_expr (tree *expr_p)
1159 {
1160   tree expr = *expr_p;
1161   if (gimplify_ctxp->case_labels)
1162     VARRAY_PUSH_TREE (gimplify_ctxp->case_labels, expr);
1163   else
1164     abort ();
1165   *expr_p = build (LABEL_EXPR, void_type_node, CASE_LABEL (expr));
1166   return GS_ALL_DONE;
1167 }
1168
1169 /* Gimplify a LABELED_BLOCK_EXPR into a LABEL_EXPR following
1170    a (possibly empty) body.  */
1171
1172 static enum gimplify_status
1173 gimplify_labeled_block_expr (tree *expr_p)
1174 {
1175   tree body = LABELED_BLOCK_BODY (*expr_p);
1176   tree label = LABELED_BLOCK_LABEL (*expr_p);
1177   tree t;
1178
1179   DECL_CONTEXT (label) = current_function_decl;
1180   t = build (LABEL_EXPR, void_type_node, label);
1181   if (body != NULL_TREE)
1182     t = build (COMPOUND_EXPR, void_type_node, body, t);
1183   *expr_p = t;
1184
1185   return GS_OK;
1186 }
1187
1188 /* Gimplify a EXIT_BLOCK_EXPR into a GOTO_EXPR.  */
1189
1190 static enum gimplify_status
1191 gimplify_exit_block_expr (tree *expr_p)
1192 {
1193   tree labeled_block = TREE_OPERAND (*expr_p, 0);
1194   tree label;
1195
1196   /* First operand must be a LABELED_BLOCK_EXPR, which should
1197      already be lowered (or partially lowered) when we get here.  */
1198 #if defined ENABLE_CHECKING
1199   if (TREE_CODE (labeled_block) != LABELED_BLOCK_EXPR)
1200     abort ();
1201 #endif
1202
1203   label = LABELED_BLOCK_LABEL (labeled_block);
1204   *expr_p = build1 (GOTO_EXPR, void_type_node, label);
1205
1206   return GS_OK;
1207 }
1208
1209 /* Build a GOTO to the LABEL_DECL pointed to by LABEL_P, building it first
1210    if necessary.  */
1211
1212 tree
1213 build_and_jump (tree *label_p)
1214 {
1215   if (label_p == NULL)
1216     /* If there's nowhere to jump, just fall through.  */
1217     return NULL_TREE;
1218
1219   if (*label_p == NULL_TREE)
1220     {
1221       tree label = create_artificial_label ();
1222       *label_p = label;
1223     }
1224
1225   return build1 (GOTO_EXPR, void_type_node, *label_p);
1226 }
1227
1228 /* Gimplify an EXIT_EXPR by converting to a GOTO_EXPR inside a COND_EXPR.
1229    This also involves building a label to jump to and communicating it to
1230    gimplify_loop_expr through gimplify_ctxp->exit_label.  */
1231
1232 static enum gimplify_status
1233 gimplify_exit_expr (tree *expr_p)
1234 {
1235   tree cond = TREE_OPERAND (*expr_p, 0);
1236   tree expr;
1237
1238   expr = build_and_jump (&gimplify_ctxp->exit_label);
1239   expr = build (COND_EXPR, void_type_node, cond, expr, NULL_TREE);
1240   *expr_p = expr;
1241
1242   return GS_OK;
1243 }
1244
1245 /* A helper function to be called via walk_tree.  Mark all labels under *TP
1246    as being forced.  To be called for DECL_INITIAL of static variables.  */
1247
1248 tree
1249 force_labels_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
1250 {
1251   if (TYPE_P (*tp))
1252     *walk_subtrees = 0;
1253   if (TREE_CODE (*tp) == LABEL_DECL)
1254     FORCED_LABEL (*tp) = 1;
1255
1256   return NULL_TREE;
1257 }
1258
1259 /* Break out elements of a constructor used as an initializer into separate
1260    MODIFY_EXPRs.
1261
1262    Note that we still need to clear any elements that don't have explicit
1263    initializers, so if not all elements are initialized we keep the
1264    original MODIFY_EXPR, we just remove all of the constructor elements.  */
1265
1266 static enum gimplify_status
1267 gimplify_init_constructor (tree *expr_p, tree *pre_p,
1268                            tree *post_p, bool want_value)
1269 {
1270   tree object = TREE_OPERAND (*expr_p, 0);
1271   tree ctor = TREE_OPERAND (*expr_p, 1);
1272   tree type = TREE_TYPE (ctor);
1273   enum gimplify_status ret;
1274   tree elt_list;
1275
1276   if (TREE_CODE (ctor) != CONSTRUCTOR)
1277     return GS_UNHANDLED;
1278
1279   elt_list = CONSTRUCTOR_ELTS (ctor);
1280
1281   ret = GS_ALL_DONE;
1282   switch (TREE_CODE (type))
1283     {
1284     case RECORD_TYPE:
1285     case UNION_TYPE:
1286     case QUAL_UNION_TYPE:
1287     case ARRAY_TYPE:
1288       {
1289         HOST_WIDE_INT i, num_elements, num_nonzero_elements;
1290         HOST_WIDE_INT num_nonconstant_elements;
1291         bool cleared;
1292
1293         /* Aggregate types must lower constructors to initialization of
1294            individual elements.  The exception is that a CONSTRUCTOR node
1295            with no elements indicates zero-initialization of the whole.  */
1296         if (elt_list == NULL)
1297           {
1298             if (want_value)
1299               {
1300                 *expr_p = object;
1301                 return GS_OK;
1302               }
1303             else
1304               return GS_UNHANDLED;
1305           }
1306
1307         categorize_ctor_elements (ctor, &num_nonzero_elements,
1308                                   &num_nonconstant_elements);
1309         num_elements = count_type_elements (TREE_TYPE (ctor));
1310
1311         /* If a const aggregate variable is being initialized, then it
1312            should never be a lose to promote the variable to be static.  */
1313         if (num_nonconstant_elements == 0
1314             && TREE_READONLY (object)
1315             && TREE_CODE (object) == VAR_DECL)
1316           {
1317             DECL_INITIAL (object) = ctor;
1318             TREE_STATIC (object) = 1;
1319             if (!DECL_NAME (object))
1320               DECL_NAME (object) = create_tmp_var_name ("C");
1321             walk_tree (&DECL_INITIAL (object), force_labels_r, NULL, NULL);
1322
1323             /* ??? C++ doesn't automatically append a .<number> to the
1324                assembler name, and even when it does, it looks a FE private
1325                data structures to figure out what that number should be,
1326                which are not set for this variable.  I suppose this is
1327                important for local statics for inline functions, which aren't
1328                "local" in the object file sense.  So in order to get a unique
1329                TU-local symbol, we must invoke the lhd version now.  */
1330             lhd_set_decl_assembler_name (object);
1331
1332             *expr_p = NULL_TREE;
1333             break;
1334           }
1335
1336         /* If there are "lots" of initialized elements, and all of them
1337            are valid address constants, then the entire initializer can
1338            be dropped to memory, and then memcpy'd out.  */
1339         if (num_nonconstant_elements == 0)
1340           {
1341             HOST_WIDE_INT size = int_size_in_bytes (type);
1342             unsigned int align;
1343
1344             /* ??? We can still get unbounded array types, at least
1345                from the C++ front end.  This seems wrong, but attempt
1346                to work around it for now.  */
1347             if (size < 0)
1348               {
1349                 size = int_size_in_bytes (TREE_TYPE (object));
1350                 if (size >= 0)
1351                   TREE_TYPE (ctor) = type = TREE_TYPE (object);
1352               }
1353
1354             /* Find the maximum alignment we can assume for the object.  */
1355             /* ??? Make use of DECL_OFFSET_ALIGN.  */
1356             if (DECL_P (object))
1357               align = DECL_ALIGN (object);
1358             else
1359               align = TYPE_ALIGN (type);
1360
1361             if (size > 0 && !can_move_by_pieces (size, align))
1362               {
1363                 tree new = create_tmp_var_raw (type, "C");
1364                 gimple_add_tmp_var (new);
1365                 TREE_STATIC (new) = 1;
1366                 TREE_READONLY (new) = 1;
1367                 DECL_INITIAL (new) = ctor;
1368                 if (align > DECL_ALIGN (new))
1369                   {
1370                     DECL_ALIGN (new) = align;
1371                     DECL_USER_ALIGN (new) = 1;
1372                   }
1373                 walk_tree (&DECL_INITIAL (new), force_labels_r, NULL, NULL);
1374
1375                 TREE_OPERAND (*expr_p, 1) = new;
1376                 break;
1377               }
1378           }
1379
1380         /* If there are "lots" of initialized elements, even discounting
1381            those that are not address constants (and thus *must* be 
1382            computed at runtime), then partition the constructor into
1383            constant and non-constant parts.  Block copy the constant
1384            parts in, then generate code for the non-constant parts.  */
1385         /* TODO.  There's code in cp/typeck.c to do this.  */
1386
1387         /* If there are "lots" of zeros, then block clear the object first.  */
1388         cleared = false;
1389         if (num_elements - num_nonzero_elements > CLEAR_RATIO
1390             && num_nonzero_elements < num_elements/4)
1391           cleared = true;
1392
1393         /* ??? This bit ought not be needed.  For any element not present
1394            in the initializer, we should simply set them to zero.  Except
1395            we'd need to *find* the elements that are not present, and that
1396            requires trickery to avoid quadratic compile-time behavior in
1397            large cases or excessive memory use in small cases.  */
1398         else
1399           {
1400             HOST_WIDE_INT len = list_length (elt_list);
1401             if (TREE_CODE (type) == ARRAY_TYPE)
1402               {
1403                 tree nelts = array_type_nelts (type);
1404                 if (!host_integerp (nelts, 1)
1405                     || tree_low_cst (nelts, 1) != len)
1406                   cleared = 1;;
1407               }
1408             else if (len != fields_length (type))
1409               cleared = 1;
1410           }
1411
1412         if (cleared)
1413           {
1414             CONSTRUCTOR_ELTS (ctor) = NULL_TREE;
1415             append_to_statement_list (*expr_p, pre_p);
1416           }
1417
1418         for (i = 0; elt_list; i++, elt_list = TREE_CHAIN (elt_list))
1419           {
1420             tree purpose, value, cref, init;
1421
1422             purpose = TREE_PURPOSE (elt_list);
1423             value = TREE_VALUE (elt_list);
1424
1425             if (cleared && initializer_zerop (value))
1426               continue;
1427
1428             if (TREE_CODE (type) == ARRAY_TYPE)
1429               {
1430                 tree t = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (object)));
1431
1432                 /* ??? Here's to hoping the front end fills in all of the
1433                    indicies, so we don't have to figure out what's missing
1434                    ourselves.  */
1435                 if (!purpose)
1436                   abort ();
1437                 /* ??? Need to handle this.  */
1438                 if (TREE_CODE (purpose) == RANGE_EXPR)
1439                   abort ();
1440
1441                 cref = build (ARRAY_REF, t, object, purpose, NULL_TREE, NULL_TREE);
1442               }
1443             else
1444               cref = build (COMPONENT_REF, TREE_TYPE (purpose), object,
1445                             purpose, NULL_TREE);
1446
1447             init = build (MODIFY_EXPR, TREE_TYPE (purpose), cref, value);
1448
1449             /* Each member initialization is a full-expression.  */
1450             gimplify_and_add (init, pre_p);
1451           }
1452
1453         *expr_p = NULL_TREE;
1454       }
1455       break;
1456
1457     case COMPLEX_TYPE:
1458       {
1459         tree r, i;
1460
1461         /* Extract the real and imaginary parts out of the ctor.  */
1462         r = i = NULL_TREE;
1463         if (elt_list)
1464           {
1465             r = TREE_VALUE (elt_list);
1466             elt_list = TREE_CHAIN (elt_list);
1467             if (elt_list)
1468               {
1469                 i = TREE_VALUE (elt_list);
1470                 if (TREE_CHAIN (elt_list))
1471                   abort ();
1472               }
1473           }
1474         if (r == NULL || i == NULL)
1475           {
1476             tree zero = convert (TREE_TYPE (type), integer_zero_node);
1477             if (r == NULL)
1478               r = zero;
1479             if (i == NULL)
1480               i = zero;
1481           }
1482
1483         /* Complex types have either COMPLEX_CST or COMPLEX_EXPR to
1484            represent creation of a complex value.  */
1485         if (TREE_CONSTANT (r) && TREE_CONSTANT (i))
1486           {
1487             ctor = build_complex (type, r, i);
1488             TREE_OPERAND (*expr_p, 1) = ctor;
1489           }
1490         else
1491           {
1492             ctor = build (COMPLEX_EXPR, type, r, i);
1493             TREE_OPERAND (*expr_p, 1) = ctor;
1494             ret = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
1495                                  is_gimple_rhs, fb_rvalue);
1496           }
1497       }
1498       break;
1499
1500     case VECTOR_TYPE:
1501       /* Go ahead and simplify constant constructors to VECTOR_CST.  */
1502       if (TREE_CONSTANT (ctor))
1503         TREE_OPERAND (*expr_p, 1) = build_vector (type, elt_list);
1504       else
1505         {
1506           /* Vector types use CONSTRUCTOR all the way through gimple
1507              compilation as a general initializer.  */
1508           for (; elt_list; elt_list = TREE_CHAIN (elt_list))
1509             {
1510               enum gimplify_status tret;
1511               tret = gimplify_expr (&TREE_VALUE (elt_list), pre_p, post_p,
1512                                     is_gimple_constructor_elt, fb_rvalue);
1513               if (tret == GS_ERROR)
1514                 ret = GS_ERROR;
1515             }
1516         }
1517       break;
1518
1519     default:
1520       /* So how did we get a CONSTRUCTOR for a scalar type?  */
1521       abort ();
1522     }
1523
1524   if (ret == GS_ERROR)
1525     return GS_ERROR;
1526   else if (want_value)
1527     {
1528       append_to_statement_list (*expr_p, pre_p);
1529       *expr_p = object;
1530       return GS_OK;
1531     }
1532   else
1533     return GS_ALL_DONE;
1534 }
1535
1536 /* *EXPR_P is a COMPONENT_REF being used as an rvalue.  If its type is
1537    different from its canonical type, wrap the whole thing inside a
1538    NOP_EXPR and force the type of the COMPONENT_REF to be the canonical
1539    type.
1540
1541    The canonical type of a COMPONENT_REF is the type of the field being
1542    referenced--unless the field is a bit-field which can be read directly
1543    in a smaller mode, in which case the canonical type is the
1544    sign-appropriate type corresponding to that mode.  */
1545
1546 static void
1547 canonicalize_component_ref (tree *expr_p)
1548 {
1549   tree expr = *expr_p;
1550   tree type;
1551
1552   if (TREE_CODE (expr) != COMPONENT_REF)
1553     abort ();
1554
1555   if (INTEGRAL_TYPE_P (TREE_TYPE (expr)))
1556     type = TREE_TYPE (get_unwidened (expr, NULL_TREE));
1557   else
1558     type = TREE_TYPE (TREE_OPERAND (expr, 1));
1559
1560   if (TREE_TYPE (expr) != type)
1561     {
1562       tree old_type = TREE_TYPE (expr);
1563
1564       /* Set the type of the COMPONENT_REF to the underlying type.  */
1565       TREE_TYPE (expr) = type;
1566
1567       /* And wrap the whole thing inside a NOP_EXPR.  */
1568       expr = build1 (NOP_EXPR, old_type, expr);
1569
1570       *expr_p = expr;
1571     }
1572 }
1573
1574 /* If a NOP conversion is changing a pointer to array of foo to a pointer
1575    to foo, embed that change in the ADDR_EXPR by converting 
1576       T array[U];
1577       (T *)&array
1578    ==>
1579       &array[L]
1580    where L is the lower bound.  For simplicity, only do this for constant
1581    lower bound.  */
1582
1583 static void
1584 canonicalize_addr_expr (tree *expr_p)
1585 {
1586   tree expr = *expr_p;
1587   tree ctype = TREE_TYPE (expr);
1588   tree addr_expr = TREE_OPERAND (expr, 0);
1589   tree atype = TREE_TYPE (addr_expr);
1590   tree dctype, datype, ddatype, otype, obj_expr;
1591
1592   /* Both cast and addr_expr types should be pointers.  */
1593   if (!POINTER_TYPE_P (ctype) || !POINTER_TYPE_P (atype))
1594     return;
1595
1596   /* The addr_expr type should be a pointer to an array.  */
1597   datype = TREE_TYPE (atype);
1598   if (TREE_CODE (datype) != ARRAY_TYPE)
1599     return;
1600
1601   /* Both cast and addr_expr types should address the same object type.  */
1602   dctype = TREE_TYPE (ctype);
1603   ddatype = TREE_TYPE (datype);
1604   if (!lang_hooks.types_compatible_p (ddatype, dctype))
1605     return;
1606
1607   /* The addr_expr and the object type should match.  */
1608   obj_expr = TREE_OPERAND (addr_expr, 0);
1609   otype = TREE_TYPE (obj_expr);
1610   if (!lang_hooks.types_compatible_p (otype, datype))
1611     return;
1612
1613   /* The lower bound and element sizes must be constant.  */
1614   if (TREE_CODE (TYPE_SIZE_UNIT (dctype)) != INTEGER_CST
1615       || !TYPE_DOMAIN (datype) || !TYPE_MIN_VALUE (TYPE_DOMAIN (datype))
1616       || TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (datype))) != INTEGER_CST)
1617     return;
1618
1619   /* All checks succeeded.  Build a new node to merge the cast.  */
1620   *expr_p = build4 (ARRAY_REF, dctype, obj_expr,
1621                     TYPE_MIN_VALUE (TYPE_DOMAIN (datype)),
1622                     TYPE_MIN_VALUE (TYPE_DOMAIN (datype)),
1623                     size_binop (EXACT_DIV_EXPR, TYPE_SIZE_UNIT (dctype),
1624                                 size_int (TYPE_ALIGN (dctype)
1625                                           / BITS_PER_UNIT)));
1626   *expr_p = build1 (ADDR_EXPR, ctype, *expr_p);
1627 }
1628
1629 /* *EXPR_P is a NOP_EXPR or CONVERT_EXPR.  Remove it and/or other conversions
1630    underneath as appropriate.  */
1631
1632 static enum gimplify_status
1633 gimplify_conversion (tree *expr_p)
1634 {  
1635   /* Strip away as many useless type conversions as possible
1636      at the toplevel.  */
1637   STRIP_USELESS_TYPE_CONVERSION (*expr_p);
1638
1639   /* If we still have a conversion at the toplevel, then strip
1640      away all but the outermost conversion.  */
1641   if (TREE_CODE (*expr_p) == NOP_EXPR || TREE_CODE (*expr_p) == CONVERT_EXPR)
1642     {
1643       STRIP_SIGN_NOPS (TREE_OPERAND (*expr_p, 0));
1644
1645       /* And remove the outermost conversion if it's useless.  */
1646       if (tree_ssa_useless_type_conversion (*expr_p))
1647         *expr_p = TREE_OPERAND (*expr_p, 0);
1648     }
1649
1650   /* If we still have a conversion at the toplevel,
1651      then canonicalize some constructs.  */
1652   if (TREE_CODE (*expr_p) == NOP_EXPR || TREE_CODE (*expr_p) == CONVERT_EXPR)
1653     {
1654       tree sub = TREE_OPERAND (*expr_p, 0);
1655
1656       /* If a NOP conversion is changing the type of a COMPONENT_REF
1657          expression, then canonicalize its type now in order to expose more
1658          redundant conversions.  */
1659       if (TREE_CODE (sub) == COMPONENT_REF)
1660         canonicalize_component_ref (&TREE_OPERAND (*expr_p, 0));
1661
1662       /* If a NOP conversion is changing a pointer to array of foo
1663          to a pointer to foo, embed that change in the ADDR_EXPR.  */
1664       else if (TREE_CODE (sub) == ADDR_EXPR)
1665         canonicalize_addr_expr (expr_p);
1666     }
1667
1668   return GS_OK;
1669 }
1670
1671 /* Reduce MIN/MAX_EXPR to a COND_EXPR for further gimplification.  */
1672
1673 static enum gimplify_status
1674 gimplify_minimax_expr (tree *expr_p, tree *pre_p, tree *post_p)
1675 {
1676   tree op1 = TREE_OPERAND (*expr_p, 0);
1677   tree op2 = TREE_OPERAND (*expr_p, 1);
1678   enum tree_code code;
1679   enum gimplify_status r0, r1;
1680
1681   if (TREE_CODE (*expr_p) == MIN_EXPR)
1682     code = LE_EXPR;
1683   else
1684     code = GE_EXPR;
1685
1686   r0 = gimplify_expr (&op1, pre_p, post_p, is_gimple_val, fb_rvalue);
1687   r1 = gimplify_expr (&op2, pre_p, post_p, is_gimple_val, fb_rvalue);
1688
1689   *expr_p = build (COND_EXPR, TREE_TYPE (*expr_p),
1690                    build (code, boolean_type_node, op1, op2),
1691                    op1, op2);
1692
1693   if (r0 == GS_ERROR || r1 == GS_ERROR)
1694     return GS_ERROR;
1695   else
1696     return GS_OK;
1697 }
1698
1699 /* Subroutine of gimplify_compound_lval.
1700    Converts an ARRAY_REF to the equivalent *(&array + offset) form.  */
1701
1702 static enum gimplify_status
1703 gimplify_array_ref_to_plus (tree *expr_p, tree *pre_p, tree *post_p)
1704 {
1705   tree array = TREE_OPERAND (*expr_p, 0);
1706   tree arrtype = TREE_TYPE (array);
1707   tree elttype = TREE_TYPE (arrtype);
1708   tree size = array_ref_element_size (*expr_p);
1709   tree ptrtype = build_pointer_type (elttype);
1710   enum tree_code add_code = PLUS_EXPR;
1711   tree idx = TREE_OPERAND (*expr_p, 1);
1712   tree minidx = unshare_expr (array_ref_low_bound (*expr_p));
1713   tree offset, addr, result;
1714   enum gimplify_status ret;
1715
1716   /* If the array domain does not start at zero, apply the offset.  */
1717   if (!integer_zerop (minidx))
1718     {
1719       idx = convert (TREE_TYPE (minidx), idx);
1720       idx = fold (build (MINUS_EXPR, TREE_TYPE (minidx), idx, minidx));
1721     }
1722   
1723   /* If the index is negative -- a technically invalid situation now
1724      that we've biased the index back to zero -- then casting it to
1725      unsigned has ill effects.  In particular, -1*4U/4U != -1.
1726      Represent this as a subtraction of a positive rather than addition
1727      of a negative.  This will prevent any conversion back to ARRAY_REF
1728      from getting the wrong results from the division.  */
1729   if (TREE_CODE (idx) == INTEGER_CST && tree_int_cst_sgn (idx) < 0)
1730     {
1731       idx = fold (build1 (NEGATE_EXPR, TREE_TYPE (idx), idx));
1732       add_code = MINUS_EXPR;
1733     }
1734
1735   /* Pointer arithmetic must be done in sizetype.  */
1736   idx = fold_convert (sizetype, idx);
1737
1738   /* Convert the index to a byte offset.  */
1739   offset = size_binop (MULT_EXPR, size, idx);
1740
1741   ret = gimplify_expr (&array, pre_p, post_p, is_gimple_min_lval, fb_lvalue);
1742   if (ret == GS_ERROR)
1743     return ret;
1744
1745   addr = build_fold_addr_expr_with_type (array, ptrtype);
1746   result = fold (build (add_code, ptrtype, addr, offset));
1747   *expr_p = build1 (INDIRECT_REF, elttype, result);
1748
1749   return GS_OK;
1750 }
1751
1752 /*  Build an expression for the address of T.  Folds away INDIRECT_REF to
1753     avoid confusing the gimplify process.  */
1754
1755 static tree
1756 build_addr_expr_with_type (tree t, tree ptrtype)
1757 {
1758   if (TREE_CODE (t) == INDIRECT_REF)
1759     {
1760       t = TREE_OPERAND (t, 0);
1761       if (TREE_TYPE (t) != ptrtype)
1762         t = build1 (NOP_EXPR, ptrtype, t);
1763     }
1764   else
1765     {
1766       tree base = t;
1767
1768       if (TREE_CODE (base) == REALPART_EXPR
1769           || TREE_CODE (base) == IMAGPART_EXPR)
1770         base = TREE_OPERAND (base, 0);
1771       else
1772         while (handled_component_p (base))
1773           base = TREE_OPERAND (base, 0);
1774
1775       if (DECL_P (base))
1776         TREE_ADDRESSABLE (base) = 1;
1777
1778       t = build1 (ADDR_EXPR, ptrtype, t);
1779     }
1780
1781   return t;
1782 }
1783
1784 static tree
1785 build_addr_expr (tree t)
1786 {
1787   return build_addr_expr_with_type (t, build_pointer_type (TREE_TYPE (t)));
1788 }
1789
1790 /* Gimplify the COMPONENT_REF, ARRAY_REF, REALPART_EXPR or IMAGPART_EXPR
1791    node pointed by EXPR_P.
1792
1793       compound_lval
1794               : min_lval '[' val ']'
1795               | min_lval '.' ID
1796               | compound_lval '[' val ']'
1797               | compound_lval '.' ID
1798
1799    This is not part of the original SIMPLE definition, which separates
1800    array and member references, but it seems reasonable to handle them
1801    together.  Also, this way we don't run into problems with union
1802    aliasing; gcc requires that for accesses through a union to alias, the
1803    union reference must be explicit, which was not always the case when we
1804    were splitting up array and member refs.
1805
1806    PRE_P points to the list where side effects that must happen before
1807      *EXPR_P should be stored.
1808
1809    POST_P points to the list where side effects that must happen after
1810      *EXPR_P should be stored.  */
1811
1812 static enum gimplify_status
1813 gimplify_compound_lval (tree *expr_p, tree *pre_p,
1814                         tree *post_p, bool want_lvalue)
1815 {
1816   tree *p;
1817   varray_type stack;
1818   enum gimplify_status ret = GS_OK, tret;
1819
1820 #if defined ENABLE_CHECKING
1821   if (TREE_CODE (*expr_p) != ARRAY_REF
1822       && TREE_CODE (*expr_p) != ARRAY_RANGE_REF
1823       && TREE_CODE (*expr_p) != COMPONENT_REF
1824       && TREE_CODE (*expr_p) != BIT_FIELD_REF
1825       && TREE_CODE (*expr_p) != REALPART_EXPR
1826       && TREE_CODE (*expr_p) != IMAGPART_EXPR)
1827     abort ();
1828 #endif
1829
1830   /* Create a stack of the subexpressions so later we can walk them in
1831      order from inner to outer.  */
1832   VARRAY_TREE_INIT (stack, 10, "stack");
1833
1834   /* We can either handle one REALPART_EXPR or IMAGEPART_EXPR or
1835      nest of handled components.  */
1836   if (TREE_CODE (*expr_p) == REALPART_EXPR
1837       || TREE_CODE (*expr_p) == IMAGPART_EXPR)
1838     p = &TREE_OPERAND (*expr_p, 0);
1839   else
1840     for (p = expr_p; handled_component_p (*p); p = &TREE_OPERAND (*p, 0))
1841       VARRAY_PUSH_TREE (stack, *p);
1842
1843   /* Now STACK is a stack of pointers to all the refs we've walked through
1844      and P points to the innermost expression.
1845
1846      Process each of the outer nodes from left to right, then gimplify the
1847      base.  We need to do it in this order so that PLACEHOLDER_EXPRs
1848      can be resolved.  */
1849   for (; VARRAY_ACTIVE_SIZE (stack) > 0; )
1850     {
1851       tree t = VARRAY_TOP_TREE (stack);
1852
1853       if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
1854         {
1855           /* Gimplify the dimension.
1856              Temporary fix for gcc.c-torture/execute/20040313-1.c.
1857              Gimplify non-constant array indices into a temporary
1858              variable.
1859              FIXME - The real fix is to gimplify post-modify
1860              expressions into a minimal gimple lvalue.  However, that
1861              exposes bugs in alias analysis.  The alias analyzer does
1862              not handle &PTR->FIELD very well.  Will fix after the
1863              branch is merged into mainline (dnovillo 2004-05-03).  */
1864           if (!is_gimple_min_invariant (TREE_OPERAND (t, 1)))
1865             {
1866               tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
1867                                     is_gimple_tmp_var, fb_rvalue);
1868               ret = MIN (ret, tret);
1869             }
1870
1871           /* Gimplify the low bound and element type size and put them into
1872              the ARRAY_REF.  If these values are set, they have already been
1873              gimplified.  */
1874           if (!TREE_OPERAND (t, 2))
1875             {
1876               tree low = unshare_expr (array_ref_low_bound (t));
1877               if (!is_gimple_min_invariant (low))
1878                 {
1879                   TREE_OPERAND (t, 2) = low;
1880                   tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1881                                         is_gimple_tmp_var, fb_rvalue);
1882                   ret = MIN (ret, tret);
1883                 }
1884             }
1885
1886           if (!TREE_OPERAND (t, 3))
1887             {
1888               tree elmt_type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0)));
1889               tree elmt_size = unshare_expr (array_ref_element_size (t));
1890               tree factor = size_int (TYPE_ALIGN (elmt_type) / BITS_PER_UNIT);
1891
1892               /* Divide the element size by the alignment of the element
1893                  type (above).  */
1894               elmt_size = size_binop (EXACT_DIV_EXPR, elmt_size, factor);
1895
1896               if (!is_gimple_min_invariant (elmt_size))
1897                 {
1898                   TREE_OPERAND (t, 3) = elmt_size;
1899                   tret = gimplify_expr (&TREE_OPERAND (t, 3), pre_p, post_p,
1900                                         is_gimple_tmp_var, fb_rvalue);
1901                   ret = MIN (ret, tret);
1902                 }
1903             }
1904         }
1905       else if (TREE_CODE (t) == COMPONENT_REF)
1906         {
1907           /* Set the field offset into T and gimplify it.  */
1908           if (!TREE_OPERAND (t, 2))
1909             {
1910               tree offset = unshare_expr (component_ref_field_offset (t));
1911               tree field = TREE_OPERAND (t, 1);
1912               tree factor
1913                 = size_int (DECL_OFFSET_ALIGN (field) / BITS_PER_UNIT);
1914
1915               /* Divide the offset by its alignment.  */
1916               offset = size_binop (EXACT_DIV_EXPR, offset, factor);
1917
1918               if (!is_gimple_min_invariant (offset))
1919                 {
1920                   TREE_OPERAND (t, 2) = offset;
1921                   tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1922                                         is_gimple_tmp_var, fb_rvalue);
1923                   ret = MIN (ret, tret);
1924                 }
1925             }
1926         }
1927       else if (TREE_CODE (t) == BIT_FIELD_REF)
1928         {
1929           tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
1930                                 is_gimple_val, fb_rvalue);
1931           ret = MIN (ret, tret);
1932           tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1933                                 is_gimple_val, fb_rvalue);
1934           ret = MIN (ret, tret);
1935         }
1936           
1937       recalculate_side_effects (t);
1938       VARRAY_POP (stack);
1939     }
1940
1941   tret = gimplify_expr (p, pre_p, post_p, is_gimple_min_lval,
1942                         want_lvalue ? fb_lvalue : fb_rvalue);
1943   ret = MIN (ret, tret);
1944
1945   /* If the outermost expression is a COMPONENT_REF, canonicalize its type.  */
1946   if (!want_lvalue && TREE_CODE (*expr_p) == COMPONENT_REF)
1947     {
1948       canonicalize_component_ref (expr_p);
1949       ret = MIN (ret, GS_OK);
1950     }
1951
1952   return ret;
1953 }
1954
1955 /*  Gimplify the self modifying expression pointed by EXPR_P (++, --, +=, -=).
1956
1957     PRE_P points to the list where side effects that must happen before
1958         *EXPR_P should be stored.
1959
1960     POST_P points to the list where side effects that must happen after
1961         *EXPR_P should be stored.
1962
1963     WANT_VALUE is nonzero iff we want to use the value of this expression
1964         in another expression.  */
1965
1966 static enum gimplify_status
1967 gimplify_self_mod_expr (tree *expr_p, tree *pre_p, tree *post_p,
1968                         bool want_value)
1969 {
1970   enum tree_code code;
1971   tree lhs, lvalue, rhs, t1;
1972   bool postfix;
1973   enum tree_code arith_code;
1974   enum gimplify_status ret;
1975
1976   code = TREE_CODE (*expr_p);
1977
1978 #if defined ENABLE_CHECKING
1979   if (code != POSTINCREMENT_EXPR
1980       && code != POSTDECREMENT_EXPR
1981       && code != PREINCREMENT_EXPR
1982       && code != PREDECREMENT_EXPR)
1983     abort ();
1984 #endif
1985
1986   /* Prefix or postfix?  */
1987   if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR)
1988     /* Faster to treat as prefix if result is not used.  */
1989     postfix = want_value;
1990   else
1991     postfix = false;
1992
1993   /* Add or subtract?  */
1994   if (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
1995     arith_code = PLUS_EXPR;
1996   else
1997     arith_code = MINUS_EXPR;
1998
1999   /* Gimplify the LHS into a GIMPLE lvalue.  */
2000   lvalue = TREE_OPERAND (*expr_p, 0);
2001   ret = gimplify_expr (&lvalue, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
2002   if (ret == GS_ERROR)
2003     return ret;
2004
2005   /* Extract the operands to the arithmetic operation.  */
2006   lhs = lvalue;
2007   rhs = TREE_OPERAND (*expr_p, 1);
2008
2009   /* For postfix operator, we evaluate the LHS to an rvalue and then use
2010      that as the result value and in the postqueue operation.  */
2011   if (postfix)
2012     {
2013       ret = gimplify_expr (&lhs, pre_p, post_p, is_gimple_val, fb_rvalue);
2014       if (ret == GS_ERROR)
2015         return ret;
2016     }
2017
2018   t1 = build (arith_code, TREE_TYPE (*expr_p), lhs, rhs);
2019   t1 = build (MODIFY_EXPR, TREE_TYPE (lvalue), lvalue, t1);
2020
2021   if (postfix)
2022     {
2023       gimplify_and_add (t1, post_p);
2024       *expr_p = lhs;
2025       return GS_ALL_DONE;
2026     }
2027   else
2028     {
2029       *expr_p = t1;
2030       return GS_OK;
2031     }
2032 }
2033
2034 /*  Gimplify the CALL_EXPR node pointed by EXPR_P.
2035
2036       call_expr
2037               : ID '(' arglist ')'
2038
2039       arglist
2040               : arglist ',' val
2041               | val
2042
2043     PRE_P points to the list where side effects that must happen before
2044         *EXPR_P should be stored.  */
2045
2046 static enum gimplify_status
2047 gimplify_call_expr (tree *expr_p, tree *pre_p, bool (*gimple_test_f) (tree))
2048 {
2049   tree decl;
2050   tree arglist;
2051   enum gimplify_status ret;
2052
2053 #if defined ENABLE_CHECKING
2054   if (TREE_CODE (*expr_p) != CALL_EXPR)
2055     abort ();
2056 #endif
2057
2058   /* For reliable diagnostics during inlining, it is necessary that 
2059      every call_expr be annotated with file and line.  */
2060   if (!EXPR_LOCUS (*expr_p))
2061     annotate_with_locus (*expr_p, input_location);
2062
2063   /* This may be a call to a builtin function.
2064
2065      Builtin function calls may be transformed into different
2066      (and more efficient) builtin function calls under certain
2067      circumstances.  Unfortunately, gimplification can muck things
2068      up enough that the builtin expanders are not aware that certain
2069      transformations are still valid.
2070
2071      So we attempt transformation/gimplification of the call before
2072      we gimplify the CALL_EXPR.  At this time we do not manage to
2073      transform all calls in the same manner as the expanders do, but
2074      we do transform most of them.  */
2075   decl = get_callee_fndecl (*expr_p);
2076   if (decl && DECL_BUILT_IN (decl))
2077     {
2078       tree new;
2079
2080       /* If it is allocation of stack, record the need to restore the memory
2081          when the enclosing bind_expr is exited.  */
2082       if (DECL_FUNCTION_CODE (decl) == BUILT_IN_STACK_ALLOC)
2083         gimplify_ctxp->save_stack = true;
2084
2085       /* If it is restore of the stack, reset it, since it means we are
2086          regimplifying the bind_expr.  Note that we use the fact that
2087          for try_finally_expr, try part is processed first.  */
2088       if (DECL_FUNCTION_CODE (decl) == BUILT_IN_STACK_RESTORE)
2089         gimplify_ctxp->save_stack = false;
2090
2091       new = simplify_builtin (*expr_p, gimple_test_f == is_gimple_stmt);
2092
2093       if (new && new != *expr_p)
2094         {
2095           /* There was a transformation of this call which computes the
2096              same value, but in a more efficient way.  Return and try
2097              again.  */
2098           *expr_p = new;
2099           return GS_OK;
2100         }
2101     }
2102
2103   /* There is a sequence point before the call, so any side effects in
2104      the calling expression must occur before the actual call.  Force
2105      gimplify_expr to use an internal post queue.  */
2106   ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, NULL,
2107                        is_gimple_call_addr, fb_rvalue);
2108
2109   if (PUSH_ARGS_REVERSED)
2110     TREE_OPERAND (*expr_p, 1) = nreverse (TREE_OPERAND (*expr_p, 1));
2111   for (arglist = TREE_OPERAND (*expr_p, 1); arglist;
2112        arglist = TREE_CHAIN (arglist))
2113     {
2114       enum gimplify_status t;
2115
2116       /* There is a sequence point before a function call.  Side effects in
2117          the argument list must occur before the actual call. So, when
2118          gimplifying arguments, force gimplify_expr to use an internal
2119          post queue which is then appended to the end of PRE_P.  */
2120       t = gimplify_expr (&TREE_VALUE (arglist), pre_p, NULL, is_gimple_val,
2121                          fb_rvalue);
2122
2123       if (t == GS_ERROR)
2124         ret = GS_ERROR;
2125     }
2126   if (PUSH_ARGS_REVERSED)
2127     TREE_OPERAND (*expr_p, 1) = nreverse (TREE_OPERAND (*expr_p, 1));
2128
2129   /* Try this again in case gimplification exposed something.  */
2130   if (ret != GS_ERROR && decl && DECL_BUILT_IN (decl))
2131     {
2132       tree new = simplify_builtin (*expr_p, gimple_test_f == is_gimple_stmt);
2133
2134       if (new && new != *expr_p)
2135         {
2136           /* There was a transformation of this call which computes the
2137              same value, but in a more efficient way.  Return and try
2138              again.  */
2139           *expr_p = new;
2140           return GS_OK;
2141         }
2142     }
2143
2144   /* If the function is "const" or "pure", then clear TREE_SIDE_EFFECTS on its
2145      decl.  This allows us to eliminate redundant or useless
2146      calls to "const" functions.  */
2147   if (TREE_CODE (*expr_p) == CALL_EXPR
2148       && (call_expr_flags (*expr_p) & (ECF_CONST | ECF_PURE)))
2149     TREE_SIDE_EFFECTS (*expr_p) = 0;
2150
2151   return ret;
2152 }
2153
2154 /* Handle shortcut semantics in the predicate operand of a COND_EXPR by
2155    rewriting it into multiple COND_EXPRs, and possibly GOTO_EXPRs.
2156
2157    TRUE_LABEL_P and FALSE_LABEL_P point to the labels to jump to if the
2158    condition is true or false, respectively.  If null, we should generate
2159    our own to skip over the evaluation of this specific expression.
2160
2161    This function is the tree equivalent of do_jump.
2162
2163    shortcut_cond_r should only be called by shortcut_cond_expr.  */
2164
2165 static tree
2166 shortcut_cond_r (tree pred, tree *true_label_p, tree *false_label_p)
2167 {
2168   tree local_label = NULL_TREE;
2169   tree t, expr = NULL;
2170
2171   /* OK, it's not a simple case; we need to pull apart the COND_EXPR to
2172      retain the shortcut semantics.  Just insert the gotos here;
2173      shortcut_cond_expr will append the real blocks later.  */
2174   if (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
2175     {
2176       /* Turn if (a && b) into
2177
2178          if (a); else goto no;
2179          if (b) goto yes; else goto no;
2180          (no:) */
2181
2182       if (false_label_p == NULL)
2183         false_label_p = &local_label;
2184
2185       t = shortcut_cond_r (TREE_OPERAND (pred, 0), NULL, false_label_p);
2186       append_to_statement_list (t, &expr);
2187
2188       t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
2189                            false_label_p);
2190       append_to_statement_list (t, &expr);
2191     }
2192   else if (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
2193     {
2194       /* Turn if (a || b) into
2195
2196          if (a) goto yes;
2197          if (b) goto yes; else goto no;
2198          (yes:) */
2199
2200       if (true_label_p == NULL)
2201         true_label_p = &local_label;
2202
2203       t = shortcut_cond_r (TREE_OPERAND (pred, 0), true_label_p, NULL);
2204       append_to_statement_list (t, &expr);
2205
2206       t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
2207                            false_label_p);
2208       append_to_statement_list (t, &expr);
2209     }
2210   else if (TREE_CODE (pred) == COND_EXPR)
2211     {
2212       /* As long as we're messing with gotos, turn if (a ? b : c) into
2213          if (a)
2214            if (b) goto yes; else goto no;
2215          else
2216            if (c) goto yes; else goto no;  */
2217       expr = build (COND_EXPR, void_type_node, TREE_OPERAND (pred, 0),
2218                     shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
2219                                      false_label_p),
2220                     shortcut_cond_r (TREE_OPERAND (pred, 2), true_label_p,
2221                                      false_label_p));
2222     }
2223   else
2224     {
2225       expr = build (COND_EXPR, void_type_node, pred,
2226                     build_and_jump (true_label_p),
2227                     build_and_jump (false_label_p));
2228     }
2229
2230   if (local_label)
2231     {
2232       t = build1 (LABEL_EXPR, void_type_node, local_label);
2233       append_to_statement_list (t, &expr);
2234     }
2235
2236   return expr;
2237 }
2238
2239 static tree
2240 shortcut_cond_expr (tree expr)
2241 {
2242   tree pred = TREE_OPERAND (expr, 0);
2243   tree then_ = TREE_OPERAND (expr, 1);
2244   tree else_ = TREE_OPERAND (expr, 2);
2245   tree true_label, false_label, end_label, t;
2246   tree *true_label_p;
2247   tree *false_label_p;
2248   bool emit_end, emit_false;
2249   bool then_se = then_ && TREE_SIDE_EFFECTS (then_);
2250   bool else_se = else_ && TREE_SIDE_EFFECTS (else_);
2251
2252   /* First do simple transformations.  */
2253   if (!else_se)
2254     {
2255       /* If there is no 'else', turn (a && b) into if (a) if (b).  */
2256       while (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
2257         {
2258           TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
2259           then_ = shortcut_cond_expr (expr);
2260           pred = TREE_OPERAND (pred, 0);
2261           expr = build (COND_EXPR, void_type_node, pred, then_, NULL_TREE);
2262         }
2263     }
2264   if (!then_se)
2265     {
2266       /* If there is no 'then', turn
2267            if (a || b); else d
2268          into
2269            if (a); else if (b); else d.  */
2270       while (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
2271         {
2272           TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
2273           else_ = shortcut_cond_expr (expr);
2274           pred = TREE_OPERAND (pred, 0);
2275           expr = build (COND_EXPR, void_type_node, pred, NULL_TREE, else_);
2276         }
2277     }
2278
2279   /* If we're done, great.  */
2280   if (TREE_CODE (pred) != TRUTH_ANDIF_EXPR
2281       && TREE_CODE (pred) != TRUTH_ORIF_EXPR)
2282     return expr;
2283
2284   /* Otherwise we need to mess with gotos.  Change
2285        if (a) c; else d;
2286      to
2287        if (a); else goto no;
2288        c; goto end;
2289        no: d; end:
2290      and recursively gimplify the condition.  */
2291
2292   true_label = false_label = end_label = NULL_TREE;
2293
2294   /* If our arms just jump somewhere, hijack those labels so we don't
2295      generate jumps to jumps.  */
2296
2297   if (then_
2298       && TREE_CODE (then_) == GOTO_EXPR
2299       && TREE_CODE (GOTO_DESTINATION (then_)) == LABEL_DECL)
2300     {
2301       true_label = GOTO_DESTINATION (then_);
2302       then_ = NULL;
2303       then_se = false;
2304     }
2305
2306   if (else_
2307       && TREE_CODE (else_) == GOTO_EXPR
2308       && TREE_CODE (GOTO_DESTINATION (else_)) == LABEL_DECL)
2309     {
2310       false_label = GOTO_DESTINATION (else_);
2311       else_ = NULL;
2312       else_se = false;
2313     }
2314
2315   /* If we aren't hijacking a label for the 'then' branch, it falls through.  */
2316   if (true_label)
2317     true_label_p = &true_label;
2318   else
2319     true_label_p = NULL;
2320
2321   /* The 'else' branch also needs a label if it contains interesting code.  */
2322   if (false_label || else_se)
2323     false_label_p = &false_label;
2324   else
2325     false_label_p = NULL;
2326
2327   /* If there was nothing else in our arms, just forward the label(s).  */
2328   if (!then_se && !else_se)
2329     return shortcut_cond_r (pred, true_label_p, false_label_p);
2330
2331   /* If our last subexpression already has a terminal label, reuse it.  */
2332   if (else_se)
2333     expr = expr_last (else_);
2334   else if (then_se)
2335     expr = expr_last (then_);
2336   else
2337     expr = NULL;
2338   if (expr && TREE_CODE (expr) == LABEL_EXPR)
2339     end_label = LABEL_EXPR_LABEL (expr);
2340
2341   /* If we don't care about jumping to the 'else' branch, jump to the end
2342      if the condition is false.  */
2343   if (!false_label_p)
2344     false_label_p = &end_label;
2345
2346   /* We only want to emit these labels if we aren't hijacking them.  */
2347   emit_end = (end_label == NULL_TREE);
2348   emit_false = (false_label == NULL_TREE);
2349
2350   pred = shortcut_cond_r (pred, true_label_p, false_label_p);
2351
2352   expr = NULL;
2353   append_to_statement_list (pred, &expr);
2354
2355   append_to_statement_list (then_, &expr);
2356   if (else_se)
2357     {
2358       t = build_and_jump (&end_label);
2359       append_to_statement_list (t, &expr);
2360       if (emit_false)
2361         {
2362           t = build1 (LABEL_EXPR, void_type_node, false_label);
2363           append_to_statement_list (t, &expr);
2364         }
2365       append_to_statement_list (else_, &expr);
2366     }
2367   if (emit_end && end_label)
2368     {
2369       t = build1 (LABEL_EXPR, void_type_node, end_label);
2370       append_to_statement_list (t, &expr);
2371     }
2372
2373   return expr;
2374 }
2375
2376 /* EXPR is used in a boolean context; make sure it has BOOLEAN_TYPE.  */
2377
2378 static tree
2379 gimple_boolify (tree expr)
2380 {
2381   tree type = TREE_TYPE (expr);
2382
2383   if (TREE_CODE (type) == BOOLEAN_TYPE)
2384     return expr;
2385
2386   /* If this is the predicate of a COND_EXPR, it might not even be a
2387      truthvalue yet.  */
2388   expr = lang_hooks.truthvalue_conversion (expr);
2389
2390   switch (TREE_CODE (expr))
2391     {
2392     case TRUTH_AND_EXPR:
2393     case TRUTH_OR_EXPR:
2394     case TRUTH_XOR_EXPR:
2395     case TRUTH_ANDIF_EXPR:
2396     case TRUTH_ORIF_EXPR:
2397       /* Also boolify the arguments of truth exprs.  */
2398       TREE_OPERAND (expr, 1) = gimple_boolify (TREE_OPERAND (expr, 1));
2399       /* FALLTHRU */
2400
2401     case TRUTH_NOT_EXPR:
2402       TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
2403       /* FALLTHRU */
2404
2405     case EQ_EXPR: case NE_EXPR:
2406     case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR:
2407       /* These expressions always produce boolean results.  */
2408       TREE_TYPE (expr) = boolean_type_node;
2409       return expr;
2410       
2411     default:
2412       /* Other expressions that get here must have boolean values, but
2413          might need to be converted to the appropriate mode.  */
2414       return convert (boolean_type_node, expr);
2415     }
2416 }
2417
2418 /*  Convert the conditional expression pointed by EXPR_P '(p) ? a : b;'
2419     into
2420
2421     if (p)                      if (p)
2422       t1 = a;                     a;
2423     else                or      else
2424       t1 = b;                     b;
2425     t1;
2426
2427     The second form is used when *EXPR_P is of type void.
2428
2429     TARGET is the tree for T1 above.
2430
2431     PRE_P points to the list where side effects that must happen before
2432         *EXPR_P should be stored.  */
2433
2434 static enum gimplify_status
2435 gimplify_cond_expr (tree *expr_p, tree *pre_p, tree target)
2436 {
2437   tree expr = *expr_p;
2438   tree tmp, type;
2439   enum gimplify_status ret;
2440
2441   type = TREE_TYPE (expr);
2442   if (!type)
2443     TREE_TYPE (expr) = void_type_node;
2444
2445   /* If this COND_EXPR has a value, copy the values into a temporary within
2446      the arms.  */
2447   else if (! VOID_TYPE_P (type))
2448     {
2449       if (target)
2450         {
2451           tmp = target;
2452           ret = GS_OK;
2453         }
2454       else
2455         {
2456           tmp = create_tmp_var (TREE_TYPE (expr), "iftmp");
2457           ret = GS_ALL_DONE;
2458         }
2459
2460       /* Build the then clause, 't1 = a;'.  But don't build an assignment
2461          if this branch is void; in C++ it can be, if it's a throw.  */
2462       if (TREE_TYPE (TREE_OPERAND (expr, 1)) != void_type_node)
2463         TREE_OPERAND (expr, 1)
2464           = build (MODIFY_EXPR, void_type_node, tmp, TREE_OPERAND (expr, 1));
2465
2466       /* Build the else clause, 't1 = b;'.  */
2467       if (TREE_TYPE (TREE_OPERAND (expr, 2)) != void_type_node)
2468         TREE_OPERAND (expr, 2)
2469           = build (MODIFY_EXPR, void_type_node, tmp, TREE_OPERAND (expr, 2));
2470
2471       TREE_TYPE (expr) = void_type_node;
2472       recalculate_side_effects (expr);
2473
2474       /* Move the COND_EXPR to the prequeue and use the temp in its place.  */
2475       gimplify_and_add (expr, pre_p);
2476       *expr_p = tmp;
2477
2478       return ret;
2479     }
2480
2481   /* Make sure the condition has BOOLEAN_TYPE.  */
2482   TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
2483
2484   /* Break apart && and || conditions.  */
2485   if (TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ANDIF_EXPR
2486       || TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ORIF_EXPR)
2487     {
2488       expr = shortcut_cond_expr (expr);
2489
2490       if (expr != *expr_p)
2491         {
2492           *expr_p = expr;
2493
2494           /* We can't rely on gimplify_expr to re-gimplify the expanded
2495              form properly, as cleanups might cause the target labels to be
2496              wrapped in a TRY_FINALLY_EXPR.  To prevent that, we need to
2497              set up a conditional context.  */
2498           gimple_push_condition ();
2499           gimplify_stmt (expr_p);
2500           gimple_pop_condition (pre_p);
2501
2502           return GS_ALL_DONE;
2503         }
2504     }
2505
2506   /* Now do the normal gimplification.  */
2507   ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, NULL,
2508                        is_gimple_condexpr, fb_rvalue);
2509
2510   gimple_push_condition ();
2511
2512   gimplify_to_stmt_list (&TREE_OPERAND (expr, 1));
2513   gimplify_to_stmt_list (&TREE_OPERAND (expr, 2));
2514   recalculate_side_effects (expr);
2515
2516   gimple_pop_condition (pre_p);
2517
2518   if (ret == GS_ERROR)
2519     ;
2520   else if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
2521     ret = GS_ALL_DONE;
2522   else if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 2)))
2523     /* Rewrite "if (a); else b" to "if (!a) b"  */
2524     {
2525       TREE_OPERAND (expr, 0) = invert_truthvalue (TREE_OPERAND (expr, 0));
2526       ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, NULL,
2527                            is_gimple_condexpr, fb_rvalue);
2528
2529       tmp = TREE_OPERAND (expr, 1);
2530       TREE_OPERAND (expr, 1) = TREE_OPERAND (expr, 2);
2531       TREE_OPERAND (expr, 2) = tmp;
2532     }
2533   else
2534     /* Both arms are empty; replace the COND_EXPR with its predicate.  */
2535     expr = TREE_OPERAND (expr, 0);
2536
2537   *expr_p = expr;
2538   return ret;
2539 }
2540
2541 /*  Gimplify the MODIFY_EXPR node pointed by EXPR_P.
2542
2543       modify_expr
2544               : varname '=' rhs
2545               | '*' ID '=' rhs
2546
2547     PRE_P points to the list where side effects that must happen before
2548         *EXPR_P should be stored.
2549
2550     POST_P points to the list where side effects that must happen after
2551         *EXPR_P should be stored.
2552
2553     WANT_VALUE is nonzero iff we want to use the value of this expression
2554         in another expression.  */
2555
2556 static enum gimplify_status
2557 gimplify_modify_expr (tree *expr_p, tree *pre_p, tree *post_p, bool want_value)
2558 {
2559   tree *from_p = &TREE_OPERAND (*expr_p, 1);
2560   tree *to_p = &TREE_OPERAND (*expr_p, 0);
2561   enum gimplify_status ret = GS_UNHANDLED;
2562
2563 #if defined ENABLE_CHECKING
2564   if (TREE_CODE (*expr_p) != MODIFY_EXPR && TREE_CODE (*expr_p) != INIT_EXPR)
2565     abort ();
2566 #endif
2567
2568   /* The distinction between MODIFY_EXPR and INIT_EXPR is no longer useful.  */
2569   if (TREE_CODE (*expr_p) == INIT_EXPR)
2570     TREE_SET_CODE (*expr_p, MODIFY_EXPR);
2571
2572   /* See if any simplifications can be done based on what the RHS is.  */
2573   ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
2574                                   want_value);
2575   if (ret != GS_UNHANDLED)
2576     return ret;
2577
2578   /* If the value being copied is of variable width, expose the length
2579      if the copy by converting the whole thing to a memcpy.  Note that
2580      we need to do this before gimplifying any of the operands
2581      so that we can resolve any PLACEHOLDER_EXPRs in the size.  */
2582   if (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (*to_p))) != INTEGER_CST)
2583     {
2584       tree args, t, dest;
2585
2586       t = TYPE_SIZE_UNIT (TREE_TYPE (*to_p));
2587       t = SUBSTITUTE_PLACEHOLDER_IN_EXPR (t, *to_p);
2588       t = SUBSTITUTE_PLACEHOLDER_IN_EXPR (t, *from_p);
2589       t = unshare_expr (t);
2590       args = tree_cons (NULL, t, NULL);
2591       t = build_fold_addr_expr (*from_p);
2592       args = tree_cons (NULL, t, args);
2593       dest = build_fold_addr_expr (*to_p);
2594       args = tree_cons (NULL, dest, args);
2595       t = implicit_built_in_decls[BUILT_IN_MEMCPY];
2596       t = build_function_call_expr (t, args);
2597       if (want_value)
2598         {
2599           t = build1 (NOP_EXPR, TREE_TYPE (dest), t);
2600           t = build1 (INDIRECT_REF, TREE_TYPE (*to_p), t);
2601         }
2602       *expr_p = t;
2603       return GS_OK;
2604     }
2605
2606   ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
2607   if (ret == GS_ERROR)
2608     return ret;
2609
2610   ret = gimplify_expr (from_p, pre_p, post_p, is_gimple_rhs, fb_rvalue);
2611   if (ret == GS_ERROR)
2612     return ret;
2613
2614   /* Now see if the above changed *from_p to something we handle specially.  */
2615   ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
2616                                   want_value);
2617   if (ret != GS_UNHANDLED)
2618     return ret;
2619
2620   /* If the destination is already simple, nothing else needed.  */
2621   if (is_gimple_tmp_var (*to_p))
2622     ret = GS_ALL_DONE;
2623   else
2624     {
2625       /* If the RHS of the MODIFY_EXPR may throw or make a nonlocal goto and
2626          the LHS is a user variable, then we need to introduce a temporary.
2627          ie temp = RHS; LHS = temp.
2628
2629          This way the optimizers can determine that the user variable is
2630          only modified if evaluation of the RHS does not throw.
2631
2632          FIXME this should be handled by the is_gimple_rhs predicate.  */
2633
2634       if (aggregate_value_p (TREE_TYPE (*from_p), NULL_TREE))
2635         /* Don't force a temp of a large aggregate type; the copy could be
2636            arbitrarily expensive.  Instead we will generate a V_MAY_DEF for
2637            the assignment.  */;
2638       else if (TREE_CODE (*from_p) == CALL_EXPR
2639                || (flag_non_call_exceptions && tree_could_trap_p (*from_p))
2640                /* If we're dealing with a renamable type, either source or dest
2641                   must be a renamed variable.  */
2642                || (is_gimple_reg_type (TREE_TYPE (*from_p))
2643                    && !is_gimple_reg (*to_p)))
2644         gimplify_expr (from_p, pre_p, post_p, is_gimple_val, fb_rvalue);
2645
2646       ret = want_value ? GS_OK : GS_ALL_DONE;
2647     }
2648
2649   if (want_value)
2650     {
2651       append_to_statement_list (*expr_p, pre_p);
2652       *expr_p = *to_p;
2653     }
2654
2655   return ret;
2656 }
2657
2658 /*  Subroutine of above to do simplications of MODIFY_EXPRs based on
2659     the code of the RHS.  We loop for as long as we can do something.  */
2660
2661 static enum gimplify_status
2662 gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p,
2663                           tree *post_p, bool want_value)
2664 {
2665   enum gimplify_status ret = GS_OK;
2666
2667   while (ret != GS_UNHANDLED)
2668     switch (TREE_CODE (*from_p))
2669       {
2670       case TARGET_EXPR:
2671         {
2672           /* If we are initializing something from a TARGET_EXPR, strip the
2673              TARGET_EXPR and initialize it directly, if possible.  This can't
2674              be done if the initializer is void, since that implies that the
2675              temporary is set in some non-trivial way.
2676
2677              ??? What about code that pulls out the temp and uses it
2678              elsewhere? I think that such code never uses the TARGET_EXPR as
2679              an initializer.  If I'm wrong, we'll abort because the temp won't
2680              have any RTL.  In that case, I guess we'll need to replace
2681              references somehow.  */
2682           tree init = TARGET_EXPR_INITIAL (*from_p);
2683
2684           if (!VOID_TYPE_P (TREE_TYPE (init)))
2685             {
2686               *from_p = init;
2687               ret = GS_OK;
2688             }
2689           else
2690             ret = GS_UNHANDLED;
2691         }
2692         break;
2693
2694       case COMPOUND_EXPR:
2695         /* Remove any COMPOUND_EXPR in the RHS so the following cases will be
2696            caught.  */
2697         gimplify_compound_expr (from_p, pre_p, true);
2698         ret = GS_OK;
2699         break;
2700
2701       case CONSTRUCTOR:
2702         /* If we're initializing from a CONSTRUCTOR, break this into
2703            individual MODIFY_EXPRs.  */
2704         return gimplify_init_constructor (expr_p, pre_p, post_p, want_value);
2705
2706       case COND_EXPR:
2707         /* If we're assigning from a ?: expression with ADDRESSABLE type, push
2708            the assignment down into the branches, since we can't generate a
2709            temporary of such a type.  */
2710         if (TREE_ADDRESSABLE (TREE_TYPE (*from_p)))
2711           {
2712             *expr_p = *from_p;
2713             return gimplify_cond_expr (expr_p, pre_p, *to_p);
2714           }
2715         else
2716           ret = GS_UNHANDLED;
2717         break;
2718
2719       default:
2720         ret = GS_UNHANDLED;
2721         break;
2722       }
2723
2724   return ret;
2725 }
2726
2727 /*  Gimplify a comparison between two variable-sized objects.  Do this
2728     with a call to BUILT_IN_MEMCMP.  */
2729
2730 static enum gimplify_status
2731 gimplify_variable_sized_compare (tree *expr_p)
2732 {
2733   tree op0 = TREE_OPERAND (*expr_p, 0);
2734   tree op1 = TREE_OPERAND (*expr_p, 1);
2735   tree args, t, dest;
2736
2737   t = TYPE_SIZE_UNIT (TREE_TYPE (op0));
2738   t = SUBSTITUTE_PLACEHOLDER_IN_EXPR (t, op0);
2739   t = unshare_expr (t);
2740   args = tree_cons (NULL, t, NULL);
2741   t = build_addr_expr (op1);
2742   args = tree_cons (NULL, t, args);
2743   dest = build_addr_expr (op0);
2744   args = tree_cons (NULL, dest, args);
2745   t = implicit_built_in_decls[BUILT_IN_MEMCMP];
2746   t = build_function_call_expr (t, args);
2747   *expr_p
2748     = build (TREE_CODE (*expr_p), TREE_TYPE (*expr_p), t, integer_zero_node);
2749
2750   return GS_OK;
2751 }
2752
2753 /*  Gimplify TRUTH_ANDIF_EXPR and TRUTH_ORIF_EXPR expressions.  EXPR_P
2754     points to the expression to gimplify.
2755
2756     Expressions of the form 'a && b' are gimplified to:
2757
2758         a && b ? true : false
2759
2760     gimplify_cond_expr will do the rest.
2761
2762     PRE_P points to the list where side effects that must happen before
2763         *EXPR_P should be stored.  */
2764
2765 static enum gimplify_status
2766 gimplify_boolean_expr (tree *expr_p)
2767 {
2768   /* Preserve the original type of the expression.  */
2769   tree type = TREE_TYPE (*expr_p);
2770
2771   *expr_p = build (COND_EXPR, type, *expr_p,
2772                    convert (type, boolean_true_node),
2773                    convert (type, boolean_false_node));
2774
2775   return GS_OK;
2776 }
2777
2778 /* Gimplifies an expression sequence.  This function gimplifies each
2779    expression and re-writes the original expression with the last
2780    expression of the sequence in GIMPLE form.
2781
2782    PRE_P points to the list where the side effects for all the
2783        expressions in the sequence will be emitted.
2784     
2785    WANT_VALUE is true when the result of the last COMPOUND_EXPR is used.  */
2786 /* ??? Should rearrange to share the pre-queue with all the indirect
2787    invocations of gimplify_expr.  Would probably save on creations 
2788    of statement_list nodes.  */
2789
2790 static enum gimplify_status
2791 gimplify_compound_expr (tree *expr_p, tree *pre_p, bool want_value)
2792 {
2793   tree t = *expr_p;
2794
2795   do
2796     {
2797       tree *sub_p = &TREE_OPERAND (t, 0);
2798
2799       if (TREE_CODE (*sub_p) == COMPOUND_EXPR)
2800         gimplify_compound_expr (sub_p, pre_p, false);
2801       else
2802         gimplify_stmt (sub_p);
2803       append_to_statement_list (*sub_p, pre_p);
2804
2805       t = TREE_OPERAND (t, 1);
2806     }
2807   while (TREE_CODE (t) == COMPOUND_EXPR);
2808
2809   *expr_p = t;
2810   if (want_value)
2811     return GS_OK;
2812   else
2813     {
2814       gimplify_stmt (expr_p);
2815       return GS_ALL_DONE;
2816     }
2817 }
2818
2819 /* Gimplifies a statement list.  These may be created either by an
2820    enlightened front-end, or by shortcut_cond_expr.  */
2821
2822 static enum gimplify_status
2823 gimplify_statement_list (tree *expr_p)
2824 {
2825   tree_stmt_iterator i = tsi_start (*expr_p);
2826
2827   while (!tsi_end_p (i))
2828     {
2829       tree t;
2830
2831       gimplify_stmt (tsi_stmt_ptr (i));
2832
2833       t = tsi_stmt (i);
2834       if (t == NULL)
2835         tsi_delink (&i);
2836       else if (TREE_CODE (t) == STATEMENT_LIST)
2837         {
2838           tsi_link_before (&i, t, TSI_SAME_STMT);
2839           tsi_delink (&i);
2840         }
2841       else
2842         tsi_next (&i);
2843     }
2844
2845   return GS_ALL_DONE;
2846 }
2847
2848 /*  Gimplify a SAVE_EXPR node.  EXPR_P points to the expression to
2849     gimplify.  After gimplification, EXPR_P will point to a new temporary
2850     that holds the original value of the SAVE_EXPR node.
2851
2852     PRE_P points to the list where side effects that must happen before
2853         *EXPR_P should be stored.  */
2854
2855 static enum gimplify_status
2856 gimplify_save_expr (tree *expr_p, tree *pre_p, tree *post_p)
2857 {
2858   enum gimplify_status ret = GS_ALL_DONE;
2859   tree val;
2860
2861 #if defined ENABLE_CHECKING
2862   if (TREE_CODE (*expr_p) != SAVE_EXPR)
2863     abort ();
2864 #endif
2865
2866   val = TREE_OPERAND (*expr_p, 0);
2867
2868   /* If the operand is already a GIMPLE temporary, just re-write the
2869      SAVE_EXPR node.  */
2870   if (is_gimple_tmp_var (val))
2871     *expr_p = val;
2872   /* The operand may be a void-valued expression such as SAVE_EXPRs
2873      generated by the Java frontend for class initialization.  It is
2874      being executed only for its side-effects.  */
2875   else if (TREE_TYPE (val) == void_type_node)
2876     {
2877       tree body = TREE_OPERAND (*expr_p, 0);
2878       ret = gimplify_expr (& body, pre_p, post_p, is_gimple_stmt, fb_none);
2879       append_to_statement_list (body, pre_p);
2880       *expr_p = NULL;
2881     }
2882   else
2883     *expr_p = TREE_OPERAND (*expr_p, 0)
2884       = get_initialized_tmp_var (val, pre_p, post_p);
2885
2886   return ret;
2887 }
2888
2889 /*  Re-write the ADDR_EXPR node pointed by EXPR_P
2890
2891       unary_expr
2892               : ...
2893               | '&' varname
2894               ...
2895
2896     PRE_P points to the list where side effects that must happen before
2897         *EXPR_P should be stored.
2898
2899     POST_P points to the list where side effects that must happen after
2900         *EXPR_P should be stored.  */
2901
2902 static enum gimplify_status
2903 gimplify_addr_expr (tree *expr_p, tree *pre_p, tree *post_p)
2904 {
2905   tree expr = *expr_p;
2906   tree op0 = TREE_OPERAND (expr, 0);
2907   enum gimplify_status ret;
2908
2909   switch (TREE_CODE (op0))
2910     {
2911     case INDIRECT_REF:
2912       /* Check if we are dealing with an expression of the form '&*ptr'.
2913          While the front end folds away '&*ptr' into 'ptr', these
2914          expressions may be generated internally by the compiler (e.g.,
2915          builtins like __builtin_va_end).  */
2916       *expr_p = TREE_OPERAND (op0, 0);
2917       ret = GS_OK;
2918       break;
2919
2920     case ARRAY_REF:
2921       /* Fold &a[6] to (&a + 6).  */
2922       ret = gimplify_array_ref_to_plus (&TREE_OPERAND (expr, 0),
2923                                         pre_p, post_p);
2924
2925       /* This added an INDIRECT_REF.  Fold it away.  */
2926       *expr_p = TREE_OPERAND (TREE_OPERAND (expr, 0), 0);
2927       break;
2928
2929     case VIEW_CONVERT_EXPR:
2930       /* Take the address of our operand and then convert it to the type of
2931          this ADDR_EXPR.  */
2932       *expr_p = fold_convert (TREE_TYPE (expr),
2933                               build_addr_expr (TREE_OPERAND (op0, 0)));
2934       ret = GS_OK;
2935       break;
2936
2937     default:
2938       /* We use fb_either here because the C frontend sometimes takes
2939          the address of a call that returns a struct.  */
2940       ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, post_p,
2941                            is_gimple_addr_expr_arg, fb_either);
2942       if (ret != GS_ERROR)
2943         {
2944           /* At this point, the argument of the ADDR_EXPR should be
2945              sufficiently simple that there are never side effects.  */
2946           /* ??? Could split out the decision code from build1 to verify.  */
2947           TREE_SIDE_EFFECTS (expr) = 0;
2948
2949           /* Make sure TREE_INVARIANT/TREE_CONSTANT is set properly.  */
2950           recompute_tree_invarant_for_addr_expr (expr);
2951
2952           /* Mark the RHS addressable.  */
2953           lang_hooks.mark_addressable (TREE_OPERAND (expr, 0));
2954         }
2955       break;
2956     }
2957
2958   /* If the operand is gimplified into a _DECL, mark the address expression
2959      as TREE_INVARIANT.  */
2960   if (DECL_P (TREE_OPERAND (expr, 0)))
2961     TREE_INVARIANT (expr) = 1;
2962
2963   return ret;
2964 }
2965
2966 /* Gimplify the operands of an ASM_EXPR.  Input operands should be a gimple
2967    value; output operands should be a gimple lvalue.  */
2968
2969 static enum gimplify_status
2970 gimplify_asm_expr (tree *expr_p, tree *pre_p, tree *post_p)
2971 {
2972   tree expr = *expr_p;
2973   int noutputs = list_length (ASM_OUTPUTS (expr));
2974   const char **oconstraints
2975     = (const char **) alloca ((noutputs) * sizeof (const char *));
2976   int i;
2977   tree link;
2978   const char *constraint;
2979   bool allows_mem, allows_reg, is_inout;
2980   enum gimplify_status ret, tret;
2981
2982   ASM_STRING (expr)
2983     = resolve_asm_operand_names (ASM_STRING (expr), ASM_OUTPUTS (expr),
2984                                  ASM_INPUTS (expr));
2985
2986   ret = GS_ALL_DONE;
2987   for (i = 0, link = ASM_OUTPUTS (expr); link; ++i, link = TREE_CHAIN (link))
2988     {
2989       oconstraints[i] = constraint
2990         = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
2991
2992       parse_output_constraint (&constraint, i, 0, 0,
2993                                &allows_mem, &allows_reg, &is_inout);
2994
2995       if (!allows_reg && allows_mem)
2996         lang_hooks.mark_addressable (TREE_VALUE (link));
2997
2998       tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
2999                             is_inout ? is_gimple_min_lval : is_gimple_lvalue,
3000                             fb_lvalue | fb_mayfail);
3001       if (tret == GS_ERROR)
3002         {
3003           error ("invalid lvalue in asm output %d", i);
3004           ret = tret;
3005         }
3006
3007       if (is_inout)
3008         {
3009           /* An input/output operand.  To give the optimizers more
3010              flexibility, split it into separate input and output
3011              operands.  */
3012           tree input;
3013           char buf[10];
3014           size_t constraint_len = strlen (constraint);
3015
3016           /* Turn the in/out constraint into an output constraint.  */
3017           char *p = xstrdup (constraint);
3018           p[0] = '=';
3019           TREE_VALUE (TREE_PURPOSE (link)) = build_string (constraint_len, p);
3020           free (p);
3021
3022           /* And add a matching input constraint.  */
3023           if (allows_reg)
3024             {
3025               sprintf (buf, "%d", i);
3026               input = build_string (strlen (buf), buf);
3027             }
3028           else
3029             input = build_string (constraint_len - 1, constraint + 1);
3030           input = build_tree_list (build_tree_list (NULL_TREE, input),
3031                                    unshare_expr (TREE_VALUE (link)));
3032           ASM_INPUTS (expr) = chainon (ASM_INPUTS (expr), input);
3033         }
3034     }
3035
3036   for (link = ASM_INPUTS (expr); link; ++i, link = TREE_CHAIN (link))
3037     {
3038       constraint
3039         = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
3040       parse_input_constraint (&constraint, 0, 0, noutputs, 0,
3041                               oconstraints, &allows_mem, &allows_reg);
3042
3043       /* If the operand is a memory input, it should be an lvalue.  */
3044       if (!allows_reg && allows_mem)
3045         {
3046           lang_hooks.mark_addressable (TREE_VALUE (link));
3047           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
3048                                 is_gimple_lvalue, fb_lvalue | fb_mayfail);
3049           if (tret == GS_ERROR)
3050             {
3051               error ("memory input %d is not directly addressable", i);
3052               ret = tret;
3053             }
3054         }
3055       else
3056         {
3057           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
3058                                 is_gimple_val, fb_rvalue);
3059           if (tret == GS_ERROR)
3060             ret = tret;
3061         }
3062     }
3063
3064   return ret;
3065 }
3066
3067 /* Gimplify a CLEANUP_POINT_EXPR.  Currently this works by adding
3068    WITH_CLEANUP_EXPRs to the prequeue as we encounter cleanups while
3069    gimplifying the body, and converting them to TRY_FINALLY_EXPRs when we
3070    return to this function.
3071
3072    FIXME should we complexify the prequeue handling instead?  Or use flags
3073    for all the cleanups and let the optimizer tighten them up?  The current
3074    code seems pretty fragile; it will break on a cleanup within any
3075    non-conditional nesting.  But any such nesting would be broken, anyway;
3076    we can't write a TRY_FINALLY_EXPR that starts inside a nesting construct
3077    and continues out of it.  We can do that at the RTL level, though, so
3078    having an optimizer to tighten up try/finally regions would be a Good
3079    Thing.  */
3080
3081 static enum gimplify_status
3082 gimplify_cleanup_point_expr (tree *expr_p, tree *pre_p)
3083 {
3084   tree_stmt_iterator iter;
3085   tree body;
3086
3087   tree temp = voidify_wrapper_expr (*expr_p, NULL);
3088
3089   /* We only care about the number of conditions between the innermost
3090      CLEANUP_POINT_EXPR and the cleanup.  So save and reset the count.  */
3091   int old_conds = gimplify_ctxp->conditions;
3092   gimplify_ctxp->conditions = 0;
3093
3094   body = TREE_OPERAND (*expr_p, 0);
3095   gimplify_to_stmt_list (&body);
3096
3097   gimplify_ctxp->conditions = old_conds;
3098
3099   for (iter = tsi_start (body); !tsi_end_p (iter); )
3100     {
3101       tree *wce_p = tsi_stmt_ptr (iter);
3102       tree wce = *wce_p;
3103
3104       if (TREE_CODE (wce) == WITH_CLEANUP_EXPR)
3105         {
3106           if (tsi_one_before_end_p (iter))
3107             {
3108               tsi_link_before (&iter, TREE_OPERAND (wce, 1), TSI_SAME_STMT);
3109               tsi_delink (&iter);
3110               break;
3111             }
3112           else
3113             {
3114               tree sl, tfe;
3115
3116               sl = tsi_split_statement_list_after (&iter);
3117               tfe = build (TRY_FINALLY_EXPR, void_type_node, sl, NULL_TREE);
3118               append_to_statement_list (TREE_OPERAND (wce, 1),
3119                                      &TREE_OPERAND (tfe, 1));
3120               *wce_p = tfe;
3121               iter = tsi_start (sl);
3122             }
3123         }
3124       else
3125         tsi_next (&iter);
3126     }
3127
3128   if (temp)
3129     {
3130       *expr_p = temp;
3131       append_to_statement_list (body, pre_p);
3132       return GS_OK;
3133     }
3134   else
3135     {
3136       *expr_p = body;
3137       return GS_ALL_DONE;
3138     }
3139 }
3140
3141 /* Insert a cleanup marker for gimplify_cleanup_point_expr.  CLEANUP
3142    is the cleanup action required.  */
3143
3144 static void
3145 gimple_push_cleanup (tree var, tree cleanup, tree *pre_p)
3146 {
3147   tree wce;
3148
3149   /* Errors can result in improperly nested cleanups.  Which results in
3150      confusion when trying to resolve the WITH_CLEANUP_EXPR.  */
3151   if (errorcount || sorrycount)
3152     return;
3153
3154   if (gimple_conditional_context ())
3155     {
3156       /* If we're in a conditional context, this is more complex.  We only
3157          want to run the cleanup if we actually ran the initialization that
3158          necessitates it, but we want to run it after the end of the
3159          conditional context.  So we wrap the try/finally around the
3160          condition and use a flag to determine whether or not to actually
3161          run the destructor.  Thus
3162
3163            test ? f(A()) : 0
3164
3165          becomes (approximately)
3166
3167            flag = 0;
3168            try {
3169              if (test) { A::A(temp); flag = 1; val = f(temp); }
3170              else { val = 0; }
3171            } finally {
3172              if (flag) A::~A(temp);
3173            }
3174            val
3175       */
3176
3177       tree flag = create_tmp_var (boolean_type_node, "cleanup");
3178       tree ffalse = build (MODIFY_EXPR, void_type_node, flag,
3179                            boolean_false_node);
3180       tree ftrue = build (MODIFY_EXPR, void_type_node, flag,
3181                           boolean_true_node);
3182       cleanup = build (COND_EXPR, void_type_node, flag, cleanup, NULL);
3183       wce = build (WITH_CLEANUP_EXPR, void_type_node, NULL_TREE,
3184                    cleanup, NULL_TREE);
3185       append_to_statement_list (ffalse, &gimplify_ctxp->conditional_cleanups);
3186       append_to_statement_list (wce, &gimplify_ctxp->conditional_cleanups);
3187       append_to_statement_list (ftrue, pre_p);
3188
3189       /* Because of this manipulation, and the EH edges that jump
3190          threading cannot redirect, the temporary (VAR) will appear
3191          to be used uninitialized.  Don't warn.  */
3192       TREE_NO_WARNING (var) = 1;
3193     }
3194   else
3195     {
3196       wce = build (WITH_CLEANUP_EXPR, void_type_node, NULL_TREE,
3197                    cleanup, NULL_TREE);
3198       append_to_statement_list (wce, pre_p);
3199     }
3200
3201   gimplify_stmt (&TREE_OPERAND (wce, 1));
3202 }
3203
3204 /* Gimplify a TARGET_EXPR which doesn't appear on the rhs of an INIT_EXPR.  */
3205
3206 static enum gimplify_status
3207 gimplify_target_expr (tree *expr_p, tree *pre_p, tree *post_p)
3208 {
3209   tree targ = *expr_p;
3210   tree temp = TARGET_EXPR_SLOT (targ);
3211   tree init = TARGET_EXPR_INITIAL (targ);
3212   enum gimplify_status ret;
3213
3214   if (init)
3215     {
3216       /* TARGET_EXPR temps aren't part of the enclosing block, so add it
3217          to the temps list.  */
3218       gimple_add_tmp_var (temp);
3219
3220       /* If TARGET_EXPR_INITIAL is void, then the mere evaluation of the
3221          expression is supposed to initialize the slot.  */
3222       if (VOID_TYPE_P (TREE_TYPE (init)))
3223         ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
3224       else
3225         {
3226           /* Special handling for BIND_EXPR can result in fewer temps.  */
3227           ret = GS_OK;
3228           if (TREE_CODE (init) == BIND_EXPR)
3229             gimplify_bind_expr (&init, temp, pre_p);
3230           if (init != temp)
3231             {
3232               init = build (MODIFY_EXPR, void_type_node, temp, init);
3233               ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt,
3234                                    fb_none);
3235             }
3236         }
3237       if (ret == GS_ERROR)
3238         return GS_ERROR;
3239       append_to_statement_list (init, pre_p);
3240
3241       /* If needed, push the cleanup for the temp.  */
3242       if (TARGET_EXPR_CLEANUP (targ))
3243         {
3244           gimplify_stmt (&TARGET_EXPR_CLEANUP (targ));
3245           gimple_push_cleanup (temp, TARGET_EXPR_CLEANUP (targ), pre_p);
3246         }
3247
3248       /* Only expand this once.  */
3249       TREE_OPERAND (targ, 3) = init;
3250       TARGET_EXPR_INITIAL (targ) = NULL_TREE;
3251     }
3252   else if (!temp->decl.seen_in_bind_expr)
3253     /* We should have expanded this before.  */
3254     abort ();
3255
3256   *expr_p = temp;
3257   return GS_OK;
3258 }
3259
3260 /* Gimplification of expression trees.  */
3261
3262 /* Gimplify an expression which appears at statement context; usually, this
3263    means replacing it with a suitably gimple STATEMENT_LIST.  */
3264
3265 void
3266 gimplify_stmt (tree *stmt_p)
3267 {
3268   gimplify_expr (stmt_p, NULL, NULL, is_gimple_stmt, fb_none);
3269 }
3270
3271 /* Similarly, but force the result to be a STATEMENT_LIST.  */
3272
3273 void
3274 gimplify_to_stmt_list (tree *stmt_p)
3275 {
3276   gimplify_stmt (stmt_p);
3277   if (!*stmt_p)
3278     *stmt_p = alloc_stmt_list ();
3279   else if (TREE_CODE (*stmt_p) != STATEMENT_LIST)
3280     {
3281       tree t = *stmt_p;
3282       *stmt_p = alloc_stmt_list ();
3283       append_to_statement_list (t, stmt_p);
3284     }
3285 }
3286
3287
3288 /*  Gimplifies the expression tree pointed by EXPR_P.  Return 0 if
3289     gimplification failed.
3290
3291     PRE_P points to the list where side effects that must happen before
3292         EXPR should be stored.
3293
3294     POST_P points to the list where side effects that must happen after
3295         EXPR should be stored, or NULL if there is no suitable list.  In
3296         that case, we copy the result to a temporary, emit the
3297         post-effects, and then return the temporary.
3298
3299     GIMPLE_TEST_F points to a function that takes a tree T and
3300         returns nonzero if T is in the GIMPLE form requested by the
3301         caller.  The GIMPLE predicates are in tree-gimple.c.
3302
3303         This test is used twice.  Before gimplification, the test is
3304         invoked to determine whether *EXPR_P is already gimple enough.  If
3305         that fails, *EXPR_P is gimplified according to its code and
3306         GIMPLE_TEST_F is called again.  If the test still fails, then a new
3307         temporary variable is created and assigned the value of the
3308         gimplified expression.
3309
3310     FALLBACK tells the function what sort of a temporary we want.  If the 1
3311         bit is set, an rvalue is OK.  If the 2 bit is set, an lvalue is OK.
3312         If both are set, either is OK, but an lvalue is preferable.
3313
3314     The return value is either GS_ERROR or GS_ALL_DONE, since this function
3315     iterates until solution.  */
3316
3317 enum gimplify_status
3318 gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
3319                bool (* gimple_test_f) (tree), fallback_t fallback)
3320 {
3321   tree tmp;
3322   tree internal_pre = NULL_TREE;
3323   tree internal_post = NULL_TREE;
3324   tree save_expr;
3325   int is_statement = (pre_p == NULL);
3326   location_t *locus;
3327   location_t saved_location;
3328   enum gimplify_status ret;
3329
3330   save_expr = *expr_p;
3331   if (save_expr == NULL_TREE)
3332     return GS_ALL_DONE;
3333
3334   /* We used to check the predicate here and return immediately if it
3335      succeeds.  This is wrong; the design is for gimplification to be
3336      idempotent, and for the predicates to only test for valid forms, not
3337      whether they are fully simplified.  */
3338
3339   /* Set up our internal queues if needed.  */
3340   if (pre_p == NULL)
3341     pre_p = &internal_pre;
3342   if (post_p == NULL)
3343     post_p = &internal_post;
3344
3345   saved_location = input_location;
3346   if (save_expr == error_mark_node)
3347     locus = NULL;
3348   else
3349     locus = EXPR_LOCUS (save_expr);
3350   if (locus)
3351     input_location = *locus;
3352
3353   /* Loop over the specific gimplifiers until the toplevel node
3354      remains the same.  */
3355   do
3356     {
3357       /* Strip any uselessness.  */
3358       STRIP_MAIN_TYPE_NOPS (*expr_p);
3359
3360       /* Remember the expr.  */
3361       save_expr = *expr_p;
3362
3363       /* Die, die, die, my darling.  */
3364       if (save_expr == error_mark_node
3365           || (TREE_TYPE (save_expr)
3366               && TREE_TYPE (save_expr) == error_mark_node))
3367         {
3368           ret = GS_ERROR;
3369           break;
3370         }
3371
3372       /* Do any language-specific gimplification.  */
3373       ret = lang_hooks.gimplify_expr (expr_p, pre_p, post_p);
3374       if (ret == GS_OK)
3375         {
3376           if (*expr_p == NULL_TREE)
3377             break;
3378           if (*expr_p != save_expr)
3379             continue;
3380         }
3381       else if (ret != GS_UNHANDLED)
3382         break;
3383
3384       ret = GS_OK;
3385       switch (TREE_CODE (*expr_p))
3386         {
3387           /* First deal with the special cases.  */
3388
3389         case POSTINCREMENT_EXPR:
3390         case POSTDECREMENT_EXPR:
3391         case PREINCREMENT_EXPR:
3392         case PREDECREMENT_EXPR:
3393           ret = gimplify_self_mod_expr (expr_p, pre_p, post_p,
3394                                         fallback != fb_none);
3395           break;
3396
3397         case ARRAY_REF:
3398         case ARRAY_RANGE_REF:
3399         case REALPART_EXPR:
3400         case IMAGPART_EXPR:
3401         case COMPONENT_REF:
3402           ret = gimplify_compound_lval (expr_p, pre_p, post_p,
3403                                         fallback & fb_lvalue);
3404           break;
3405
3406         case COND_EXPR:
3407           ret = gimplify_cond_expr (expr_p, pre_p, NULL_TREE);
3408           break;
3409
3410         case CALL_EXPR:
3411           ret = gimplify_call_expr (expr_p, pre_p, gimple_test_f);
3412           break;
3413
3414         case TREE_LIST:
3415           abort ();
3416
3417         case COMPOUND_EXPR:
3418           ret = gimplify_compound_expr (expr_p, pre_p, fallback != fb_none);
3419           break;
3420
3421         case MODIFY_EXPR:
3422         case INIT_EXPR:
3423           ret = gimplify_modify_expr (expr_p, pre_p, post_p,
3424                                       fallback != fb_none);
3425           break;
3426
3427         case TRUTH_ANDIF_EXPR:
3428         case TRUTH_ORIF_EXPR:
3429           ret = gimplify_boolean_expr (expr_p);
3430           break;
3431
3432         case TRUTH_NOT_EXPR:
3433           TREE_OPERAND (*expr_p, 0)
3434             = gimple_boolify (TREE_OPERAND (*expr_p, 0));
3435           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3436                                is_gimple_val, fb_rvalue);
3437           recalculate_side_effects (*expr_p);
3438           break;
3439
3440         case ADDR_EXPR:
3441           ret = gimplify_addr_expr (expr_p, pre_p, post_p);
3442           break;
3443
3444         case VA_ARG_EXPR:
3445           ret = gimplify_va_arg_expr (expr_p, pre_p, post_p);
3446           break;
3447
3448         case VIEW_CONVERT_EXPR:
3449           if (VOID_TYPE_P (TREE_TYPE (*expr_p))
3450               || fallback == fb_none)
3451             {
3452               /* Just strip a conversion to void (or in void context) and
3453                  try again.  */
3454               *expr_p = TREE_OPERAND (*expr_p, 0);
3455               break;
3456             }
3457
3458           /* If both types are BLKmode or if one type is of variable size,
3459              convert this into a pointer punning operation.  This avoids
3460              copies of large data or making a variable-size temporary.  */
3461           if ((TYPE_MODE (TREE_TYPE (*expr_p)) == BLKmode
3462                && TYPE_MODE (TREE_TYPE (TREE_OPERAND (*expr_p, 0))) == BLKmode)
3463               || !TREE_CONSTANT (TYPE_SIZE (TREE_TYPE (*expr_p)))
3464               || !TREE_CONSTANT (TYPE_SIZE (TREE_TYPE
3465                                             (TREE_OPERAND (*expr_p,0)))))
3466             {
3467               tree restype = TREE_TYPE (*expr_p);
3468               *expr_p = build1 (INDIRECT_REF, TREE_TYPE (*expr_p),
3469                                 fold_convert (build_pointer_type (restype),
3470                                               build_addr_expr
3471                                               (TREE_OPERAND (*expr_p, 0))));
3472               break;
3473             }
3474           goto unary;
3475
3476         case CONVERT_EXPR:
3477         case NOP_EXPR:
3478           if (IS_EMPTY_STMT (*expr_p))
3479             {
3480               ret = GS_ALL_DONE;
3481               break;
3482             }
3483
3484           if (VOID_TYPE_P (TREE_TYPE (*expr_p))
3485               || fallback == fb_none)
3486             {
3487               /* Just strip a conversion to void (or in void context) and
3488                  try again.  */
3489               *expr_p = TREE_OPERAND (*expr_p, 0);
3490               break;
3491             }
3492
3493           ret = gimplify_conversion (expr_p);
3494           if (ret == GS_ERROR)
3495             break;
3496           if (*expr_p != save_expr)
3497             break;
3498           /* FALLTHRU */
3499
3500         case FIX_TRUNC_EXPR:
3501         case FIX_CEIL_EXPR:
3502         case FIX_FLOOR_EXPR:
3503         case FIX_ROUND_EXPR:
3504         unary:
3505           /* unary_expr: ... | '(' cast ')' val | ...  */
3506           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3507                                is_gimple_val, fb_rvalue);
3508           recalculate_side_effects (*expr_p);
3509           break;
3510
3511         case INDIRECT_REF:
3512           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3513                                is_gimple_reg, fb_rvalue);
3514           recalculate_side_effects (*expr_p);
3515           break;
3516
3517           /* Constants need not be gimplified.  */
3518         case INTEGER_CST:
3519         case REAL_CST:
3520         case STRING_CST:
3521         case COMPLEX_CST:
3522         case VECTOR_CST:
3523           ret = GS_ALL_DONE;
3524           break;
3525
3526         case CONST_DECL:
3527           *expr_p = DECL_INITIAL (*expr_p);
3528           break;
3529
3530         case EXC_PTR_EXPR:
3531           /* FIXME make this a decl.  */
3532           ret = GS_ALL_DONE;
3533           break;
3534
3535         case BIND_EXPR:
3536           ret = gimplify_bind_expr (expr_p, NULL, pre_p);
3537           break;
3538
3539         case LOOP_EXPR:
3540           ret = gimplify_loop_expr (expr_p, pre_p);
3541           break;
3542
3543         case SWITCH_EXPR:
3544           ret = gimplify_switch_expr (expr_p, pre_p);
3545           break;
3546
3547         case LABELED_BLOCK_EXPR:
3548           ret = gimplify_labeled_block_expr (expr_p);
3549           break;
3550
3551         case EXIT_BLOCK_EXPR:
3552           ret = gimplify_exit_block_expr (expr_p);
3553           break;
3554
3555         case EXIT_EXPR:
3556           ret = gimplify_exit_expr (expr_p);
3557           break;
3558
3559         case GOTO_EXPR:
3560           /* If the target is not LABEL, then it is a computed jump
3561              and the target needs to be gimplified.  */
3562           if (TREE_CODE (GOTO_DESTINATION (*expr_p)) != LABEL_DECL)
3563             ret = gimplify_expr (&GOTO_DESTINATION (*expr_p), pre_p,
3564                                  NULL, is_gimple_val, fb_rvalue);
3565           break;
3566
3567         case LABEL_EXPR:
3568           ret = GS_ALL_DONE;
3569 #ifdef ENABLE_CHECKING
3570           if (decl_function_context (LABEL_EXPR_LABEL (*expr_p)) != current_function_decl)
3571             abort ();
3572 #endif
3573           break;
3574
3575         case CASE_LABEL_EXPR:
3576           ret = gimplify_case_label_expr (expr_p);
3577           break;
3578
3579         case RETURN_EXPR:
3580           ret = gimplify_return_expr (*expr_p, pre_p);
3581           break;
3582
3583         case CONSTRUCTOR:
3584           /* Don't reduce this in place; let gimplify_init_constructor work
3585              its magic.  */
3586           ret = GS_ALL_DONE;
3587           break;
3588
3589           /* The following are special cases that are not handled by the
3590              original GIMPLE grammar.  */
3591
3592           /* SAVE_EXPR nodes are converted into a GIMPLE identifier and
3593              eliminated.  */
3594         case SAVE_EXPR:
3595           ret = gimplify_save_expr (expr_p, pre_p, post_p);
3596           break;
3597
3598         case BIT_FIELD_REF:
3599           {
3600             enum gimplify_status r0, r1, r2;
3601
3602             r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3603                                 is_gimple_min_lval, fb_either);
3604             r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
3605                                 is_gimple_val, fb_rvalue);
3606             r2 = gimplify_expr (&TREE_OPERAND (*expr_p, 2), pre_p, post_p,
3607                                 is_gimple_val, fb_rvalue);
3608             recalculate_side_effects (*expr_p);
3609
3610             ret = MIN (r0, MIN (r1, r2));
3611           }
3612           break;
3613
3614         case NON_LVALUE_EXPR:
3615           /* This should have been stripped above.  */
3616           abort ();
3617           break;
3618
3619         case ASM_EXPR:
3620           ret = gimplify_asm_expr (expr_p, pre_p, post_p);
3621           break;
3622
3623         case TRY_FINALLY_EXPR:
3624         case TRY_CATCH_EXPR:
3625           gimplify_to_stmt_list (&TREE_OPERAND (*expr_p, 0));
3626           gimplify_to_stmt_list (&TREE_OPERAND (*expr_p, 1));
3627           ret = GS_ALL_DONE;
3628           break;
3629
3630         case CLEANUP_POINT_EXPR:
3631           ret = gimplify_cleanup_point_expr (expr_p, pre_p);
3632           break;
3633
3634         case TARGET_EXPR:
3635           ret = gimplify_target_expr (expr_p, pre_p, post_p);
3636           break;
3637
3638         case CATCH_EXPR:
3639           gimplify_to_stmt_list (&CATCH_BODY (*expr_p));
3640           ret = GS_ALL_DONE;
3641           break;
3642
3643         case EH_FILTER_EXPR:
3644           gimplify_to_stmt_list (&EH_FILTER_FAILURE (*expr_p));
3645           ret = GS_ALL_DONE;
3646           break;
3647
3648         case OBJ_TYPE_REF:
3649           {
3650             enum gimplify_status r0, r1;
3651             r0 = gimplify_expr (&OBJ_TYPE_REF_OBJECT (*expr_p), pre_p, post_p,
3652                                 is_gimple_val, fb_rvalue);
3653             r1 = gimplify_expr (&OBJ_TYPE_REF_EXPR (*expr_p), pre_p, post_p,
3654                                 is_gimple_val, fb_rvalue);
3655             ret = MIN (r0, r1);
3656           }
3657           break;
3658
3659         case MIN_EXPR:
3660         case MAX_EXPR:
3661           ret = gimplify_minimax_expr (expr_p, pre_p, post_p);
3662           break;
3663
3664         case LABEL_DECL:
3665           /* We get here when taking the address of a label.  We mark
3666              the label as "forced"; meaning it can never be removed and
3667              it is a potential target for any computed goto.  */
3668           FORCED_LABEL (*expr_p) = 1;
3669           ret = GS_ALL_DONE;
3670           break;
3671
3672         case STATEMENT_LIST:
3673           ret = gimplify_statement_list (expr_p);
3674           break;
3675
3676         case VAR_DECL:
3677           /* ??? If this is a local variable, and it has not been seen in any
3678              outer BIND_EXPR, then it's probably the result of a duplicate
3679              declaration, for which we've already issued an error.  It would
3680              be really nice if the front end wouldn't leak these at all. 
3681              Currently the only known culprit is C++ destructors, as seen
3682              in g++.old-deja/g++.jason/binding.C.  */
3683           tmp = *expr_p;
3684           if (!TREE_STATIC (tmp) && !DECL_EXTERNAL (tmp)
3685               && decl_function_context (tmp) == current_function_decl
3686               && !tmp->decl.seen_in_bind_expr)
3687             {
3688 #ifdef ENABLE_CHECKING
3689               if (!errorcount && !sorrycount)
3690                 abort ();
3691 #endif
3692               ret = GS_ERROR;
3693             }
3694           else
3695             ret = GS_ALL_DONE;
3696           break;
3697
3698         default:
3699           /* If this is a comparison of objects of aggregate type, handle
3700              it specially (by converting to a call to memcmp).  It would be
3701              nice to only have to do this for variable-sized objects, but
3702              then we'd have to allow the same nest of reference nodes we
3703              allow for MODIFY_EXPR and that's too complex.  */
3704           if (TREE_CODE_CLASS (TREE_CODE (*expr_p)) == '<'
3705               && (AGGREGATE_TYPE_P (TREE_TYPE (TREE_OPERAND (*expr_p, 1)))))
3706             ret = gimplify_variable_sized_compare (expr_p);
3707
3708           /* If *EXPR_P does not need to be special-cased, handle it
3709              according to its class.  */
3710           else if (TREE_CODE_CLASS (TREE_CODE (*expr_p)) == '1')
3711             ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
3712                                  post_p, is_gimple_val, fb_rvalue);
3713           else if (TREE_CODE_CLASS (TREE_CODE (*expr_p)) == '2'
3714                    || TREE_CODE_CLASS (TREE_CODE (*expr_p)) == '<'
3715                    || TREE_CODE (*expr_p) == TRUTH_AND_EXPR
3716                    || TREE_CODE (*expr_p) == TRUTH_OR_EXPR
3717                    || TREE_CODE (*expr_p) == TRUTH_XOR_EXPR)
3718             {
3719               enum gimplify_status r0, r1;
3720
3721               r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
3722                                   post_p, is_gimple_val, fb_rvalue);
3723               r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
3724                                   post_p, is_gimple_val, fb_rvalue);
3725
3726               ret = MIN (r0, r1);
3727             }
3728           else if (TREE_CODE_CLASS (TREE_CODE (*expr_p)) == 'd'
3729                    || TREE_CODE_CLASS (TREE_CODE (*expr_p)) == 'c')
3730             {
3731               ret = GS_ALL_DONE;
3732               break;
3733             }
3734           else
3735             /* Fail if we don't know how to handle this tree code.  */
3736             abort ();
3737
3738           recalculate_side_effects (*expr_p);
3739           break;
3740         }
3741
3742       /* If we replaced *expr_p, gimplify again.  */
3743       if (ret == GS_OK && (*expr_p == NULL || *expr_p == save_expr))
3744         ret = GS_ALL_DONE;
3745     }
3746   while (ret == GS_OK);
3747
3748   /* If we encountered an error_mark somewhere nested inside, either
3749      stub out the statement or propagate the error back out.  */
3750   if (ret == GS_ERROR)
3751     {
3752       if (is_statement)
3753         *expr_p = NULL;
3754       goto out;
3755     }
3756
3757 #ifdef ENABLE_CHECKING
3758   /* This was only valid as a return value from the langhook, which
3759      we handled.  Make sure it doesn't escape from any other context.  */
3760   if (ret == GS_UNHANDLED)
3761     abort ();
3762 #endif
3763
3764   if (fallback == fb_none && *expr_p && !is_gimple_stmt (*expr_p))
3765     {
3766       /* We aren't looking for a value, and we don't have a valid
3767          statement.  If it doesn't have side-effects, throw it away.  */
3768       if (!TREE_SIDE_EFFECTS (*expr_p))
3769         *expr_p = NULL;
3770       else if (!TREE_THIS_VOLATILE (*expr_p))
3771         {
3772           /* This is probably a _REF that contains something nested that
3773              has side effects.  Recurse through the operands to find it.  */
3774           enum tree_code code = TREE_CODE (*expr_p);
3775
3776           if (code == COMPONENT_REF
3777               || code == REALPART_EXPR || code == IMAGPART_EXPR)
3778             gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3779                            gimple_test_f, fallback);
3780           else if (code == ARRAY_REF || code == ARRAY_RANGE_REF)
3781             {
3782               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3783                              gimple_test_f, fallback);
3784               gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
3785                            gimple_test_f, fallback);
3786             }
3787           else
3788             /* Anything else with side-effects
3789                must be converted to a valid statement before we get here.  */
3790             abort ();
3791
3792           *expr_p = NULL;
3793         }
3794       else if (COMPLETE_TYPE_P (TREE_TYPE (*expr_p)))
3795         {
3796           /* Historically, the compiler has treated a bare
3797              reference to a volatile lvalue as forcing a load.  */
3798           tree tmp = create_tmp_var (TREE_TYPE (*expr_p), "vol");
3799           *expr_p = build (MODIFY_EXPR, TREE_TYPE (tmp), tmp, *expr_p);
3800         }
3801       else
3802         /* We can't do anything useful with a volatile reference to
3803            incomplete type, so just throw it away.  */
3804         *expr_p = NULL;
3805     }
3806
3807   /* If we are gimplifying at the statement level, we're done.  Tack
3808      everything together and replace the original statement with the
3809      gimplified form.  */
3810   if (fallback == fb_none || is_statement)
3811     {
3812       if (internal_pre || internal_post)
3813         {
3814           append_to_statement_list (*expr_p, &internal_pre);
3815           append_to_statement_list (internal_post, &internal_pre);
3816           annotate_all_with_locus (&internal_pre, input_location);
3817           *expr_p = internal_pre;
3818         }
3819       else if (!*expr_p)
3820         ;
3821       else if (TREE_CODE (*expr_p) == STATEMENT_LIST)
3822         annotate_all_with_locus (expr_p, input_location);
3823       else
3824         annotate_one_with_locus (*expr_p, input_location);
3825       goto out;
3826     }
3827
3828   /* Otherwise we're gimplifying a subexpression, so the resulting value is
3829      interesting.  */
3830
3831   /* If it's sufficiently simple already, we're done.  Unless we are
3832      handling some post-effects internally; if that's the case, we need to
3833      copy into a temp before adding the post-effects to the tree.  */
3834   if (!internal_post && (*gimple_test_f) (*expr_p))
3835     goto out;
3836
3837   /* Otherwise, we need to create a new temporary for the gimplified
3838      expression.  */
3839
3840   /* We can't return an lvalue if we have an internal postqueue.  The
3841      object the lvalue refers to would (probably) be modified by the
3842      postqueue; we need to copy the value out first, which means an
3843      rvalue.  */
3844   if ((fallback & fb_lvalue) && !internal_post
3845       && is_gimple_addr_expr_arg (*expr_p))
3846     {
3847       /* An lvalue will do.  Take the address of the expression, store it
3848          in a temporary, and replace the expression with an INDIRECT_REF of
3849          that temporary.  */
3850       tmp = build_fold_addr_expr (*expr_p);
3851       gimplify_expr (&tmp, pre_p, post_p, is_gimple_reg, fb_rvalue);
3852       *expr_p = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (tmp)), tmp);
3853     }
3854   else if ((fallback & fb_rvalue) && is_gimple_rhs (*expr_p))
3855     {
3856 #if defined ENABLE_CHECKING
3857       if (VOID_TYPE_P (TREE_TYPE (*expr_p)))
3858         abort ();
3859 #endif
3860
3861       /* An rvalue will do.  Assign the gimplified expression into a new
3862          temporary TMP and replace the original expression with TMP.  */
3863
3864       if (internal_post || (fallback & fb_lvalue))
3865         /* The postqueue might change the value of the expression between
3866            the initialization and use of the temporary, so we can't use a
3867            formal temp.  FIXME do we care?  */
3868         *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
3869       else
3870         *expr_p = get_formal_tmp_var (*expr_p, pre_p);
3871     }
3872   else if (fallback & fb_mayfail)
3873     {
3874       /* If this is an asm statement, and the user asked for the impossible,
3875          don't abort.  Fail and let gimplify_asm_expr issue an error.  */
3876       ret = GS_ERROR;
3877       goto out;
3878     }
3879   else
3880     {
3881       fprintf (stderr, "gimplification failed:\n");
3882       print_generic_expr (stderr, *expr_p, 0);
3883       debug_tree (*expr_p);
3884       abort ();
3885     }
3886
3887 #if defined ENABLE_CHECKING
3888   /* Make sure the temporary matches our predicate.  */
3889   if (!(*gimple_test_f) (*expr_p))
3890     abort ();
3891 #endif
3892
3893   if (internal_post)
3894     {
3895       annotate_all_with_locus (&internal_post, input_location);
3896       append_to_statement_list (internal_post, pre_p);
3897     }
3898
3899  out:
3900   input_location = saved_location;
3901   return ret;
3902 }
3903
3904 /* Look through TYPE for variable-sized objects and gimplify each such
3905    size that we find.  Add to LIST_P any statements generated.  */
3906
3907 void
3908 gimplify_type_sizes (tree type, tree *list_p)
3909 {
3910   tree field;
3911
3912   switch (TREE_CODE (type))
3913     {
3914     case ERROR_MARK:
3915       return;
3916
3917     case INTEGER_TYPE:
3918     case ENUMERAL_TYPE:
3919     case BOOLEAN_TYPE:
3920     case CHAR_TYPE:
3921     case REAL_TYPE:
3922       gimplify_one_sizepos (&TYPE_MIN_VALUE (type), list_p);
3923       gimplify_one_sizepos (&TYPE_MAX_VALUE (type), list_p);
3924       break;
3925
3926     case ARRAY_TYPE:
3927       /* These anonymous types don't have declarations, so handle them here. */
3928       gimplify_type_sizes (TYPE_DOMAIN (type), list_p);
3929       break;
3930
3931     case RECORD_TYPE:
3932     case UNION_TYPE:
3933     case QUAL_UNION_TYPE:
3934       for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
3935         if (TREE_CODE (field) == FIELD_DECL)
3936           gimplify_one_sizepos (&DECL_FIELD_OFFSET (field), list_p);
3937       break;
3938
3939     default:
3940       break;
3941     }
3942
3943   gimplify_one_sizepos (&TYPE_SIZE (type), list_p);
3944   gimplify_one_sizepos (&TYPE_SIZE_UNIT (type), list_p);
3945 }
3946
3947 /* Subroutine of the above to gimplify one size or position, *EXPR_P.
3948    We add any required statements to STMT_P.  */
3949
3950 void
3951 gimplify_one_sizepos (tree *expr_p, tree *stmt_p)
3952 {
3953   /* We don't do anything if the value isn't there, is constant, or contains
3954      A PLACEHOLDER_EXPR.  */
3955   if (*expr_p == NULL_TREE || TREE_CONSTANT (*expr_p)
3956       || CONTAINS_PLACEHOLDER_P (*expr_p))
3957     return;
3958
3959   gimplify_expr (expr_p, stmt_p, NULL, is_gimple_val, fb_rvalue);
3960 }
3961 \f
3962 #ifdef ENABLE_CHECKING
3963 /* Compare types A and B for a "close enough" match.  */
3964
3965 static bool
3966 cpt_same_type (tree a, tree b)
3967 {
3968   if (lang_hooks.types_compatible_p (a, b))
3969     return true;
3970
3971   /* ??? The C++ FE decomposes METHOD_TYPES to FUNCTION_TYPES and doesn't
3972      link them together.  This routine is intended to catch type errors
3973      that will affect the optimizers, and the optimizers don't add new
3974      dereferences of function pointers, so ignore it.  */
3975   if ((TREE_CODE (a) == FUNCTION_TYPE || TREE_CODE (a) == METHOD_TYPE)
3976       && (TREE_CODE (b) == FUNCTION_TYPE || TREE_CODE (b) == METHOD_TYPE))
3977     return true;
3978
3979   /* ??? The C FE pushes type qualifiers after the fact into the type of
3980      the element from the type of the array.  See build_unary_op's handling
3981      of ADDR_EXPR.  This seems wrong -- if we were going to do this, we
3982      should have done it when creating the variable in the first place.
3983      Alternately, why aren't the two array types made variants?  */
3984   if (TREE_CODE (a) == ARRAY_TYPE && TREE_CODE (b) == ARRAY_TYPE)
3985     return cpt_same_type (TREE_TYPE (a), TREE_TYPE (b));
3986
3987   /* And because of those, we have to recurse down through pointers.  */
3988   if (POINTER_TYPE_P (a) && POINTER_TYPE_P (b))
3989     return cpt_same_type (TREE_TYPE (a), TREE_TYPE (b));
3990
3991   return false;
3992 }
3993
3994 /* Check for some cases of the front end missing cast expressions.
3995    The type of a dereference should correspond to the pointer type;
3996    similarly the type of an address should match its object.  */
3997
3998 static tree
3999 check_pointer_types_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
4000                        void *data ATTRIBUTE_UNUSED)
4001 {
4002   tree t = *tp;
4003   tree ptype, otype, dtype;
4004
4005   switch (TREE_CODE (t))
4006     {
4007     case INDIRECT_REF:
4008     case ARRAY_REF:
4009       otype = TREE_TYPE (t);
4010       ptype = TREE_TYPE (TREE_OPERAND (t, 0));
4011       dtype = TREE_TYPE (ptype);
4012       if (!cpt_same_type (otype, dtype))
4013         abort ();
4014       break;
4015
4016     case ADDR_EXPR:
4017       ptype = TREE_TYPE (t);
4018       otype = TREE_TYPE (TREE_OPERAND (t, 0));
4019       dtype = TREE_TYPE (ptype);
4020       if (!cpt_same_type (otype, dtype))
4021         {
4022           /* &array is allowed to produce a pointer to the element, rather than
4023              a pointer to the array type.  We must allow this in order to
4024              properly represent assigning the address of an array in C into
4025              pointer to the element type.  */
4026           if (TREE_CODE (otype) == ARRAY_TYPE
4027               && POINTER_TYPE_P (ptype)
4028               && cpt_same_type (TREE_TYPE (otype), dtype))
4029             break;
4030           abort ();
4031         }
4032       break;
4033
4034     default:
4035       return NULL_TREE;
4036     }
4037
4038
4039   return NULL_TREE;
4040 }
4041 #endif
4042
4043 /* Gimplify the body of statements pointed by BODY_P.  FNDECL is the
4044    function decl containing BODY.  */
4045
4046 void
4047 gimplify_body (tree *body_p, tree fndecl)
4048 {
4049   location_t saved_location = input_location;
4050   tree body;
4051
4052   timevar_push (TV_TREE_GIMPLIFY);
4053   push_gimplify_context ();
4054
4055   /* Unshare most shared trees in the body and in that of any nested functions.
4056      It would seem we don't have to do this for nested functions because
4057      they are supposed to be output and then the outer function gimplified
4058      first, but the g++ front end doesn't always do it that way.  */
4059   unshare_body (body_p, fndecl);
4060   unvisit_body (body_p, fndecl);
4061
4062   /* Make sure input_location isn't set to something wierd.  */
4063   input_location = DECL_SOURCE_LOCATION (fndecl);
4064
4065   /* Gimplify the function's body.  */
4066   gimplify_stmt (body_p);
4067   body = *body_p;
4068
4069   /* Unshare again, in case gimplification was sloppy.  */
4070   unshare_all_trees (body);
4071
4072   if (!body)
4073     body = alloc_stmt_list ();
4074   else if (TREE_CODE (body) == STATEMENT_LIST)
4075     {
4076       tree t = expr_only (*body_p);
4077       if (t)
4078         body = t;
4079     }
4080
4081   /* If there isn't an outer BIND_EXPR, add one.  */
4082   if (TREE_CODE (body) != BIND_EXPR)
4083     {
4084       tree b = build (BIND_EXPR, void_type_node, NULL_TREE,
4085                       NULL_TREE, NULL_TREE);
4086       TREE_SIDE_EFFECTS (b) = 1;
4087       append_to_statement_list_force (body, &BIND_EXPR_BODY (b));
4088       body = b;
4089     }
4090   *body_p = body;
4091
4092   pop_gimplify_context (body);
4093
4094 #ifdef ENABLE_CHECKING
4095   walk_tree (body_p, check_pointer_types_r, NULL, NULL);
4096 #endif
4097
4098   timevar_pop (TV_TREE_GIMPLIFY);
4099   input_location = saved_location;
4100 }
4101
4102 /* Entry point to the gimplification pass.  FNDECL is the FUNCTION_DECL
4103    node for the function we want to gimplify.  */
4104
4105 void
4106 gimplify_function_tree (tree fndecl)
4107 {
4108   tree oldfn;
4109
4110   oldfn = current_function_decl;
4111   current_function_decl = fndecl;
4112
4113   gimplify_body (&DECL_SAVED_TREE (fndecl), fndecl);
4114
4115   /* If we're instrumenting function entry/exit, then prepend the call to
4116      the entry hook and wrap the whole function in a TRY_FINALLY_EXPR to
4117      catch the exit hook.  */
4118   /* ??? Add some way to ignore exceptions for this TFE.  */
4119   if (flag_instrument_function_entry_exit
4120       && ! DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl))
4121     {
4122       tree tf, x, bind;
4123
4124       tf = build (TRY_FINALLY_EXPR, void_type_node, NULL, NULL);
4125       TREE_SIDE_EFFECTS (tf) = 1;
4126       x = DECL_SAVED_TREE (fndecl);
4127       append_to_statement_list (x, &TREE_OPERAND (tf, 0));
4128       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_EXIT];
4129       x = build_function_call_expr (x, NULL);
4130       append_to_statement_list (x, &TREE_OPERAND (tf, 1));
4131
4132       bind = build (BIND_EXPR, void_type_node, NULL, NULL, NULL);
4133       TREE_SIDE_EFFECTS (bind) = 1;
4134       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_ENTER];
4135       x = build_function_call_expr (x, NULL);
4136       append_to_statement_list (x, &BIND_EXPR_BODY (bind));
4137       append_to_statement_list (tf, &BIND_EXPR_BODY (bind));
4138
4139       DECL_SAVED_TREE (fndecl) = bind;
4140     }
4141
4142   current_function_decl = oldfn;
4143 }
4144
4145 #include "gt-gimplify.h"