1 /* Perform optimizations on tree structure.
2 Copyright (C) 1998-2015 Free Software Foundation, Inc.
3 Written by Mark Michell (mark@codesourcery.com).
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GCC is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
28 #include "stringpool.h"
33 #include "tree-inline.h"
35 #include "langhooks.h"
36 #include "diagnostic-core.h"
38 #include "tree-iterator.h"
39 #include "plugin-api.h"
40 #include "hard-reg-set.h"
47 static void update_cloned_parm (tree
, tree
, bool);
49 /* CLONED_PARM is a copy of CLONE, generated for a cloned constructor
50 or destructor. Update it to ensure that the source-position for
51 the cloned parameter matches that for the original, and that the
52 debugging generation code will be able to find the original PARM. */
55 update_cloned_parm (tree parm
, tree cloned_parm
, bool first
)
57 DECL_ABSTRACT_ORIGIN (cloned_parm
) = parm
;
59 /* We may have taken its address. */
60 TREE_ADDRESSABLE (cloned_parm
) = TREE_ADDRESSABLE (parm
);
62 /* The definition might have different constness. */
63 TREE_READONLY (cloned_parm
) = TREE_READONLY (parm
);
65 TREE_USED (cloned_parm
) = !first
|| TREE_USED (parm
);
67 /* The name may have changed from the declaration. */
68 DECL_NAME (cloned_parm
) = DECL_NAME (parm
);
69 DECL_SOURCE_LOCATION (cloned_parm
) = DECL_SOURCE_LOCATION (parm
);
70 TREE_TYPE (cloned_parm
) = TREE_TYPE (parm
);
72 DECL_GIMPLE_REG_P (cloned_parm
) = DECL_GIMPLE_REG_P (parm
);
76 /* FN is a function in High GIMPLE form that has a complete body and no
77 CFG. CLONE is a function whose body is to be set to a copy of FN,
78 mapping argument declarations according to the ARG_MAP splay_tree. */
81 clone_body (tree clone
, tree fn
, void *arg_map
)
86 /* Clone the body, as if we were making an inline call. But, remap
87 the parameters in the callee to the parameters of caller. */
88 memset (&id
, 0, sizeof (id
));
91 id
.src_cfun
= DECL_STRUCT_FUNCTION (fn
);
92 id
.decl_map
= static_cast<hash_map
<tree
, tree
> *> (arg_map
);
94 id
.copy_decl
= copy_decl_no_change
;
95 id
.transform_call_graph_edges
= CB_CGE_DUPLICATE
;
96 id
.transform_new_cfg
= true;
97 id
.transform_return_to_modify
= false;
98 id
.transform_lang_insert_block
= NULL
;
100 /* We're not inside any EH region. */
103 stmts
= DECL_SAVED_TREE (fn
);
104 walk_tree (&stmts
, copy_tree_body_r
, &id
, NULL
);
106 /* Also remap the initializer of any static variables so that they (in
107 particular, any label addresses) correspond to the base variant rather
108 than the abstract one. */
109 if (DECL_NAME (clone
) == base_dtor_identifier
110 || DECL_NAME (clone
) == base_ctor_identifier
)
115 FOR_EACH_LOCAL_DECL (DECL_STRUCT_FUNCTION (fn
), ix
, decl
)
116 walk_tree (&DECL_INITIAL (decl
), copy_tree_body_r
, &id
, NULL
);
119 append_to_statement_list_force (stmts
, &DECL_SAVED_TREE (clone
));
122 /* DELETE_DTOR is a delete destructor whose body will be built.
123 COMPLETE_DTOR is the corresponding complete destructor. */
126 build_delete_destructor_body (tree delete_dtor
, tree complete_dtor
)
128 tree call_dtor
, call_delete
;
129 tree parm
= DECL_ARGUMENTS (delete_dtor
);
130 tree virtual_size
= cxx_sizeof (current_class_type
);
132 /* Call the corresponding complete destructor. */
133 gcc_assert (complete_dtor
);
134 call_dtor
= build_cxx_call (complete_dtor
, 1, &parm
,
135 tf_warning_or_error
);
136 add_stmt (call_dtor
);
138 add_stmt (build_stmt (0, LABEL_EXPR
, cdtor_label
));
140 /* Call the delete function. */
141 call_delete
= build_op_delete_call (DELETE_EXPR
, current_class_ptr
,
144 /*placement=*/NULL_TREE
,
145 /*alloc_fn=*/NULL_TREE
,
146 tf_warning_or_error
);
147 add_stmt (call_delete
);
149 /* Return the address of the object. */
150 if (targetm
.cxx
.cdtor_returns_this ())
152 tree val
= DECL_ARGUMENTS (delete_dtor
);
153 val
= build2 (MODIFY_EXPR
, TREE_TYPE (val
),
154 DECL_RESULT (delete_dtor
), val
);
155 add_stmt (build_stmt (0, RETURN_EXPR
, val
));
159 /* Return name of comdat group for complete and base ctor (or dtor)
160 that have the same body. If dtor is virtual, deleting dtor goes
161 into this comdat group as well. */
164 cdtor_comdat_group (tree complete
, tree base
)
166 tree complete_name
= DECL_ASSEMBLER_NAME (complete
);
167 tree base_name
= DECL_ASSEMBLER_NAME (base
);
170 bool diff_seen
= false;
172 gcc_assert (IDENTIFIER_LENGTH (complete_name
)
173 == IDENTIFIER_LENGTH (base_name
));
174 grp_name
= XALLOCAVEC (char, IDENTIFIER_LENGTH (complete_name
) + 1);
175 p
= IDENTIFIER_POINTER (complete_name
);
176 q
= IDENTIFIER_POINTER (base_name
);
177 for (idx
= 0; idx
< IDENTIFIER_LENGTH (complete_name
); idx
++)
178 if (p
[idx
] == q
[idx
])
179 grp_name
[idx
] = p
[idx
];
182 gcc_assert (!diff_seen
184 && (p
[idx
- 1] == 'C' || p
[idx
- 1] == 'D')
190 grp_name
[idx
] = '\0';
191 gcc_assert (diff_seen
);
192 return get_identifier (grp_name
);
195 /* Returns true iff we can make the base and complete [cd]tor aliases of
196 the same symbol rather than separate functions. */
199 can_alias_cdtor (tree fn
)
201 #ifndef ASM_OUTPUT_DEF
202 /* If aliases aren't supported by the assembler, fail. */
205 /* We can't use an alias if there are virtual bases. */
206 if (CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fn
)))
208 /* ??? Why not use aliases with -frepo? */
209 if (flag_use_repository
)
211 gcc_assert (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (fn
)
212 || DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (fn
));
213 /* Don't use aliases for weak/linkonce definitions unless we can put both
214 symbols in the same COMDAT group. */
215 return (DECL_INTERFACE_KNOWN (fn
)
216 && (SUPPORTS_ONE_ONLY
|| !DECL_WEAK (fn
))
217 && (!DECL_ONE_ONLY (fn
)
218 || (HAVE_COMDAT_GROUP
&& DECL_WEAK (fn
))));
221 /* FN is a [cd]tor, fns is a pointer to an array of length 3. Fill fns
222 with pointers to the base, complete, and deleting variants. */
225 populate_clone_array (tree fn
, tree
*fns
)
233 /* Look for the complete destructor which may be used to build the
234 delete destructor. */
235 FOR_EACH_CLONE (clone
, fn
)
236 if (DECL_NAME (clone
) == complete_dtor_identifier
237 || DECL_NAME (clone
) == complete_ctor_identifier
)
239 else if (DECL_NAME (clone
) == base_dtor_identifier
240 || DECL_NAME (clone
) == base_ctor_identifier
)
242 else if (DECL_NAME (clone
) == deleting_dtor_identifier
)
248 /* FN is a constructor or destructor, and there are FUNCTION_DECLs
249 cloned from it nearby. Instead of cloning this body, leave it
250 alone and create tiny one-call bodies for the cloned
251 FUNCTION_DECLs. These clones are sibcall candidates, and their
252 resulting code will be very thunk-esque. */
255 maybe_thunk_body (tree fn
, bool force
)
257 tree bind
, block
, call
, clone
, clone_result
, fn_parm
, fn_parm_typelist
;
258 tree last_arg
, modify
, *args
;
259 int parmno
, vtt_parmno
, max_parms
;
262 if (!force
&& !flag_declone_ctor_dtor
)
265 /* If function accepts variable arguments, give up. */
266 last_arg
= tree_last (TYPE_ARG_TYPES (TREE_TYPE (fn
)));
267 if (last_arg
!= void_list_node
)
270 /* If we got this far, we've decided to turn the clones into thunks. */
272 /* We're going to generate code for fn, so it is no longer "abstract."
273 Also make the unified ctor/dtor private to either the translation unit
274 (for non-vague linkage ctors) or the COMDAT group (otherwise). */
276 populate_clone_array (fn
, fns
);
277 DECL_ABSTRACT_P (fn
) = false;
280 TREE_PUBLIC (fn
) = false;
281 DECL_EXTERNAL (fn
) = false;
282 DECL_INTERFACE_KNOWN (fn
) = true;
284 else if (HAVE_COMDAT_GROUP
)
286 tree comdat_group
= cdtor_comdat_group (fns
[1], fns
[0]);
287 cgraph_node::get_create (fns
[0])->set_comdat_group (comdat_group
);
288 cgraph_node::get_create (fns
[1])->add_to_same_comdat_group
289 (cgraph_node::get_create (fns
[0]));
290 symtab_node::get (fn
)->add_to_same_comdat_group
291 (symtab_node::get (fns
[0]));
293 /* If *[CD][12]* dtors go into the *[CD]5* comdat group and dtor is
294 virtual, it goes into the same comdat group as well. */
295 cgraph_node::get_create (fns
[2])->add_to_same_comdat_group
296 (symtab_node::get (fns
[0]));
297 TREE_PUBLIC (fn
) = false;
298 DECL_EXTERNAL (fn
) = false;
299 DECL_INTERFACE_KNOWN (fn
) = true;
300 /* function_and_variable_visibility doesn't want !PUBLIC decls to
301 have these flags set. */
302 DECL_WEAK (fn
) = false;
303 DECL_COMDAT (fn
) = false;
306 /* Find the vtt_parm, if present. */
307 for (vtt_parmno
= -1, parmno
= 0, fn_parm
= DECL_ARGUMENTS (fn
);
309 ++parmno
, fn_parm
= TREE_CHAIN (fn_parm
))
311 if (DECL_ARTIFICIAL (fn_parm
)
312 && DECL_NAME (fn_parm
) == vtt_parm_identifier
)
314 /* Compensate for removed in_charge parameter. */
320 /* Allocate an argument buffer for build_cxx_call().
321 Make sure it is large enough for any of the clones. */
323 FOR_EACH_CLONE (clone
, fn
)
325 int length
= list_length (DECL_ARGUMENTS (fn
));
326 if (length
> max_parms
)
329 args
= (tree
*) alloca (max_parms
* sizeof (tree
));
331 /* We know that any clones immediately follow FN in TYPE_METHODS. */
332 FOR_EACH_CLONE (clone
, fn
)
336 /* If we've already generated a body for this clone, avoid
337 duplicating it. (Is it possible for a clone-list to grow after we
339 if (DECL_SAVED_TREE (clone
) || TREE_ASM_WRITTEN (clone
))
342 /* Start processing the function. */
343 start_preparsed_function (clone
, NULL_TREE
, SF_PRE_PARSED
);
347 for (clone_parm
= DECL_ARGUMENTS (clone
); clone_parm
;
348 clone_parm
= TREE_CHAIN (clone_parm
))
349 DECL_ABSTRACT_ORIGIN (clone_parm
) = NULL_TREE
;
350 /* Build the delete destructor by calling complete destructor and
352 build_delete_destructor_body (clone
, fns
[1]);
356 /* Walk parameter lists together, creating parameter list for
357 call to original function. */
359 fn_parm
= DECL_ARGUMENTS (fn
),
360 fn_parm_typelist
= TYPE_ARG_TYPES (TREE_TYPE (fn
)),
361 clone_parm
= DECL_ARGUMENTS (clone
);
364 fn_parm
= TREE_CHAIN (fn_parm
))
366 if (parmno
== vtt_parmno
&& ! DECL_HAS_VTT_PARM_P (clone
))
368 gcc_assert (fn_parm_typelist
);
369 /* Clobber argument with formal parameter type. */
371 = convert (TREE_VALUE (fn_parm_typelist
),
374 else if (parmno
== 1 && DECL_HAS_IN_CHARGE_PARM_P (fn
))
377 = copy_node (in_charge_arg_for_name (DECL_NAME (clone
)));
378 args
[parmno
] = in_charge
;
380 /* Map other parameters to their equivalents in the cloned
384 gcc_assert (clone_parm
);
385 DECL_ABSTRACT_ORIGIN (clone_parm
) = NULL
;
386 args
[parmno
] = clone_parm
;
387 clone_parm
= TREE_CHAIN (clone_parm
);
389 if (fn_parm_typelist
)
390 fn_parm_typelist
= TREE_CHAIN (fn_parm_typelist
);
393 /* We built this list backwards; fix now. */
395 call
= build_cxx_call (fn
, parmno
, args
, tf_warning_or_error
);
396 /* Arguments passed to the thunk by invisible reference should
397 be transmitted to the callee unchanged. Do not create a
398 temporary and invoke the copy constructor. The thunking
399 transformation must not introduce any constructor calls. */
400 CALL_FROM_THUNK_P (call
) = 1;
401 block
= make_node (BLOCK
);
402 if (targetm
.cxx
.cdtor_returns_this ())
404 clone_result
= DECL_RESULT (clone
);
405 modify
= build2 (MODIFY_EXPR
, TREE_TYPE (clone_result
),
407 modify
= build1 (RETURN_EXPR
, void_type_node
, modify
);
414 bind
= c_build_bind_expr (DECL_SOURCE_LOCATION (clone
),
415 block
, cur_stmt_list
);
416 DECL_SAVED_TREE (clone
) = push_stmt_list ();
420 DECL_ABSTRACT_ORIGIN (clone
) = NULL
;
421 expand_or_defer_fn (finish_function (0));
426 /* FN is a function that has a complete body. Clone the body as
427 necessary. Returns nonzero if there's no longer any need to
428 process the main body. */
431 maybe_clone_body (tree fn
)
433 tree comdat_group
= NULL_TREE
;
438 bool need_alias
= false;
440 /* We only clone constructors and destructors. */
441 if (!DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (fn
)
442 && !DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (fn
))
445 populate_clone_array (fn
, fns
);
447 /* Remember if we can't have multiple clones for some reason. We need to
448 check this before we remap local static initializers in clone_body. */
449 if (!tree_versionable_function_p (fn
))
452 /* We know that any clones immediately follow FN in the TYPE_METHODS
454 push_to_top_level ();
455 for (idx
= 0; idx
< 3; idx
++)
464 /* Update CLONE's source position information to match FN's. */
465 DECL_SOURCE_LOCATION (clone
) = DECL_SOURCE_LOCATION (fn
);
466 DECL_DECLARED_INLINE_P (clone
) = DECL_DECLARED_INLINE_P (fn
);
467 DECL_DECLARED_CONSTEXPR_P (clone
) = DECL_DECLARED_CONSTEXPR_P (fn
);
468 DECL_COMDAT (clone
) = DECL_COMDAT (fn
);
469 DECL_WEAK (clone
) = DECL_WEAK (fn
);
471 /* We don't copy the comdat group from fn to clone because the assembler
472 name of fn was corrupted by write_mangled_name by adding *INTERNAL*
473 to it. By doing so, it also corrupted the comdat group. */
474 if (DECL_ONE_ONLY (fn
))
475 cgraph_node::get_create (clone
)->set_comdat_group (cxx_comdat_group (clone
));
476 DECL_USE_TEMPLATE (clone
) = DECL_USE_TEMPLATE (fn
);
477 DECL_EXTERNAL (clone
) = DECL_EXTERNAL (fn
);
478 DECL_INTERFACE_KNOWN (clone
) = DECL_INTERFACE_KNOWN (fn
);
479 DECL_NOT_REALLY_EXTERN (clone
) = DECL_NOT_REALLY_EXTERN (fn
);
480 TREE_PUBLIC (clone
) = TREE_PUBLIC (fn
);
481 DECL_VISIBILITY (clone
) = DECL_VISIBILITY (fn
);
482 DECL_VISIBILITY_SPECIFIED (clone
) = DECL_VISIBILITY_SPECIFIED (fn
);
483 DECL_DLLIMPORT_P (clone
) = DECL_DLLIMPORT_P (fn
);
484 DECL_ATTRIBUTES (clone
) = copy_list (DECL_ATTRIBUTES (fn
));
485 DECL_DISREGARD_INLINE_LIMITS (clone
) = DECL_DISREGARD_INLINE_LIMITS (fn
);
486 set_decl_section_name (clone
, DECL_SECTION_NAME (fn
));
488 /* Adjust the parameter names and locations. */
489 parm
= DECL_ARGUMENTS (fn
);
490 clone_parm
= DECL_ARGUMENTS (clone
);
491 /* Update the `this' parameter, which is always first. */
492 update_cloned_parm (parm
, clone_parm
, first
);
493 parm
= DECL_CHAIN (parm
);
494 clone_parm
= DECL_CHAIN (clone_parm
);
495 if (DECL_HAS_IN_CHARGE_PARM_P (fn
))
496 parm
= DECL_CHAIN (parm
);
497 if (DECL_HAS_VTT_PARM_P (fn
))
498 parm
= DECL_CHAIN (parm
);
499 if (DECL_HAS_VTT_PARM_P (clone
))
500 clone_parm
= DECL_CHAIN (clone_parm
);
502 parm
= DECL_CHAIN (parm
), clone_parm
= DECL_CHAIN (clone_parm
))
503 /* Update this parameter. */
504 update_cloned_parm (parm
, clone_parm
, first
);
507 bool can_alias
= can_alias_cdtor (fn
);
509 /* If we decide to turn clones into thunks, they will branch to fn.
510 Must have original function available to call. */
511 if (!can_alias
&& maybe_thunk_body (fn
, need_alias
))
513 pop_from_top_level ();
514 /* We still need to emit the original function. */
518 /* Emit the DWARF1 abstract instance. */
519 (*debug_hooks
->deferred_inline_function
) (fn
);
521 /* We know that any clones immediately follow FN in the TYPE_METHODS list. */
522 for (idx
= 0; idx
< 3; idx
++)
527 hash_map
<tree
, tree
> *decl_map
;
534 /* Start processing the function. */
535 start_preparsed_function (clone
, NULL_TREE
, SF_PRE_PARSED
);
537 /* Tell cgraph if both ctors or both dtors are known to have
542 && cgraph_node::get_create (fns
[0])->create_same_body_alias
546 if (DECL_ONE_ONLY (fns
[0]))
548 /* For comdat base and complete cdtors put them
549 into the same, *[CD]5* comdat group instead of
551 comdat_group
= cdtor_comdat_group (fns
[1], fns
[0]);
552 cgraph_node::get_create (fns
[0])->set_comdat_group (comdat_group
);
553 if (symtab_node::get (clone
)->same_comdat_group
)
554 symtab_node::get (clone
)->remove_from_same_comdat_group ();
555 symtab_node::get (clone
)->add_to_same_comdat_group
556 (symtab_node::get (fns
[0]));
560 /* Build the delete destructor by calling complete destructor
561 and delete function. */
564 build_delete_destructor_body (clone
, fns
[1]);
565 /* If *[CD][12]* dtors go into the *[CD]5* comdat group and dtor is
566 virtual, it goes into the same comdat group as well. */
568 cgraph_node::get_create (clone
)->add_to_same_comdat_group
569 (symtab_node::get (fns
[0]));
572 /* No need to populate body. */ ;
575 /* If we can't have multiple copies of FN (say, because there's a
576 static local initialized with the address of a label), we need
577 to use an alias for the complete variant. */
578 if (idx
== 1 && need_alias
)
580 if (DECL_STRUCT_FUNCTION (fn
)->cannot_be_copied_set
)
581 sorry (DECL_STRUCT_FUNCTION (fn
)->cannot_be_copied_reason
, fn
);
583 sorry ("making multiple clones of %qD", fn
);
586 /* Remap the parameters. */
587 decl_map
= new hash_map
<tree
, tree
>;
589 parm
= DECL_ARGUMENTS (fn
),
590 clone_parm
= DECL_ARGUMENTS (clone
);
593 parm
= DECL_CHAIN (parm
))
595 /* Map the in-charge parameter to an appropriate constant. */
596 if (DECL_HAS_IN_CHARGE_PARM_P (fn
) && parmno
== 1)
599 in_charge
= in_charge_arg_for_name (DECL_NAME (clone
));
600 decl_map
->put (parm
, in_charge
);
602 else if (DECL_ARTIFICIAL (parm
)
603 && DECL_NAME (parm
) == vtt_parm_identifier
)
605 /* For a subobject constructor or destructor, the next
606 argument is the VTT parameter. Remap the VTT_PARM
607 from the CLONE to this parameter. */
608 if (DECL_HAS_VTT_PARM_P (clone
))
610 DECL_ABSTRACT_ORIGIN (clone_parm
) = parm
;
611 decl_map
->put (parm
, clone_parm
);
612 clone_parm
= DECL_CHAIN (clone_parm
);
614 /* Otherwise, map the VTT parameter to `NULL'. */
618 = fold_convert (TREE_TYPE (parm
), null_pointer_node
);
619 decl_map
->put (parm
, t
);
622 /* Map other parameters to their equivalents in the cloned
626 decl_map
->put (parm
, clone_parm
);
627 clone_parm
= DECL_CHAIN (clone_parm
);
631 if (targetm
.cxx
.cdtor_returns_this ())
633 parm
= DECL_RESULT (fn
);
634 clone_parm
= DECL_RESULT (clone
);
635 decl_map
->put (parm
, clone_parm
);
638 /* Clone the body. */
639 clone_body (clone
, fn
, decl_map
);
645 /* The clone can throw iff the original function can throw. */
646 cp_function_chain
->can_throw
= !TREE_NOTHROW (fn
);
648 /* Now, expand this function into RTL, if appropriate. */
650 BLOCK_ABSTRACT_ORIGIN (DECL_INITIAL (clone
)) = DECL_INITIAL (fn
);
653 if (expand_or_defer_fn_1 (clone
))
654 emit_associated_thunks (clone
);
657 expand_or_defer_fn (clone
);
660 pop_from_top_level ();
662 /* We don't need to process the original function any further. */