1 /* Perform optimizations on tree structure.
2 Copyright (C) 1998-2014 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"
26 #include "stringpool.h"
33 #include "tree-inline.h"
35 #include "langhooks.h"
36 #include "diagnostic-core.h"
38 #include "tree-iterator.h"
43 static void update_cloned_parm (tree
, tree
, bool);
45 /* CLONED_PARM is a copy of CLONE, generated for a cloned constructor
46 or destructor. Update it to ensure that the source-position for
47 the cloned parameter matches that for the original, and that the
48 debugging generation code will be able to find the original PARM. */
51 update_cloned_parm (tree parm
, tree cloned_parm
, bool first
)
53 DECL_ABSTRACT_ORIGIN (cloned_parm
) = parm
;
55 /* We may have taken its address. */
56 TREE_ADDRESSABLE (cloned_parm
) = TREE_ADDRESSABLE (parm
);
58 /* The definition might have different constness. */
59 TREE_READONLY (cloned_parm
) = TREE_READONLY (parm
);
61 TREE_USED (cloned_parm
) = !first
|| TREE_USED (parm
);
63 /* The name may have changed from the declaration. */
64 DECL_NAME (cloned_parm
) = DECL_NAME (parm
);
65 DECL_SOURCE_LOCATION (cloned_parm
) = DECL_SOURCE_LOCATION (parm
);
66 TREE_TYPE (cloned_parm
) = TREE_TYPE (parm
);
68 DECL_GIMPLE_REG_P (cloned_parm
) = DECL_GIMPLE_REG_P (parm
);
72 /* FN is a function in High GIMPLE form that has a complete body and no
73 CFG. CLONE is a function whose body is to be set to a copy of FN,
74 mapping argument declarations according to the ARG_MAP splay_tree. */
77 clone_body (tree clone
, tree fn
, void *arg_map
)
82 /* Clone the body, as if we were making an inline call. But, remap
83 the parameters in the callee to the parameters of caller. */
84 memset (&id
, 0, sizeof (id
));
87 id
.src_cfun
= DECL_STRUCT_FUNCTION (fn
);
88 id
.decl_map
= static_cast<hash_map
<tree
, tree
> *> (arg_map
);
90 id
.copy_decl
= copy_decl_no_change
;
91 id
.transform_call_graph_edges
= CB_CGE_DUPLICATE
;
92 id
.transform_new_cfg
= true;
93 id
.transform_return_to_modify
= false;
94 id
.transform_lang_insert_block
= NULL
;
96 /* We're not inside any EH region. */
99 stmts
= DECL_SAVED_TREE (fn
);
100 walk_tree (&stmts
, copy_tree_body_r
, &id
, NULL
);
102 /* Also remap the initializer of any static variables so that they (in
103 particular, any label addresses) correspond to the base variant rather
104 than the abstract one. */
105 if (DECL_NAME (clone
) == base_dtor_identifier
106 || DECL_NAME (clone
) == base_ctor_identifier
)
111 FOR_EACH_LOCAL_DECL (DECL_STRUCT_FUNCTION (fn
), ix
, decl
)
112 walk_tree (&DECL_INITIAL (decl
), copy_tree_body_r
, &id
, NULL
);
115 append_to_statement_list_force (stmts
, &DECL_SAVED_TREE (clone
));
118 /* DELETE_DTOR is a delete destructor whose body will be built.
119 COMPLETE_DTOR is the corresponding complete destructor. */
122 build_delete_destructor_body (tree delete_dtor
, tree complete_dtor
)
124 tree call_dtor
, call_delete
;
125 tree parm
= DECL_ARGUMENTS (delete_dtor
);
126 tree virtual_size
= cxx_sizeof (current_class_type
);
128 /* Call the corresponding complete destructor. */
129 gcc_assert (complete_dtor
);
130 call_dtor
= build_cxx_call (complete_dtor
, 1, &parm
,
131 tf_warning_or_error
);
132 add_stmt (call_dtor
);
134 add_stmt (build_stmt (0, LABEL_EXPR
, cdtor_label
));
136 /* Call the delete function. */
137 call_delete
= build_op_delete_call (DELETE_EXPR
, current_class_ptr
,
140 /*placement=*/NULL_TREE
,
141 /*alloc_fn=*/NULL_TREE
,
142 tf_warning_or_error
);
143 add_stmt (call_delete
);
145 /* Return the address of the object. */
146 if (targetm
.cxx
.cdtor_returns_this ())
148 tree val
= DECL_ARGUMENTS (delete_dtor
);
149 val
= build2 (MODIFY_EXPR
, TREE_TYPE (val
),
150 DECL_RESULT (delete_dtor
), val
);
151 add_stmt (build_stmt (0, RETURN_EXPR
, val
));
155 /* Return name of comdat group for complete and base ctor (or dtor)
156 that have the same body. If dtor is virtual, deleting dtor goes
157 into this comdat group as well. */
160 cdtor_comdat_group (tree complete
, tree base
)
162 tree complete_name
= DECL_ASSEMBLER_NAME (complete
);
163 tree base_name
= DECL_ASSEMBLER_NAME (base
);
166 bool diff_seen
= false;
168 gcc_assert (IDENTIFIER_LENGTH (complete_name
)
169 == IDENTIFIER_LENGTH (base_name
));
170 grp_name
= XALLOCAVEC (char, IDENTIFIER_LENGTH (complete_name
) + 1);
171 p
= IDENTIFIER_POINTER (complete_name
);
172 q
= IDENTIFIER_POINTER (base_name
);
173 for (idx
= 0; idx
< IDENTIFIER_LENGTH (complete_name
); idx
++)
174 if (p
[idx
] == q
[idx
])
175 grp_name
[idx
] = p
[idx
];
178 gcc_assert (!diff_seen
180 && (p
[idx
- 1] == 'C' || p
[idx
- 1] == 'D')
186 grp_name
[idx
] = '\0';
187 gcc_assert (diff_seen
);
188 return get_identifier (grp_name
);
191 /* Returns true iff we can make the base and complete [cd]tor aliases of
192 the same symbol rather than separate functions. */
195 can_alias_cdtor (tree fn
)
197 #ifndef ASM_OUTPUT_DEF
198 /* If aliases aren't supported by the assembler, fail. */
201 /* We can't use an alias if there are virtual bases. */
202 if (CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fn
)))
204 /* ??? Why not use aliases with -frepo? */
205 if (flag_use_repository
)
207 gcc_assert (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (fn
)
208 || DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (fn
));
209 /* Don't use aliases for weak/linkonce definitions unless we can put both
210 symbols in the same COMDAT group. */
211 return (DECL_INTERFACE_KNOWN (fn
)
212 && (SUPPORTS_ONE_ONLY
|| !DECL_WEAK (fn
))
213 && (!DECL_ONE_ONLY (fn
)
214 || (HAVE_COMDAT_GROUP
&& DECL_WEAK (fn
))));
217 /* FN is a [cd]tor, fns is a pointer to an array of length 3. Fill fns
218 with pointers to the base, complete, and deleting variants. */
221 populate_clone_array (tree fn
, tree
*fns
)
229 /* Look for the complete destructor which may be used to build the
230 delete destructor. */
231 FOR_EACH_CLONE (clone
, fn
)
232 if (DECL_NAME (clone
) == complete_dtor_identifier
233 || DECL_NAME (clone
) == complete_ctor_identifier
)
235 else if (DECL_NAME (clone
) == base_dtor_identifier
236 || DECL_NAME (clone
) == base_ctor_identifier
)
238 else if (DECL_NAME (clone
) == deleting_dtor_identifier
)
244 /* FN is a constructor or destructor, and there are FUNCTION_DECLs
245 cloned from it nearby. Instead of cloning this body, leave it
246 alone and create tiny one-call bodies for the cloned
247 FUNCTION_DECLs. These clones are sibcall candidates, and their
248 resulting code will be very thunk-esque. */
251 maybe_thunk_body (tree fn
, bool force
)
253 tree bind
, block
, call
, clone
, clone_result
, fn_parm
, fn_parm_typelist
;
254 tree last_arg
, modify
, *args
;
255 int parmno
, vtt_parmno
, max_parms
;
258 if (!force
&& !flag_declone_ctor_dtor
)
261 /* If function accepts variable arguments, give up. */
262 last_arg
= tree_last (TYPE_ARG_TYPES (TREE_TYPE (fn
)));
263 if (last_arg
!= void_list_node
)
266 /* If we got this far, we've decided to turn the clones into thunks. */
268 /* We're going to generate code for fn, so it is no longer "abstract."
269 Also make the unified ctor/dtor private to either the translation unit
270 (for non-vague linkage ctors) or the COMDAT group (otherwise). */
272 populate_clone_array (fn
, fns
);
273 DECL_ABSTRACT_P (fn
) = false;
276 TREE_PUBLIC (fn
) = false;
277 DECL_EXTERNAL (fn
) = false;
278 DECL_INTERFACE_KNOWN (fn
) = true;
280 else if (HAVE_COMDAT_GROUP
)
282 tree comdat_group
= cdtor_comdat_group (fns
[1], fns
[0]);
283 cgraph_node::get_create (fns
[0])->set_comdat_group (comdat_group
);
284 cgraph_node::get_create (fns
[1])->add_to_same_comdat_group
285 (cgraph_node::get_create (fns
[0]));
286 symtab_node::get (fn
)->add_to_same_comdat_group
287 (symtab_node::get (fns
[0]));
289 /* If *[CD][12]* dtors go into the *[CD]5* comdat group and dtor is
290 virtual, it goes into the same comdat group as well. */
291 cgraph_node::get_create (fns
[2])->add_to_same_comdat_group
292 (symtab_node::get (fns
[0]));
293 TREE_PUBLIC (fn
) = false;
294 DECL_EXTERNAL (fn
) = false;
295 DECL_INTERFACE_KNOWN (fn
) = true;
296 /* function_and_variable_visibility doesn't want !PUBLIC decls to
297 have these flags set. */
298 DECL_WEAK (fn
) = false;
299 DECL_COMDAT (fn
) = false;
302 /* Find the vtt_parm, if present. */
303 for (vtt_parmno
= -1, parmno
= 0, fn_parm
= DECL_ARGUMENTS (fn
);
305 ++parmno
, fn_parm
= TREE_CHAIN (fn_parm
))
307 if (DECL_ARTIFICIAL (fn_parm
)
308 && DECL_NAME (fn_parm
) == vtt_parm_identifier
)
310 /* Compensate for removed in_charge parameter. */
316 /* Allocate an argument buffer for build_cxx_call().
317 Make sure it is large enough for any of the clones. */
319 FOR_EACH_CLONE (clone
, fn
)
321 int length
= list_length (DECL_ARGUMENTS (fn
));
322 if (length
> max_parms
)
325 args
= (tree
*) alloca (max_parms
* sizeof (tree
));
327 /* We know that any clones immediately follow FN in TYPE_METHODS. */
328 FOR_EACH_CLONE (clone
, fn
)
332 /* If we've already generated a body for this clone, avoid
333 duplicating it. (Is it possible for a clone-list to grow after we
335 if (DECL_SAVED_TREE (clone
) || TREE_ASM_WRITTEN (clone
))
338 /* Start processing the function. */
339 start_preparsed_function (clone
, NULL_TREE
, SF_PRE_PARSED
);
343 for (clone_parm
= DECL_ARGUMENTS (clone
); clone_parm
;
344 clone_parm
= TREE_CHAIN (clone_parm
))
345 DECL_ABSTRACT_ORIGIN (clone_parm
) = NULL_TREE
;
346 /* Build the delete destructor by calling complete destructor and
348 build_delete_destructor_body (clone
, fns
[1]);
352 /* Walk parameter lists together, creating parameter list for
353 call to original function. */
355 fn_parm
= DECL_ARGUMENTS (fn
),
356 fn_parm_typelist
= TYPE_ARG_TYPES (TREE_TYPE (fn
)),
357 clone_parm
= DECL_ARGUMENTS (clone
);
360 fn_parm
= TREE_CHAIN (fn_parm
))
362 if (parmno
== vtt_parmno
&& ! DECL_HAS_VTT_PARM_P (clone
))
364 gcc_assert (fn_parm_typelist
);
365 /* Clobber argument with formal parameter type. */
367 = convert (TREE_VALUE (fn_parm_typelist
),
370 else if (parmno
== 1 && DECL_HAS_IN_CHARGE_PARM_P (fn
))
373 = copy_node (in_charge_arg_for_name (DECL_NAME (clone
)));
374 args
[parmno
] = in_charge
;
376 /* Map other parameters to their equivalents in the cloned
380 gcc_assert (clone_parm
);
381 DECL_ABSTRACT_ORIGIN (clone_parm
) = NULL
;
382 args
[parmno
] = clone_parm
;
383 clone_parm
= TREE_CHAIN (clone_parm
);
385 if (fn_parm_typelist
)
386 fn_parm_typelist
= TREE_CHAIN (fn_parm_typelist
);
389 /* We built this list backwards; fix now. */
391 call
= build_cxx_call (fn
, parmno
, args
, tf_warning_or_error
);
392 /* Arguments passed to the thunk by invisible reference should
393 be transmitted to the callee unchanged. Do not create a
394 temporary and invoke the copy constructor. The thunking
395 transformation must not introduce any constructor calls. */
396 CALL_FROM_THUNK_P (call
) = 1;
397 block
= make_node (BLOCK
);
398 if (targetm
.cxx
.cdtor_returns_this ())
400 clone_result
= DECL_RESULT (clone
);
401 modify
= build2 (MODIFY_EXPR
, TREE_TYPE (clone_result
),
403 modify
= build1 (RETURN_EXPR
, void_type_node
, modify
);
410 bind
= c_build_bind_expr (DECL_SOURCE_LOCATION (clone
),
411 block
, cur_stmt_list
);
412 DECL_SAVED_TREE (clone
) = push_stmt_list ();
416 DECL_ABSTRACT_ORIGIN (clone
) = NULL
;
417 expand_or_defer_fn (finish_function (0));
422 /* FN is a function that has a complete body. Clone the body as
423 necessary. Returns nonzero if there's no longer any need to
424 process the main body. */
427 maybe_clone_body (tree fn
)
429 tree comdat_group
= NULL_TREE
;
434 bool need_alias
= false;
436 /* We only clone constructors and destructors. */
437 if (!DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (fn
)
438 && !DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (fn
))
441 populate_clone_array (fn
, fns
);
443 /* Remember if we can't have multiple clones for some reason. We need to
444 check this before we remap local static initializers in clone_body. */
445 if (!tree_versionable_function_p (fn
))
448 /* We know that any clones immediately follow FN in the TYPE_METHODS
450 push_to_top_level ();
451 for (idx
= 0; idx
< 3; idx
++)
460 /* Update CLONE's source position information to match FN's. */
461 DECL_SOURCE_LOCATION (clone
) = DECL_SOURCE_LOCATION (fn
);
462 DECL_DECLARED_INLINE_P (clone
) = DECL_DECLARED_INLINE_P (fn
);
463 DECL_DECLARED_CONSTEXPR_P (clone
) = DECL_DECLARED_CONSTEXPR_P (fn
);
464 DECL_COMDAT (clone
) = DECL_COMDAT (fn
);
465 DECL_WEAK (clone
) = DECL_WEAK (fn
);
467 /* We don't copy the comdat group from fn to clone because the assembler
468 name of fn was corrupted by write_mangled_name by adding *INTERNAL*
469 to it. By doing so, it also corrupted the comdat group. */
470 if (DECL_ONE_ONLY (fn
))
471 cgraph_node::get_create (clone
)->set_comdat_group (cxx_comdat_group (clone
));
472 DECL_USE_TEMPLATE (clone
) = DECL_USE_TEMPLATE (fn
);
473 DECL_EXTERNAL (clone
) = DECL_EXTERNAL (fn
);
474 DECL_INTERFACE_KNOWN (clone
) = DECL_INTERFACE_KNOWN (fn
);
475 DECL_NOT_REALLY_EXTERN (clone
) = DECL_NOT_REALLY_EXTERN (fn
);
476 TREE_PUBLIC (clone
) = TREE_PUBLIC (fn
);
477 DECL_VISIBILITY (clone
) = DECL_VISIBILITY (fn
);
478 DECL_VISIBILITY_SPECIFIED (clone
) = DECL_VISIBILITY_SPECIFIED (fn
);
479 DECL_DLLIMPORT_P (clone
) = DECL_DLLIMPORT_P (fn
);
480 DECL_ATTRIBUTES (clone
) = copy_list (DECL_ATTRIBUTES (fn
));
481 DECL_DISREGARD_INLINE_LIMITS (clone
) = DECL_DISREGARD_INLINE_LIMITS (fn
);
482 set_decl_section_name (clone
, DECL_SECTION_NAME (fn
));
484 /* Adjust the parameter names and locations. */
485 parm
= DECL_ARGUMENTS (fn
);
486 clone_parm
= DECL_ARGUMENTS (clone
);
487 /* Update the `this' parameter, which is always first. */
488 update_cloned_parm (parm
, clone_parm
, first
);
489 parm
= DECL_CHAIN (parm
);
490 clone_parm
= DECL_CHAIN (clone_parm
);
491 if (DECL_HAS_IN_CHARGE_PARM_P (fn
))
492 parm
= DECL_CHAIN (parm
);
493 if (DECL_HAS_VTT_PARM_P (fn
))
494 parm
= DECL_CHAIN (parm
);
495 if (DECL_HAS_VTT_PARM_P (clone
))
496 clone_parm
= DECL_CHAIN (clone_parm
);
498 parm
= DECL_CHAIN (parm
), clone_parm
= DECL_CHAIN (clone_parm
))
499 /* Update this parameter. */
500 update_cloned_parm (parm
, clone_parm
, first
);
503 bool can_alias
= can_alias_cdtor (fn
);
505 /* If we decide to turn clones into thunks, they will branch to fn.
506 Must have original function available to call. */
507 if (!can_alias
&& maybe_thunk_body (fn
, need_alias
))
509 pop_from_top_level ();
510 /* We still need to emit the original function. */
514 /* Emit the DWARF1 abstract instance. */
515 (*debug_hooks
->deferred_inline_function
) (fn
);
517 /* We know that any clones immediately follow FN in the TYPE_METHODS list. */
518 for (idx
= 0; idx
< 3; idx
++)
523 hash_map
<tree
, tree
> *decl_map
;
530 /* Start processing the function. */
531 start_preparsed_function (clone
, NULL_TREE
, SF_PRE_PARSED
);
533 /* Tell cgraph if both ctors or both dtors are known to have
538 && cgraph_node::get_create (fns
[0])->create_same_body_alias
542 if (DECL_ONE_ONLY (fns
[0]))
544 /* For comdat base and complete cdtors put them
545 into the same, *[CD]5* comdat group instead of
547 comdat_group
= cdtor_comdat_group (fns
[1], fns
[0]);
548 cgraph_node::get_create (fns
[0])->set_comdat_group (comdat_group
);
549 if (symtab_node::get (clone
)->same_comdat_group
)
550 symtab_node::get (clone
)->remove_from_same_comdat_group ();
551 symtab_node::get (clone
)->add_to_same_comdat_group
552 (symtab_node::get (fns
[0]));
556 /* Build the delete destructor by calling complete destructor
557 and delete function. */
560 build_delete_destructor_body (clone
, fns
[1]);
561 /* If *[CD][12]* dtors go into the *[CD]5* comdat group and dtor is
562 virtual, it goes into the same comdat group as well. */
564 cgraph_node::get_create (clone
)->add_to_same_comdat_group
565 (symtab_node::get (fns
[0]));
568 /* No need to populate body. */ ;
571 /* If we can't have multiple copies of FN (say, because there's a
572 static local initialized with the address of a label), we need
573 to use an alias for the complete variant. */
574 if (idx
== 1 && need_alias
)
576 if (DECL_STRUCT_FUNCTION (fn
)->cannot_be_copied_set
)
577 sorry (DECL_STRUCT_FUNCTION (fn
)->cannot_be_copied_reason
, fn
);
579 sorry ("making multiple clones of %qD", fn
);
582 /* Remap the parameters. */
583 decl_map
= new hash_map
<tree
, tree
>;
585 parm
= DECL_ARGUMENTS (fn
),
586 clone_parm
= DECL_ARGUMENTS (clone
);
589 parm
= DECL_CHAIN (parm
))
591 /* Map the in-charge parameter to an appropriate constant. */
592 if (DECL_HAS_IN_CHARGE_PARM_P (fn
) && parmno
== 1)
595 in_charge
= in_charge_arg_for_name (DECL_NAME (clone
));
596 decl_map
->put (parm
, in_charge
);
598 else if (DECL_ARTIFICIAL (parm
)
599 && DECL_NAME (parm
) == vtt_parm_identifier
)
601 /* For a subobject constructor or destructor, the next
602 argument is the VTT parameter. Remap the VTT_PARM
603 from the CLONE to this parameter. */
604 if (DECL_HAS_VTT_PARM_P (clone
))
606 DECL_ABSTRACT_ORIGIN (clone_parm
) = parm
;
607 decl_map
->put (parm
, clone_parm
);
608 clone_parm
= DECL_CHAIN (clone_parm
);
610 /* Otherwise, map the VTT parameter to `NULL'. */
614 = fold_convert (TREE_TYPE (parm
), null_pointer_node
);
615 decl_map
->put (parm
, t
);
618 /* Map other parameters to their equivalents in the cloned
622 decl_map
->put (parm
, clone_parm
);
623 clone_parm
= DECL_CHAIN (clone_parm
);
627 if (targetm
.cxx
.cdtor_returns_this ())
629 parm
= DECL_RESULT (fn
);
630 clone_parm
= DECL_RESULT (clone
);
631 decl_map
->put (parm
, clone_parm
);
634 /* Clone the body. */
635 clone_body (clone
, fn
, decl_map
);
641 /* The clone can throw iff the original function can throw. */
642 cp_function_chain
->can_throw
= !TREE_NOTHROW (fn
);
644 /* Now, expand this function into RTL, if appropriate. */
646 BLOCK_ABSTRACT_ORIGIN (DECL_INITIAL (clone
)) = DECL_INITIAL (fn
);
649 if (expand_or_defer_fn_1 (clone
))
650 emit_associated_thunks (clone
);
653 expand_or_defer_fn (clone
);
656 pop_from_top_level ();
658 /* We don't need to process the original function any further. */