]> gcc.gnu.org Git - gcc.git/blame - gcc/tree-inline.c
c-common.c (verify_sequence_points): Export.
[gcc.git] / gcc / tree-inline.c
CommitLineData
ac534736 1/* Tree inlining.
d9221e01 2 Copyright 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
588d3ade
AO
3 Contributed by Alexandre Oliva <aoliva@redhat.com>
4
54a7b573 5This file is part of GCC.
588d3ade 6
54a7b573 7GCC is free software; you can redistribute it and/or modify
588d3ade
AO
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
54a7b573 12GCC is distributed in the hope that it will be useful,
588d3ade
AO
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
54a7b573 18along with GCC; see the file COPYING. If not, write to
588d3ade
AO
19the Free Software Foundation, 59 Temple Place - Suite 330,
20Boston, MA 02111-1307, USA. */
21
22#include "config.h"
23#include "system.h"
4977bab6
ZW
24#include "coretypes.h"
25#include "tm.h"
69dcadff 26#include "toplev.h"
588d3ade
AO
27#include "tree.h"
28#include "tree-inline.h"
d4e4baa9
AO
29#include "rtl.h"
30#include "expr.h"
31#include "flags.h"
32#include "params.h"
33#include "input.h"
34#include "insn-config.h"
35#include "integrate.h"
36#include "varray.h"
37#include "hashtab.h"
38#include "splay-tree.h"
d23c55c2 39#include "langhooks.h"
1c4a429a 40#include "cgraph.h"
ddd2d57e 41#include "intl.h"
6de9cd9a 42#include "tree-mudflap.h"
18c6ada9 43#include "function.h"
6de9cd9a 44#include "diagnostic.h"
d4e4baa9 45
6de9cd9a
DN
46/* I'm not real happy about this, but we need to handle gimple and
47 non-gimple trees. */
48#include "tree-iterator.h"
eadf906f 49#include "tree-gimple.h"
588d3ade 50
588d3ade 51/* 0 if we should not perform inlining.
d92b4486
KH
52 1 if we should expand functions calls inline at the tree level.
53 2 if we should consider *all* functions to be inline
588d3ade
AO
54 candidates. */
55
56int flag_inline_trees = 0;
d4e4baa9
AO
57
58/* To Do:
59
60 o In order to make inlining-on-trees work, we pessimized
61 function-local static constants. In particular, they are now
62 always output, even when not addressed. Fix this by treating
63 function-local static constants just like global static
64 constants; the back-end already knows not to output them if they
65 are not needed.
66
67 o Provide heuristics to clamp inlining of recursive template
68 calls? */
69
70/* Data required for function inlining. */
71
72typedef struct inline_data
73{
74 /* A stack of the functions we are inlining. For example, if we are
75 compiling `f', which calls `g', which calls `h', and we are
76 inlining the body of `h', the stack will contain, `h', followed
77 by `g', followed by `f'. The first few elements of the stack may
78 contain other functions that we know we should not recurse into,
79 even though they are not directly being inlined. */
80 varray_type fns;
81 /* The index of the first element of FNS that really represents an
82 inlined function. */
83 unsigned first_inlined_fn;
84 /* The label to jump to when a return statement is encountered. If
85 this value is NULL, then return statements will simply be
86 remapped as return statements, rather than as jumps. */
87 tree ret_label;
6de9cd9a
DN
88 /* The VAR_DECL for the return value. */
89 tree retvar;
d4e4baa9
AO
90 /* The map from local declarations in the inlined function to
91 equivalents in the function into which it is being inlined. */
92 splay_tree decl_map;
93 /* Nonzero if we are currently within the cleanup for a
94 TARGET_EXPR. */
95 int in_target_cleanup_p;
d4e4baa9
AO
96 /* A list of the functions current function has inlined. */
97 varray_type inlined_fns;
d4e4baa9
AO
98 /* We use the same mechanism to build clones that we do to perform
99 inlining. However, there are a few places where we need to
100 distinguish between those two situations. This flag is true if
101 we are cloning, rather than inlining. */
102 bool cloning_p;
18c6ada9
JH
103 /* Similarly for saving function body. */
104 bool saving_p;
d4e4baa9
AO
105 /* Hash table used to prevent walk_tree from visiting the same node
106 umpteen million times. */
107 htab_t tree_pruner;
18c6ada9
JH
108 /* Callgraph node of function we are inlining into. */
109 struct cgraph_node *node;
110 /* Callgraph node of currently inlined function. */
111 struct cgraph_node *current_node;
6de9cd9a
DN
112 /* Statement iterator. We need this so we can keep the tree in
113 gimple form when we insert the inlined function. It is not
114 used when we are not dealing with gimple trees. */
115 tree_stmt_iterator tsi;
d4e4baa9
AO
116} inline_data;
117
118/* Prototypes. */
119
6de9cd9a
DN
120/* The approximate number of instructions per statement. This number
121 need not be particularly accurate; it is used only to make
122 decisions about when a function is too big to inline. */
123#define INSNS_PER_STMT (10)
124
46c5ad27
AJ
125static tree declare_return_variable (inline_data *, tree, tree *);
126static tree copy_body_r (tree *, int *, void *);
127static tree copy_body (inline_data *);
128static tree expand_call_inline (tree *, int *, void *);
129static void expand_calls_inline (tree *, inline_data *);
b3c3af2f 130static bool inlinable_function_p (tree);
46c5ad27 131static tree remap_decl (tree, inline_data *);
3c2a7a6a 132static tree remap_type (tree, inline_data *);
6de9cd9a
DN
133static tree initialize_inlined_parameters (inline_data *, tree,
134 tree, tree, tree);
135static void remap_block (tree *, inline_data *);
136static tree remap_decls (tree, inline_data *);
137static void copy_bind_expr (tree *, int *, inline_data *);
138static tree mark_local_for_remap_r (tree *, int *, void *);
139static tree unsave_r (tree *, int *, void *);
140static void declare_inline_vars (tree bind_expr, tree vars);
d4e4baa9 141
5e20bdd7
JZ
142/* Insert a tree->tree mapping for ID. Despite the name suggests
143 that the trees should be variables, it is used for more than that. */
144
145static void
146insert_decl_map (inline_data *id, tree key, tree value)
147{
148 splay_tree_insert (id->decl_map, (splay_tree_key) key,
149 (splay_tree_value) value);
150
151 /* Always insert an identity map as well. If we see this same new
152 node again, we won't want to duplicate it a second time. */
153 if (key != value)
154 splay_tree_insert (id->decl_map, (splay_tree_key) value,
155 (splay_tree_value) value);
156}
157
d4e4baa9
AO
158/* Remap DECL during the copying of the BLOCK tree for the function. */
159
160static tree
46c5ad27 161remap_decl (tree decl, inline_data *id)
d4e4baa9
AO
162{
163 splay_tree_node n;
164 tree fn;
165
166 /* We only remap local variables in the current function. */
167 fn = VARRAY_TOP_TREE (id->fns);
6de9cd9a
DN
168#if 0
169 /* We need to remap statics, too, so that they get expanded even if the
170 inline function is never emitted out of line. We might as well also
171 remap extern decls so that they show up in the debug info. */
ae2bcd98 172 if (! lang_hooks.tree_inlining.auto_var_in_fn_p (decl, fn))
d4e4baa9 173 return NULL_TREE;
6de9cd9a 174#endif
d4e4baa9
AO
175
176 /* See if we have remapped this declaration. */
177 n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl);
3c2a7a6a 178
d4e4baa9
AO
179 /* If we didn't already have an equivalent for this declaration,
180 create one now. */
181 if (!n)
182 {
183 tree t;
184
185 /* Make a copy of the variable or label. */
3c2a7a6a
RH
186 t = copy_decl_for_inlining (decl, fn, VARRAY_TREE (id->fns, 0));
187
188 /* Remap types, if necessary. */
189 TREE_TYPE (t) = remap_type (TREE_TYPE (t), id);
190 if (TREE_CODE (t) == TYPE_DECL)
191 DECL_ORIGINAL_TYPE (t) = remap_type (DECL_ORIGINAL_TYPE (t), id);
192 else if (TREE_CODE (t) == PARM_DECL)
193 DECL_ARG_TYPE_AS_WRITTEN (t)
194 = remap_type (DECL_ARG_TYPE_AS_WRITTEN (t), id);
195
196 /* Remap sizes as necessary. */
197 walk_tree (&DECL_SIZE (t), copy_body_r, id, NULL);
198 walk_tree (&DECL_SIZE_UNIT (t), copy_body_r, id, NULL);
d4e4baa9 199
6de9cd9a
DN
200#if 0
201 /* FIXME handle anon aggrs. */
d4e4baa9 202 if (! DECL_NAME (t) && TREE_TYPE (t)
ae2bcd98 203 && lang_hooks.tree_inlining.anon_aggr_type_p (TREE_TYPE (t)))
d4e4baa9
AO
204 {
205 /* For a VAR_DECL of anonymous type, we must also copy the
3c2a7a6a 206 member VAR_DECLS here and rechain the DECL_ANON_UNION_ELEMS. */
d4e4baa9
AO
207 tree members = NULL;
208 tree src;
d92b4486 209
d4e4baa9
AO
210 for (src = DECL_ANON_UNION_ELEMS (t); src;
211 src = TREE_CHAIN (src))
212 {
213 tree member = remap_decl (TREE_VALUE (src), id);
214
215 if (TREE_PURPOSE (src))
216 abort ();
217 members = tree_cons (NULL, member, members);
218 }
219 DECL_ANON_UNION_ELEMS (t) = nreverse (members);
220 }
6de9cd9a 221#endif
d92b4486 222
d4e4baa9
AO
223 /* Remember it, so that if we encounter this local entity
224 again we can reuse this copy. */
5e20bdd7
JZ
225 insert_decl_map (id, decl, t);
226 return t;
d4e4baa9
AO
227 }
228
6de9cd9a 229 return unshare_expr ((tree) n->value);
d4e4baa9
AO
230}
231
3c2a7a6a
RH
232static tree
233remap_type (tree type, inline_data *id)
234{
235 splay_tree_node node;
236 tree new, t;
237
238 if (type == NULL)
239 return type;
240
241 /* See if we have remapped this type. */
242 node = splay_tree_lookup (id->decl_map, (splay_tree_key) type);
243 if (node)
244 return (tree) node->value;
245
246 /* The type only needs remapping if it's variably modified. */
247 if (! variably_modified_type_p (type))
248 {
5e20bdd7 249 insert_decl_map (id, type, type);
3c2a7a6a
RH
250 return type;
251 }
252
253 /* We do need a copy. build and register it now. */
254 new = copy_node (type);
5e20bdd7 255 insert_decl_map (id, type, new);
3c2a7a6a
RH
256
257 /* This is a new type, not a copy of an old type. Need to reassociate
258 variants. We can handle everything except the main variant lazily. */
259 t = TYPE_MAIN_VARIANT (type);
260 if (type != t)
261 {
262 t = remap_type (t, id);
263 TYPE_MAIN_VARIANT (new) = t;
264 TYPE_NEXT_VARIANT (new) = TYPE_MAIN_VARIANT (t);
265 TYPE_NEXT_VARIANT (t) = new;
266 }
267 else
268 {
269 TYPE_MAIN_VARIANT (new) = new;
270 TYPE_NEXT_VARIANT (new) = NULL;
271 }
272
273 /* Lazily create pointer and reference types. */
274 TYPE_POINTER_TO (new) = NULL;
275 TYPE_REFERENCE_TO (new) = NULL;
276
277 switch (TREE_CODE (new))
278 {
279 case INTEGER_TYPE:
280 case REAL_TYPE:
281 case ENUMERAL_TYPE:
282 case BOOLEAN_TYPE:
283 case CHAR_TYPE:
284 t = TYPE_MIN_VALUE (new);
285 if (t && TREE_CODE (t) != INTEGER_CST)
286 walk_tree (&TYPE_MIN_VALUE (new), copy_body_r, id, NULL);
1c9766da 287
3c2a7a6a
RH
288 t = TYPE_MAX_VALUE (new);
289 if (t && TREE_CODE (t) != INTEGER_CST)
290 walk_tree (&TYPE_MAX_VALUE (new), copy_body_r, id, NULL);
291 return new;
292
293 case POINTER_TYPE:
294 TREE_TYPE (new) = t = remap_type (TREE_TYPE (new), id);
1c9766da
RK
295 TYPE_NEXT_PTR_TO (new) = TYPE_POINTER_TO (t);
296 TYPE_POINTER_TO (t) = new;
3c2a7a6a
RH
297 return new;
298
299 case REFERENCE_TYPE:
300 TREE_TYPE (new) = t = remap_type (TREE_TYPE (new), id);
1c9766da
RK
301 TYPE_NEXT_REF_TO (new) = TYPE_REFERENCE_TO (t);
302 TYPE_REFERENCE_TO (t) = new;
3c2a7a6a
RH
303 return new;
304
305 case METHOD_TYPE:
306 case FUNCTION_TYPE:
307 TREE_TYPE (new) = remap_type (TREE_TYPE (new), id);
308 walk_tree (&TYPE_ARG_TYPES (new), copy_body_r, id, NULL);
309 return new;
310
311 case ARRAY_TYPE:
312 TREE_TYPE (new) = remap_type (TREE_TYPE (new), id);
313 TYPE_DOMAIN (new) = remap_type (TYPE_DOMAIN (new), id);
314 break;
315
316 case RECORD_TYPE:
317 case UNION_TYPE:
318 case QUAL_UNION_TYPE:
319 walk_tree (&TYPE_FIELDS (new), copy_body_r, id, NULL);
320 break;
321
322 case FILE_TYPE:
323 case SET_TYPE:
324 case OFFSET_TYPE:
325 default:
326 /* Shouldn't have been thought variable sized. */
327 abort ();
328 }
329
330 walk_tree (&TYPE_SIZE (new), copy_body_r, id, NULL);
331 walk_tree (&TYPE_SIZE_UNIT (new), copy_body_r, id, NULL);
332
333 return new;
334}
335
6de9cd9a
DN
336static tree
337remap_decls (tree decls, inline_data *id)
d4e4baa9 338{
6de9cd9a
DN
339 tree old_var;
340 tree new_decls = NULL_TREE;
d4e4baa9 341
6de9cd9a
DN
342 /* Remap its variables. */
343 for (old_var = decls; old_var; old_var = TREE_CHAIN (old_var))
d4e4baa9 344 {
6de9cd9a
DN
345 tree new_var;
346
347 /* Remap the variable. */
348 new_var = remap_decl (old_var, id);
349
350 /* If we didn't remap this variable, so we can't mess with its
351 TREE_CHAIN. If we remapped this variable to the return slot, it's
352 already declared somewhere else, so don't declare it here. */
353 if (!new_var || new_var == id->retvar)
354 ;
355#ifdef ENABLE_CHECKING
356 else if (!DECL_P (new_var))
357 abort ();
358#endif
d4e4baa9
AO
359 else
360 {
6de9cd9a
DN
361 TREE_CHAIN (new_var) = new_decls;
362 new_decls = new_var;
d4e4baa9 363 }
d4e4baa9 364 }
d4e4baa9 365
6de9cd9a
DN
366 return nreverse (new_decls);
367}
368
369/* Copy the BLOCK to contain remapped versions of the variables
370 therein. And hook the new block into the block-tree. */
371
372static void
373remap_block (tree *block, inline_data *id)
374{
d436bff8
AH
375 tree old_block;
376 tree new_block;
d436bff8
AH
377 tree fn;
378
379 /* Make the new block. */
380 old_block = *block;
381 new_block = make_node (BLOCK);
382 TREE_USED (new_block) = TREE_USED (old_block);
383 BLOCK_ABSTRACT_ORIGIN (new_block) = old_block;
d436bff8
AH
384 *block = new_block;
385
386 /* Remap its variables. */
6de9cd9a 387 BLOCK_VARS (new_block) = remap_decls (BLOCK_VARS (old_block), id);
d436bff8 388
6de9cd9a
DN
389 fn = VARRAY_TREE (id->fns, 0);
390#if 1
391 /* FIXME! It shouldn't be so hard to manage blocks. Rebuilding them in
392 rest_of_compilation is a good start. */
393 if (id->cloning_p)
394 /* We're building a clone; DECL_INITIAL is still
395 error_mark_node, and current_binding_level is the parm
396 binding level. */
673fda6b 397 lang_hooks.decls.insert_block (new_block);
6de9cd9a
DN
398 else
399 {
400 /* Attach this new block after the DECL_INITIAL block for the
401 function into which this block is being inlined. In
402 rest_of_compilation we will straighten out the BLOCK tree. */
403 tree *first_block;
404 if (DECL_INITIAL (fn))
405 first_block = &BLOCK_CHAIN (DECL_INITIAL (fn));
d436bff8 406 else
6de9cd9a
DN
407 first_block = &DECL_INITIAL (fn);
408 BLOCK_CHAIN (new_block) = *first_block;
409 *first_block = new_block;
d436bff8 410 }
6de9cd9a 411#endif
d436bff8 412 /* Remember the remapped block. */
6de9cd9a 413 insert_decl_map (id, old_block, new_block);
d4e4baa9
AO
414}
415
d4e4baa9 416static void
6de9cd9a 417copy_statement_list (tree *tp)
d4e4baa9 418{
6de9cd9a
DN
419 tree_stmt_iterator oi, ni;
420 tree new;
421
422 new = alloc_stmt_list ();
423 ni = tsi_start (new);
424 oi = tsi_start (*tp);
425 *tp = new;
426
427 for (; !tsi_end_p (oi); tsi_next (&oi))
428 tsi_link_after (&ni, tsi_stmt (oi), TSI_NEW_STMT);
429}
d4e4baa9 430
6de9cd9a
DN
431static void
432copy_bind_expr (tree *tp, int *walk_subtrees, inline_data *id)
433{
434 tree block = BIND_EXPR_BLOCK (*tp);
d4e4baa9
AO
435 /* Copy (and replace) the statement. */
436 copy_tree_r (tp, walk_subtrees, NULL);
6de9cd9a
DN
437 if (block)
438 {
439 remap_block (&block, id);
440 BIND_EXPR_BLOCK (*tp) = block;
441 }
d4e4baa9 442
6de9cd9a
DN
443 if (BIND_EXPR_VARS (*tp))
444 /* This will remap a lot of the same decls again, but this should be
445 harmless. */
446 BIND_EXPR_VARS (*tp) = remap_decls (BIND_EXPR_VARS (*tp), id);
d4e4baa9
AO
447}
448
449/* Called from copy_body via walk_tree. DATA is really an
450 `inline_data *'. */
d4e4baa9 451static tree
46c5ad27 452copy_body_r (tree *tp, int *walk_subtrees, void *data)
d4e4baa9
AO
453{
454 inline_data* id;
455 tree fn;
456
457 /* Set up. */
458 id = (inline_data *) data;
459 fn = VARRAY_TOP_TREE (id->fns);
460
461#if 0
462 /* All automatic variables should have a DECL_CONTEXT indicating
463 what function they come from. */
464 if ((TREE_CODE (*tp) == VAR_DECL || TREE_CODE (*tp) == LABEL_DECL)
465 && DECL_NAMESPACE_SCOPE_P (*tp))
466 if (! DECL_EXTERNAL (*tp) && ! TREE_STATIC (*tp))
467 abort ();
468#endif
469
9e14e18f
RH
470 /* If this is a RETURN_EXPR, change it into a MODIFY_EXPR and a
471 GOTO_EXPR with the RET_LABEL as its target. */
6de9cd9a 472 if (TREE_CODE (*tp) == RETURN_EXPR && id->ret_label)
d4e4baa9
AO
473 {
474 tree return_stmt = *tp;
475 tree goto_stmt;
476
6de9cd9a 477 /* Build the GOTO_EXPR. */
d436bff8
AH
478 tree assignment = TREE_OPERAND (return_stmt, 0);
479 goto_stmt = build1 (GOTO_EXPR, void_type_node, id->ret_label);
6de9cd9a 480 TREE_USED (id->ret_label) = 1;
d4e4baa9
AO
481
482 /* If we're returning something, just turn that into an
483 assignment into the equivalent of the original
484 RESULT_DECL. */
d436bff8 485 if (assignment)
6de9cd9a
DN
486 {
487 /* Do not create a statement containing a naked RESULT_DECL. */
488 if (lang_hooks.gimple_before_inlining)
489 if (TREE_CODE (assignment) == RESULT_DECL)
490 gimplify_stmt (&assignment);
491
9e14e18f 492 *tp = build (BIND_EXPR, void_type_node, NULL, NULL, NULL);
6de9cd9a
DN
493 append_to_statement_list (assignment, &BIND_EXPR_BODY (*tp));
494 append_to_statement_list (goto_stmt, &BIND_EXPR_BODY (*tp));
495 }
d4e4baa9
AO
496 /* If we're not returning anything just do the jump. */
497 else
498 *tp = goto_stmt;
499 }
500 /* Local variables and labels need to be replaced by equivalent
501 variables. We don't want to copy static variables; there's only
502 one of those, no matter how many times we inline the containing
5e20bdd7 503 function. */
ae2bcd98 504 else if (lang_hooks.tree_inlining.auto_var_in_fn_p (*tp, fn))
d4e4baa9
AO
505 {
506 tree new_decl;
507
508 /* Remap the declaration. */
509 new_decl = remap_decl (*tp, id);
510 if (! new_decl)
511 abort ();
512 /* Replace this variable with the copy. */
513 STRIP_TYPE_NOPS (new_decl);
514 *tp = new_decl;
515 }
516#if 0
517 else if (nonstatic_local_decl_p (*tp)
518 && DECL_CONTEXT (*tp) != VARRAY_TREE (id->fns, 0))
519 abort ();
520#endif
6de9cd9a
DN
521 else if (TREE_CODE (*tp) == STATEMENT_LIST)
522 copy_statement_list (tp);
d4e4baa9
AO
523 else if (TREE_CODE (*tp) == SAVE_EXPR)
524 remap_save_expr (tp, id->decl_map, VARRAY_TREE (id->fns, 0),
525 walk_subtrees);
526 else if (TREE_CODE (*tp) == UNSAVE_EXPR)
527 /* UNSAVE_EXPRs should not be generated until expansion time. */
528 abort ();
6de9cd9a
DN
529 else if (TREE_CODE (*tp) == BIND_EXPR)
530 copy_bind_expr (tp, walk_subtrees, id);
d436bff8
AH
531 else if (TREE_CODE (*tp) == LABELED_BLOCK_EXPR)
532 {
533 /* We need a new copy of this labeled block; the EXIT_BLOCK_EXPR
534 will refer to it, so save a copy ready for remapping. We
535 save it in the decl_map, although it isn't a decl. */
536 tree new_block = copy_node (*tp);
5e20bdd7 537 insert_decl_map (id, *tp, new_block);
d436bff8
AH
538 *tp = new_block;
539 }
540 else if (TREE_CODE (*tp) == EXIT_BLOCK_EXPR)
541 {
50aadcbc
AJ
542 splay_tree_node n
543 = splay_tree_lookup (id->decl_map,
d436bff8
AH
544 (splay_tree_key) TREE_OPERAND (*tp, 0));
545 /* We _must_ have seen the enclosing LABELED_BLOCK_EXPR. */
546 if (! n)
547 abort ();
548 *tp = copy_node (*tp);
549 TREE_OPERAND (*tp, 0) = (tree) n->value;
550 }
3c2a7a6a
RH
551 /* Types may need remapping as well. */
552 else if (TYPE_P (*tp))
553 *tp = remap_type (*tp, id);
554
d4e4baa9
AO
555 /* Otherwise, just copy the node. Note that copy_tree_r already
556 knows not to copy VAR_DECLs, etc., so this is safe. */
557 else
558 {
18c6ada9
JH
559 tree old_node = *tp;
560
68594ce7
JM
561 if (TREE_CODE (*tp) == MODIFY_EXPR
562 && TREE_OPERAND (*tp, 0) == TREE_OPERAND (*tp, 1)
ae2bcd98 563 && (lang_hooks.tree_inlining.auto_var_in_fn_p
68594ce7 564 (TREE_OPERAND (*tp, 0), fn)))
d4e4baa9
AO
565 {
566 /* Some assignments VAR = VAR; don't generate any rtl code
567 and thus don't count as variable modification. Avoid
568 keeping bogosities like 0 = 0. */
569 tree decl = TREE_OPERAND (*tp, 0), value;
570 splay_tree_node n;
571
572 n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl);
573 if (n)
574 {
575 value = (tree) n->value;
576 STRIP_TYPE_NOPS (value);
577 if (TREE_CONSTANT (value) || TREE_READONLY_DECL_P (value))
68594ce7
JM
578 {
579 *tp = value;
580 return copy_body_r (tp, walk_subtrees, data);
581 }
d4e4baa9
AO
582 }
583 }
68594ce7 584 else if (TREE_CODE (*tp) == ADDR_EXPR
ae2bcd98 585 && (lang_hooks.tree_inlining.auto_var_in_fn_p
68594ce7
JM
586 (TREE_OPERAND (*tp, 0), fn)))
587 {
588 /* Get rid of &* from inline substitutions. It can occur when
589 someone takes the address of a parm or return slot passed by
590 invisible reference. */
591 tree decl = TREE_OPERAND (*tp, 0), value;
592 splay_tree_node n;
593
594 n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl);
595 if (n)
596 {
597 value = (tree) n->value;
598 if (TREE_CODE (value) == INDIRECT_REF)
599 {
6de9cd9a
DN
600 /* Assume that the argument types properly match the
601 parameter types. We can't compare them well enough
602 without a comptypes langhook, and we don't want to
603 call convert and introduce a NOP_EXPR to convert
604 between two equivalent types (i.e. that only differ
605 in use of typedef names). */
606 *tp = TREE_OPERAND (value, 0);
607 return copy_body_r (tp, walk_subtrees, data);
608 }
609 }
610 }
611 else if (TREE_CODE (*tp) == INDIRECT_REF)
612 {
613 /* Get rid of *& from inline substitutions that can happen when a
614 pointer argument is an ADDR_EXPR. */
615 tree decl = TREE_OPERAND (*tp, 0), value;
616 splay_tree_node n;
617
618 n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl);
619 if (n)
620 {
621 value = (tree) n->value;
622 STRIP_NOPS (value);
623 if (TREE_CODE (value) == ADDR_EXPR)
624 {
625 *tp = TREE_OPERAND (value, 0);
68594ce7
JM
626 return copy_body_r (tp, walk_subtrees, data);
627 }
628 }
629 }
630
631 copy_tree_r (tp, walk_subtrees, NULL);
632
18c6ada9
JH
633 if (TREE_CODE (*tp) == CALL_EXPR && id->node && get_callee_fndecl (*tp))
634 {
635 if (id->saving_p)
636 {
637 struct cgraph_node *node;
638 struct cgraph_edge *edge;
639
640 for (node = id->node->next_clone; node; node = node->next_clone)
641 {
642 edge = cgraph_edge (node, old_node);
643 if (edge)
644 edge->call_expr = *tp;
645 else
646 abort ();
647 }
648 }
6de9cd9a 649 else
18c6ada9
JH
650 {
651 struct cgraph_edge *edge;
652
653 edge = cgraph_edge (id->current_node, old_node);
654 if (edge)
655 cgraph_clone_edge (edge, id->node, *tp);
656 }
657 }
658
3c2a7a6a
RH
659 TREE_TYPE (*tp) = remap_type (TREE_TYPE (*tp), id);
660
68594ce7
JM
661 /* The copied TARGET_EXPR has never been expanded, even if the
662 original node was expanded already. */
663 if (TREE_CODE (*tp) == TARGET_EXPR && TREE_OPERAND (*tp, 3))
664 {
665 TREE_OPERAND (*tp, 1) = TREE_OPERAND (*tp, 3);
666 TREE_OPERAND (*tp, 3) = NULL_TREE;
667 }
d4e4baa9
AO
668 }
669
670 /* Keep iterating. */
671 return NULL_TREE;
672}
673
674/* Make a copy of the body of FN so that it can be inserted inline in
675 another function. */
676
677static tree
46c5ad27 678copy_body (inline_data *id)
d4e4baa9
AO
679{
680 tree body;
18c6ada9 681 tree fndecl = VARRAY_TOP_TREE (id->fns);
d4e4baa9 682
18c6ada9
JH
683 if (fndecl == current_function_decl
684 && cfun->saved_tree)
685 body = cfun->saved_tree;
686 else
687 body = DECL_SAVED_TREE (fndecl);
d4e4baa9
AO
688 walk_tree (&body, copy_body_r, id, NULL);
689
690 return body;
691}
692
6de9cd9a
DN
693static void
694setup_one_parameter (inline_data *id, tree p, tree value,
695 tree fn, tree *init_stmts, tree *vars,
696 bool *gimplify_init_stmts_p)
697{
698 tree init_stmt;
699 tree var;
700 tree var_sub;
701
702 /* If the parameter is never assigned to, we may not need to
703 create a new variable here at all. Instead, we may be able
704 to just use the argument value. */
705 if (TREE_READONLY (p)
706 && !TREE_ADDRESSABLE (p)
707 && value && !TREE_SIDE_EFFECTS (value))
708 {
709 /* We can't risk substituting complex expressions. They
710 might contain variables that will be assigned to later.
711 Theoretically, we could check the expression to see if
712 all of the variables that determine its value are
713 read-only, but we don't bother. */
714 if ((TREE_CONSTANT (value) || TREE_READONLY_DECL_P (value))
715 /* We may produce non-gimple trees by adding NOPs or introduce
716 invalid sharing when operand is not really constant.
717 It is not big deal to prohibit constant propagation here as
718 we will constant propagate in DOM1 pass anyway. */
719 && (!lang_hooks.gimple_before_inlining
720 || (is_gimple_min_invariant (value)
721 && TREE_TYPE (value) == TREE_TYPE (p))))
722 {
723 /* If this is a declaration, wrap it a NOP_EXPR so that
724 we don't try to put the VALUE on the list of BLOCK_VARS. */
725 if (DECL_P (value))
726 value = build1 (NOP_EXPR, TREE_TYPE (value), value);
727
728 /* If this is a constant, make sure it has the right type. */
729 else if (TREE_TYPE (value) != TREE_TYPE (p))
730 value = fold (build1 (NOP_EXPR, TREE_TYPE (p), value));
731
732 insert_decl_map (id, p, value);
733 return;
734 }
735 }
736
737 /* Make an equivalent VAR_DECL. */
738 var = copy_decl_for_inlining (p, fn, VARRAY_TREE (id->fns, 0));
739
740 /* See if the frontend wants to pass this by invisible reference. If
741 so, our new VAR_DECL will have REFERENCE_TYPE, and we need to
742 replace uses of the PARM_DECL with dereferences. */
743 if (TREE_TYPE (var) != TREE_TYPE (p)
744 && POINTER_TYPE_P (TREE_TYPE (var))
745 && TREE_TYPE (TREE_TYPE (var)) == TREE_TYPE (p))
746 {
747 insert_decl_map (id, var, var);
748 var_sub = build1 (INDIRECT_REF, TREE_TYPE (p), var);
749 }
750 else
751 var_sub = var;
752
753 /* Register the VAR_DECL as the equivalent for the PARM_DECL;
754 that way, when the PARM_DECL is encountered, it will be
755 automatically replaced by the VAR_DECL. */
756 insert_decl_map (id, p, var_sub);
757
758 /* Declare this new variable. */
759 TREE_CHAIN (var) = *vars;
760 *vars = var;
761
762 /* Make gimplifier happy about this variable. */
763 var->decl.seen_in_bind_expr = lang_hooks.gimple_before_inlining;
764
765 /* Even if P was TREE_READONLY, the new VAR should not be.
766 In the original code, we would have constructed a
767 temporary, and then the function body would have never
768 changed the value of P. However, now, we will be
769 constructing VAR directly. The constructor body may
770 change its value multiple times as it is being
771 constructed. Therefore, it must not be TREE_READONLY;
772 the back-end assumes that TREE_READONLY variable is
773 assigned to only once. */
774 if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (p)))
775 TREE_READONLY (var) = 0;
776
777 /* Initialize this VAR_DECL from the equivalent argument. Convert
778 the argument to the proper type in case it was promoted. */
779 if (value)
780 {
e072ae27 781 tree rhs = fold_convert (TREE_TYPE (var), value);
6de9cd9a
DN
782
783 if (rhs == error_mark_node)
784 return;
785
786 /* We want to use MODIFY_EXPR, not INIT_EXPR here so that we
787 keep our trees in gimple form. */
788 init_stmt = build (MODIFY_EXPR, TREE_TYPE (var), var, rhs);
789 append_to_statement_list (init_stmt, init_stmts);
790
791 /* If we did not create a gimple value and we did not create a gimple
792 cast of a gimple value, then we will need to gimplify INIT_STMTS
793 at the end. Note that is_gimple_cast only checks the outer
794 tree code, not its operand. Thus the explicit check that it's
795 operand is a gimple value. */
796 if (!is_gimple_val (rhs)
797 && (!is_gimple_cast (rhs)
798 || !is_gimple_val (TREE_OPERAND (rhs, 0))))
799 *gimplify_init_stmts_p = true;
800 }
801}
802
d4e4baa9
AO
803/* Generate code to initialize the parameters of the function at the
804 top of the stack in ID from the ARGS (presented as a TREE_LIST). */
805
806static tree
6de9cd9a
DN
807initialize_inlined_parameters (inline_data *id, tree args, tree static_chain,
808 tree fn, tree bind_expr)
d4e4baa9 809{
6de9cd9a 810 tree init_stmts = NULL_TREE;
d4e4baa9
AO
811 tree parms;
812 tree a;
813 tree p;
d436bff8 814 tree vars = NULL_TREE;
6de9cd9a 815 bool gimplify_init_stmts_p = false;
d5123bae 816 int argnum = 0;
d4e4baa9
AO
817
818 /* Figure out what the parameters are. */
18c6ada9 819 parms = DECL_ARGUMENTS (fn);
6de9cd9a 820 if (fn == current_function_decl)
18c6ada9 821 parms = cfun->saved_args;
d4e4baa9 822
d4e4baa9
AO
823 /* Loop through the parameter declarations, replacing each with an
824 equivalent VAR_DECL, appropriately initialized. */
4838c5ee
AO
825 for (p = parms, a = args; p;
826 a = a ? TREE_CHAIN (a) : a, p = TREE_CHAIN (p))
d4e4baa9 827 {
d4e4baa9
AO
828 tree value;
829
d5123bae
MS
830 ++argnum;
831
d4e4baa9 832 /* Find the initializer. */
ae2bcd98 833 value = lang_hooks.tree_inlining.convert_parm_for_inlining
d5123bae 834 (p, a ? TREE_VALUE (a) : NULL_TREE, fn, argnum);
4838c5ee 835
6de9cd9a
DN
836 setup_one_parameter (id, p, value, fn, &init_stmts, &vars,
837 &gimplify_init_stmts_p);
d4e4baa9
AO
838 }
839
4838c5ee
AO
840 /* Evaluate trailing arguments. */
841 for (; a; a = TREE_CHAIN (a))
842 {
6e4ae815 843 tree value = TREE_VALUE (a);
6de9cd9a
DN
844 append_to_statement_list (value, &init_stmts);
845 }
4838c5ee 846
6de9cd9a
DN
847 /* Initialize the static chain. */
848 p = DECL_STRUCT_FUNCTION (fn)->static_chain_decl;
849 if (p)
850 {
851 /* No static chain? Seems like a bug in tree-nested.c. */
852 if (!static_chain)
853 abort ();
4838c5ee 854
6de9cd9a
DN
855 setup_one_parameter (id, p, static_chain, fn, &init_stmts, &vars,
856 &gimplify_init_stmts_p);
4838c5ee
AO
857 }
858
6de9cd9a
DN
859 if (gimplify_init_stmts_p && lang_hooks.gimple_before_inlining)
860 gimplify_body (&init_stmts, fn);
861
862 declare_inline_vars (bind_expr, vars);
d436bff8 863 return init_stmts;
d4e4baa9
AO
864}
865
866/* Declare a return variable to replace the RESULT_DECL for the
867 function we are calling. An appropriate DECL_STMT is returned.
868 The USE_STMT is filled in to contain a use of the declaration to
869 indicate the return value of the function. */
870
d436bff8 871static tree
6de9cd9a 872declare_return_variable (inline_data *id, tree return_slot_addr, tree *use_p)
d4e4baa9
AO
873{
874 tree fn = VARRAY_TOP_TREE (id->fns);
875 tree result = DECL_RESULT (fn);
d4e4baa9 876 int need_return_decl = 1;
6de9cd9a 877 tree var;
d4e4baa9
AO
878
879 /* We don't need to do anything for functions that don't return
880 anything. */
881 if (!result || VOID_TYPE_P (TREE_TYPE (result)))
882 {
6de9cd9a 883 *use_p = NULL_TREE;
d4e4baa9
AO
884 return NULL_TREE;
885 }
886
ae2bcd98 887 var = (lang_hooks.tree_inlining.copy_res_decl_for_inlining
69dcadff 888 (result, fn, VARRAY_TREE (id->fns, 0), id->decl_map,
4977bab6 889 &need_return_decl, return_slot_addr));
6de9cd9a
DN
890
891 /* Do not have the rest of GCC warn about this variable as it should
892 not be visible to the user. */
893 TREE_NO_WARNING (var) = 1;
d4e4baa9
AO
894
895 /* Register the VAR_DECL as the equivalent for the RESULT_DECL; that
896 way, when the RESULT_DECL is encountered, it will be
897 automatically replaced by the VAR_DECL. */
5e20bdd7 898 insert_decl_map (id, result, var);
d4e4baa9 899
6de9cd9a
DN
900 /* Remember this so we can ignore it in remap_decls. */
901 id->retvar = var;
902
903 /* Build the use expr. If the return type of the function was
4838c5ee 904 promoted, convert it back to the expected type. */
6de9cd9a
DN
905 if (return_slot_addr)
906 /* The function returns through an explicit return slot, not a normal
907 return value. */
908 *use_p = NULL_TREE;
909 else if (TREE_TYPE (var) == TREE_TYPE (TREE_TYPE (fn)))
910 *use_p = var;
911 else if (TREE_CODE (var) == INDIRECT_REF)
912 *use_p = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (fn)),
913 TREE_OPERAND (var, 0));
914 else if (TREE_ADDRESSABLE (TREE_TYPE (var)))
915 abort ();
4838c5ee 916 else
6de9cd9a 917 *use_p = build1 (NOP_EXPR, TREE_TYPE (TREE_TYPE (fn)), var);
1574ef13 918
d4e4baa9
AO
919 /* Build the declaration statement if FN does not return an
920 aggregate. */
921 if (need_return_decl)
6de9cd9a 922 return var;
d4e4baa9
AO
923 /* If FN does return an aggregate, there's no need to declare the
924 return variable; we're using a variable in our caller's frame. */
925 else
926 return NULL_TREE;
927}
928
0e9e1e0a 929/* Returns nonzero if a function can be inlined as a tree. */
4838c5ee 930
b3c3af2f
SB
931bool
932tree_inlinable_function_p (tree fn)
4838c5ee 933{
b3c3af2f 934 return inlinable_function_p (fn);
4838c5ee
AO
935}
936
f08545a8 937static const char *inline_forbidden_reason;
c986baf6 938
c986baf6 939static tree
f08545a8 940inline_forbidden_p_1 (tree *nodep, int *walk_subtrees ATTRIBUTE_UNUSED,
edeb3871 941 void *fnp)
c986baf6 942{
f08545a8 943 tree node = *nodep;
edeb3871 944 tree fn = (tree) fnp;
f08545a8 945 tree t;
c986baf6 946
f08545a8
JH
947 switch (TREE_CODE (node))
948 {
949 case CALL_EXPR:
3197c4fd
AS
950 /* Refuse to inline alloca call unless user explicitly forced so as
951 this may change program's memory overhead drastically when the
952 function using alloca is called in loop. In GCC present in
953 SPEC2000 inlining into schedule_block cause it to require 2GB of
954 RAM instead of 256MB. */
f08545a8
JH
955 if (alloca_call_p (node)
956 && !lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)))
957 {
ddd2d57e
RH
958 inline_forbidden_reason
959 = N_("%Jfunction '%F' can never be inlined because it uses "
960 "alloca (override using the always_inline attribute)");
f08545a8
JH
961 return node;
962 }
963 t = get_callee_fndecl (node);
964 if (! t)
965 break;
84f5e1b1 966
84f5e1b1 967
f08545a8
JH
968 /* We cannot inline functions that call setjmp. */
969 if (setjmp_call_p (t))
970 {
ddd2d57e
RH
971 inline_forbidden_reason
972 = N_("%Jfunction '%F' can never be inlined because it uses setjmp");
f08545a8
JH
973 return node;
974 }
975
6de9cd9a 976 if (DECL_BUILT_IN_CLASS (t) == BUILT_IN_NORMAL)
3197c4fd 977 switch (DECL_FUNCTION_CODE (t))
f08545a8 978 {
3197c4fd
AS
979 /* We cannot inline functions that take a variable number of
980 arguments. */
981 case BUILT_IN_VA_START:
982 case BUILT_IN_STDARG_START:
983 case BUILT_IN_NEXT_ARG:
984 case BUILT_IN_VA_END:
6de9cd9a
DN
985 inline_forbidden_reason
986 = N_("%Jfunction '%F' can never be inlined because it "
987 "uses variable argument lists");
988 return node;
989
3197c4fd 990 case BUILT_IN_LONGJMP:
6de9cd9a
DN
991 /* We can't inline functions that call __builtin_longjmp at
992 all. The non-local goto machinery really requires the
993 destination be in a different function. If we allow the
994 function calling __builtin_longjmp to be inlined into the
995 function calling __builtin_setjmp, Things will Go Awry. */
996 inline_forbidden_reason
997 = N_("%Jfunction '%F' can never be inlined because "
998 "it uses setjmp-longjmp exception handling");
999 return node;
1000
1001 case BUILT_IN_NONLOCAL_GOTO:
1002 /* Similarly. */
1003 inline_forbidden_reason
1004 = N_("%Jfunction '%F' can never be inlined because "
1005 "it uses non-local goto");
1006 return node;
f08545a8 1007
3197c4fd
AS
1008 default:
1009 break;
1010 }
f08545a8
JH
1011 break;
1012
6de9cd9a
DN
1013 case BIND_EXPR:
1014 for (t = BIND_EXPR_VARS (node); t ; t = TREE_CHAIN (t))
f08545a8 1015 {
6de9cd9a
DN
1016 /* We cannot inline functions that contain other functions. */
1017 if (TREE_CODE (t) == FUNCTION_DECL && DECL_INITIAL (t))
1018 {
1019 inline_forbidden_reason
1020 = N_("%Jfunction '%F' can never be inlined "
1021 "because it contains a nested function");
1022 return node;
1023 }
f08545a8
JH
1024 }
1025 break;
1026
f08545a8
JH
1027 case GOTO_EXPR:
1028 t = TREE_OPERAND (node, 0);
1029
1030 /* We will not inline a function which uses computed goto. The
1031 addresses of its local labels, which may be tucked into
1032 global storage, are of course not constant across
1033 instantiations, which causes unexpected behavior. */
1034 if (TREE_CODE (t) != LABEL_DECL)
1035 {
ddd2d57e
RH
1036 inline_forbidden_reason
1037 = N_("%Jfunction '%F' can never be inlined "
1038 "because it contains a computed goto");
f08545a8
JH
1039 return node;
1040 }
6de9cd9a 1041 break;
f08545a8 1042
6de9cd9a
DN
1043 case LABEL_EXPR:
1044 t = TREE_OPERAND (node, 0);
1045 if (DECL_NONLOCAL (t))
f08545a8 1046 {
6de9cd9a
DN
1047 /* We cannot inline a function that receives a non-local goto
1048 because we cannot remap the destination label used in the
1049 function that is performing the non-local goto. */
ddd2d57e
RH
1050 inline_forbidden_reason
1051 = N_("%Jfunction '%F' can never be inlined "
6de9cd9a 1052 "because it receives a non-local goto");
f08545a8 1053 }
f08545a8
JH
1054 break;
1055
1056 case RECORD_TYPE:
1057 case UNION_TYPE:
1058 /* We cannot inline a function of the form
1059
1060 void F (int i) { struct S { int ar[i]; } s; }
1061
1062 Attempting to do so produces a catch-22.
1063 If walk_tree examines the TYPE_FIELDS chain of RECORD_TYPE/
1064 UNION_TYPE nodes, then it goes into infinite recursion on a
1065 structure containing a pointer to its own type. If it doesn't,
1066 then the type node for S doesn't get adjusted properly when
1067 F is inlined, and we abort in find_function_data. */
1068 for (t = TYPE_FIELDS (node); t; t = TREE_CHAIN (t))
1069 if (variably_modified_type_p (TREE_TYPE (t)))
1070 {
ddd2d57e
RH
1071 inline_forbidden_reason
1072 = N_("%Jfunction '%F' can never be inlined "
1073 "because it uses variable sized variables");
f08545a8
JH
1074 return node;
1075 }
6de9cd9a 1076
f08545a8
JH
1077 default:
1078 break;
1079 }
1080
1081 return NULL_TREE;
84f5e1b1
RH
1082}
1083
f08545a8 1084/* Return subexpression representing possible alloca call, if any. */
84f5e1b1 1085static tree
f08545a8 1086inline_forbidden_p (tree fndecl)
84f5e1b1 1087{
070588f0 1088 location_t saved_loc = input_location;
51657442 1089 tree ret = walk_tree_without_duplicates
f08545a8 1090 (&DECL_SAVED_TREE (fndecl), inline_forbidden_p_1, fndecl);
070588f0 1091 input_location = saved_loc;
d1a74aa7 1092 return ret;
84f5e1b1
RH
1093}
1094
b3c3af2f
SB
1095/* Returns nonzero if FN is a function that does not have any
1096 fundamental inline blocking properties. */
d4e4baa9 1097
b3c3af2f
SB
1098static bool
1099inlinable_function_p (tree fn)
d4e4baa9 1100{
b3c3af2f 1101 bool inlinable = true;
d4e4baa9
AO
1102
1103 /* If we've already decided this function shouldn't be inlined,
1104 there's no need to check again. */
1105 if (DECL_UNINLINABLE (fn))
b3c3af2f 1106 return false;
d4e4baa9 1107
d58b7c2d
MM
1108 /* See if there is any language-specific reason it cannot be
1109 inlined. (It is important that this hook be called early because
b3c3af2f
SB
1110 in C++ it may result in template instantiation.)
1111 If the function is not inlinable for language-specific reasons,
1112 it is left up to the langhook to explain why. */
ae2bcd98 1113 inlinable = !lang_hooks.tree_inlining.cannot_inline_tree_fn (&fn);
46c5ad27 1114
b3c3af2f
SB
1115 /* If we don't have the function body available, we can't inline it.
1116 However, this should not be recorded since we also get here for
1117 forward declared inline functions. Therefore, return at once. */
1118 if (!DECL_SAVED_TREE (fn))
1119 return false;
1120
1121 /* If we're not inlining at all, then we cannot inline this function. */
1122 else if (!flag_inline_trees)
1123 inlinable = false;
1124
1125 /* Only try to inline functions if DECL_INLINE is set. This should be
1126 true for all functions declared `inline', and for all other functions
1127 as well with -finline-functions.
1128
1129 Don't think of disregarding DECL_INLINE when flag_inline_trees == 2;
1130 it's the front-end that must set DECL_INLINE in this case, because
1131 dwarf2out loses if a function that does not have DECL_INLINE set is
1132 inlined anyway. That is why we have both DECL_INLINE and
1133 DECL_DECLARED_INLINE_P. */
1134 /* FIXME: When flag_inline_trees dies, the check for flag_unit_at_a_time
1135 here should be redundant. */
1136 else if (!DECL_INLINE (fn) && !flag_unit_at_a_time)
1137 inlinable = false;
a0c8285b 1138
0bb7378d
AH
1139#ifdef INLINER_FOR_JAVA
1140 /* Synchronized methods can't be inlined. This is a bug. */
1141 else if (METHOD_SYNCHRONIZED (fn))
b3c3af2f 1142 inlinable = false;
0bb7378d 1143#endif /* INLINER_FOR_JAVA */
b3c3af2f 1144
f08545a8 1145 else if (inline_forbidden_p (fn))
b3c3af2f
SB
1146 {
1147 /* See if we should warn about uninlinable functions. Previously,
1148 some of these warnings would be issued while trying to expand
1149 the function inline, but that would cause multiple warnings
1150 about functions that would for example call alloca. But since
1151 this a property of the function, just one warning is enough.
1152 As a bonus we can now give more details about the reason why a
1153 function is not inlinable.
1154 We only warn for functions declared `inline' by the user. */
1155 bool do_warning = (warn_inline
1156 && DECL_INLINE (fn)
1157 && DECL_DECLARED_INLINE_P (fn)
1158 && !DECL_IN_SYSTEM_HEADER (fn));
1159
2d327012
JH
1160 if (lookup_attribute ("always_inline",
1161 DECL_ATTRIBUTES (fn)))
1162 sorry (inline_forbidden_reason, fn, fn);
1163 else if (do_warning)
ddd2d57e 1164 warning (inline_forbidden_reason, fn, fn);
b3c3af2f
SB
1165
1166 inlinable = false;
1167 }
d4e4baa9
AO
1168
1169 /* Squirrel away the result so that we don't have to check again. */
b3c3af2f 1170 DECL_UNINLINABLE (fn) = !inlinable;
d4e4baa9 1171
b3c3af2f
SB
1172 return inlinable;
1173}
1174
6de9cd9a
DN
1175/* Used by estimate_num_insns. Estimate number of instructions seen
1176 by given statement. */
1177static tree
1178estimate_num_insns_1 (tree *tp, int *walk_subtrees, void *data)
1179{
1180 int *count = data;
1181 tree x = *tp;
1182
1183 if (TYPE_P (x) || DECL_P (x))
1184 {
1185 *walk_subtrees = 0;
1186 return NULL;
1187 }
1188 /* Assume that constants and references counts nothing. These should
1189 be majorized by amount of operations among them we count later
1190 and are common target of CSE and similar optimizations. */
1191 if (TREE_CODE_CLASS (TREE_CODE (x)) == 'c'
1192 || TREE_CODE_CLASS (TREE_CODE (x)) == 'r')
1193 return NULL;
1194 switch (TREE_CODE (x))
1195 {
1196 /* Containers have no cost. */
1197 case TREE_LIST:
1198 case TREE_VEC:
1199 case BLOCK:
1200 case COMPONENT_REF:
1201 case BIT_FIELD_REF:
1202 case INDIRECT_REF:
1203 case BUFFER_REF:
1204 case ARRAY_REF:
1205 case ARRAY_RANGE_REF:
1206 case VTABLE_REF:
1207 case EXC_PTR_EXPR: /* ??? */
1208 case FILTER_EXPR: /* ??? */
1209 case COMPOUND_EXPR:
1210 case BIND_EXPR:
1211 case LABELED_BLOCK_EXPR:
1212 case WITH_CLEANUP_EXPR:
1213 case NOP_EXPR:
1214 case VIEW_CONVERT_EXPR:
1215 case SAVE_EXPR:
1216 case UNSAVE_EXPR:
1217 case ADDR_EXPR:
1218 case REFERENCE_EXPR:
1219 case COMPLEX_EXPR:
1220 case REALPART_EXPR:
1221 case IMAGPART_EXPR:
1222 case EXIT_BLOCK_EXPR:
1223 case CASE_LABEL_EXPR:
1224 case SSA_NAME:
1225 case CATCH_EXPR:
1226 case EH_FILTER_EXPR:
1227 case STATEMENT_LIST:
1228 case ERROR_MARK:
1229 case NON_LVALUE_EXPR:
1230 case ENTRY_VALUE_EXPR:
1231 case FDESC_EXPR:
1232 case VA_ARG_EXPR:
1233 case TRY_CATCH_EXPR:
1234 case TRY_FINALLY_EXPR:
1235 case LABEL_EXPR:
1236 case GOTO_EXPR:
1237 case RETURN_EXPR:
1238 case EXIT_EXPR:
1239 case LOOP_EXPR:
6de9cd9a
DN
1240 case PHI_NODE:
1241 break;
1242 /* We don't account constants for now. Assume that the cost is amortized
1243 by operations that do use them. We may re-consider this decision once
1244 we are able to optimize the tree before estimating it's size and break
1245 out static initializers. */
1246 case IDENTIFIER_NODE:
1247 case INTEGER_CST:
1248 case REAL_CST:
1249 case COMPLEX_CST:
1250 case VECTOR_CST:
1251 case STRING_CST:
1252 *walk_subtrees = 0;
1253 return NULL;
3a5b9284 1254
6de9cd9a
DN
1255 /* Recognize assignments of large structures and constructors of
1256 big arrays. */
1257 case INIT_EXPR:
6de9cd9a 1258 case MODIFY_EXPR:
3a5b9284
RH
1259 x = TREE_OPERAND (x, 0);
1260 /* FALLTHRU */
1261 case TARGET_EXPR:
6de9cd9a
DN
1262 case CONSTRUCTOR:
1263 {
1264 HOST_WIDE_INT size;
1265
1266 size = int_size_in_bytes (TREE_TYPE (x));
1267
1268 if (size < 0 || size > MOVE_MAX_PIECES * MOVE_RATIO)
1269 *count += 10;
1270 else
1271 *count += ((size + MOVE_MAX_PIECES - 1) / MOVE_MAX_PIECES);
1272 }
1273 break;
1274
1275 /* Assign cost of 1 to usual operations.
1276 ??? We may consider mapping RTL costs to this. */
1277 case COND_EXPR:
1278
1279 case PLUS_EXPR:
1280 case MINUS_EXPR:
1281 case MULT_EXPR:
1282
1283 case FIX_TRUNC_EXPR:
1284 case FIX_CEIL_EXPR:
1285 case FIX_FLOOR_EXPR:
1286 case FIX_ROUND_EXPR:
1287
1288 case NEGATE_EXPR:
1289 case FLOAT_EXPR:
1290 case MIN_EXPR:
1291 case MAX_EXPR:
1292 case ABS_EXPR:
1293
1294 case LSHIFT_EXPR:
1295 case RSHIFT_EXPR:
1296 case LROTATE_EXPR:
1297 case RROTATE_EXPR:
1298
1299 case BIT_IOR_EXPR:
1300 case BIT_XOR_EXPR:
1301 case BIT_AND_EXPR:
1302 case BIT_NOT_EXPR:
1303
1304 case TRUTH_ANDIF_EXPR:
1305 case TRUTH_ORIF_EXPR:
1306 case TRUTH_AND_EXPR:
1307 case TRUTH_OR_EXPR:
1308 case TRUTH_XOR_EXPR:
1309 case TRUTH_NOT_EXPR:
1310
1311 case LT_EXPR:
1312 case LE_EXPR:
1313 case GT_EXPR:
1314 case GE_EXPR:
1315 case EQ_EXPR:
1316 case NE_EXPR:
1317 case ORDERED_EXPR:
1318 case UNORDERED_EXPR:
1319
1320 case UNLT_EXPR:
1321 case UNLE_EXPR:
1322 case UNGT_EXPR:
1323 case UNGE_EXPR:
1324 case UNEQ_EXPR:
d1a7edaf 1325 case LTGT_EXPR:
6de9cd9a
DN
1326
1327 case CONVERT_EXPR:
1328
1329 case CONJ_EXPR:
1330
1331 case PREDECREMENT_EXPR:
1332 case PREINCREMENT_EXPR:
1333 case POSTDECREMENT_EXPR:
1334 case POSTINCREMENT_EXPR:
1335
1336 case SWITCH_EXPR:
1337
1338 case ASM_EXPR:
1339
1340 case RESX_EXPR:
1341 *count++;
1342 break;
1343
1ea7e6ad 1344 /* Few special cases of expensive operations. This is useful
6de9cd9a
DN
1345 to avoid inlining on functions having too many of these. */
1346 case TRUNC_DIV_EXPR:
1347 case CEIL_DIV_EXPR:
1348 case FLOOR_DIV_EXPR:
1349 case ROUND_DIV_EXPR:
1350 case EXACT_DIV_EXPR:
1351 case TRUNC_MOD_EXPR:
1352 case CEIL_MOD_EXPR:
1353 case FLOOR_MOD_EXPR:
1354 case ROUND_MOD_EXPR:
1355 case RDIV_EXPR:
1356 *count += 10;
1357 break;
1358 case CALL_EXPR:
1359 {
1360 tree decl = get_callee_fndecl (x);
1361
1362 if (decl && DECL_BUILT_IN (decl))
1363 switch (DECL_FUNCTION_CODE (decl))
1364 {
1365 case BUILT_IN_CONSTANT_P:
1366 *walk_subtrees = 0;
1367 return NULL_TREE;
1368 case BUILT_IN_EXPECT:
1369 return NULL_TREE;
1370 default:
1371 break;
1372 }
1373 *count += 10;
1374 break;
1375 }
1376 default:
1377 /* Abort here se we know we don't miss any nodes. */
1378 abort ();
1379 }
1380 return NULL;
1381}
1382
1383/* Estimate number of instructions that will be created by expanding EXPR. */
1384int
1385estimate_num_insns (tree expr)
1386{
1387 int num = 0;
1388 walk_tree_without_duplicates (&expr, estimate_num_insns_1, &num);
1389 return num;
1390}
1391
d4e4baa9
AO
1392/* If *TP is a CALL_EXPR, replace it with its inline expansion. */
1393
1394static tree
46c5ad27 1395expand_call_inline (tree *tp, int *walk_subtrees, void *data)
d4e4baa9
AO
1396{
1397 inline_data *id;
1398 tree t;
1399 tree expr;
e2405951 1400 tree stmt;
6de9cd9a
DN
1401 tree use_retvar;
1402 tree decl;
d436bff8 1403 tree fn;
d4e4baa9
AO
1404 tree arg_inits;
1405 tree *inlined_body;
6de9cd9a 1406 tree inline_result;
d4e4baa9 1407 splay_tree st;
4977bab6
ZW
1408 tree args;
1409 tree return_slot_addr;
6de9cd9a 1410 location_t saved_location;
18c6ada9 1411 struct cgraph_edge *edge;
dc0bfe6a 1412 const char *reason;
d4e4baa9
AO
1413
1414 /* See what we've got. */
1415 id = (inline_data *) data;
1416 t = *tp;
1417
6de9cd9a
DN
1418 /* Set input_location here so we get the right instantiation context
1419 if we call instantiate_decl from inlinable_function_p. */
1420 saved_location = input_location;
1421 if (EXPR_HAS_LOCATION (t))
1422 input_location = EXPR_LOCATION (t);
1423
d4e4baa9
AO
1424 /* Recurse, but letting recursive invocations know that we are
1425 inside the body of a TARGET_EXPR. */
1426 if (TREE_CODE (*tp) == TARGET_EXPR)
1427 {
6de9cd9a 1428#if 0
d4e4baa9
AO
1429 int i, len = first_rtl_op (TARGET_EXPR);
1430
1431 /* We're walking our own subtrees. */
1432 *walk_subtrees = 0;
1433
d4e4baa9
AO
1434 /* Actually walk over them. This loop is the body of
1435 walk_trees, omitting the case where the TARGET_EXPR
1436 itself is handled. */
1437 for (i = 0; i < len; ++i)
1438 {
1439 if (i == 2)
1440 ++id->in_target_cleanup_p;
1441 walk_tree (&TREE_OPERAND (*tp, i), expand_call_inline, data,
1442 id->tree_pruner);
1443 if (i == 2)
1444 --id->in_target_cleanup_p;
1445 }
1446
6de9cd9a
DN
1447 goto egress;
1448#endif
a833faa5 1449 }
d4e4baa9
AO
1450
1451 if (TYPE_P (t))
1452 /* Because types were not copied in copy_body, CALL_EXPRs beneath
1453 them should not be expanded. This can happen if the type is a
1454 dynamic array type, for example. */
1455 *walk_subtrees = 0;
1456
1457 /* From here on, we're only interested in CALL_EXPRs. */
1458 if (TREE_CODE (t) != CALL_EXPR)
6de9cd9a 1459 goto egress;
d4e4baa9
AO
1460
1461 /* First, see if we can figure out what function is being called.
1462 If we cannot, then there is no hope of inlining the function. */
1463 fn = get_callee_fndecl (t);
1464 if (!fn)
6de9cd9a 1465 goto egress;
d4e4baa9 1466
b58b1157 1467 /* Turn forward declarations into real ones. */
d4d1ebc1 1468 fn = cgraph_node (fn)->decl;
b58b1157 1469
a1a0fd4e
AO
1470 /* If fn is a declaration of a function in a nested scope that was
1471 globally declared inline, we don't set its DECL_INITIAL.
1472 However, we can't blindly follow DECL_ABSTRACT_ORIGIN because the
1473 C++ front-end uses it for cdtors to refer to their internal
1474 declarations, that are not real functions. Fortunately those
1475 don't have trees to be saved, so we can tell by checking their
1476 DECL_SAVED_TREE. */
1477 if (! DECL_INITIAL (fn)
1478 && DECL_ABSTRACT_ORIGIN (fn)
1479 && DECL_SAVED_TREE (DECL_ABSTRACT_ORIGIN (fn)))
1480 fn = DECL_ABSTRACT_ORIGIN (fn);
1481
18c6ada9
JH
1482 /* Objective C and fortran still calls tree_rest_of_compilation directly.
1483 Kill this check once this is fixed. */
1484 if (!id->current_node->analyzed)
6de9cd9a 1485 goto egress;
18c6ada9
JH
1486
1487 edge = cgraph_edge (id->current_node, t);
1488
1489 /* Constant propagation on argument done during previous inlining
1490 may create new direct call. Produce an edge for it. */
1491 if (!edge)
1492 {
1493 struct cgraph_node *dest = cgraph_node (fn);
1494
6de9cd9a
DN
1495 /* We have missing edge in the callgraph. This can happen in one case
1496 where previous inlining turned indirect call into direct call by
1497 constant propagating arguments. In all other cases we hit a bug
1498 (incorrect node sharing is most common reason for missing edges. */
18c6ada9
JH
1499 if (!dest->needed)
1500 abort ();
1501 cgraph_create_edge (id->node, dest, t)->inline_failed
1502 = N_("originally indirect function call not considered for inlining");
6de9cd9a 1503 goto egress;
18c6ada9
JH
1504 }
1505
d4e4baa9
AO
1506 /* Don't try to inline functions that are not well-suited to
1507 inlining. */
18c6ada9 1508 if (!cgraph_inline_p (edge, &reason))
a833faa5 1509 {
2d327012
JH
1510 if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)))
1511 {
1512 sorry ("%Jinlining failed in call to '%F': %s", fn, fn, reason);
1513 sorry ("called from here");
1514 }
1515 else if (warn_inline && DECL_DECLARED_INLINE_P (fn)
1516 && !DECL_IN_SYSTEM_HEADER (fn)
1517 && strlen (reason))
a833faa5 1518 {
dc0bfe6a 1519 warning ("%Jinlining failed in call to '%F': %s", fn, fn, reason);
a833faa5
MM
1520 warning ("called from here");
1521 }
6de9cd9a 1522 goto egress;
a833faa5 1523 }
d4e4baa9 1524
18c6ada9
JH
1525#ifdef ENABLE_CHECKING
1526 if (edge->callee->decl != id->node->decl)
1527 verify_cgraph_node (edge->callee);
1528#endif
1529
ae2bcd98 1530 if (! lang_hooks.tree_inlining.start_inlining (fn))
6de9cd9a 1531 goto egress;
742a37d5 1532
d436bff8
AH
1533 /* Build a block containing code to initialize the arguments, the
1534 actual inline expansion of the body, and a label for the return
1535 statements within the function to jump to. The type of the
1536 statement expression is the return type of the function call. */
1537 stmt = NULL;
6de9cd9a
DN
1538 expr = build (BIND_EXPR, TREE_TYPE (TREE_TYPE (fn)), NULL_TREE,
1539 stmt, make_node (BLOCK));
1540 BLOCK_ABSTRACT_ORIGIN (BIND_EXPR_BLOCK (expr)) = fn;
d436bff8 1541
d4e4baa9
AO
1542 /* Local declarations will be replaced by their equivalents in this
1543 map. */
1544 st = id->decl_map;
1545 id->decl_map = splay_tree_new (splay_tree_compare_pointers,
1546 NULL, NULL);
1547
1548 /* Initialize the parameters. */
4977bab6
ZW
1549 args = TREE_OPERAND (t, 1);
1550 return_slot_addr = NULL_TREE;
1551 if (CALL_EXPR_HAS_RETURN_SLOT_ADDR (t))
1552 {
1553 return_slot_addr = TREE_VALUE (args);
1554 args = TREE_CHAIN (args);
6de9cd9a 1555 TREE_TYPE (expr) = void_type_node;
4977bab6
ZW
1556 }
1557
6de9cd9a
DN
1558 arg_inits = initialize_inlined_parameters (id, args, TREE_OPERAND (t, 2),
1559 fn, expr);
d436bff8
AH
1560 if (arg_inits)
1561 {
1562 /* Expand any inlined calls in the initializers. Do this before we
1563 push FN on the stack of functions we are inlining; we want to
1564 inline calls to FN that appear in the initializers for the
6de9cd9a
DN
1565 parameters.
1566
1567 Note we need to save and restore the saved tree statement iterator
1568 to avoid having it clobbered by expand_calls_inline. */
1569 tree_stmt_iterator save_tsi;
1570
1571 save_tsi = id->tsi;
d436bff8 1572 expand_calls_inline (&arg_inits, id);
6de9cd9a 1573 id->tsi = save_tsi;
50aadcbc 1574
d436bff8 1575 /* And add them to the tree. */
6de9cd9a 1576 append_to_statement_list (arg_inits, &BIND_EXPR_BODY (expr));
d436bff8 1577 }
d4e4baa9
AO
1578
1579 /* Record the function we are about to inline so that we can avoid
1580 recursing into it. */
1581 VARRAY_PUSH_TREE (id->fns, fn);
1582
1583 /* Record the function we are about to inline if optimize_function
1584 has not been called on it yet and we don't have it in the list. */
1585 if (! DECL_INLINED_FNS (fn))
1586 {
1587 int i;
1588
1589 for (i = VARRAY_ACTIVE_SIZE (id->inlined_fns) - 1; i >= 0; i--)
1590 if (VARRAY_TREE (id->inlined_fns, i) == fn)
1591 break;
1592 if (i < 0)
1593 VARRAY_PUSH_TREE (id->inlined_fns, fn);
1594 }
1595
1596 /* Return statements in the function body will be replaced by jumps
1597 to the RET_LABEL. */
1598 id->ret_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
6de9cd9a 1599 DECL_ARTIFICIAL (id->ret_label) = 1;
d4e4baa9 1600 DECL_CONTEXT (id->ret_label) = VARRAY_TREE (id->fns, 0);
6de9cd9a 1601 insert_decl_map (id, id->ret_label, id->ret_label);
d4e4baa9 1602
23700f65
AO
1603 if (! DECL_INITIAL (fn)
1604 || TREE_CODE (DECL_INITIAL (fn)) != BLOCK)
1605 abort ();
1606
d4e4baa9 1607 /* Declare the return variable for the function. */
6de9cd9a
DN
1608 decl = declare_return_variable (id, return_slot_addr, &use_retvar);
1609 if (decl)
1610 declare_inline_vars (expr, decl);
d4e4baa9
AO
1611
1612 /* After we've initialized the parameters, we insert the body of the
1613 function itself. */
18c6ada9
JH
1614 {
1615 struct cgraph_node *old_node = id->current_node;
1616
1617 id->current_node = edge->callee;
6de9cd9a 1618 append_to_statement_list (copy_body (id), &BIND_EXPR_BODY (expr));
18c6ada9
JH
1619 id->current_node = old_node;
1620 }
6de9cd9a 1621 inlined_body = &BIND_EXPR_BODY (expr);
d4e4baa9 1622
d4e4baa9 1623 /* After the body of the function comes the RET_LABEL. This must come
14b493d6 1624 before we evaluate the returned value below, because that evaluation
d4e4baa9 1625 may cause RTL to be generated. */
6de9cd9a 1626 if (TREE_USED (id->ret_label))
3eb429b2 1627 {
6de9cd9a
DN
1628 tree label = build1 (LABEL_EXPR, void_type_node, id->ret_label);
1629 append_to_statement_list (label, &BIND_EXPR_BODY (expr));
3eb429b2 1630 }
50aadcbc 1631
6de9cd9a
DN
1632 /* Finally, mention the returned value so that the value of the
1633 statement-expression is the returned value of the function. */
1634 if (use_retvar)
1635 /* Set TREE_TYPE on BIND_EXPR? */
1636 append_to_statement_list_force (use_retvar, &BIND_EXPR_BODY (expr));
d4e4baa9
AO
1637
1638 /* Clean up. */
1639 splay_tree_delete (id->decl_map);
1640 id->decl_map = st;
1641
1642 /* The new expression has side-effects if the old one did. */
1643 TREE_SIDE_EFFECTS (expr) = TREE_SIDE_EFFECTS (t);
1644
6de9cd9a
DN
1645 /* If we are working with gimple form, then we need to keep the tree
1646 in gimple form. If we are not in gimple form, we can just replace
1647 *tp with the new BIND_EXPR. */
1648 if (lang_hooks.gimple_before_inlining)
1649 {
1650 tree save_decl;
1651
1652 /* Keep the new trees in gimple form. */
1653 BIND_EXPR_BODY (expr)
1654 = rationalize_compound_expr (BIND_EXPR_BODY (expr));
1655
1656 /* We want to create a new variable to hold the result of the
1657 inlined body. This new variable needs to be added to the
1658 function which we are inlining into, thus the saving and
1659 restoring of current_function_decl. */
1660 save_decl = current_function_decl;
1661 current_function_decl = id->node->decl;
325c3691 1662 inline_result = voidify_wrapper_expr (expr, NULL);
6de9cd9a
DN
1663 current_function_decl = save_decl;
1664
1665 /* If the inlined function returns a result that we care about,
1666 then we're going to need to splice in a MODIFY_EXPR. Otherwise
1667 the call was a standalone statement and we can just replace it
1668 with the BIND_EXPR inline representation of the called function. */
1669 if (TREE_CODE (tsi_stmt (id->tsi)) != CALL_EXPR)
1670 {
1671 tsi_link_before (&id->tsi, expr, TSI_SAME_STMT);
1672 *tp = inline_result;
1673 }
1674 else
1675 *tp = expr;
1676
1677 /* When we gimplify a function call, we may clear TREE_SIDE_EFFECTS
1678 on the call if it is to a "const" function. Thus the copy of
1679 TREE_SIDE_EFFECTS from the CALL_EXPR to the BIND_EXPR above
1680 with result in TREE_SIDE_EFFECTS not being set for the inlined
1681 copy of a "const" function.
1682
1683 Unfortunately, that is wrong as inlining the function
1684 can create/expose interesting side effects (such as setting
1685 of a return value).
1686
1687 The easiest solution is to simply recalculate TREE_SIDE_EFFECTS
1688 for the toplevel expression. */
1689 recalculate_side_effects (expr);
1690 }
1691 else
1692 *tp = expr;
d4e4baa9
AO
1693
1694 /* If the value of the new expression is ignored, that's OK. We
1695 don't warn about this for CALL_EXPRs, so we shouldn't warn about
1696 the equivalent inlined version either. */
1697 TREE_USED (*tp) = 1;
1698
e72fcfe8 1699 /* Update callgraph if needed. */
18c6ada9 1700 cgraph_remove_node (edge->callee);
e72fcfe8 1701
d4e4baa9 1702 /* Recurse into the body of the just inlined function. */
18c6ada9 1703 expand_calls_inline (inlined_body, id);
d4e4baa9
AO
1704 VARRAY_POP (id->fns);
1705
d4e4baa9
AO
1706 /* Don't walk into subtrees. We've already handled them above. */
1707 *walk_subtrees = 0;
1708
ae2bcd98 1709 lang_hooks.tree_inlining.end_inlining (fn);
742a37d5 1710
d4e4baa9 1711 /* Keep iterating. */
6de9cd9a
DN
1712 egress:
1713 input_location = saved_location;
d4e4baa9
AO
1714 return NULL_TREE;
1715}
6de9cd9a
DN
1716
1717static void
1718gimple_expand_calls_inline (tree *stmt_p, inline_data *id)
1719{
1720 tree stmt = *stmt_p;
1721 enum tree_code code = TREE_CODE (stmt);
1722 int dummy;
1723
1724 switch (code)
1725 {
1726 case STATEMENT_LIST:
1727 {
1728 tree_stmt_iterator i;
1729 tree new;
1730
1731 for (i = tsi_start (stmt); !tsi_end_p (i); )
1732 {
1733 id->tsi = i;
1734 gimple_expand_calls_inline (tsi_stmt_ptr (i), id);
1735
1736 new = tsi_stmt (i);
1737 if (TREE_CODE (new) == STATEMENT_LIST)
1738 {
1739 tsi_link_before (&i, new, TSI_SAME_STMT);
1740 tsi_delink (&i);
1741 }
1742 else
1743 tsi_next (&i);
1744 }
1745 }
1746 break;
1747
1748 case COND_EXPR:
1749 gimple_expand_calls_inline (&COND_EXPR_THEN (stmt), id);
1750 gimple_expand_calls_inline (&COND_EXPR_ELSE (stmt), id);
1751 break;
1752 case CATCH_EXPR:
1753 gimple_expand_calls_inline (&CATCH_BODY (stmt), id);
1754 break;
1755 case EH_FILTER_EXPR:
1756 gimple_expand_calls_inline (&EH_FILTER_FAILURE (stmt), id);
1757 break;
1758 case TRY_CATCH_EXPR:
1759 case TRY_FINALLY_EXPR:
1760 gimple_expand_calls_inline (&TREE_OPERAND (stmt, 0), id);
1761 gimple_expand_calls_inline (&TREE_OPERAND (stmt, 1), id);
1762 break;
1763 case BIND_EXPR:
1764 gimple_expand_calls_inline (&BIND_EXPR_BODY (stmt), id);
1765 break;
1766
1767 case COMPOUND_EXPR:
1768 /* We're gimple. We should have gotten rid of all these. */
1769 abort ();
1770
1771 case RETURN_EXPR:
1772 stmt_p = &TREE_OPERAND (stmt, 0);
1773 stmt = *stmt_p;
1774 if (!stmt || TREE_CODE (stmt) != MODIFY_EXPR)
1775 break;
1776 /* FALLTHRU */
1777 case MODIFY_EXPR:
1778 stmt_p = &TREE_OPERAND (stmt, 1);
1779 stmt = *stmt_p;
1780 if (TREE_CODE (stmt) != CALL_EXPR)
1781 break;
1782 /* FALLTHRU */
1783 case CALL_EXPR:
1784 expand_call_inline (stmt_p, &dummy, id);
1785 break;
1786
1787 default:
1788 break;
1789 }
1790}
1791
d4e4baa9
AO
1792/* Walk over the entire tree *TP, replacing CALL_EXPRs with inline
1793 expansions as appropriate. */
1794
1795static void
46c5ad27 1796expand_calls_inline (tree *tp, inline_data *id)
d4e4baa9 1797{
6de9cd9a
DN
1798 /* If we are not in gimple form, then we want to walk the tree
1799 recursively as we do not know anything about the structure
1800 of the tree. */
1801
1802 if (!lang_hooks.gimple_before_inlining)
1803 {
1804 walk_tree (tp, expand_call_inline, id, id->tree_pruner);
1805 return;
1806 }
1807
1808 /* We are in gimple form. We want to stay in gimple form. Walk
1809 the statements, inlining calls in each statement. By walking
1810 the statements, we have enough information to keep the tree
1811 in gimple form as we insert inline bodies. */
1812
1813 gimple_expand_calls_inline (tp, id);
d4e4baa9
AO
1814}
1815
1816/* Expand calls to inline functions in the body of FN. */
1817
1818void
46c5ad27 1819optimize_inline_calls (tree fn)
d4e4baa9
AO
1820{
1821 inline_data id;
1822 tree prev_fn;
d92b4486 1823
c5b6f18e
MM
1824 /* There is no point in performing inlining if errors have already
1825 occurred -- and we might crash if we try to inline invalid
1826 code. */
1827 if (errorcount || sorrycount)
1828 return;
1829
d4e4baa9
AO
1830 /* Clear out ID. */
1831 memset (&id, 0, sizeof (id));
1832
18c6ada9 1833 id.current_node = id.node = cgraph_node (fn);
d4e4baa9
AO
1834 /* Don't allow recursion into FN. */
1835 VARRAY_TREE_INIT (id.fns, 32, "fns");
1836 VARRAY_PUSH_TREE (id.fns, fn);
1837 /* Or any functions that aren't finished yet. */
1838 prev_fn = NULL_TREE;
1839 if (current_function_decl)
1840 {
1841 VARRAY_PUSH_TREE (id.fns, current_function_decl);
1842 prev_fn = current_function_decl;
1843 }
1844
ae2bcd98 1845 prev_fn = (lang_hooks.tree_inlining.add_pending_fn_decls
69dcadff 1846 (&id.fns, prev_fn));
d92b4486 1847
d4e4baa9
AO
1848 /* Create the list of functions this call will inline. */
1849 VARRAY_TREE_INIT (id.inlined_fns, 32, "inlined_fns");
1850
1851 /* Keep track of the low-water mark, i.e., the point where the first
1852 real inlining is represented in ID.FNS. */
1853 id.first_inlined_fn = VARRAY_ACTIVE_SIZE (id.fns);
1854
1855 /* Replace all calls to inline functions with the bodies of those
1856 functions. */
1857 id.tree_pruner = htab_create (37, htab_hash_pointer,
1858 htab_eq_pointer, NULL);
1859 expand_calls_inline (&DECL_SAVED_TREE (fn), &id);
1860
1861 /* Clean up. */
1862 htab_delete (id.tree_pruner);
d4e4baa9
AO
1863 if (DECL_LANG_SPECIFIC (fn))
1864 {
1865 tree ifn = make_tree_vec (VARRAY_ACTIVE_SIZE (id.inlined_fns));
d92b4486 1866
fa7b533b
ZW
1867 if (VARRAY_ACTIVE_SIZE (id.inlined_fns))
1868 memcpy (&TREE_VEC_ELT (ifn, 0), &VARRAY_TREE (id.inlined_fns, 0),
1869 VARRAY_ACTIVE_SIZE (id.inlined_fns) * sizeof (tree));
d4e4baa9
AO
1870 DECL_INLINED_FNS (fn) = ifn;
1871 }
6de9cd9a 1872
18c6ada9
JH
1873#ifdef ENABLE_CHECKING
1874 {
1875 struct cgraph_edge *e;
1876
1877 verify_cgraph_node (id.node);
1878
1879 /* Double check that we inlined everything we are supposed to inline. */
1880 for (e = id.node->callees; e; e = e->next_callee)
1881 if (!e->inline_failed)
1882 abort ();
1883 }
1884#endif
d4e4baa9
AO
1885}
1886
1887/* FN is a function that has a complete body, and CLONE is a function
1888 whose body is to be set to a copy of FN, mapping argument
1889 declarations according to the ARG_MAP splay_tree. */
1890
1891void
46c5ad27 1892clone_body (tree clone, tree fn, void *arg_map)
d4e4baa9
AO
1893{
1894 inline_data id;
1895
1896 /* Clone the body, as if we were making an inline call. But, remap
1897 the parameters in the callee to the parameters of caller. If
1898 there's an in-charge parameter, map it to an appropriate
1899 constant. */
1900 memset (&id, 0, sizeof (id));
1901 VARRAY_TREE_INIT (id.fns, 2, "fns");
1902 VARRAY_PUSH_TREE (id.fns, clone);
1903 VARRAY_PUSH_TREE (id.fns, fn);
1904 id.decl_map = (splay_tree)arg_map;
1905
1906 /* Cloning is treated slightly differently from inlining. Set
1907 CLONING_P so that it's clear which operation we're performing. */
1908 id.cloning_p = true;
1909
1910 /* Actually copy the body. */
325c3691 1911 append_to_statement_list_force (copy_body (&id), &DECL_SAVED_TREE (clone));
d4e4baa9
AO
1912}
1913
18c6ada9
JH
1914/* Save duplicate of body in FN. MAP is used to pass around splay tree
1915 used to update arguments in restore_body. */
1916tree
1917save_body (tree fn, tree *arg_copy)
1918{
1919 inline_data id;
1920 tree body, *parg;
1921
1922 memset (&id, 0, sizeof (id));
1923 VARRAY_TREE_INIT (id.fns, 1, "fns");
1924 VARRAY_PUSH_TREE (id.fns, fn);
1925 id.node = cgraph_node (fn);
1926 id.saving_p = true;
1927 id.decl_map = splay_tree_new (splay_tree_compare_pointers, NULL, NULL);
1928 *arg_copy = DECL_ARGUMENTS (fn);
1929 for (parg = arg_copy; *parg; parg = &TREE_CHAIN (*parg))
1930 {
1931 tree new = copy_node (*parg);
673fda6b 1932 lang_hooks.dup_lang_specific_decl (new);
18c6ada9
JH
1933 DECL_ABSTRACT_ORIGIN (new) = DECL_ORIGIN (*parg);
1934 insert_decl_map (&id, *parg, new);
1935 TREE_CHAIN (new) = TREE_CHAIN (*parg);
1936 *parg = new;
1937 }
1938 insert_decl_map (&id, DECL_RESULT (fn), DECL_RESULT (fn));
1939
1940 /* Actually copy the body. */
1941 body = copy_body (&id);
18c6ada9
JH
1942
1943 /* Clean up. */
1944 splay_tree_delete (id.decl_map);
1945 return body;
1946}
1947
d4e4baa9
AO
1948/* Apply FUNC to all the sub-trees of TP in a pre-order traversal.
1949 FUNC is called with the DATA and the address of each sub-tree. If
1950 FUNC returns a non-NULL value, the traversal is aborted, and the
1951 value returned by FUNC is returned. If HTAB is non-NULL it is used
1952 to record the nodes visited, and to avoid visiting a node more than
1953 once. */
1954
d92b4486 1955tree
46c5ad27 1956walk_tree (tree *tp, walk_tree_fn func, void *data, void *htab_)
d4e4baa9
AO
1957{
1958 htab_t htab = (htab_t) htab_;
1959 enum tree_code code;
1960 int walk_subtrees;
1961 tree result;
d92b4486 1962
d4e4baa9
AO
1963#define WALK_SUBTREE(NODE) \
1964 do \
1965 { \
1966 result = walk_tree (&(NODE), func, data, htab); \
1967 if (result) \
1968 return result; \
1969 } \
1970 while (0)
1971
6c624f7f
AO
1972#define WALK_SUBTREE_TAIL(NODE) \
1973 do \
1974 { \
1975 tp = & (NODE); \
1976 goto tail_recurse; \
1977 } \
1978 while (0)
1979
1980 tail_recurse:
d4e4baa9
AO
1981 /* Skip empty subtrees. */
1982 if (!*tp)
1983 return NULL_TREE;
1984
1985 if (htab)
1986 {
1987 void **slot;
d92b4486 1988
d4e4baa9 1989 /* Don't walk the same tree twice, if the user has requested
2ba84f36 1990 that we avoid doing so. */
d4e4baa9 1991 slot = htab_find_slot (htab, *tp, INSERT);
c35c7e52
RH
1992 if (*slot)
1993 return NULL_TREE;
d4e4baa9
AO
1994 *slot = *tp;
1995 }
1996
1997 /* Call the function. */
1998 walk_subtrees = 1;
1999 result = (*func) (tp, &walk_subtrees, data);
2000
2001 /* If we found something, return it. */
2002 if (result)
2003 return result;
2004
2005 code = TREE_CODE (*tp);
2006
2007 /* Even if we didn't, FUNC may have decided that there was nothing
2008 interesting below this point in the tree. */
2009 if (!walk_subtrees)
2010 {
325c3691 2011 if (code == TREE_LIST)
d4e4baa9 2012 /* But we still need to check our siblings. */
6c624f7f 2013 WALK_SUBTREE_TAIL (TREE_CHAIN (*tp));
d4e4baa9
AO
2014 else
2015 return NULL_TREE;
2016 }
2017
673fda6b
SB
2018 result = lang_hooks.tree_inlining.walk_subtrees (tp, &walk_subtrees, func,
2019 data, htab);
6de9cd9a
DN
2020 if (result || ! walk_subtrees)
2021 return result;
2022
d436bff8
AH
2023 if (code != EXIT_BLOCK_EXPR
2024 && code != SAVE_EXPR
6de9cd9a 2025 && code != BIND_EXPR
68ad9159 2026 && IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
d4e4baa9
AO
2027 {
2028 int i, len;
2029
d4e4baa9
AO
2030 /* Walk over all the sub-trees of this operand. */
2031 len = first_rtl_op (code);
2032 /* TARGET_EXPRs are peculiar: operands 1 and 3 can be the same.
2033 But, we only want to walk once. */
2034 if (code == TARGET_EXPR
2035 && TREE_OPERAND (*tp, 3) == TREE_OPERAND (*tp, 1))
2036 --len;
2037 /* Go through the subtrees. We need to do this in forward order so
2038 that the scope of a FOR_EXPR is handled properly. */
6de9cd9a 2039#ifdef DEBUG_WALK_TREE
d4e4baa9
AO
2040 for (i = 0; i < len; ++i)
2041 WALK_SUBTREE (TREE_OPERAND (*tp, i));
6de9cd9a
DN
2042#else
2043 for (i = 0; i < len - 1; ++i)
2044 WALK_SUBTREE (TREE_OPERAND (*tp, i));
d4e4baa9 2045
6de9cd9a 2046 if (len)
d4e4baa9 2047 {
6de9cd9a
DN
2048 /* The common case is that we may tail recurse here. */
2049 if (code != BIND_EXPR
2050 && !TREE_CHAIN (*tp))
2051 WALK_SUBTREE_TAIL (TREE_OPERAND (*tp, len - 1));
2052 else
2053 WALK_SUBTREE (TREE_OPERAND (*tp, len - 1));
d4e4baa9 2054 }
6de9cd9a 2055#endif
d4e4baa9
AO
2056 }
2057 else if (TREE_CODE_CLASS (code) == 'd')
2058 {
6c624f7f 2059 WALK_SUBTREE_TAIL (TREE_TYPE (*tp));
d4e4baa9 2060 }
6de9cd9a 2061 else
f3763a44 2062 {
6de9cd9a
DN
2063 if (TREE_CODE_CLASS (code) == 't')
2064 {
2065 WALK_SUBTREE (TYPE_SIZE (*tp));
2066 WALK_SUBTREE (TYPE_SIZE_UNIT (*tp));
2067 /* Also examine various special fields, below. */
2068 }
d4e4baa9 2069
6de9cd9a
DN
2070 /* Not one of the easy cases. We must explicitly go through the
2071 children. */
2072 switch (code)
2073 {
2074 case ERROR_MARK:
2075 case IDENTIFIER_NODE:
2076 case INTEGER_CST:
2077 case REAL_CST:
2078 case VECTOR_CST:
2079 case STRING_CST:
2080 case REAL_TYPE:
2081 case COMPLEX_TYPE:
2082 case VECTOR_TYPE:
2083 case VOID_TYPE:
2084 case BOOLEAN_TYPE:
2085 case UNION_TYPE:
2086 case ENUMERAL_TYPE:
2087 case BLOCK:
2088 case RECORD_TYPE:
2089 case PLACEHOLDER_EXPR:
2090 case SSA_NAME:
2091 /* None of thse have subtrees other than those already walked
2092 above. */
2093 break;
d4e4baa9 2094
6de9cd9a
DN
2095 case POINTER_TYPE:
2096 case REFERENCE_TYPE:
2097 WALK_SUBTREE_TAIL (TREE_TYPE (*tp));
2098 break;
d4e4baa9 2099
6de9cd9a
DN
2100 case TREE_LIST:
2101 WALK_SUBTREE (TREE_VALUE (*tp));
2102 WALK_SUBTREE_TAIL (TREE_CHAIN (*tp));
2103 break;
d4e4baa9 2104
6de9cd9a
DN
2105 case TREE_VEC:
2106 {
2107 int len = TREE_VEC_LENGTH (*tp);
d4e4baa9 2108
6de9cd9a
DN
2109 if (len == 0)
2110 break;
6c624f7f 2111
6de9cd9a
DN
2112 /* Walk all elements but the first. */
2113 while (--len)
2114 WALK_SUBTREE (TREE_VEC_ELT (*tp, len));
6c624f7f 2115
6de9cd9a
DN
2116 /* Now walk the first one as a tail call. */
2117 WALK_SUBTREE_TAIL (TREE_VEC_ELT (*tp, 0));
2118 }
6c624f7f 2119
6de9cd9a
DN
2120 case COMPLEX_CST:
2121 WALK_SUBTREE (TREE_REALPART (*tp));
2122 WALK_SUBTREE_TAIL (TREE_IMAGPART (*tp));
d4e4baa9 2123
6de9cd9a
DN
2124 case CONSTRUCTOR:
2125 WALK_SUBTREE_TAIL (CONSTRUCTOR_ELTS (*tp));
d4e4baa9 2126
6de9cd9a
DN
2127 case METHOD_TYPE:
2128 WALK_SUBTREE (TYPE_METHOD_BASETYPE (*tp));
2129 /* Fall through. */
d4e4baa9 2130
6de9cd9a
DN
2131 case FUNCTION_TYPE:
2132 WALK_SUBTREE (TREE_TYPE (*tp));
2133 {
2134 tree arg = TYPE_ARG_TYPES (*tp);
d4e4baa9 2135
6de9cd9a
DN
2136 /* We never want to walk into default arguments. */
2137 for (; arg; arg = TREE_CHAIN (arg))
2138 WALK_SUBTREE (TREE_VALUE (arg));
2139 }
2140 break;
d4e4baa9 2141
6de9cd9a
DN
2142 case ARRAY_TYPE:
2143 WALK_SUBTREE (TREE_TYPE (*tp));
2144 WALK_SUBTREE_TAIL (TYPE_DOMAIN (*tp));
d4e4baa9 2145
6de9cd9a
DN
2146 case INTEGER_TYPE:
2147 case CHAR_TYPE:
2148 WALK_SUBTREE (TYPE_MIN_VALUE (*tp));
2149 WALK_SUBTREE_TAIL (TYPE_MAX_VALUE (*tp));
d4e4baa9 2150
6de9cd9a
DN
2151 case OFFSET_TYPE:
2152 WALK_SUBTREE (TREE_TYPE (*tp));
2153 WALK_SUBTREE_TAIL (TYPE_OFFSET_BASETYPE (*tp));
d4e4baa9 2154
6de9cd9a
DN
2155 case EXIT_BLOCK_EXPR:
2156 WALK_SUBTREE_TAIL (TREE_OPERAND (*tp, 1));
d4e4baa9 2157
6de9cd9a
DN
2158 case SAVE_EXPR:
2159 WALK_SUBTREE_TAIL (TREE_OPERAND (*tp, 0));
d436bff8 2160
6de9cd9a
DN
2161 case BIND_EXPR:
2162 {
2163 tree decl;
2164 for (decl = BIND_EXPR_VARS (*tp); decl; decl = TREE_CHAIN (decl))
2165 {
2166 /* Walk the DECL_INITIAL and DECL_SIZE. We don't want to walk
2167 into declarations that are just mentioned, rather than
2168 declared; they don't really belong to this part of the tree.
2169 And, we can see cycles: the initializer for a declaration can
2170 refer to the declaration itself. */
2171 WALK_SUBTREE (DECL_INITIAL (decl));
2172 WALK_SUBTREE (DECL_SIZE (decl));
2173 WALK_SUBTREE (DECL_SIZE_UNIT (decl));
2174 WALK_SUBTREE (TREE_TYPE (decl));
2175 }
2176 WALK_SUBTREE_TAIL (BIND_EXPR_BODY (*tp));
2177 }
d436bff8 2178
6de9cd9a
DN
2179 case STATEMENT_LIST:
2180 {
2181 tree_stmt_iterator i;
2182 for (i = tsi_start (*tp); !tsi_end_p (i); tsi_next (&i))
2183 WALK_SUBTREE (*tsi_stmt_ptr (i));
2184 }
2185 break;
2186
2187 default:
2188 abort ();
2189 }
d4e4baa9
AO
2190 }
2191
2192 /* We didn't find what we were looking for. */
2193 return NULL_TREE;
2194
2195#undef WALK_SUBTREE
8bcefb43 2196#undef WALK_SUBTREE_TAIL
d4e4baa9
AO
2197}
2198
d92b4486 2199/* Like walk_tree, but does not walk duplicate nodes more than
d4e4baa9
AO
2200 once. */
2201
d92b4486 2202tree
46c5ad27 2203walk_tree_without_duplicates (tree *tp, walk_tree_fn func, void *data)
d4e4baa9
AO
2204{
2205 tree result;
2206 htab_t htab;
2207
2208 htab = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL);
2209 result = walk_tree (tp, func, data, htab);
2210 htab_delete (htab);
2211 return result;
2212}
2213
2214/* Passed to walk_tree. Copies the node pointed to, if appropriate. */
2215
2216tree
46c5ad27 2217copy_tree_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
d4e4baa9
AO
2218{
2219 enum tree_code code = TREE_CODE (*tp);
2220
2221 /* We make copies of most nodes. */
2222 if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
d4e4baa9 2223 || TREE_CODE_CLASS (code) == 'c'
d4e4baa9
AO
2224 || code == TREE_LIST
2225 || code == TREE_VEC
325c3691 2226 || code == TYPE_DECL)
d4e4baa9
AO
2227 {
2228 /* Because the chain gets clobbered when we make a copy, we save it
2229 here. */
2230 tree chain = TREE_CHAIN (*tp);
6de9cd9a 2231 tree new;
d4e4baa9
AO
2232
2233 /* Copy the node. */
6de9cd9a
DN
2234 new = copy_node (*tp);
2235
2236 /* Propagate mudflap marked-ness. */
2237 if (flag_mudflap && mf_marked_p (*tp))
2238 mf_mark (new);
2239
2240 *tp = new;
d4e4baa9
AO
2241
2242 /* Now, restore the chain, if appropriate. That will cause
2243 walk_tree to walk into the chain as well. */
325c3691 2244 if (code == PARM_DECL || code == TREE_LIST)
d4e4baa9
AO
2245 TREE_CHAIN (*tp) = chain;
2246
2247 /* For now, we don't update BLOCKs when we make copies. So, we
6de9cd9a
DN
2248 have to nullify all BIND_EXPRs. */
2249 if (TREE_CODE (*tp) == BIND_EXPR)
2250 BIND_EXPR_BLOCK (*tp) = NULL_TREE;
d4e4baa9 2251 }
3c2a7a6a 2252 else if (TREE_CODE_CLASS (code) == 't')
d4e4baa9 2253 *walk_subtrees = 0;
6de9cd9a
DN
2254 else if (TREE_CODE_CLASS (code) == 'd')
2255 *walk_subtrees = 0;
2256 else if (code == STATEMENT_LIST)
2257 abort ();
d4e4baa9
AO
2258
2259 return NULL_TREE;
2260}
2261
2262/* The SAVE_EXPR pointed to by TP is being copied. If ST contains
2263 information indicating to what new SAVE_EXPR this one should be
2264 mapped, use that one. Otherwise, create a new node and enter it in
2265 ST. FN is the function into which the copy will be placed. */
2266
2267void
46c5ad27 2268remap_save_expr (tree *tp, void *st_, tree fn, int *walk_subtrees)
d4e4baa9
AO
2269{
2270 splay_tree st = (splay_tree) st_;
2271 splay_tree_node n;
5e20bdd7 2272 tree t;
d4e4baa9
AO
2273
2274 /* See if we already encountered this SAVE_EXPR. */
2275 n = splay_tree_lookup (st, (splay_tree_key) *tp);
d92b4486 2276
d4e4baa9
AO
2277 /* If we didn't already remap this SAVE_EXPR, do so now. */
2278 if (!n)
2279 {
5e20bdd7 2280 t = copy_node (*tp);
d4e4baa9
AO
2281
2282 /* The SAVE_EXPR is now part of the function into which we
2283 are inlining this body. */
2284 SAVE_EXPR_CONTEXT (t) = fn;
2285 /* And we haven't evaluated it yet. */
2286 SAVE_EXPR_RTL (t) = NULL_RTX;
2287 /* Remember this SAVE_EXPR. */
5e20bdd7 2288 splay_tree_insert (st, (splay_tree_key) *tp, (splay_tree_value) t);
350ebd54 2289 /* Make sure we don't remap an already-remapped SAVE_EXPR. */
1593ad2e 2290 splay_tree_insert (st, (splay_tree_key) t, (splay_tree_value) t);
d4e4baa9
AO
2291 }
2292 else
5e20bdd7
JZ
2293 {
2294 /* We've already walked into this SAVE_EXPR; don't do it again. */
2295 *walk_subtrees = 0;
2296 t = (tree) n->value;
2297 }
d4e4baa9
AO
2298
2299 /* Replace this SAVE_EXPR with the copy. */
5e20bdd7 2300 *tp = t;
d4e4baa9 2301}
d436bff8 2302
6de9cd9a
DN
2303/* Called via walk_tree. If *TP points to a DECL_STMT for a local
2304 declaration, copies the declaration and enters it in the splay_tree
2305 in DATA (which is really an `inline_data *'). */
2306
2307static tree
2308mark_local_for_remap_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
2309 void *data)
2310{
2311 tree t = *tp;
2312 inline_data *id = (inline_data *) data;
2313 tree decl;
2314
2315 /* Don't walk into types. */
2316 if (TYPE_P (t))
2317 {
2318 *walk_subtrees = 0;
2319 return NULL_TREE;
2320 }
2321
2322 if (TREE_CODE (t) == LABEL_EXPR)
2323 decl = TREE_OPERAND (t, 0);
2324 else
2325 /* We don't need to handle anything else ahead of time. */
2326 decl = NULL_TREE;
2327
2328 if (decl)
2329 {
2330 tree copy;
2331
2332 /* Make a copy. */
2333 copy = copy_decl_for_inlining (decl,
2334 DECL_CONTEXT (decl),
2335 DECL_CONTEXT (decl));
2336
2337 /* Remember the copy. */
2338 insert_decl_map (id, decl, copy);
2339 }
2340
2341 return NULL_TREE;
2342}
2343
2344/* Called via walk_tree when an expression is unsaved. Using the
2345 splay_tree pointed to by ST (which is really a `splay_tree'),
2346 remaps all local declarations to appropriate replacements. */
d436bff8
AH
2347
2348static tree
6de9cd9a 2349unsave_r (tree *tp, int *walk_subtrees, void *data)
d436bff8 2350{
6de9cd9a
DN
2351 inline_data *id = (inline_data *) data;
2352 splay_tree st = id->decl_map;
2353 splay_tree_node n;
2354
2355 /* Only a local declaration (variable or label). */
2356 if ((TREE_CODE (*tp) == VAR_DECL && !TREE_STATIC (*tp))
2357 || TREE_CODE (*tp) == LABEL_DECL)
2358 {
2359 /* Lookup the declaration. */
2360 n = splay_tree_lookup (st, (splay_tree_key) *tp);
2361
2362 /* If it's there, remap it. */
2363 if (n)
2364 *tp = (tree) n->value;
2365 }
2366 else if (TREE_CODE (*tp) == STATEMENT_LIST)
2367 copy_statement_list (tp);
2368 else if (TREE_CODE (*tp) == BIND_EXPR)
2369 copy_bind_expr (tp, walk_subtrees, id);
2370 else if (TREE_CODE (*tp) == SAVE_EXPR)
2371 remap_save_expr (tp, st, current_function_decl, walk_subtrees);
d436bff8 2372 else
6de9cd9a
DN
2373 {
2374 copy_tree_r (tp, walk_subtrees, NULL);
2375
2376 /* Do whatever unsaving is required. */
2377 unsave_expr_1 (*tp);
2378 }
2379
2380 /* Keep iterating. */
2381 return NULL_TREE;
d436bff8
AH
2382}
2383
6de9cd9a
DN
2384/* Default lang hook for "unsave_expr_now". Copies everything in EXPR and
2385 replaces variables, labels and SAVE_EXPRs local to EXPR. */
2386
2387tree
2388lhd_unsave_expr_now (tree expr)
2389{
2390 inline_data id;
2391
2392 /* There's nothing to do for NULL_TREE. */
2393 if (expr == 0)
2394 return expr;
2395
2396 /* Set up ID. */
2397 memset (&id, 0, sizeof (id));
2398 VARRAY_TREE_INIT (id.fns, 1, "fns");
2399 VARRAY_PUSH_TREE (id.fns, current_function_decl);
2400 id.decl_map = splay_tree_new (splay_tree_compare_pointers, NULL, NULL);
2401
2402 /* Walk the tree once to find local labels. */
2403 walk_tree_without_duplicates (&expr, mark_local_for_remap_r, &id);
2404
2405 /* Walk the tree again, copying, remapping, and unsaving. */
2406 walk_tree (&expr, unsave_r, &id, NULL);
2407
2408 /* Clean up. */
2409 splay_tree_delete (id.decl_map);
2410
2411 return expr;
2412}
2413
2414/* Allow someone to determine if SEARCH is a child of TOP from gdb. */
2415static tree
2416debug_find_tree_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, void *data)
2417{
2418 if (*tp == data)
2419 return (tree) data;
2420 else
2421 return NULL;
2422}
2423
2424extern bool debug_find_tree (tree top, tree search);
2425
2426bool
2427debug_find_tree (tree top, tree search)
2428{
2429 return walk_tree_without_duplicates (&top, debug_find_tree_1, search) != 0;
2430}
2431
2432
2433/* Declare the variables created by the inliner. Add all the variables in
2434 VARS to BIND_EXPR. */
2435
2436static void
2437declare_inline_vars (tree bind_expr, tree vars)
2438{
2439 if (lang_hooks.gimple_before_inlining)
2440 {
2441 tree t;
2442 for (t = vars; t; t = TREE_CHAIN (t))
2443 vars->decl.seen_in_bind_expr = 1;
2444 }
2445
2446 add_var_to_bind_expr (bind_expr, vars);
2447}
This page took 1.436722 seconds and 5 git commands to generate.