xref: /dflybsd-src/contrib/gcc-8.0/gcc/cp/optimize.c (revision fb3c2c0caaaa0e5d800e088b7dd7983e9ab009ec)
1 /* Perform optimizations on tree structure.
2    Copyright (C) 1998-2018 Free Software Foundation, Inc.
3    Written by Mark Michell (mark@codesourcery.com).
4 
5 This file is part of GCC.
6 
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)
10 any later version.
11 
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.
16 
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/>.  */
20 
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "target.h"
25 #include "cp-tree.h"
26 #include "stringpool.h"
27 #include "cgraph.h"
28 #include "debug.h"
29 #include "tree-inline.h"
30 #include "tree-iterator.h"
31 
32 /* Prototypes.  */
33 
34 static void update_cloned_parm (tree, tree, bool);
35 
36 /* CLONED_PARM is a copy of CLONE, generated for a cloned constructor
37    or destructor.  Update it to ensure that the source-position for
38    the cloned parameter matches that for the original, and that the
39    debugging generation code will be able to find the original PARM.  */
40 
41 static void
42 update_cloned_parm (tree parm, tree cloned_parm, bool first)
43 {
44   DECL_ABSTRACT_ORIGIN (cloned_parm) = parm;
45 
46   /* We may have taken its address.  */
47   TREE_ADDRESSABLE (cloned_parm) = TREE_ADDRESSABLE (parm);
48 
49   /* The definition might have different constness.  */
50   TREE_READONLY (cloned_parm) = TREE_READONLY (parm);
51 
52   TREE_USED (cloned_parm) = !first || TREE_USED (parm);
53 
54   /* The name may have changed from the declaration.  */
55   DECL_NAME (cloned_parm) = DECL_NAME (parm);
56   DECL_SOURCE_LOCATION (cloned_parm) = DECL_SOURCE_LOCATION (parm);
57   TREE_TYPE (cloned_parm) = TREE_TYPE (parm);
58 
59   DECL_GIMPLE_REG_P (cloned_parm) = DECL_GIMPLE_REG_P (parm);
60 }
61 
62 
63 /* FN is a function in High GIMPLE form that has a complete body and no
64    CFG.  CLONE is a function whose body is to be set to a copy of FN,
65    mapping argument declarations according to the ARG_MAP splay_tree.  */
66 
67 static void
68 clone_body (tree clone, tree fn, void *arg_map)
69 {
70   copy_body_data id;
71   tree stmts;
72 
73   /* Clone the body, as if we were making an inline call.  But, remap
74      the parameters in the callee to the parameters of caller.  */
75   memset (&id, 0, sizeof (id));
76   id.src_fn = fn;
77   id.dst_fn = clone;
78   id.src_cfun = DECL_STRUCT_FUNCTION (fn);
79   id.decl_map = static_cast<hash_map<tree, tree> *> (arg_map);
80 
81   id.copy_decl = copy_decl_no_change;
82   id.transform_call_graph_edges = CB_CGE_DUPLICATE;
83   id.transform_new_cfg = true;
84   id.transform_return_to_modify = false;
85   id.transform_lang_insert_block = NULL;
86 
87   /* We're not inside any EH region.  */
88   id.eh_lp_nr = 0;
89 
90   stmts = DECL_SAVED_TREE (fn);
91   walk_tree (&stmts, copy_tree_body_r, &id, NULL);
92 
93   /* Also remap the initializer of any static variables so that they (in
94      particular, any label addresses) correspond to the base variant rather
95      than the abstract one.  */
96   if (DECL_NAME (clone) == base_dtor_identifier
97       || DECL_NAME (clone) == base_ctor_identifier)
98     {
99       unsigned ix;
100       tree decl;
101 
102       FOR_EACH_LOCAL_DECL (DECL_STRUCT_FUNCTION (fn), ix, decl)
103         walk_tree (&DECL_INITIAL (decl), copy_tree_body_r, &id, NULL);
104     }
105 
106   append_to_statement_list_force (stmts, &DECL_SAVED_TREE (clone));
107 }
108 
109 /* DELETE_DTOR is a delete destructor whose body will be built.
110    COMPLETE_DTOR is the corresponding complete destructor.  */
111 
112 static void
113 build_delete_destructor_body (tree delete_dtor, tree complete_dtor)
114 {
115   tree parm = DECL_ARGUMENTS (delete_dtor);
116   tree virtual_size = cxx_sizeof (current_class_type);
117 
118   /* Call the corresponding complete destructor.  */
119   gcc_assert (complete_dtor);
120   tree call_dtor = build_cxx_call (complete_dtor, 1, &parm,
121 				   tf_warning_or_error);
122 
123   /* Call the delete function.  */
124   tree call_delete = build_op_delete_call (DELETE_EXPR, current_class_ptr,
125 					   virtual_size,
126 					   /*global_p=*/false,
127 					   /*placement=*/NULL_TREE,
128 					   /*alloc_fn=*/NULL_TREE,
129 					   tf_warning_or_error);
130 
131   /* Operator delete must be called, whether or not the dtor throws.  */
132   add_stmt (build2 (TRY_FINALLY_EXPR, void_type_node, call_dtor, call_delete));
133 
134   /* Return the address of the object.  */
135   if (targetm.cxx.cdtor_returns_this ())
136     {
137       tree val = DECL_ARGUMENTS (delete_dtor);
138       val = build2 (MODIFY_EXPR, TREE_TYPE (val),
139                     DECL_RESULT (delete_dtor), val);
140       add_stmt (build_stmt (0, RETURN_EXPR, val));
141     }
142 }
143 
144 /* Return name of comdat group for complete and base ctor (or dtor)
145    that have the same body.  If dtor is virtual, deleting dtor goes
146    into this comdat group as well.  */
147 
148 static tree
149 cdtor_comdat_group (tree complete, tree base)
150 {
151   tree complete_name = DECL_ASSEMBLER_NAME (complete);
152   tree base_name = DECL_ASSEMBLER_NAME (base);
153   char *grp_name;
154   const char *p, *q;
155   bool diff_seen = false;
156   size_t idx;
157   gcc_assert (IDENTIFIER_LENGTH (complete_name)
158 	      == IDENTIFIER_LENGTH (base_name));
159   grp_name = XALLOCAVEC (char, IDENTIFIER_LENGTH (complete_name) + 1);
160   p = IDENTIFIER_POINTER (complete_name);
161   q = IDENTIFIER_POINTER (base_name);
162   for (idx = 0; idx < IDENTIFIER_LENGTH (complete_name); idx++)
163     if (p[idx] == q[idx])
164       grp_name[idx] = p[idx];
165     else
166       {
167 	gcc_assert (!diff_seen
168 		    && idx > 0
169 		    && (p[idx - 1] == 'C' || p[idx - 1] == 'D'
170 			|| p[idx - 1] == 'I')
171 		    && p[idx] == '1'
172 		    && q[idx] == '2');
173 	grp_name[idx] = '5';
174 	diff_seen = true;
175       }
176   grp_name[idx] = '\0';
177   gcc_assert (diff_seen);
178   return get_identifier (grp_name);
179 }
180 
181 /* Returns true iff we can make the base and complete [cd]tor aliases of
182    the same symbol rather than separate functions.  */
183 
184 static bool
185 can_alias_cdtor (tree fn)
186 {
187   /* If aliases aren't supported by the assembler, fail.  */
188   if (!TARGET_SUPPORTS_ALIASES)
189     return false;
190 
191   /* We can't use an alias if there are virtual bases.  */
192   if (CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fn)))
193     return false;
194   /* ??? Why not use aliases with -frepo?  */
195   if (flag_use_repository)
196     return false;
197   gcc_assert (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (fn)
198 	      || DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (fn));
199   /* Don't use aliases for weak/linkonce definitions unless we can put both
200      symbols in the same COMDAT group.  */
201   return (DECL_INTERFACE_KNOWN (fn)
202 	  && (SUPPORTS_ONE_ONLY || !DECL_WEAK (fn))
203 	  && (!DECL_ONE_ONLY (fn)
204 	      || (HAVE_COMDAT_GROUP && DECL_WEAK (fn))));
205 }
206 
207 /* FN is a [cd]tor, fns is a pointer to an array of length 3.  Fill fns
208    with pointers to the base, complete, and deleting variants.  */
209 
210 static void
211 populate_clone_array (tree fn, tree *fns)
212 {
213   tree clone;
214 
215   fns[0] = NULL_TREE;
216   fns[1] = NULL_TREE;
217   fns[2] = NULL_TREE;
218 
219   /* Look for the complete destructor which may be used to build the
220      delete destructor.  */
221   FOR_EACH_CLONE (clone, fn)
222     if (DECL_NAME (clone) == complete_dtor_identifier
223 	|| DECL_NAME (clone) == complete_ctor_identifier)
224       fns[1] = clone;
225     else if (DECL_NAME (clone) == base_dtor_identifier
226 	     || DECL_NAME (clone) == base_ctor_identifier)
227       fns[0] = clone;
228     else if (DECL_NAME (clone) == deleting_dtor_identifier)
229       fns[2] = clone;
230     else
231       gcc_unreachable ();
232 }
233 
234 /* FN is a constructor or destructor, and there are FUNCTION_DECLs
235    cloned from it nearby.  Instead of cloning this body, leave it
236    alone and create tiny one-call bodies for the cloned
237    FUNCTION_DECLs.  These clones are sibcall candidates, and their
238    resulting code will be very thunk-esque.  */
239 
240 static bool
241 maybe_thunk_body (tree fn, bool force)
242 {
243   tree bind, block, call, clone, clone_result, fn_parm, fn_parm_typelist;
244   tree last_arg, modify, *args;
245   int parmno, vtt_parmno, max_parms;
246   tree fns[3];
247 
248   if (!force && !flag_declone_ctor_dtor)
249     return 0;
250 
251   /* If function accepts variable arguments, give up.  */
252   last_arg = tree_last (TYPE_ARG_TYPES (TREE_TYPE (fn)));
253   if (last_arg != void_list_node)
254     return 0;
255 
256   /* If we got this far, we've decided to turn the clones into thunks.  */
257 
258   /* We're going to generate code for fn, so it is no longer "abstract."
259      Also make the unified ctor/dtor private to either the translation unit
260      (for non-vague linkage ctors) or the COMDAT group (otherwise).  */
261 
262   populate_clone_array (fn, fns);
263 
264   /* Can happen during error recovery (c++/71464).  */
265   if (!fns[0] || !fns[1])
266     return 0;
267 
268   /* Don't use thunks if the base clone omits inherited parameters.  */
269   if (ctor_omit_inherited_parms (fns[0]))
270     return 0;
271 
272   DECL_ABSTRACT_P (fn) = false;
273   if (!DECL_WEAK (fn))
274     {
275       TREE_PUBLIC (fn) = false;
276       DECL_EXTERNAL (fn) = false;
277       DECL_INTERFACE_KNOWN (fn) = true;
278     }
279   else if (HAVE_COMDAT_GROUP)
280     {
281       /* At eof, defer creation of mangling aliases temporarily.  */
282       bool save_defer_mangling_aliases = defer_mangling_aliases;
283       defer_mangling_aliases = true;
284       tree comdat_group = cdtor_comdat_group (fns[1], fns[0]);
285       defer_mangling_aliases = save_defer_mangling_aliases;
286       cgraph_node::get_create (fns[0])->set_comdat_group (comdat_group);
287       cgraph_node::get_create (fns[1])->add_to_same_comdat_group
288 	(cgraph_node::get_create (fns[0]));
289       symtab_node::get (fn)->add_to_same_comdat_group
290 	(symtab_node::get (fns[0]));
291       if (fns[2])
292 	/* If *[CD][12]* dtors go into the *[CD]5* comdat group and dtor is
293 	   virtual, it goes into the same comdat group as well.  */
294 	cgraph_node::get_create (fns[2])->add_to_same_comdat_group
295 	  (symtab_node::get (fns[0]));
296       /* Emit them now that the thunks are same comdat group aliases.  */
297       if (!save_defer_mangling_aliases)
298 	generate_mangling_aliases ();
299       TREE_PUBLIC (fn) = false;
300       DECL_EXTERNAL (fn) = false;
301       DECL_INTERFACE_KNOWN (fn) = true;
302       /* function_and_variable_visibility doesn't want !PUBLIC decls to
303 	 have these flags set.  */
304       DECL_WEAK (fn) = false;
305       DECL_COMDAT (fn) = false;
306     }
307 
308   /* Find the vtt_parm, if present.  */
309   for (vtt_parmno = -1, parmno = 0, fn_parm = DECL_ARGUMENTS (fn);
310        fn_parm;
311        ++parmno, fn_parm = TREE_CHAIN (fn_parm))
312     {
313       if (DECL_ARTIFICIAL (fn_parm)
314 	  && DECL_NAME (fn_parm) == vtt_parm_identifier)
315 	{
316 	  /* Compensate for removed in_charge parameter.  */
317 	  vtt_parmno = parmno;
318 	  break;
319 	}
320     }
321 
322   /* Allocate an argument buffer for build_cxx_call().
323      Make sure it is large enough for any of the clones.  */
324   max_parms = 0;
325   FOR_EACH_CLONE (clone, fn)
326     {
327       int length = list_length (DECL_ARGUMENTS (fn));
328       if (length > max_parms)
329         max_parms = length;
330     }
331   args = XALLOCAVEC (tree, max_parms);
332 
333   /* We know that any clones immediately follow FN in TYPE_FIELDS.  */
334   FOR_EACH_CLONE (clone, fn)
335     {
336       tree clone_parm;
337 
338       /* If we've already generated a body for this clone, avoid
339 	 duplicating it.  (Is it possible for a clone-list to grow after we
340 	 first see it?)  */
341       if (DECL_SAVED_TREE (clone) || TREE_ASM_WRITTEN (clone))
342 	continue;
343 
344       /* Start processing the function.  */
345       start_preparsed_function (clone, NULL_TREE, SF_PRE_PARSED);
346 
347       if (clone == fns[2])
348 	{
349 	  for (clone_parm = DECL_ARGUMENTS (clone); clone_parm;
350 	       clone_parm = TREE_CHAIN (clone_parm))
351 	    DECL_ABSTRACT_ORIGIN (clone_parm) = NULL_TREE;
352 	  /* Build the delete destructor by calling complete destructor and
353 	     delete function.  */
354 	  build_delete_destructor_body (clone, fns[1]);
355 	}
356       else
357 	{
358 	  /* Walk parameter lists together, creating parameter list for
359 	     call to original function.  */
360 	  for (parmno = 0,
361 		 fn_parm = DECL_ARGUMENTS (fn),
362 		 fn_parm_typelist = TYPE_ARG_TYPES (TREE_TYPE (fn)),
363 		 clone_parm = DECL_ARGUMENTS (clone);
364 	       fn_parm;
365 	       ++parmno,
366 		 fn_parm = TREE_CHAIN (fn_parm))
367 	    {
368 	      if (parmno == vtt_parmno && ! DECL_HAS_VTT_PARM_P (clone))
369 		{
370 		  gcc_assert (fn_parm_typelist);
371 		  /* Clobber argument with formal parameter type.  */
372 		  args[parmno]
373 		    = convert (TREE_VALUE (fn_parm_typelist),
374 			       null_pointer_node);
375 		}
376 	      else if (parmno == 1 && DECL_HAS_IN_CHARGE_PARM_P (fn))
377 		{
378 		  tree in_charge
379 		    = copy_node (in_charge_arg_for_name (DECL_NAME (clone)));
380 		  args[parmno] = in_charge;
381 		}
382 	      /* Map other parameters to their equivalents in the cloned
383 		 function.  */
384 	      else
385 		{
386 		  gcc_assert (clone_parm);
387 		  DECL_ABSTRACT_ORIGIN (clone_parm) = NULL;
388 		  args[parmno] = clone_parm;
389 		  clone_parm = TREE_CHAIN (clone_parm);
390 		}
391 	      if (fn_parm_typelist)
392 		fn_parm_typelist = TREE_CHAIN (fn_parm_typelist);
393 	    }
394 
395 	  /* We built this list backwards; fix now.  */
396 	  mark_used (fn);
397 	  call = build_cxx_call (fn, parmno, args, tf_warning_or_error);
398 	  /* Arguments passed to the thunk by invisible reference should
399 	     be transmitted to the callee unchanged.  Do not create a
400 	     temporary and invoke the copy constructor.  The thunking
401 	     transformation must not introduce any constructor calls.  */
402 	  CALL_FROM_THUNK_P (call) = 1;
403 	  block = make_node (BLOCK);
404 	  if (targetm.cxx.cdtor_returns_this ())
405 	    {
406 	      clone_result = DECL_RESULT (clone);
407 	      modify = build2 (MODIFY_EXPR, TREE_TYPE (clone_result),
408 			       clone_result, call);
409 	      modify = build1 (RETURN_EXPR, void_type_node, modify);
410 	      add_stmt (modify);
411 	    }
412 	  else
413 	    {
414 	      add_stmt (call);
415 	    }
416 	  bind = c_build_bind_expr (DECL_SOURCE_LOCATION (clone),
417 				    block, cur_stmt_list);
418 	  DECL_SAVED_TREE (clone) = push_stmt_list ();
419 	  add_stmt (bind);
420 	}
421 
422       DECL_ABSTRACT_ORIGIN (clone) = NULL;
423       expand_or_defer_fn (finish_function (/*inline_p=*/false));
424     }
425   return 1;
426 }
427 
428 /* FN is a function that has a complete body.  Clone the body as
429    necessary.  Returns nonzero if there's no longer any need to
430    process the main body.  */
431 
432 bool
433 maybe_clone_body (tree fn)
434 {
435   tree comdat_group = NULL_TREE;
436   tree clone;
437   tree fns[3];
438   bool first = true;
439   int idx;
440   bool need_alias = false;
441 
442   /* We only clone constructors and destructors.  */
443   if (!DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (fn)
444       && !DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (fn))
445     return 0;
446 
447   populate_clone_array (fn, fns);
448 
449   /* Remember if we can't have multiple clones for some reason.  We need to
450      check this before we remap local static initializers in clone_body.  */
451   if (!tree_versionable_function_p (fn))
452     need_alias = true;
453 
454   /* We know that any clones immediately follow FN in the TYPE_FIELDS
455      list.  */
456   push_to_top_level ();
457   for (idx = 0; idx < 3; idx++)
458     {
459       tree parm;
460       tree clone_parm;
461 
462       clone = fns[idx];
463       if (!clone)
464 	continue;
465 
466       /* Update CLONE's source position information to match FN's.  */
467       DECL_SOURCE_LOCATION (clone) = DECL_SOURCE_LOCATION (fn);
468       DECL_DECLARED_INLINE_P (clone) = DECL_DECLARED_INLINE_P (fn);
469       DECL_DECLARED_CONSTEXPR_P (clone) = DECL_DECLARED_CONSTEXPR_P (fn);
470       DECL_COMDAT (clone) = DECL_COMDAT (fn);
471       DECL_WEAK (clone) = DECL_WEAK (fn);
472 
473       /* We don't copy the comdat group from fn to clone because the assembler
474 	 name of fn was corrupted by write_mangled_name by adding *INTERNAL*
475 	 to it. By doing so, it also corrupted the comdat group. */
476       if (DECL_ONE_ONLY (fn))
477 	cgraph_node::get_create (clone)->set_comdat_group (cxx_comdat_group (clone));
478       DECL_USE_TEMPLATE (clone) = DECL_USE_TEMPLATE (fn);
479       DECL_EXTERNAL (clone) = DECL_EXTERNAL (fn);
480       DECL_INTERFACE_KNOWN (clone) = DECL_INTERFACE_KNOWN (fn);
481       DECL_NOT_REALLY_EXTERN (clone) = DECL_NOT_REALLY_EXTERN (fn);
482       TREE_PUBLIC (clone) = TREE_PUBLIC (fn);
483       DECL_VISIBILITY (clone) = DECL_VISIBILITY (fn);
484       DECL_VISIBILITY_SPECIFIED (clone) = DECL_VISIBILITY_SPECIFIED (fn);
485       DECL_DLLIMPORT_P (clone) = DECL_DLLIMPORT_P (fn);
486       DECL_ATTRIBUTES (clone) = copy_list (DECL_ATTRIBUTES (fn));
487       DECL_DISREGARD_INLINE_LIMITS (clone) = DECL_DISREGARD_INLINE_LIMITS (fn);
488       set_decl_section_name (clone, DECL_SECTION_NAME (fn));
489 
490       /* Adjust the parameter names and locations.  */
491       parm = DECL_ARGUMENTS (fn);
492       clone_parm = DECL_ARGUMENTS (clone);
493       /* Update the `this' parameter, which is always first.  */
494       update_cloned_parm (parm, clone_parm, first);
495       parm = DECL_CHAIN (parm);
496       clone_parm = DECL_CHAIN (clone_parm);
497       if (DECL_HAS_IN_CHARGE_PARM_P (fn))
498 	parm = DECL_CHAIN (parm);
499       if (DECL_HAS_VTT_PARM_P (fn))
500 	parm = DECL_CHAIN (parm);
501       if (DECL_HAS_VTT_PARM_P (clone))
502 	clone_parm = DECL_CHAIN (clone_parm);
503       for (; parm && clone_parm;
504 	   parm = DECL_CHAIN (parm), clone_parm = DECL_CHAIN (clone_parm))
505 	/* Update this parameter.  */
506 	update_cloned_parm (parm, clone_parm, first);
507     }
508 
509   bool can_alias = can_alias_cdtor (fn);
510 
511   /* If we decide to turn clones into thunks, they will branch to fn.
512      Must have original function available to call.  */
513   if (!can_alias && maybe_thunk_body (fn, need_alias))
514     {
515       pop_from_top_level ();
516       /* We still need to emit the original function.  */
517       return 0;
518     }
519 
520   /* Emit the DWARF1 abstract instance.  */
521   (*debug_hooks->deferred_inline_function) (fn);
522 
523   /* We know that any clones immediately follow FN in the TYPE_FIELDS. */
524   for (idx = 0; idx < 3; idx++)
525     {
526       tree parm;
527       tree clone_parm;
528       int parmno;
529       hash_map<tree, tree> *decl_map;
530       bool alias = false;
531 
532       clone = fns[idx];
533       if (!clone)
534 	continue;
535 
536       /* Start processing the function.  */
537       start_preparsed_function (clone, NULL_TREE, SF_PRE_PARSED);
538 
539       /* Tell cgraph if both ctors or both dtors are known to have
540 	 the same body.  */
541       if (can_alias
542 	  && fns[0]
543 	  && idx == 1
544 	  && cgraph_node::get_create (fns[0])->create_same_body_alias
545 	       (clone, fns[0]))
546 	{
547 	  alias = true;
548 	  if (DECL_ONE_ONLY (fns[0]))
549 	    {
550 	      /* For comdat base and complete cdtors put them
551 		 into the same, *[CD]5* comdat group instead of
552 		 *[CD][12]*.  */
553 	      comdat_group = cdtor_comdat_group (fns[1], fns[0]);
554 	      cgraph_node::get_create (fns[0])->set_comdat_group (comdat_group);
555 	      if (symtab_node::get (clone)->same_comdat_group)
556 		symtab_node::get (clone)->remove_from_same_comdat_group ();
557 	      symtab_node::get (clone)->add_to_same_comdat_group
558 		(symtab_node::get (fns[0]));
559 	    }
560 	}
561 
562       /* Build the delete destructor by calling complete destructor
563          and delete function.  */
564       if (idx == 2)
565 	{
566 	  build_delete_destructor_body (clone, fns[1]);
567 	  /* If *[CD][12]* dtors go into the *[CD]5* comdat group and dtor is
568 	     virtual, it goes into the same comdat group as well.  */
569 	  if (comdat_group)
570 	    cgraph_node::get_create (clone)->add_to_same_comdat_group
571 	      (symtab_node::get (fns[0]));
572 	}
573       else if (alias)
574 	/* No need to populate body.  */ ;
575       else
576 	{
577 	  /* If we can't have multiple copies of FN (say, because there's a
578 	     static local initialized with the address of a label), we need
579 	     to use an alias for the complete variant.  */
580 	  if (idx == 1 && need_alias)
581 	    {
582 	      if (DECL_STRUCT_FUNCTION (fn)->cannot_be_copied_set)
583 		sorry (DECL_STRUCT_FUNCTION (fn)->cannot_be_copied_reason, fn);
584 	      else
585 		sorry ("making multiple clones of %qD", fn);
586 	    }
587 
588           /* Remap the parameters.  */
589           decl_map = new hash_map<tree, tree>;
590           for (parmno = 0,
591                 parm = DECL_ARGUMENTS (fn),
592                 clone_parm = DECL_ARGUMENTS (clone);
593               parm;
594               ++parmno,
595                 parm = DECL_CHAIN (parm))
596             {
597               /* Map the in-charge parameter to an appropriate constant.  */
598               if (DECL_HAS_IN_CHARGE_PARM_P (fn) && parmno == 1)
599                 {
600                   tree in_charge;
601                   in_charge = in_charge_arg_for_name (DECL_NAME (clone));
602                   decl_map->put (parm, in_charge);
603                 }
604               else if (DECL_ARTIFICIAL (parm)
605                        && DECL_NAME (parm) == vtt_parm_identifier)
606                 {
607                   /* For a subobject constructor or destructor, the next
608                      argument is the VTT parameter.  Remap the VTT_PARM
609                      from the CLONE to this parameter.  */
610                   if (DECL_HAS_VTT_PARM_P (clone))
611                     {
612                       DECL_ABSTRACT_ORIGIN (clone_parm) = parm;
613                       decl_map->put (parm, clone_parm);
614                       clone_parm = DECL_CHAIN (clone_parm);
615                     }
616                   /* Otherwise, map the VTT parameter to `NULL'.  */
617                   else
618 		    {
619 		      tree t
620 			= fold_convert (TREE_TYPE (parm), null_pointer_node);
621 		      decl_map->put (parm, t);
622 		    }
623                 }
624               /* Map other parameters to their equivalents in the cloned
625                  function.  */
626               else
627                 {
628 		  tree replacement;
629 		  if (clone_parm)
630 		    {
631 		      replacement = clone_parm;
632 		      clone_parm = DECL_CHAIN (clone_parm);
633 		    }
634 		  else
635 		    {
636 		      /* Inheriting ctors can omit parameters from the base
637 			 clone.  Replace them with null lvalues.  */
638 		      tree reftype = build_reference_type (TREE_TYPE (parm));
639 		      replacement = fold_convert (reftype, null_pointer_node);
640 		      replacement = convert_from_reference (replacement);
641 		    }
642                   decl_map->put (parm, replacement);
643                 }
644             }
645 
646           if (targetm.cxx.cdtor_returns_this ())
647             {
648               parm = DECL_RESULT (fn);
649               clone_parm = DECL_RESULT (clone);
650               decl_map->put (parm, clone_parm);
651             }
652 
653           /* Clone the body.  */
654           clone_body (clone, fn, decl_map);
655 
656           /* Clean up.  */
657           delete decl_map;
658         }
659 
660       /* The clone can throw iff the original function can throw.  */
661       cp_function_chain->can_throw = !TREE_NOTHROW (fn);
662 
663       /* Now, expand this function into RTL, if appropriate.  */
664       finish_function (/*inline_p=*/false);
665       BLOCK_ABSTRACT_ORIGIN (DECL_INITIAL (clone)) = DECL_INITIAL (fn);
666       if (alias)
667 	{
668 	  if (expand_or_defer_fn_1 (clone))
669 	    emit_associated_thunks (clone);
670 	  /* We didn't generate a body, so remove the empty one.  */
671 	  DECL_SAVED_TREE (clone) = NULL_TREE;
672 	}
673       else
674 	expand_or_defer_fn (clone);
675       first = false;
676     }
677   pop_from_top_level ();
678 
679   /* We don't need to process the original function any further.  */
680   return 1;
681 }
682