1 /* Tree lowering pass. This pass gimplifies the tree representation built
2 by the C-based front ends. The structure of gimplified, or
3 language-independent, trees is dictated by the grammar described in this
5 Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
6 Lowering of expressions contributed by Sebastian Pop <s.pop@laposte.net>
7 Re-written to support lowering of whole function trees, documentation
8 and miscellaneous cleanups by Diego Novillo <dnovillo@redhat.com>
10 This file is part of GCC.
12 GCC is free software; you can redistribute it and/or modify it under
13 the terms of the GNU General Public License as published by the Free
14 Software Foundation; either version 2, or (at your option) any later
17 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
18 WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 You should have received a copy of the GNU General Public License
23 along with GCC; see the file COPYING. If not, write to the Free
24 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
29 #include "coretypes.h"
36 #include "tree-gimple.h"
37 #include "hard-reg-set.h"
38 #include "basic-block.h"
39 #include "tree-flow.h"
40 #include "tree-inline.h"
41 #include "diagnostic.h"
42 #include "langhooks.h"
43 #include "langhooks-def.h"
47 #include "tree-dump.h"
48 #include "c-pretty-print.h"
52 /* The gimplification pass converts the language-dependent trees
53 (ld-trees) emitted by the parser into language-independent trees
54 (li-trees) that are the target of SSA analysis and transformations.
56 Language-independent trees are based on the SIMPLE intermediate
57 representation used in the McCAT compiler framework:
59 "Designing the McCAT Compiler Based on a Family of Structured
60 Intermediate Representations,"
61 L. Hendren, C. Donawa, M. Emami, G. Gao, Justiani, and B. Sridharan,
62 Proceedings of the 5th International Workshop on Languages and
63 Compilers for Parallel Computing, no. 757 in Lecture Notes in
64 Computer Science, New Haven, Connecticut, pp. 406-420,
65 Springer-Verlag, August 3-5, 1992.
67 http://www-acaps.cs.mcgill.ca/info/McCAT/McCAT.html
69 Basically, we walk down gimplifying the nodes that we encounter. As we
70 walk back up, we check that they fit our constraints, and copy them
71 into temporaries if not. */
73 /* Local declarations. */
75 enum bc_t
{ bc_break
= 0, bc_continue
= 1 };
77 static struct c_gimplify_ctx
79 /* For handling break and continue. */
80 tree current_bc_label
;
88 ctxp
= (struct c_gimplify_ctx
*) xcalloc (1, sizeof (struct c_gimplify_ctx
));
89 ctxp
->bc_id
[bc_continue
] = get_identifier ("continue");
90 ctxp
->bc_id
[bc_break
] = get_identifier ("break");
96 gcc_assert (ctxp
&& !ctxp
->current_bc_label
);
101 /* Gimplification of statement trees. */
103 /* Convert the tree representation of FNDECL from C frontend trees to
107 c_genericize (tree fndecl
)
110 int local_dump_flags
;
111 struct cgraph_node
*cgn
;
113 /* Dump the C-specific tree IR. */
114 dump_file
= dump_begin (TDI_original
, &local_dump_flags
);
117 fprintf (dump_file
, "\n;; Function %s",
118 lang_hooks
.decl_printable_name (fndecl
, 2));
119 fprintf (dump_file
, " (%s)\n",
120 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fndecl
)));
121 fprintf (dump_file
, ";; enabled by -%s\n", dump_flag_name (TDI_original
));
122 fprintf (dump_file
, "\n");
124 if (local_dump_flags
& TDF_RAW
)
125 dump_node (DECL_SAVED_TREE (fndecl
),
126 TDF_SLIM
| local_dump_flags
, dump_file
);
128 print_c_tree (dump_file
, DECL_SAVED_TREE (fndecl
));
129 fprintf (dump_file
, "\n");
131 dump_end (TDI_original
, dump_file
);
134 /* Go ahead and gimplify for now. */
136 gimplify_function_tree (fndecl
);
139 /* Dump the genericized tree IR. */
140 dump_function (TDI_generic
, fndecl
);
142 /* Genericize all nested functions now. We do things in this order so
143 that items like VLA sizes are expanded properly in the context of
144 the correct function. */
145 cgn
= cgraph_node (fndecl
);
146 for (cgn
= cgn
->nested
; cgn
; cgn
= cgn
->next_nested
)
147 c_genericize (cgn
->decl
);
151 add_block_to_enclosing (tree block
)
155 for (enclosing
= gimple_current_bind_expr ();
156 enclosing
; enclosing
= TREE_CHAIN (enclosing
))
157 if (BIND_EXPR_BLOCK (enclosing
))
160 enclosing
= BIND_EXPR_BLOCK (enclosing
);
161 BLOCK_SUBBLOCKS (enclosing
) = chainon (BLOCK_SUBBLOCKS (enclosing
), block
);
164 /* Genericize a scope by creating a new BIND_EXPR.
165 BLOCK is either a BLOCK representing the scope or a chain of _DECLs.
166 In the latter case, we need to create a new BLOCK and add it to the
167 BLOCK_SUBBLOCKS of the enclosing block.
168 BODY is a chain of C _STMT nodes for the contents of the scope, to be
172 c_build_bind_expr (tree block
, tree body
)
176 if (block
== NULL_TREE
)
178 else if (TREE_CODE (block
) == BLOCK
)
179 decls
= BLOCK_VARS (block
);
183 if (DECL_ARTIFICIAL (decls
))
187 block
= make_node (BLOCK
);
188 BLOCK_VARS (block
) = decls
;
189 add_block_to_enclosing (block
);
194 body
= build_empty_stmt ();
197 bind
= build3 (BIND_EXPR
, void_type_node
, decls
, body
, block
);
198 TREE_SIDE_EFFECTS (bind
) = 1;
206 /* Gimplify an EXPR_STMT node.
208 STMT is the statement node.
210 PRE_P points to the list where side effects that must happen before
211 STMT should be stored.
213 POST_P points to the list where side effects that must happen after
214 STMT should be stored. */
216 static enum gimplify_status
217 gimplify_expr_stmt (tree
*stmt_p
)
219 tree stmt
= EXPR_STMT_EXPR (*stmt_p
);
221 if (stmt
== error_mark_node
)
224 /* Gimplification of a statement expression will nullify the
225 statement if all its side effects are moved to *PRE_P and *POST_P.
227 In this case we will not want to emit the gimplified statement.
228 However, we may still want to emit a warning, so we do that before
230 if (stmt
&& (extra_warnings
|| warn_unused_value
))
232 if (!TREE_SIDE_EFFECTS (stmt
))
234 if (!IS_EMPTY_STMT (stmt
)
235 && !VOID_TYPE_P (TREE_TYPE (stmt
))
236 && !TREE_NO_WARNING (stmt
))
237 warning ("statement with no effect");
239 else if (warn_unused_value
)
240 warn_if_unused_value (stmt
, input_location
);
243 if (stmt
== NULL_TREE
)
244 stmt
= alloc_stmt_list ();
251 /* Begin a scope which can be exited by a break or continue statement. BC
254 Just creates a label and pushes it into the current context. */
257 begin_bc_block (enum bc_t bc
)
259 tree label
= create_artificial_label ();
260 DECL_NAME (label
) = ctxp
->bc_id
[bc
];
261 TREE_CHAIN (label
) = ctxp
->current_bc_label
;
262 ctxp
->current_bc_label
= label
;
266 /* Finish a scope which can be exited by a break or continue statement.
267 LABEL was returned from the most recent call to begin_bc_block. BODY is
268 an expression for the contents of the scope.
270 If we saw a break (or continue) in the scope, append a LABEL_EXPR to
271 body. Otherwise, just forget the label. */
274 finish_bc_block (tree label
, tree body
)
276 gcc_assert (label
== ctxp
->current_bc_label
);
278 if (TREE_USED (label
))
282 /* Clear the name so flow can delete the label. */
283 DECL_NAME (label
) = NULL_TREE
;
284 t
= build1 (LABEL_EXPR
, void_type_node
, label
);
286 append_to_statement_list (body
, &sl
);
287 append_to_statement_list (t
, &sl
);
291 ctxp
->current_bc_label
= TREE_CHAIN (label
);
292 TREE_CHAIN (label
) = NULL_TREE
;
296 /* Build a GOTO_EXPR to represent a break or continue statement. BC
300 build_bc_goto (enum bc_t bc
)
303 tree target_name
= ctxp
->bc_id
[bc
];
305 /* Look for the appropriate type of label. */
306 for (label
= ctxp
->current_bc_label
;
308 label
= TREE_CHAIN (label
))
309 if (DECL_NAME (label
) == target_name
)
312 if (label
== NULL_TREE
)
315 error ("break statement not within loop or switch");
317 error ("continue statement not within loop or switch");
322 /* Mark the label used for finish_bc_block. */
323 TREE_USED (label
) = 1;
324 return build1 (GOTO_EXPR
, void_type_node
, label
);
327 /* Build a generic representation of one of the C loop forms. COND is the
328 loop condition or NULL_TREE. BODY is the (possibly compound) statement
329 controlled by the loop. INCR is the increment expression of a for-loop,
330 or NULL_TREE. COND_IS_FIRST indicates whether the condition is
331 evaluated before the loop body as in while and for loops, or after the
332 loop body as in do-while loops. */
335 gimplify_c_loop (tree cond
, tree body
, tree incr
, bool cond_is_first
)
337 tree top
, entry
, exit
, cont_block
, break_block
, stmt_list
, t
;
338 location_t stmt_locus
;
340 stmt_locus
= input_location
;
342 /* Detect do { ... } while (0) and don't generate loop construct. */
343 if (!cond_is_first
&& cond
&& integer_zerop (cond
))
347 /* If we use a LOOP_EXPR here, we have to feed the whole thing
348 back through the main gimplifier to lower it. Given that we
349 have to gimplify the loop body NOW so that we can resolve
350 break/continue stmts, seems easier to just expand to gotos. */
351 top
= build1 (LABEL_EXPR
, void_type_node
, NULL_TREE
);
354 break_block
= begin_bc_block (bc_break
);
358 /* If we have an exit condition, then we build an IF with gotos either
359 out of the loop, or to the top of it. If there's no exit condition,
360 then we just build a jump back to the top. */
361 exit
= build_and_jump (&LABEL_EXPR_LABEL (top
));
364 t
= build_bc_goto (bc_break
);
365 exit
= build3 (COND_EXPR
, void_type_node
, cond
, exit
, t
);
367 gimplify_stmt (&exit
);
373 cont_block
= begin_bc_block (bc_continue
);
375 gimplify_stmt (&body
);
376 gimplify_stmt (&incr
);
378 body
= finish_bc_block (cont_block
, body
);
382 if (cond_is_first
&& cond
)
384 entry
= build1 (LABEL_EXPR
, void_type_node
, NULL_TREE
);
385 t
= build_and_jump (&LABEL_EXPR_LABEL (entry
));
386 append_to_statement_list (t
, &stmt_list
);
391 append_to_statement_list (top
, &stmt_list
);
392 append_to_statement_list (body
, &stmt_list
);
393 append_to_statement_list (incr
, &stmt_list
);
394 append_to_statement_list (entry
, &stmt_list
);
395 append_to_statement_list (exit
, &stmt_list
);
397 annotate_all_with_locus (&stmt_list
, stmt_locus
);
399 return finish_bc_block (break_block
, stmt_list
);
402 /* Gimplify a FOR_STMT node. Move the stuff in the for-init-stmt into the
403 prequeue and hand off to gimplify_c_loop. */
405 static enum gimplify_status
406 gimplify_for_stmt (tree
*stmt_p
, tree
*pre_p
)
410 if (FOR_INIT_STMT (stmt
))
411 gimplify_and_add (FOR_INIT_STMT (stmt
), pre_p
);
413 *stmt_p
= gimplify_c_loop (FOR_COND (stmt
), FOR_BODY (stmt
),
419 /* Gimplify a WHILE_STMT node. */
421 static enum gimplify_status
422 gimplify_while_stmt (tree
*stmt_p
)
425 *stmt_p
= gimplify_c_loop (WHILE_COND (stmt
), WHILE_BODY (stmt
),
430 /* Gimplify a DO_STMT node. */
432 static enum gimplify_status
433 gimplify_do_stmt (tree
*stmt_p
)
436 *stmt_p
= gimplify_c_loop (DO_COND (stmt
), DO_BODY (stmt
),
441 /* Genericize a SWITCH_STMT by turning it into a SWITCH_EXPR. */
443 static enum gimplify_status
444 gimplify_switch_stmt (tree
*stmt_p
)
447 tree break_block
, body
;
448 location_t stmt_locus
= input_location
;
450 break_block
= begin_bc_block (bc_break
);
452 body
= SWITCH_BODY (stmt
);
454 body
= build_empty_stmt ();
456 *stmt_p
= build3 (SWITCH_EXPR
, SWITCH_TYPE (stmt
), SWITCH_COND (stmt
),
458 SET_EXPR_LOCATION (*stmt_p
, stmt_locus
);
459 gimplify_stmt (stmt_p
);
461 *stmt_p
= finish_bc_block (break_block
, *stmt_p
);
465 /* Gimplification of expression trees. */
467 /* Gimplify a C99 compound literal expression. This just means adding the
468 DECL_EXPR before the current EXPR_STMT and using its anonymous decl
471 static enum gimplify_status
472 gimplify_compound_literal_expr (tree
*expr_p
, tree
*pre_p
)
474 tree decl_s
= COMPOUND_LITERAL_EXPR_DECL_STMT (*expr_p
);
475 tree decl
= DECL_EXPR_DECL (decl_s
);
477 /* This decl isn't mentioned in the enclosing block, so add it to the
478 list of temps. FIXME it seems a bit of a kludge to say that
479 anonymous artificial vars aren't pushed, but everything else is. */
480 if (DECL_NAME (decl
) == NULL_TREE
)
481 gimple_add_tmp_var (decl
);
483 gimplify_and_add (decl_s
, pre_p
);
488 /* Do C-specific gimplification. Args are as for gimplify_expr. */
491 c_gimplify_expr (tree
*expr_p
, tree
*pre_p
, tree
*post_p ATTRIBUTE_UNUSED
)
493 enum tree_code code
= TREE_CODE (*expr_p
);
498 /* This is handled mostly by gimplify.c, but we have to deal with
499 not warning about int x = x; as it is a GCC extension to turn off
500 this warning but only if warn_init_self is zero. */
501 if (TREE_CODE (DECL_EXPR_DECL (*expr_p
)) == VAR_DECL
502 && !DECL_EXTERNAL (DECL_EXPR_DECL (*expr_p
))
503 && !TREE_STATIC (DECL_EXPR_DECL (*expr_p
))
504 && (DECL_INITIAL (DECL_EXPR_DECL (*expr_p
))
505 == DECL_EXPR_DECL (*expr_p
))
507 TREE_NO_WARNING (DECL_EXPR_DECL (*expr_p
)) = 1;
510 case COMPOUND_LITERAL_EXPR
:
511 return gimplify_compound_literal_expr (expr_p
, pre_p
);
514 return gimplify_for_stmt (expr_p
, pre_p
);
517 return gimplify_while_stmt (expr_p
);
520 return gimplify_do_stmt (expr_p
);
523 return gimplify_switch_stmt (expr_p
);
526 return gimplify_expr_stmt (expr_p
);
529 *expr_p
= build_bc_goto (bc_continue
);
533 *expr_p
= build_bc_goto (bc_break
);