xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/d/decl.cc (revision 122b5006ee1bd67145794b4cde92f4fe4781a5ec)
1 /* decl.cc -- Lower D frontend declarations to GCC trees.
2    Copyright (C) 2006-2019 Free Software Foundation, Inc.
3 
4 GCC is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3, or (at your option)
7 any later version.
8 
9 GCC is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU General Public License for more details.
13 
14 You should have received a copy of the GNU General Public License
15 along with GCC; see the file COPYING3.  If not see
16 <http://www.gnu.org/licenses/>.  */
17 
18 #include "config.h"
19 #include "system.h"
20 #include "coretypes.h"
21 
22 #include "dmd/aggregate.h"
23 #include "dmd/attrib.h"
24 #include "dmd/cond.h"
25 #include "dmd/ctfe.h"
26 #include "dmd/declaration.h"
27 #include "dmd/enum.h"
28 #include "dmd/errors.h"
29 #include "dmd/globals.h"
30 #include "dmd/hdrgen.h"
31 #include "dmd/identifier.h"
32 #include "dmd/import.h"
33 #include "dmd/init.h"
34 #include "dmd/mangle.h"
35 #include "dmd/module.h"
36 #include "dmd/nspace.h"
37 #include "dmd/target.h"
38 #include "dmd/template.h"
39 
40 #include "tree.h"
41 #include "tree-iterator.h"
42 #include "fold-const.h"
43 #include "diagnostic.h"
44 #include "langhooks.h"
45 #include "target.h"
46 #include "common/common-target.h"
47 #include "cgraph.h"
48 #include "toplev.h"
49 #include "stringpool.h"
50 #include "varasm.h"
51 #include "stor-layout.h"
52 #include "attribs.h"
53 #include "function.h"
54 #include "debug.h"
55 #include "tree-pretty-print.h"
56 
57 #include "d-tree.h"
58 
59 
60 /* Return identifier for the external mangled name of DECL.  */
61 
62 static const char *
63 mangle_decl (Dsymbol *decl)
64 {
65   if (decl->isFuncDeclaration ())
66     return mangleExact ((FuncDeclaration *)decl);
67   else
68     {
69       OutBuffer buf;
70       mangleToBuffer (decl, &buf);
71       return buf.extractString ();
72     }
73 }
74 
75 /* Generate a mangled identifier using NAME and SUFFIX, prefixed by the
76    assembler name for DECL.  */
77 
78 tree
79 mangle_internal_decl (Dsymbol *decl, const char *name, const char *suffix)
80 {
81   const char *prefix = mangle_decl (decl);
82   unsigned namelen = strlen (name);
83   unsigned buflen = (2 + strlen (prefix) + namelen + strlen (suffix)) * 2;
84   char *buf = (char *) alloca (buflen);
85 
86   snprintf (buf, buflen, "_D%s%u%s%s", prefix, namelen, name, suffix);
87   tree ident = get_identifier (buf);
88 
89   /* Symbol is not found in user code, but generate a readable name for it
90      anyway for debug and diagnostic reporting.  */
91   snprintf (buf, buflen, "%s.%s", decl->toPrettyChars (), name);
92   IDENTIFIER_PRETTY_NAME (ident) = get_identifier (buf);
93 
94   return ident;
95 }
96 
97 /* Returns true if DECL is from the gcc.attribute module.  */
98 
99 static bool
100 gcc_attribute_p (Dsymbol *decl)
101 {
102   ModuleDeclaration *md = decl->getModule ()->md;
103 
104   if (md && md->packages && md->packages->dim == 1)
105     {
106       if (!strcmp ((*md->packages)[0]->toChars (), "gcc")
107 	  && !strcmp (md->id->toChars (), "attribute"))
108 	return true;
109     }
110 
111   return false;
112 }
113 
114 /* Implements the visitor interface to lower all Declaration AST classes
115    emitted from the D Front-end to GCC trees.
116    All visit methods accept one parameter D, which holds the frontend AST
117    of the declaration to compile.  These also don't return any value, instead
118    generated code are appened to global_declarations or added to the
119    current_binding_level by d_pushdecl().  */
120 
121 class DeclVisitor : public Visitor
122 {
123   using Visitor::visit;
124 
125   /* If we're lowering the body of a version(unittest) condition.  */
126   bool in_version_unittest_;
127 
128 public:
129   DeclVisitor (void)
130   {
131     this->in_version_unittest_ = false;
132   }
133 
134   /* This should be overridden by each declaration class.  */
135 
136   void visit (Dsymbol *)
137   {
138   }
139 
140   /* Compile a D module, and all members of it.  */
141 
142   void visit (Module *d)
143   {
144     if (d->semanticRun >= PASSobj)
145       return;
146 
147     build_module_tree (d);
148     d->semanticRun = PASSobj;
149   }
150 
151   /* Write the imported symbol to debug.  */
152 
153   void visit (Import *d)
154   {
155     if (d->semanticRun >= PASSobj)
156       return;
157 
158     /* Implements import declarations by telling the debug back-end we are
159        importing the NAMESPACE_DECL of the module or IMPORTED_DECL of the
160        declaration into the current lexical scope CONTEXT.  NAME is set if
161        this is a renamed import.  */
162     if (d->isstatic)
163       return;
164 
165     /* Get the context of this import, this should never be null.  */
166     tree context = d_module_context ();
167 
168     if (d->ident == NULL)
169       {
170 	/* Importing declaration list.  */
171 	for (size_t i = 0; i < d->names.dim; i++)
172 	  {
173 	    AliasDeclaration *aliasdecl = d->aliasdecls[i];
174 	    tree decl = build_import_decl (aliasdecl);
175 
176 	    /* Skip over unhandled imports.  */
177 	    if (decl == NULL_TREE)
178 	      continue;
179 
180 	    Identifier *alias = d->aliases[i];
181 	    tree name = (alias != NULL)
182 	      ? get_identifier (alias->toChars ()) : NULL_TREE;
183 
184 	    debug_hooks->imported_module_or_decl (decl, name, context,
185 						  false, false);
186 	  }
187       }
188     else
189       {
190 	/* Importing the entire module.  */
191 	tree decl = build_import_decl (d->mod);
192 
193 	tree name = (d->aliasId != NULL)
194 	  ? get_identifier (d->aliasId->toChars ()) : NULL_TREE;
195 
196 	debug_hooks->imported_module_or_decl (decl, name, context,
197 					      false, false);
198       }
199 
200     d->semanticRun = PASSobj;
201   }
202 
203   /* Expand any local variables found in tuples.  */
204 
205   void visit (TupleDeclaration *d)
206   {
207     for (size_t i = 0; i < d->objects->dim; i++)
208       {
209 	RootObject *o = (*d->objects)[i];
210 	if ((o->dyncast () == DYNCAST_EXPRESSION)
211 	    && ((Expression *) o)->op == TOKdsymbol)
212 	  {
213 	    Declaration *d = ((DsymbolExp *) o)->s->isDeclaration ();
214 	    if (d)
215 	      d->accept (this);
216 	  }
217       }
218   }
219 
220   /* Walk over all declarations in the attribute scope.  */
221 
222   void visit (AttribDeclaration *d)
223   {
224     Dsymbols *ds = d->include (NULL, NULL);
225 
226     if (!ds)
227       return;
228 
229     for (size_t i = 0; i < ds->dim; i++)
230       {
231 	Dsymbol *s = (*ds)[i];
232 	s->accept (this);
233       }
234   }
235 
236   /* Pragmas are a way to pass special information to the compiler and to add
237      vendor specific extensions to D.  We don't do anything here, yet.  */
238 
239   void visit (PragmaDeclaration *d)
240   {
241     if (!global.params.ignoreUnsupportedPragmas)
242       {
243 	if (d->ident == Identifier::idPool ("lib")
244 	    || d->ident == Identifier::idPool ("startaddress"))
245 	  {
246 	    warning_at (make_location_t (d->loc), OPT_Wunknown_pragmas,
247 			"pragma(%s) not implemented", d->ident->toChars ());
248 	  }
249       }
250 
251     visit ((AttribDeclaration *) d);
252   }
253 
254   /* Conditional compilation is the process of selecting which code to compile
255      and which code to not compile.  Look for version conditions that may  */
256 
257   void visit (ConditionalDeclaration *d)
258   {
259     bool old_condition = this->in_version_unittest_;
260 
261     if (global.params.useUnitTests)
262       {
263 	VersionCondition *vc = d->condition->isVersionCondition ();
264 	if (vc && vc->ident == Identifier::idPool ("unittest"))
265 	  this->in_version_unittest_ = true;
266       }
267 
268     visit ((AttribDeclaration *) d);
269 
270     this->in_version_unittest_ = old_condition;
271   }
272 
273   /* Walk over all members in the namespace scope.  */
274 
275   void visit (Nspace *d)
276   {
277     if (isError (d) || !d->members)
278       return;
279 
280     for (size_t i = 0; i < d->members->dim; i++)
281       {
282 	Dsymbol *s = (*d->members)[i];
283 	s->accept (this);
284       }
285   }
286 
287   /* Templates are D's approach to generic programming.  They have no members
288      that can be emitted, however if the template is nested and used as a
289      voldemort type, then it's members must be compiled before the parent
290      function finishes.  */
291 
292   void visit (TemplateDeclaration *d)
293   {
294     /* Type cannot be directly named outside of the scope it's declared in, so
295        the only way it can be escaped is if the function has auto return.  */
296     FuncDeclaration *fd = d_function_chain ? d_function_chain->function : NULL;
297 
298     if (!fd || !fd->isAuto ())
299       return;
300 
301     /* Check if the function returns an instantiated type that may contain
302        nested members.  Only applies to classes or structs.  */
303     Type *tb = fd->type->nextOf ()->baseElemOf ();
304 
305     while (tb->ty == Tarray || tb->ty == Tpointer)
306       tb = tb->nextOf ()->baseElemOf ();
307 
308     TemplateInstance *ti = NULL;
309 
310     if (tb->ty == Tstruct)
311       ti = ((TypeStruct *) tb)->sym->isInstantiated ();
312     else if (tb->ty == Tclass)
313       ti = ((TypeClass *) tb)->sym->isInstantiated ();
314 
315     /* Return type is instantiated from this template declaration, walk over
316        all members of the instance.  */
317     if (ti && ti->tempdecl == d)
318       ti->accept (this);
319   }
320 
321   /* Walk over all members in the instantiated template.  */
322 
323   void visit (TemplateInstance *d)
324   {
325     if (isError (d)|| !d->members)
326       return;
327 
328     if (!d->needsCodegen ())
329       return;
330 
331     for (size_t i = 0; i < d->members->dim; i++)
332       {
333 	Dsymbol *s = (*d->members)[i];
334 	s->accept (this);
335       }
336   }
337 
338   /* Walk over all members in the mixin template scope.  */
339 
340   void visit (TemplateMixin *d)
341   {
342     if (isError (d)|| !d->members)
343       return;
344 
345     for (size_t i = 0; i < d->members->dim; i++)
346       {
347 	Dsymbol *s = (*d->members)[i];
348 	s->accept (this);
349       }
350   }
351 
352   /* Write out compiler generated TypeInfo, initializer and functions for the
353      given struct declaration, walking over all static members.  */
354 
355   void visit (StructDeclaration *d)
356   {
357     if (d->semanticRun >= PASSobj)
358       return;
359 
360     if (d->type->ty == Terror)
361       {
362 	error_at (make_location_t (d->loc),
363 		  "had semantic errors when compiling");
364 	return;
365       }
366 
367     /* Add this decl to the current binding level.  */
368     tree ctype = build_ctype (d->type);
369     if (TYPE_NAME (ctype))
370       d_pushdecl (TYPE_NAME (ctype));
371 
372     /* Anonymous structs/unions only exist as part of others,
373        do not output forward referenced structs.  */
374     if (d->isAnonymous () || !d->members)
375       return;
376 
377     /* Don't emit any symbols from gcc.attribute module.  */
378     if (gcc_attribute_p (d))
379       return;
380 
381     /* Generate TypeInfo.  */
382     if (have_typeinfo_p (Type::dtypeinfo))
383       create_typeinfo (d->type, NULL);
384 
385     /* Generate static initializer.  */
386     d->sinit = aggregate_initializer_decl (d);
387     DECL_INITIAL (d->sinit) = layout_struct_initializer (d);
388 
389     if (d->isInstantiated ())
390       d_linkonce_linkage (d->sinit);
391 
392     d_finish_decl (d->sinit);
393 
394     /* Put out the members.  */
395     for (size_t i = 0; i < d->members->dim; i++)
396       {
397 	Dsymbol *member = (*d->members)[i];
398 	/* There might be static ctors in the members, and they cannot
399 	   be put in separate object files.  */
400 	member->accept (this);
401       }
402 
403     /* Put out xopEquals, xopCmp and xopHash.  */
404     if (d->xeq && d->xeq != d->xerreq)
405       d->xeq->accept (this);
406 
407     if (d->xcmp && d->xcmp != d->xerrcmp)
408       d->xcmp->accept (this);
409 
410     if (d->xhash)
411       d->xhash->accept (this);
412 
413     d->semanticRun = PASSobj;
414   }
415 
416   /* Finish semantic analysis of functions in vtbl for class CD.  */
417 
418   bool finish_vtable (ClassDeclaration *d)
419   {
420     bool has_errors = false;
421 
422     /* Finish semantic analysis of functions in vtbl[].  */
423     for (size_t i = d->vtblOffset (); i < d->vtbl.dim; i++)
424       {
425 	FuncDeclaration *fd = d->vtbl[i]->isFuncDeclaration ();
426 
427 	if (!fd || (!fd->fbody && d->isAbstract ()))
428 	  continue;
429 
430 	/* Ensure function has a return value.  */
431 	if (!fd->functionSemantic ())
432 	  has_errors = true;
433 
434 	/* No name hiding to check for.  */
435 	if (!d->isFuncHidden (fd) || fd->isFuture ())
436 	  continue;
437 
438 	/* The function fd is hidden from the view of the class.
439 	   If it overlaps with any function in the vtbl[], then
440 	   issue an error.  */
441 	for (size_t j = 1; j < d->vtbl.dim; j++)
442 	  {
443 	    if (j == i)
444 	      continue;
445 
446 	    FuncDeclaration *fd2 = d->vtbl[j]->isFuncDeclaration ();
447 	    if (!fd2->ident->equals (fd->ident))
448 	      continue;
449 
450 	    /* The function is marked as @__future, a deprecation has
451 	       already been given by the frontend.  */
452 	    if (fd2->isFuture ())
453 	      continue;
454 
455 	    if (fd->leastAsSpecialized (fd2) || fd2->leastAsSpecialized (fd))
456 	      {
457 		TypeFunction *tf = (TypeFunction *) fd->type;
458 		if (tf->ty == Tfunction)
459 		  {
460 		    error_at (make_location_t (fd->loc), "use of %qs",
461 			      fd->toPrettyChars ());
462 		    inform (make_location_t (fd2->loc), "is hidden by %qs",
463 			    fd2->toPrettyChars ());
464 		    inform (make_location_t (d->loc),
465 			    "use %<alias %s = %s.%s;%> to introduce base class "
466 			    "overload set.", fd->toChars (),
467 			    fd->parent->toChars (), fd->toChars ());
468 		  }
469 		else
470 		  {
471 		    error_at (make_location_t (fd->loc), "use of %qs",
472 			      fd->toPrettyChars ());
473 		    inform (make_location_t (fd2->loc), "is hidden by %qs",
474 			      fd2->toPrettyChars ());
475 		  }
476 
477 		has_errors = true;
478 		break;
479 	      }
480 	  }
481       }
482 
483     return !has_errors;
484   }
485 
486   /* Write out compiler generated TypeInfo, initializer and vtables for the
487      given class declaration, walking over all static members.  */
488 
489   void visit (ClassDeclaration *d)
490   {
491     if (d->semanticRun >= PASSobj)
492       return;
493 
494     if (d->type->ty == Terror)
495       {
496 	error_at (make_location_t (d->loc),
497 		  "had semantic errors when compiling");
498 	return;
499       }
500 
501     if (!d->members)
502       return;
503 
504     /* Put out the members.  */
505     for (size_t i = 0; i < d->members->dim; i++)
506       {
507 	Dsymbol *member = (*d->members)[i];
508 	member->accept (this);
509       }
510 
511     /* If something goes wrong during final semantic pass, don't bother with
512        the rest as we may have incomplete info.  */
513     if (!this->finish_vtable (d))
514       return;
515 
516     /* Generate C symbols.  */
517     d->csym = get_classinfo_decl (d);
518     d->vtblsym = get_vtable_decl (d);
519     d->sinit = aggregate_initializer_decl (d);
520 
521     /* Generate static initializer.  */
522     DECL_INITIAL (d->sinit) = layout_class_initializer (d);
523     d_linkonce_linkage (d->sinit);
524     d_finish_decl (d->sinit);
525 
526     /* Put out the TypeInfo.  */
527     if (have_typeinfo_p (Type::dtypeinfo))
528       create_typeinfo (d->type, NULL);
529 
530     DECL_INITIAL (d->csym) = layout_classinfo (d);
531     d_linkonce_linkage (d->csym);
532     d_finish_decl (d->csym);
533 
534     /* Put out the vtbl[].  */
535     vec<constructor_elt, va_gc> *elms = NULL;
536 
537     /* First entry is ClassInfo reference.  */
538     if (d->vtblOffset ())
539       CONSTRUCTOR_APPEND_ELT (elms, size_zero_node, build_address (d->csym));
540 
541     for (size_t i = d->vtblOffset (); i < d->vtbl.dim; i++)
542       {
543 	FuncDeclaration *fd = d->vtbl[i]->isFuncDeclaration ();
544 
545 	if (fd && (fd->fbody || !d->isAbstract()))
546 	  {
547 	    CONSTRUCTOR_APPEND_ELT (elms, size_int (i),
548 				    build_address (get_symbol_decl (fd)));
549 	  }
550       }
551 
552     DECL_INITIAL (d->vtblsym)
553       = build_constructor (TREE_TYPE (d->vtblsym), elms);
554     d_comdat_linkage (d->vtblsym);
555     d_finish_decl (d->vtblsym);
556 
557     /* Add this decl to the current binding level.  */
558     tree ctype = TREE_TYPE (build_ctype (d->type));
559     if (TYPE_NAME (ctype))
560       d_pushdecl (TYPE_NAME (ctype));
561 
562     d->semanticRun = PASSobj;
563   }
564 
565   /* Write out compiler generated TypeInfo and vtables for the given interface
566      declaration, walking over all static members.  */
567 
568   void visit (InterfaceDeclaration *d)
569   {
570     if (d->semanticRun >= PASSobj)
571       return;
572 
573     if (d->type->ty == Terror)
574       {
575 	error_at (make_location_t (d->loc),
576 		  "had semantic errors when compiling");
577 	return;
578       }
579 
580     if (!d->members)
581       return;
582 
583     /* Put out the members.  */
584     for (size_t i = 0; i < d->members->dim; i++)
585       {
586 	Dsymbol *member = (*d->members)[i];
587 	member->accept (this);
588       }
589 
590     /* Generate C symbols.  */
591     d->csym = get_classinfo_decl (d);
592 
593     /* Put out the TypeInfo.  */
594     if (have_typeinfo_p (Type::dtypeinfo))
595       {
596 	create_typeinfo (d->type, NULL);
597 	d->type->vtinfo->accept (this);
598       }
599 
600     DECL_INITIAL (d->csym) = layout_classinfo (d);
601     d_linkonce_linkage (d->csym);
602     d_finish_decl (d->csym);
603 
604     /* Add this decl to the current binding level.  */
605     tree ctype = TREE_TYPE (build_ctype (d->type));
606     if (TYPE_NAME (ctype))
607       d_pushdecl (TYPE_NAME (ctype));
608 
609     d->semanticRun = PASSobj;
610   }
611 
612   /* Write out compiler generated TypeInfo and initializer for the given
613      enum declaration.  */
614 
615   void visit (EnumDeclaration *d)
616   {
617     if (d->semanticRun >= PASSobj)
618       return;
619 
620     if (d->errors || d->type->ty == Terror)
621       {
622 	error_at (make_location_t (d->loc),
623 		  "had semantic errors when compiling");
624 	return;
625       }
626 
627     if (d->isAnonymous ())
628       return;
629 
630     /* Generate TypeInfo.  */
631     if (have_typeinfo_p (Type::dtypeinfo))
632       create_typeinfo (d->type, NULL);
633 
634     TypeEnum *tc = (TypeEnum *) d->type;
635     if (tc->sym->members && !d->type->isZeroInit ())
636       {
637 	/* Generate static initializer.  */
638 	d->sinit = enum_initializer_decl (d);
639 	DECL_INITIAL (d->sinit) = build_expr (tc->sym->defaultval, true);
640 
641 	if (d->isInstantiated ())
642 	  d_linkonce_linkage (d->sinit);
643 
644 	d_finish_decl (d->sinit);
645 
646 	/* Add this decl to the current binding level.  */
647 	tree ctype = build_ctype (d->type);
648 	if (TREE_CODE (ctype) == ENUMERAL_TYPE && TYPE_NAME (ctype))
649 	  d_pushdecl (TYPE_NAME (ctype));
650       }
651 
652     d->semanticRun = PASSobj;
653   }
654 
655   /* Finish up a variable declaration and push it into the current scope.
656      This can either be a static, local or manifest constant.  */
657 
658   void visit (VarDeclaration *d)
659   {
660     if (d->semanticRun >= PASSobj)
661       return;
662 
663     if (d->type->ty == Terror)
664       {
665 	error_at (make_location_t (d->loc),
666 		  "had semantic errors when compiling");
667 	return;
668       }
669 
670     if (d->aliassym)
671       {
672 	d->toAlias ()->accept (this);
673 	return;
674       }
675 
676     /* Do not store variables we cannot take the address of,
677        but keep the values for purposes of debugging.  */
678     if (!d->canTakeAddressOf ())
679       {
680 	/* Don't know if there is a good way to handle instantiations.  */
681 	if (d->isInstantiated ())
682 	  return;
683 
684 	/* Cannot make an expression out of a void initializer.  */
685 	if (!d->_init || d->_init->isVoidInitializer ())
686 	  return;
687 
688 	tree decl = get_symbol_decl (d);
689 	Expression *ie = initializerToExpression (d->_init);
690 
691 	/* CONST_DECL was initially intended for enumerals and may be used for
692 	   scalars in general, but not for aggregates.  Here a non-constant
693 	   value is generated anyway so as the CONST_DECL only serves as a
694 	   placeholder for the value, however the DECL itself should never be
695 	   referenced in any generated code, or passed to the back-end.  */
696 	if (!d->type->isscalar ())
697 	  DECL_INITIAL (decl) = build_expr (ie, false);
698 	else
699 	  {
700 	    DECL_INITIAL (decl) = build_expr (ie, true);
701 	    d_pushdecl (decl);
702 	    rest_of_decl_compilation (decl, 1, 0);
703 	  }
704       }
705     else if (d->isDataseg () && !(d->storage_class & STCextern))
706       {
707 	tree decl = get_symbol_decl (d);
708 
709 	/* Duplicated VarDeclarations map to the same symbol.  Check if this
710 	   is the one declaration which will be emitted.  */
711 	tree ident = DECL_ASSEMBLER_NAME (decl);
712 	if (IDENTIFIER_DSYMBOL (ident) && IDENTIFIER_DSYMBOL (ident) != d)
713 	  return;
714 
715 	/* How big a symbol can be should depend on back-end.  */
716 	tree size = build_integer_cst (d->type->size (d->loc),
717 				       build_ctype (Type::tsize_t));
718 	if (!valid_constant_size_p (size))
719 	  {
720 	    error_at (make_location_t (d->loc), "size is too large");
721 	    return;
722 	  }
723 
724 	if (d->_init && !d->_init->isVoidInitializer ())
725 	  {
726 	    Expression *e = initializerToExpression (d->_init, d->type);
727 	    DECL_INITIAL (decl) = build_expr (e, true);
728 	  }
729 	else
730 	  {
731 	    if (d->type->ty == Tstruct)
732 	      {
733 		StructDeclaration *sd = ((TypeStruct *) d->type)->sym;
734 		DECL_INITIAL (decl) = layout_struct_initializer (sd);
735 	      }
736 	    else
737 	      {
738 		Expression *e = d->type->defaultInitLiteral (d->loc);
739 		DECL_INITIAL (decl) = build_expr (e, true);
740 	      }
741 	  }
742 
743 	/* Frontend should have already caught this.  */
744 	gcc_assert (!integer_zerop (size)
745 		    || d->type->toBasetype ()->ty == Tsarray);
746 
747 	d_finish_decl (decl);
748 
749 	/* Maybe record the var against the current module.  */
750 	register_module_decl (d);
751       }
752     else if (!d->isDataseg () && !d->isMember ())
753       {
754 	/* This is needed for VarDeclarations in mixins that are to be local
755 	   variables of a function.  Otherwise, it would be enough to make
756 	   a check for isVarDeclaration() in DeclarationExp codegen.  */
757 	declare_local_var (d);
758 
759 	if (d->_init)
760 	  {
761 	    tree decl = get_symbol_decl (d);
762 
763 	    if (!d->_init->isVoidInitializer ())
764 	      {
765 		ExpInitializer *vinit = d->_init->isExpInitializer ();
766 		Expression *ie = initializerToExpression (vinit);
767 		tree exp = build_expr (ie);
768 
769 		/* Maybe put variable on list of things needing destruction.  */
770 		if (d->needsScopeDtor ())
771 		  {
772 		    vec_safe_push (d_function_chain->vars_in_scope, decl);
773 		    /* Force a TARGET_EXPR to add the corresponding cleanup.  */
774 		    exp = force_target_expr (compound_expr (exp, decl));
775 		    TARGET_EXPR_CLEANUP (exp) = build_expr (d->edtor);
776 		  }
777 
778 		add_stmt (exp);
779 	      }
780 	    else if (d->size (d->loc) != 0)
781 	      {
782 		/* Zero-length arrays do not have an initializer.  */
783 		warning (OPT_Wuninitialized, "uninitialized variable '%s'",
784 			 d->ident ? d->ident->toChars () : "(no name)");
785 	      }
786 	  }
787       }
788 
789     d->semanticRun = PASSobj;
790   }
791 
792   /* Generate and compile a static TypeInfo declaration, but only if it is
793      needed in the current compilation.  */
794 
795   void visit (TypeInfoDeclaration *d)
796   {
797     if (d->semanticRun >= PASSobj)
798       return;
799 
800     if (speculative_type_p (d->tinfo))
801       return;
802 
803     tree t = get_typeinfo_decl (d);
804     DECL_INITIAL (t) = layout_typeinfo (d);
805     d_finish_decl (t);
806     d->semanticRun = PASSobj;
807   }
808 
809   /* Finish up a function declaration and compile it all the way
810      down to assembler language output.  */
811 
812   void visit (FuncDeclaration *d)
813   {
814     /* Already generated the function.  */
815     if (d->semanticRun >= PASSobj)
816       return;
817 
818     /* Don't emit any symbols from gcc.attribute module.  */
819     if (gcc_attribute_p (d))
820       return;
821 
822     /* Not emitting unittest functions.  */
823     if (!global.params.useUnitTests && d->isUnitTestDeclaration ())
824       return;
825 
826     /* Check if any errors occurred when running semantic.  */
827     if (d->type->ty == Tfunction)
828       {
829 	TypeFunction *tf = (TypeFunction *) d->type;
830 	if (tf->next == NULL || tf->next->ty == Terror)
831 	  return;
832       }
833 
834     if (d->semantic3Errors)
835       return;
836 
837     if (d->isNested ())
838       {
839 	FuncDeclaration *fdp = d;
840 	while (fdp && fdp->isNested ())
841 	  {
842 	    fdp = fdp->toParent2 ()->isFuncDeclaration ();
843 
844 	    if (fdp == NULL)
845 	      break;
846 
847 	    /* Parent failed to compile, but errors were gagged.  */
848 	    if (fdp->semantic3Errors)
849 	      return;
850 	  }
851       }
852 
853     /* Ensure all semantic passes have run.  */
854     if (d->semanticRun < PASSsemantic3)
855       {
856 	d->functionSemantic3 ();
857 	Module::runDeferredSemantic3 ();
858       }
859 
860     if (global.errors)
861       return;
862 
863     /* Duplicated FuncDeclarations map to the same symbol.  Check if this
864        is the one declaration which will be emitted.  */
865     tree fndecl = get_symbol_decl (d);
866     tree ident = DECL_ASSEMBLER_NAME (fndecl);
867     if (IDENTIFIER_DSYMBOL (ident) && IDENTIFIER_DSYMBOL (ident) != d)
868       return;
869 
870     if (!d->fbody)
871       {
872 	rest_of_decl_compilation (fndecl, 1, 0);
873 	return;
874       }
875 
876     if (global.params.verbose)
877       message ("function  %s", d->toPrettyChars ());
878 
879     /* Start generating code for this function.  */
880     gcc_assert (d->semanticRun == PASSsemantic3done);
881     d->semanticRun = PASSobj;
882 
883     tree old_context = start_function (d);
884 
885     tree parm_decl = NULL_TREE;
886     tree param_list = NULL_TREE;
887 
888     /* Special arguments...  */
889 
890     /* 'this' parameter:
891        For nested functions, D still generates a vthis, but it
892        should not be referenced in any expression.  */
893     if (d->vthis)
894       {
895 	parm_decl = get_symbol_decl (d->vthis);
896 	DECL_ARTIFICIAL (parm_decl) = 1;
897 	TREE_READONLY (parm_decl) = 1;
898 
899 	if (d->vthis->type == Type::tvoidptr)
900 	  {
901 	    /* Replace generic pointer with back-end closure type
902 	       (this wins for gdb).  */
903 	    tree frame_type = FRAMEINFO_TYPE (get_frameinfo (d));
904 	    gcc_assert (frame_type != NULL_TREE);
905 	    TREE_TYPE (parm_decl) = build_pointer_type (frame_type);
906 	  }
907 
908 	param_list = chainon (param_list, parm_decl);
909 	d_function_chain->static_chain = parm_decl;
910       }
911 
912     /* _arguments parameter.  */
913     if (d->v_arguments)
914       {
915 	parm_decl = get_symbol_decl (d->v_arguments);
916 	param_list = chainon (param_list, parm_decl);
917       }
918 
919     /* formal function parameters.  */
920     size_t n_parameters = d->parameters ? d->parameters->dim : 0;
921 
922     for (size_t i = 0; i < n_parameters; i++)
923       {
924 	VarDeclaration *param = (*d->parameters)[i];
925 	parm_decl = get_symbol_decl (param);
926 	/* Chain them in the correct order.  */
927 	param_list = chainon (param_list, parm_decl);
928       }
929 
930     DECL_ARGUMENTS (fndecl) = param_list;
931     DECL_IN_UNITTEST_CONDITION_P (fndecl) = this->in_version_unittest_;
932     rest_of_decl_compilation (fndecl, 1, 0);
933 
934     /* If this is a member function that nested (possibly indirectly) in another
935        function, construct an expession for this member function's static chain
936        by going through parent link of nested classes.  */
937     if (d->isThis ())
938       {
939 	AggregateDeclaration *ad = d->isThis ();
940 	tree this_tree = get_symbol_decl (d->vthis);
941 
942 	while (ad->isNested ())
943 	  {
944 	    Dsymbol *pd = ad->toParent2 ();
945 	    tree vthis_field = get_symbol_decl (ad->vthis);
946 	    this_tree = component_ref (build_deref (this_tree), vthis_field);
947 
948 	    ad = pd->isAggregateDeclaration ();
949 	    if (ad == NULL)
950 	      {
951 		cfun->language->static_chain = this_tree;
952 		break;
953 	      }
954 	  }
955       }
956 
957     /* May change cfun->static_chain.  */
958     build_closure (d);
959 
960     if (d->vresult)
961       declare_local_var (d->vresult);
962 
963     if (d->v_argptr)
964       push_stmt_list ();
965 
966     /* Named return value optimisation support for D.
967        Implemented by overriding all the RETURN_EXPRs and replacing all
968        occurrences of VAR with the RESULT_DECL for the function.
969        This is only worth doing for functions that can return in memory.  */
970     if (d->nrvo_can)
971       {
972 	tree restype = TREE_TYPE (DECL_RESULT (fndecl));
973 
974 	if (!AGGREGATE_TYPE_P (restype))
975 	  d->nrvo_can = 0;
976 	else
977 	  d->nrvo_can = aggregate_value_p (restype, fndecl);
978       }
979 
980     if (d->nrvo_can)
981       {
982 	tree resdecl = DECL_RESULT (fndecl);
983 
984 	TREE_TYPE (resdecl)
985 	  = build_reference_type (TREE_TYPE (resdecl));
986 	DECL_BY_REFERENCE (resdecl) = 1;
987 	TREE_ADDRESSABLE (resdecl) = 0;
988 	relayout_decl (resdecl);
989 
990 	if (d->nrvo_var)
991 	  {
992 	    tree var = get_symbol_decl (d->nrvo_var);
993 
994 	    /* Copy name from VAR to RESULT.  */
995 	    DECL_NAME (resdecl) = DECL_NAME (var);
996 	    /* Don't forget that we take its address.  */
997 	    TREE_ADDRESSABLE (var) = 1;
998 	    resdecl = build_deref (resdecl);
999 
1000 	    SET_DECL_VALUE_EXPR (var, resdecl);
1001 	    DECL_HAS_VALUE_EXPR_P (var) = 1;
1002 	    SET_DECL_LANG_NRVO (var, resdecl);
1003 	  }
1004       }
1005 
1006     build_function_body (d);
1007 
1008     /* Initialize the _argptr variable.  */
1009     if (d->v_argptr)
1010       {
1011 	tree body = pop_stmt_list ();
1012 	tree var = get_decl_tree (d->v_argptr);
1013 	var = build_address (var);
1014 
1015 	tree init = build_call_expr (builtin_decl_explicit (BUILT_IN_VA_START),
1016 				     2, var, parm_decl);
1017 	declare_local_var (d->v_argptr);
1018 	add_stmt (init);
1019 
1020 	tree cleanup = build_call_expr (builtin_decl_explicit (BUILT_IN_VA_END),
1021 					1, var);
1022 	add_stmt (build2 (TRY_FINALLY_EXPR, void_type_node, body, cleanup));
1023       }
1024 
1025     finish_function (old_context);
1026 
1027     /* Maybe record the function against the current module.  */
1028     register_module_decl (d);
1029   }
1030 };
1031 
1032 /* Main entry point for the DeclVisitor interface to send
1033    the Declaration AST class D to GCC back-end.  */
1034 
1035 void
1036 build_decl_tree (Dsymbol *d)
1037 {
1038   location_t saved_location = input_location;
1039 
1040   /* Set input location, empty DECL_SOURCE_FILE can crash debug generator.  */
1041   if (d->loc.filename)
1042     input_location = make_location_t (d->loc);
1043   else
1044     input_location = make_location_t (Loc ("<no_file>", 1, 0));
1045 
1046   DeclVisitor v = DeclVisitor ();
1047   d->accept (&v);
1048 
1049   input_location = saved_location;
1050 }
1051 
1052 /* Return the decl for the symbol, create it if it doesn't already exist.  */
1053 
1054 tree
1055 get_symbol_decl (Declaration *decl)
1056 {
1057   if (decl->csym)
1058     return decl->csym;
1059 
1060   /* Deal with placeholder symbols immediately:
1061      SymbolDeclaration is used as a shell around an initializer symbol.  */
1062   SymbolDeclaration *sd = decl->isSymbolDeclaration ();
1063   if (sd)
1064     {
1065       decl->csym = aggregate_initializer_decl (sd->dsym);
1066       return decl->csym;
1067     }
1068 
1069   /* Global static TypeInfo declaration.  */
1070   if (decl->isTypeInfoDeclaration ())
1071     return get_typeinfo_decl ((TypeInfoDeclaration *) decl);
1072 
1073   /* FuncAliasDeclaration is used to import functions from another scope.  */
1074   FuncAliasDeclaration *fad = decl->isFuncAliasDeclaration ();
1075   if (fad)
1076     {
1077       decl->csym = get_symbol_decl (fad->funcalias);
1078       return decl->csym;
1079     }
1080 
1081   /* It is possible for a field declaration symbol to be requested
1082      before the parent type has been built.  */
1083   if (decl->isField ())
1084     {
1085       AggregateDeclaration *ad = decl->toParent ()->isAggregateDeclaration ();
1086       gcc_assert (ad != NULL);
1087 
1088       /* Finishing off the type should create the associated FIELD_DECL.  */
1089       build_ctype (ad->type);
1090       gcc_assert (decl->csym != NULL);
1091 
1092       return decl->csym;
1093     }
1094 
1095   /* Build the tree for the symbol.  */
1096   FuncDeclaration *fd = decl->isFuncDeclaration ();
1097   if (fd)
1098     {
1099       /* Run full semantic on functions we need to know about.  */
1100       if (!fd->functionSemantic ())
1101 	{
1102 	  decl->csym = error_mark_node;
1103 	  return decl->csym;
1104 	}
1105 
1106       decl->csym = build_decl (make_location_t (decl->loc), FUNCTION_DECL,
1107 			       get_identifier (decl->ident->toChars ()),
1108 			       NULL_TREE);
1109 
1110       /* Set function type afterwards as there could be self references.  */
1111       TREE_TYPE (decl->csym) = build_ctype (fd->type);
1112 
1113       if (!fd->fbody)
1114 	DECL_EXTERNAL (decl->csym) = 1;
1115     }
1116   else
1117     {
1118       /* Build the variable declaration.  */
1119       VarDeclaration *vd = decl->isVarDeclaration ();
1120       gcc_assert (vd != NULL);
1121 
1122       tree_code code = vd->isParameter () ? PARM_DECL
1123 	: !vd->canTakeAddressOf () ? CONST_DECL
1124 	: VAR_DECL;
1125       decl->csym = build_decl (make_location_t (decl->loc), code,
1126 			       get_identifier (decl->ident->toChars ()),
1127 			       declaration_type (vd));
1128 
1129       /* If any alignment was set on the declaration.  */
1130       if (vd->alignment != STRUCTALIGN_DEFAULT)
1131 	{
1132 	  SET_DECL_ALIGN (decl->csym, vd->alignment * BITS_PER_UNIT);
1133 	  DECL_USER_ALIGN (decl->csym) = 1;
1134 	}
1135 
1136       if (vd->storage_class & STCextern)
1137 	DECL_EXTERNAL (decl->csym) = 1;
1138     }
1139 
1140   /* Set the declaration mangled identifier if static.  */
1141   if (decl->isCodeseg () || decl->isDataseg ())
1142     {
1143       tree mangled_name;
1144 
1145       if (decl->mangleOverride)
1146 	mangled_name = get_identifier (decl->mangleOverride);
1147       else
1148 	mangled_name = get_identifier (mangle_decl (decl));
1149 
1150       mangled_name = targetm.mangle_decl_assembler_name (decl->csym,
1151 							 mangled_name);
1152       /* The frontend doesn't handle duplicate definitions of unused symbols
1153 	 with the same mangle.  So a check is done here instead.  */
1154       if (!DECL_EXTERNAL (decl->csym))
1155 	{
1156 	  if (IDENTIFIER_DSYMBOL (mangled_name))
1157 	    {
1158 	      Declaration *other = IDENTIFIER_DSYMBOL (mangled_name);
1159 
1160 	      /* Non-templated variables shouldn't be defined twice.  */
1161 	      if (!decl->isInstantiated ())
1162 		ScopeDsymbol::multiplyDefined (decl->loc, decl, other);
1163 
1164 	      decl->csym = get_symbol_decl (other);
1165 	      return decl->csym;
1166 	    }
1167 
1168 	  IDENTIFIER_PRETTY_NAME (mangled_name)
1169 	    = get_identifier (decl->toPrettyChars (true));
1170 	  IDENTIFIER_DSYMBOL (mangled_name) = decl;
1171 	}
1172 
1173       SET_DECL_ASSEMBLER_NAME (decl->csym, mangled_name);
1174     }
1175 
1176   DECL_LANG_SPECIFIC (decl->csym) = build_lang_decl (decl);
1177   DECL_CONTEXT (decl->csym) = d_decl_context (decl);
1178 
1179   if (TREE_CODE (decl->csym) == PARM_DECL)
1180     {
1181       /* Pass non-trivial structs by invisible reference.  */
1182       if (TREE_ADDRESSABLE (TREE_TYPE (decl->csym)))
1183 	{
1184 	  tree argtype = build_reference_type (TREE_TYPE (decl->csym));
1185 	  argtype = build_qualified_type (argtype, TYPE_QUAL_RESTRICT);
1186 	  gcc_assert (!DECL_BY_REFERENCE (decl->csym));
1187 	  TREE_TYPE (decl->csym) = argtype;
1188 	  DECL_BY_REFERENCE (decl->csym) = 1;
1189 	  TREE_ADDRESSABLE (decl->csym) = 0;
1190 	  relayout_decl (decl->csym);
1191 	  decl->storage_class |= STCref;
1192 	}
1193 
1194       DECL_ARG_TYPE (decl->csym) = TREE_TYPE (decl->csym);
1195       gcc_assert (TREE_CODE (DECL_CONTEXT (decl->csym)) == FUNCTION_DECL);
1196     }
1197   else if (TREE_CODE (decl->csym) == CONST_DECL)
1198     {
1199       /* Manifest constants have no address in memory.  */
1200       TREE_CONSTANT (decl->csym) = 1;
1201       TREE_READONLY (decl->csym) = 1;
1202     }
1203   else if (TREE_CODE (decl->csym) == FUNCTION_DECL)
1204     {
1205       /* The real function type may differ from its declaration.  */
1206       tree fntype = TREE_TYPE (decl->csym);
1207       tree newfntype = NULL_TREE;
1208 
1209       if (fd->isNested ())
1210 	{
1211 	  /* Add an extra argument for the frame/closure pointer, this is also
1212 	     required to be compatible with D delegates.  */
1213 	  newfntype = build_vthis_function (void_type_node, fntype);
1214 	}
1215       else if (fd->isThis ())
1216 	{
1217 	  /* Add an extra argument for the 'this' parameter.  The handle type is
1218 	     used even if there is no debug info.  It is needed to make sure
1219 	     virtual member functions are not called statically.  */
1220 	  AggregateDeclaration *ad = fd->isMember2 ();
1221 	  tree handle = build_ctype (ad->handleType ());
1222 
1223 	  /* If handle is a pointer type, get record type.  */
1224 	  if (!ad->isStructDeclaration ())
1225 	    handle = TREE_TYPE (handle);
1226 
1227 	  newfntype = build_vthis_function (handle, fntype);
1228 
1229 	  /* Set the vindex on virtual functions.  */
1230 	  if (fd->isVirtual () && fd->vtblIndex != -1)
1231 	    {
1232 	      DECL_VINDEX (decl->csym) = size_int (fd->vtblIndex);
1233 	      DECL_VIRTUAL_P (decl->csym) = 1;
1234 	    }
1235 	}
1236       else if (fd->isMain () || fd->isCMain ())
1237 	{
1238 	  /* The main function is named 'D main' to distinguish from C main.  */
1239 	  if (fd->isMain ())
1240 	    DECL_NAME (decl->csym) = get_identifier (fd->toPrettyChars (true));
1241 
1242 	  /* 'void main' is implicitly converted to returning an int.  */
1243 	  newfntype = build_function_type (d_int_type, TYPE_ARG_TYPES (fntype));
1244 	}
1245 
1246       if (newfntype != NULL_TREE)
1247 	{
1248 	  /* Copy the old attributes from the original type.  */
1249 	  TYPE_ATTRIBUTES (newfntype) = TYPE_ATTRIBUTES (fntype);
1250 	  TYPE_LANG_SPECIFIC (newfntype) = TYPE_LANG_SPECIFIC (fntype);
1251 	  TREE_ADDRESSABLE (newfntype) = TREE_ADDRESSABLE (fntype);
1252 	  TREE_TYPE (decl->csym) = newfntype;
1253 	  d_keep (newfntype);
1254 	}
1255 
1256       /* Miscellaneous function flags.  */
1257       if (fd->isMember2 () || fd->isFuncLiteralDeclaration ())
1258 	{
1259 	  /* See grokmethod in cp/decl.c.  Maybe we shouldn't be setting inline
1260 	     flags without reason or proper handling.  */
1261 	  DECL_DECLARED_INLINE_P (decl->csym) = 1;
1262 	  DECL_NO_INLINE_WARNING_P (decl->csym) = 1;
1263 	}
1264 
1265       /* Function was declared 'naked'.  */
1266       if (fd->naked)
1267 	{
1268 	  insert_decl_attribute (decl->csym, "naked");
1269 	  DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl->csym) = 1;
1270 	}
1271 
1272       /* Vector array operations are always compiler generated.  */
1273       if (fd->isArrayOp)
1274 	{
1275 	  TREE_PUBLIC (decl->csym) = 1;
1276 	  DECL_ARTIFICIAL (decl->csym) = 1;
1277 	  DECL_DECLARED_INLINE_P (decl->csym) = 1;
1278 	  d_comdat_linkage (decl->csym);
1279 	}
1280 
1281       /* And so are ensure and require contracts.  */
1282       if (fd->ident == Identifier::idPool ("ensure")
1283 	  || fd->ident == Identifier::idPool ("require"))
1284 	{
1285 	  DECL_ARTIFICIAL (decl->csym) = 1;
1286 	  TREE_PUBLIC (decl->csym) = 1;
1287 	}
1288 
1289       if (decl->storage_class & STCfinal)
1290 	DECL_FINAL_P (decl->csym) = 1;
1291 
1292       /* Check whether this function is expanded by the frontend.  */
1293       DECL_INTRINSIC_CODE (decl->csym) = INTRINSIC_NONE;
1294       maybe_set_intrinsic (fd);
1295 
1296       /* For nested functions in particular, unnest fndecl in the cgraph, as
1297 	 all static chain passing is handled by the front-end.  Do this even
1298 	 if we are not emitting the body.  */
1299       struct cgraph_node *node = cgraph_node::get_create (decl->csym);
1300       if (node->origin)
1301 	node->unnest ();
1302     }
1303 
1304   /* Mark compiler generated temporaries as artificial.  */
1305   if (decl->storage_class & STCtemp)
1306     DECL_ARTIFICIAL (decl->csym) = 1;
1307 
1308   /* Propagate shared on the decl.  */
1309   if (TYPE_SHARED (TREE_TYPE (decl->csym)))
1310     TREE_ADDRESSABLE (decl->csym) = 1;
1311 
1312   /* Symbol was marked volatile.  */
1313   if (decl->storage_class & STCvolatile)
1314     TREE_THIS_VOLATILE (decl->csym) = 1;
1315 
1316   /* Protection attributes are used by the debugger.  */
1317   if (decl->protection.kind == PROTprivate)
1318     TREE_PRIVATE (decl->csym) = 1;
1319   else if (decl->protection.kind == PROTprotected)
1320     TREE_PROTECTED (decl->csym) = 1;
1321 
1322   /* Likewise, so could the deprecated attribute.  */
1323   if (decl->storage_class & STCdeprecated)
1324     TREE_DEPRECATED (decl->csym) = 1;
1325 
1326 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
1327   /* Have to test for import first.  */
1328   if (decl->isImportedSymbol ())
1329     {
1330       insert_decl_attribute (decl->csym, "dllimport");
1331       DECL_DLLIMPORT_P (decl->csym) = 1;
1332     }
1333   else if (decl->isExport ())
1334     insert_decl_attribute (decl->csym, "dllexport");
1335 #endif
1336 
1337   if (decl->isDataseg () || decl->isCodeseg () || decl->isThreadlocal ())
1338     {
1339       /* Set TREE_PUBLIC by default, but allow private template to override.  */
1340       if (!fd || !fd->isNested ())
1341 	TREE_PUBLIC (decl->csym) = 1;
1342 
1343       TREE_STATIC (decl->csym) = 1;
1344       /* The decl has not been defined -- yet.  */
1345       DECL_EXTERNAL (decl->csym) = 1;
1346 
1347       if (decl->isInstantiated ())
1348 	d_linkonce_linkage (decl->csym);
1349     }
1350 
1351   /* Symbol is going in thread local storage.  */
1352   if (decl->isThreadlocal () && !DECL_ARTIFICIAL (decl->csym))
1353     {
1354       if (global.params.vtls)
1355 	message (decl->loc, "`%s` is thread local", decl->toChars ());
1356 
1357       set_decl_tls_model (decl->csym, decl_default_tls_model (decl->csym));
1358     }
1359 
1360   /* Apply any user attributes that may affect semantic meaning.  */
1361   if (decl->userAttribDecl)
1362     {
1363       Expressions *attrs = decl->userAttribDecl->getAttributes ();
1364       decl_attributes (&decl->csym, build_attributes (attrs), 0);
1365     }
1366   else if (DECL_ATTRIBUTES (decl->csym) != NULL)
1367     decl_attributes (&decl->csym, DECL_ATTRIBUTES (decl->csym), 0);
1368 
1369   /* %% Probably should be a little more intelligent about setting this.  */
1370   TREE_USED (decl->csym) = 1;
1371   d_keep (decl->csym);
1372 
1373   return decl->csym;
1374 }
1375 
1376 /* Returns a declaration for a VAR_DECL.  Used to create compiler-generated
1377    global variables.  */
1378 
1379 tree
1380 declare_extern_var (tree ident, tree type)
1381 {
1382   /* If the VAR_DECL has already been declared, return it.  */
1383   if (IDENTIFIER_DECL_TREE (ident))
1384     return IDENTIFIER_DECL_TREE (ident);
1385 
1386   tree name = IDENTIFIER_PRETTY_NAME (ident)
1387     ? IDENTIFIER_PRETTY_NAME (ident) : ident;
1388   tree decl = build_decl (input_location, VAR_DECL, name, type);
1389 
1390   IDENTIFIER_DECL_TREE (ident) = decl;
1391   d_keep (decl);
1392 
1393   SET_DECL_ASSEMBLER_NAME (decl, ident);
1394   DECL_ARTIFICIAL (decl) = 1;
1395   TREE_STATIC (decl) = 1;
1396   TREE_PUBLIC (decl) = 1;
1397 
1398   /* The decl has not been defined -- yet.  */
1399   DECL_EXTERNAL (decl) = 1;
1400 
1401   return decl;
1402 }
1403 
1404 /* Add local variable VAR into the current function body.  */
1405 
1406 void
1407 declare_local_var (VarDeclaration *var)
1408 {
1409   gcc_assert (!var->isDataseg () && !var->isMember ());
1410   gcc_assert (current_function_decl != NULL_TREE);
1411 
1412   FuncDeclaration *fd = cfun->language->function;
1413   tree decl = get_symbol_decl (var);
1414 
1415   gcc_assert (!TREE_STATIC (decl));
1416   d_pushdecl (decl);
1417   DECL_CONTEXT (decl) = current_function_decl;
1418 
1419   /* Compiler generated symbols.  */
1420   if (var == fd->vresult || var == fd->v_argptr)
1421     DECL_ARTIFICIAL (decl) = 1;
1422 
1423   if (DECL_LANG_FRAME_FIELD (decl))
1424     {
1425       /* Fixes debugging local variables.  */
1426       SET_DECL_VALUE_EXPR (decl, get_decl_tree (var));
1427       DECL_HAS_VALUE_EXPR_P (decl) = 1;
1428     }
1429 }
1430 
1431 /* Return an unnamed local temporary of type TYPE.  */
1432 
1433 tree
1434 build_local_temp (tree type)
1435 {
1436   tree decl = build_decl (input_location, VAR_DECL, NULL_TREE, type);
1437 
1438   DECL_CONTEXT (decl) = current_function_decl;
1439   DECL_ARTIFICIAL (decl) = 1;
1440   DECL_IGNORED_P (decl) = 1;
1441   d_pushdecl (decl);
1442 
1443   return decl;
1444 }
1445 
1446 /* Return the correct decl to be used for DECL.  For VAR_DECLs, this could
1447    instead be a FIELD_DECL from a closure, or a RESULT_DECL from a named return
1448    value.  For PARM_DECLs, this could be a FIELD_DECL for a non-local `this'.
1449    For all other kinds of decls, this just returns the result of
1450    get_symbol_decl().  */
1451 
1452 tree
1453 get_decl_tree (Declaration *decl)
1454 {
1455   tree t = get_symbol_decl (decl);
1456   FuncDeclaration *fd = cfun ? cfun->language->function : NULL;
1457   VarDeclaration *vd = decl->isVarDeclaration ();
1458 
1459   /* If cfun is NULL, then this is a global static.  */
1460   if (vd == NULL || fd == NULL)
1461     return t;
1462 
1463   /* Get the named return value.  */
1464   if (DECL_LANG_NRVO (t))
1465     return DECL_LANG_NRVO (t);
1466 
1467   /* Get the closure holding the var decl.  */
1468   if (DECL_LANG_FRAME_FIELD (t))
1469     {
1470       FuncDeclaration *parent = vd->toParent2 ()->isFuncDeclaration ();
1471       tree frame_ref = get_framedecl (fd, parent);
1472 
1473       return component_ref (build_deref (frame_ref),
1474 			    DECL_LANG_FRAME_FIELD (t));
1475     }
1476 
1477   /* Get the non-local 'this' value by going through parent link
1478      of nested classes, this routine pretty much undoes what
1479      getRightThis in the frontend removes from codegen.  */
1480   if (vd->parent != fd && vd->isThisDeclaration ())
1481     {
1482       /* Find the first parent that is a member function.  */
1483       while (!fd->isMember2 ())
1484 	{
1485 	  gcc_assert (fd->vthis);
1486 	  fd = fd->toParent2 ()->isFuncDeclaration ();
1487 	  gcc_assert (fd != NULL);
1488 	}
1489 
1490       AggregateDeclaration *ad = fd->isThis ();
1491       gcc_assert (ad != NULL);
1492 
1493       t = get_decl_tree (fd->vthis);
1494       Dsymbol *outer = fd;
1495 
1496       while (outer != vd->parent)
1497 	{
1498 	  gcc_assert (ad != NULL);
1499 	  outer = ad->toParent2 ();
1500 
1501 	  /* Get the this->this parent link.  */
1502 	  tree vfield = get_symbol_decl (ad->vthis);
1503 	  t = component_ref (build_deref (t), vfield);
1504 
1505 	  ad = outer->isAggregateDeclaration ();
1506 	  if (ad != NULL)
1507 	    continue;
1508 
1509 	  fd = outer->isFuncDeclaration ();
1510 	  while (fd != NULL)
1511 	    {
1512 	      /* If outer function creates a closure, then the 'this'
1513 		 value would be the closure pointer, and the real
1514 		 'this' the first field of that closure.  */
1515 	      tree ff = get_frameinfo (fd);
1516 	      if (FRAMEINFO_CREATES_FRAME (ff))
1517 		{
1518 		  t = build_nop (build_pointer_type (FRAMEINFO_TYPE (ff)), t);
1519 		  t = indirect_ref (build_ctype (fd->vthis->type), t);
1520 		}
1521 
1522 	      if (fd == vd->parent)
1523 		break;
1524 
1525 	      /* Continue looking for the right `this'.  */
1526 	      outer = outer->toParent2 ();
1527 	      fd = outer->isFuncDeclaration ();
1528 	    }
1529 
1530 	  ad = outer->isAggregateDeclaration ();
1531 	}
1532 
1533       return t;
1534     }
1535 
1536   /* Auto variable that the back end will handle for us.  */
1537   return t;
1538 }
1539 
1540 /* Finish up a variable declaration and compile it all the way to
1541    the assembler language output.  */
1542 
1543 void
1544 d_finish_decl (tree decl)
1545 {
1546   gcc_assert (!error_operand_p (decl));
1547 
1548   /* We are sending this symbol to object file, can't be extern.  */
1549   TREE_STATIC (decl) = 1;
1550   DECL_EXTERNAL (decl) = 0;
1551 
1552   /* Update the TLS model as the linkage has been modified.  */
1553   if (DECL_THREAD_LOCAL_P (decl))
1554     set_decl_tls_model (decl, decl_default_tls_model (decl));
1555 
1556   relayout_decl (decl);
1557 
1558   if (flag_checking && DECL_INITIAL (decl))
1559     {
1560       /* Initializer must never be bigger than symbol size.  */
1561       dinteger_t tsize = int_size_in_bytes (TREE_TYPE (decl));
1562       dinteger_t dtsize = int_size_in_bytes (TREE_TYPE (DECL_INITIAL (decl)));
1563 
1564       if (tsize < dtsize)
1565 	{
1566 	  tree name = DECL_ASSEMBLER_NAME (decl);
1567 
1568 	  internal_error ("Mismatch between declaration %qE size (%wd) and "
1569 			  "its initializer size (%wd).",
1570 			  IDENTIFIER_PRETTY_NAME (name)
1571 			  ? IDENTIFIER_PRETTY_NAME (name) : name,
1572 			  tsize, dtsize);
1573 	}
1574     }
1575 
1576   /* Without weak symbols, symbol should be put in .common, but that can't
1577      be done if there is a nonzero initializer.  */
1578   if (DECL_COMDAT (decl) && DECL_COMMON (decl)
1579       && initializer_zerop (DECL_INITIAL (decl)))
1580     DECL_INITIAL (decl) = error_mark_node;
1581 
1582   /* Add this decl to the current binding level.  */
1583   d_pushdecl (decl);
1584 
1585   rest_of_decl_compilation (decl, 1, 0);
1586 }
1587 
1588 /* Thunk code is based on g++.  */
1589 
1590 static int thunk_labelno;
1591 
1592 /* Create a static alias to function.  */
1593 
1594 static tree
1595 make_alias_for_thunk (tree function)
1596 {
1597   tree alias;
1598   char buf[256];
1599 
1600   /* Thunks may reference extern functions which cannot be aliased.  */
1601   if (DECL_EXTERNAL (function))
1602     return function;
1603 
1604   targetm.asm_out.generate_internal_label (buf, "LTHUNK", thunk_labelno);
1605   thunk_labelno++;
1606 
1607   alias = build_decl (DECL_SOURCE_LOCATION (function), FUNCTION_DECL,
1608 		      get_identifier (buf), TREE_TYPE (function));
1609   DECL_LANG_SPECIFIC (alias) = DECL_LANG_SPECIFIC (function);
1610   lang_hooks.dup_lang_specific_decl (alias);
1611   DECL_CONTEXT (alias) = NULL_TREE;
1612   TREE_READONLY (alias) = TREE_READONLY (function);
1613   TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (function);
1614   TREE_PUBLIC (alias) = 0;
1615 
1616   DECL_EXTERNAL (alias) = 0;
1617   DECL_ARTIFICIAL (alias) = 1;
1618 
1619   DECL_DECLARED_INLINE_P (alias) = 0;
1620   DECL_INITIAL (alias) = error_mark_node;
1621   DECL_ARGUMENTS (alias) = copy_list (DECL_ARGUMENTS (function));
1622 
1623   TREE_ADDRESSABLE (alias) = 1;
1624   TREE_USED (alias) = 1;
1625   SET_DECL_ASSEMBLER_NAME (alias, DECL_NAME (alias));
1626 
1627   if (!flag_syntax_only)
1628     {
1629       cgraph_node *aliasn;
1630       aliasn = cgraph_node::create_same_body_alias (alias, function);
1631       gcc_assert (aliasn != NULL);
1632     }
1633   return alias;
1634 }
1635 
1636 /* Emit the definition of a D vtable thunk.  */
1637 
1638 static void
1639 finish_thunk (tree thunk, tree function)
1640 {
1641   /* Setup how D thunks are outputted.  */
1642   int fixed_offset = -THUNK_LANG_OFFSET (thunk);
1643   bool this_adjusting = true;
1644   tree alias;
1645 
1646   if (TARGET_USE_LOCAL_THUNK_ALIAS_P (function))
1647     alias = make_alias_for_thunk (function);
1648   else
1649     alias = function;
1650 
1651   TREE_ADDRESSABLE (function) = 1;
1652   TREE_USED (function) = 1;
1653 
1654   if (flag_syntax_only)
1655     {
1656       TREE_ASM_WRITTEN (thunk) = 1;
1657       return;
1658     }
1659 
1660   if (TARGET_USE_LOCAL_THUNK_ALIAS_P (function)
1661       && targetm_common.have_named_sections)
1662     {
1663       tree fn = function;
1664       symtab_node *symbol = symtab_node::get (function);
1665 
1666       if (symbol != NULL && symbol->alias)
1667 	{
1668 	  if (symbol->analyzed)
1669 	    fn = symtab_node::get (function)->ultimate_alias_target ()->decl;
1670 	  else
1671 	    fn = symtab_node::get (function)->alias_target;
1672 	}
1673       resolve_unique_section (fn, 0, flag_function_sections);
1674 
1675       if (DECL_SECTION_NAME (fn) != NULL && DECL_ONE_ONLY (fn))
1676 	{
1677 	  resolve_unique_section (thunk, 0, flag_function_sections);
1678 
1679 	  /* Output the thunk into the same section as function.  */
1680 	  set_decl_section_name (thunk, DECL_SECTION_NAME (fn));
1681 	  symtab_node::get (thunk)->implicit_section
1682 	    = symtab_node::get (fn)->implicit_section;
1683 	}
1684     }
1685 
1686   /* Set up cloned argument trees for the thunk.  */
1687   tree t = NULL_TREE;
1688   for (tree a = DECL_ARGUMENTS (function); a; a = DECL_CHAIN (a))
1689     {
1690       tree x = copy_node (a);
1691       DECL_CHAIN (x) = t;
1692       DECL_CONTEXT (x) = thunk;
1693       SET_DECL_RTL (x, NULL);
1694       DECL_HAS_VALUE_EXPR_P (x) = 0;
1695       TREE_ADDRESSABLE (x) = 0;
1696       t = x;
1697     }
1698   DECL_ARGUMENTS (thunk) = nreverse (t);
1699   TREE_ASM_WRITTEN (thunk) = 1;
1700 
1701   cgraph_node *funcn, *thunk_node;
1702 
1703   funcn = cgraph_node::get_create (function);
1704   gcc_assert (funcn);
1705   thunk_node = funcn->create_thunk (thunk, thunk, this_adjusting,
1706 				    fixed_offset, 0, 0, 0, alias);
1707 
1708   if (DECL_ONE_ONLY (function))
1709     thunk_node->add_to_same_comdat_group (funcn);
1710 
1711   /* Target assemble_mi_thunk doesn't work across section boundaries
1712      on many targets, instead force thunk to be expanded in gimple.  */
1713   if (DECL_EXTERNAL (function))
1714     {
1715       /* cgraph::expand_thunk writes over current_function_decl, so if this
1716 	 could ever be in use by the codegen pass, we want to know about it.  */
1717       gcc_assert (current_function_decl == NULL_TREE);
1718 
1719       if (!stdarg_p (TREE_TYPE (thunk)))
1720 	{
1721 	  thunk_node->create_edge (funcn, NULL, thunk_node->count);
1722 	  thunk_node->expand_thunk (false, true);
1723 	}
1724 
1725       /* Tell the back-end to not bother inlining the function, this is
1726 	 assumed not to work as it could be referencing symbols outside
1727 	 of the current compilation unit.  */
1728       DECL_UNINLINABLE (function) = 1;
1729     }
1730 }
1731 
1732 /* Return a thunk to DECL.  Thunks adjust the incoming `this' pointer by OFFSET.
1733    Adjustor thunks are created and pointers to them stored in the method entries
1734    in the vtable in order to set the this pointer to the start of the object
1735    instance corresponding to the implementing method.  */
1736 
1737 tree
1738 make_thunk (FuncDeclaration *decl, int offset)
1739 {
1740   tree function = get_symbol_decl (decl);
1741 
1742   if (!DECL_ARGUMENTS (function) || !DECL_RESULT (function))
1743     {
1744       /* Compile the function body before generating the thunk, this is done
1745 	 even if the decl is external to the current module.  */
1746       if (decl->fbody)
1747 	build_decl_tree (decl);
1748       else
1749 	{
1750 	  /* Build parameters for functions that are not being compiled,
1751 	     so that they can be correctly cloned in finish_thunk.  */
1752 	  tree fntype = TREE_TYPE (function);
1753 	  tree params = NULL_TREE;
1754 
1755 	  for (tree t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
1756 	    {
1757 	      if (t == void_list_node)
1758 		break;
1759 
1760 	      tree param = build_decl (DECL_SOURCE_LOCATION (function),
1761 				       PARM_DECL, NULL_TREE, TREE_VALUE (t));
1762 	      DECL_ARG_TYPE (param) = TREE_TYPE (param);
1763 	      DECL_ARTIFICIAL (param) = 1;
1764 	      DECL_IGNORED_P (param) = 1;
1765 	      DECL_CONTEXT (param) = function;
1766 	      params = chainon (params, param);
1767 	    }
1768 
1769 	  DECL_ARGUMENTS (function) = params;
1770 
1771 	  /* Also build the result decl, which is needed when force creating
1772 	     the thunk in gimple inside cgraph_node::expand_thunk.  */
1773 	  tree resdecl = build_decl (DECL_SOURCE_LOCATION (function),
1774 				     RESULT_DECL, NULL_TREE,
1775 				     TREE_TYPE (fntype));
1776 	  DECL_ARTIFICIAL (resdecl) = 1;
1777 	  DECL_IGNORED_P (resdecl) = 1;
1778 	  DECL_CONTEXT (resdecl) = function;
1779 	  DECL_RESULT (function) = resdecl;
1780 	}
1781     }
1782 
1783   /* Don't build the thunk if the compilation step failed.  */
1784   if (global.errors)
1785     return error_mark_node;
1786 
1787   /* See if we already have the thunk in question.  */
1788   for (tree t = DECL_LANG_THUNKS (function); t; t = DECL_CHAIN (t))
1789     {
1790       if (THUNK_LANG_OFFSET (t) == offset)
1791 	return t;
1792     }
1793 
1794   tree thunk = build_decl (DECL_SOURCE_LOCATION (function),
1795 			   FUNCTION_DECL, NULL_TREE, TREE_TYPE (function));
1796   DECL_LANG_SPECIFIC (thunk) = DECL_LANG_SPECIFIC (function);
1797   lang_hooks.dup_lang_specific_decl (thunk);
1798   THUNK_LANG_OFFSET (thunk) = offset;
1799 
1800   TREE_READONLY (thunk) = TREE_READONLY (function);
1801   TREE_THIS_VOLATILE (thunk) = TREE_THIS_VOLATILE (function);
1802   TREE_NOTHROW (thunk) = TREE_NOTHROW (function);
1803 
1804   DECL_CONTEXT (thunk) = d_decl_context (decl);
1805 
1806   /* Thunks inherit the public access of the function they are targetting.  */
1807   TREE_PUBLIC (thunk) = TREE_PUBLIC (function);
1808   DECL_EXTERNAL (thunk) = 0;
1809 
1810   /* Thunks are always addressable.  */
1811   TREE_ADDRESSABLE (thunk) = 1;
1812   TREE_USED (thunk) = 1;
1813   DECL_ARTIFICIAL (thunk) = 1;
1814   DECL_DECLARED_INLINE_P (thunk) = 0;
1815 
1816   DECL_VISIBILITY (thunk) = DECL_VISIBILITY (function);
1817   DECL_COMDAT (thunk) = DECL_COMDAT (function);
1818   DECL_WEAK (thunk) = DECL_WEAK (function);
1819 
1820   tree target_name = DECL_ASSEMBLER_NAME (function);
1821   unsigned identlen = IDENTIFIER_LENGTH (target_name) + 14;
1822   const char *ident = XNEWVEC (const char, identlen);
1823   snprintf (CONST_CAST (char *, ident), identlen,
1824 	    "_DT%u%s", offset, IDENTIFIER_POINTER (target_name));
1825 
1826   DECL_NAME (thunk) = get_identifier (ident);
1827   SET_DECL_ASSEMBLER_NAME (thunk, DECL_NAME (thunk));
1828 
1829   d_keep (thunk);
1830 
1831   finish_thunk (thunk, function);
1832 
1833   /* Add it to the list of thunks associated with the function.  */
1834   DECL_LANG_THUNKS (thunk) = NULL_TREE;
1835   DECL_CHAIN (thunk) = DECL_LANG_THUNKS (function);
1836   DECL_LANG_THUNKS (function) = thunk;
1837 
1838   return thunk;
1839 }
1840 
1841 /* Create the FUNCTION_DECL for a function definition.
1842    This function creates a binding context for the function body
1843    as well as setting up the FUNCTION_DECL in current_function_decl.
1844    Returns the previous function context if it was already set.  */
1845 
1846 tree
1847 start_function (FuncDeclaration *fd)
1848 {
1849   tree fndecl = get_symbol_decl (fd);
1850 
1851   /* Function has been defined, check now whether we intend to send it to
1852      object file, or it really is extern.  Such as inlinable functions from
1853      modules not in this compilation, or thunk aliases.  */
1854   TemplateInstance *ti = fd->isInstantiated ();
1855   if (ti && ti->needsCodegen ())
1856     {
1857       /* Warn about templates instantiated in this compilation.  */
1858       if (ti == fd->parent)
1859 	{
1860 	  warning (OPT_Wtemplates, "%s %qs instantiated",
1861 		   ti->kind (), ti->toPrettyChars (false));
1862 	}
1863 
1864       DECL_EXTERNAL (fndecl) = 0;
1865     }
1866   else
1867     {
1868       Module *md = fd->getModule ();
1869       if (md && md->isRoot ())
1870 	DECL_EXTERNAL (fndecl) = 0;
1871     }
1872 
1873   DECL_INITIAL (fndecl) = error_mark_node;
1874 
1875   /* Add this decl to the current binding level.  */
1876   d_pushdecl (fndecl);
1877 
1878   /* Save the current function context.  */
1879   tree old_context = current_function_decl;
1880 
1881   if (old_context)
1882     push_function_context ();
1883 
1884   /* Let GCC know the current scope is this function.  */
1885   current_function_decl = fndecl;
1886 
1887   tree restype = TREE_TYPE (TREE_TYPE (fndecl));
1888   tree resdecl = build_decl (make_location_t (fd->loc), RESULT_DECL,
1889 			     NULL_TREE, restype);
1890 
1891   DECL_RESULT (fndecl) = resdecl;
1892   DECL_CONTEXT (resdecl) = fndecl;
1893   DECL_ARTIFICIAL (resdecl) = 1;
1894   DECL_IGNORED_P (resdecl) = 1;
1895 
1896   /* Initialize the RTL code for the function.  */
1897   allocate_struct_function (fndecl, false);
1898 
1899   /* Store the end of the function.  */
1900   if (fd->endloc.filename)
1901     cfun->function_end_locus = make_location_t (fd->endloc);
1902   else
1903     cfun->function_end_locus = DECL_SOURCE_LOCATION (fndecl);
1904 
1905   cfun->language = ggc_cleared_alloc<language_function> ();
1906   cfun->language->function = fd;
1907 
1908   /* Default chain value is 'null' unless parent found.  */
1909   cfun->language->static_chain = null_pointer_node;
1910 
1911   /* Find module for this function.  */
1912   for (Dsymbol *p = fd->parent; p != NULL; p = p->parent)
1913     {
1914       cfun->language->module = p->isModule ();
1915       if (cfun->language->module)
1916 	break;
1917     }
1918   gcc_assert (cfun->language->module != NULL);
1919 
1920   /* Begin the statement tree for this function.  */
1921   push_stmt_list ();
1922   push_binding_level (level_function);
1923 
1924   return old_context;
1925 }
1926 
1927 /* Finish up a function declaration and compile that function all
1928    the way to assembler language output.  The free the storage for
1929    the function definition.  Restores the previous function context.  */
1930 
1931 void
1932 finish_function (tree old_context)
1933 {
1934   tree fndecl = current_function_decl;
1935 
1936   /* Tie off the statement tree for this function.  */
1937   tree block = pop_binding_level ();
1938   tree body = pop_stmt_list ();
1939   tree bind = build3 (BIND_EXPR, void_type_node,
1940 		      BLOCK_VARS (block), body, block);
1941 
1942   gcc_assert (vec_safe_is_empty (d_function_chain->stmt_list));
1943 
1944   /* Back-end expects a statement list to come from somewhere, however
1945      pop_stmt_list returns expressions when there is a single statement.
1946      So here we create a statement list unconditionally.  */
1947   if (TREE_CODE (body) != STATEMENT_LIST)
1948     {
1949       tree stmtlist = alloc_stmt_list ();
1950       append_to_statement_list_force (body, &stmtlist);
1951       BIND_EXPR_BODY (bind) = stmtlist;
1952     }
1953   else if (!STATEMENT_LIST_HEAD (body))
1954     {
1955       /* For empty functions add a void return.  */
1956       append_to_statement_list_force (return_expr (NULL_TREE), &body);
1957     }
1958 
1959   DECL_SAVED_TREE (fndecl) = bind;
1960 
1961   if (!errorcount && !global.errors)
1962     {
1963       /* Dump the D-specific tree IR.  */
1964       dump_function (TDI_original, fndecl);
1965 
1966       cgraph_node::finalize_function (fndecl, true);
1967     }
1968 
1969   /* We're leaving the context of this function, so free it.  */
1970   ggc_free (cfun->language);
1971   cfun->language = NULL;
1972   set_cfun (NULL);
1973 
1974   if (old_context)
1975     pop_function_context ();
1976 
1977   current_function_decl = old_context;
1978 }
1979 
1980 /* Mark DECL, which is a VAR_DECL or FUNCTION_DECL as a symbol that
1981    must be emitted in this, output module.  */
1982 
1983 void
1984 mark_needed (tree decl)
1985 {
1986   TREE_USED (decl) = 1;
1987 
1988   if (TREE_CODE (decl) == FUNCTION_DECL)
1989     {
1990       struct cgraph_node *node = cgraph_node::get_create (decl);
1991       node->forced_by_abi = true;
1992     }
1993   else if (VAR_P (decl))
1994     {
1995       struct varpool_node *node = varpool_node::get_create (decl);
1996       node->forced_by_abi = true;
1997     }
1998 }
1999 
2000 /* Get the offset to the BC's vtbl[] initializer from the start of CD.
2001    Returns "~0u" if the base class is not found in any vtable interfaces.  */
2002 
2003 unsigned
2004 base_vtable_offset (ClassDeclaration *cd, BaseClass *bc)
2005 {
2006   unsigned csymoffset = Target::classinfosize;
2007   unsigned interfacesize = int_size_in_bytes (vtbl_interface_type_node);
2008   csymoffset += cd->vtblInterfaces->dim * interfacesize;
2009 
2010   for (size_t i = 0; i < cd->vtblInterfaces->dim; i++)
2011     {
2012       BaseClass *b = (*cd->vtblInterfaces)[i];
2013       if (b == bc)
2014 	return csymoffset;
2015       csymoffset += b->sym->vtbl.dim * Target::ptrsize;
2016     }
2017 
2018   /* Check all overriding interface vtbl[]s.  */
2019   for (ClassDeclaration *cd2 = cd->baseClass; cd2; cd2 = cd2->baseClass)
2020     {
2021       for (size_t k = 0; k < cd2->vtblInterfaces->dim; k++)
2022 	{
2023 	  BaseClass *bs = (*cd2->vtblInterfaces)[k];
2024 	  if (bs->fillVtbl (cd, NULL, 0))
2025 	    {
2026 	      if (bc == bs)
2027 		return csymoffset;
2028 	      csymoffset += bs->sym->vtbl.dim * Target::ptrsize;
2029 	    }
2030 	}
2031     }
2032 
2033   return ~0u;
2034 }
2035 
2036 /* Get the VAR_DECL of the vtable symbol for DECL.  If this does not yet exist,
2037    create it.  The vtable is accessible via ClassInfo, but since it is needed
2038    frequently (like for rtti comparisons), make it directly accessible.  */
2039 
2040 tree
2041 get_vtable_decl (ClassDeclaration *decl)
2042 {
2043   if (decl->vtblsym)
2044     return decl->vtblsym;
2045 
2046   tree ident = mangle_internal_decl (decl, "__vtbl", "Z");
2047   /* Note: Using a static array type for the VAR_DECL, the DECL_INITIAL value
2048      will have a different type.  However the back-end seems to accept this.  */
2049   tree type = build_ctype (Type::tvoidptr->sarrayOf (decl->vtbl.dim));
2050 
2051   decl->vtblsym = declare_extern_var (ident, type);
2052   DECL_LANG_SPECIFIC (decl->vtblsym) = build_lang_decl (NULL);
2053 
2054   /* Class is a reference, want the record type.  */
2055   DECL_CONTEXT (decl->vtblsym) = TREE_TYPE (build_ctype (decl->type));
2056   TREE_READONLY (decl->vtblsym) = 1;
2057   DECL_VIRTUAL_P (decl->vtblsym) = 1;
2058 
2059   SET_DECL_ALIGN (decl->vtblsym, TARGET_VTABLE_ENTRY_ALIGN);
2060   DECL_USER_ALIGN (decl->vtblsym) = true;
2061 
2062   return decl->vtblsym;
2063 }
2064 
2065 /* Helper function of build_class_instance.  Find the field inside aggregate
2066    TYPE identified by IDENT at field OFFSET.  */
2067 
2068 static tree
2069 find_aggregate_field (tree type, tree ident, tree offset)
2070 {
2071   tree fields = TYPE_FIELDS (type);
2072 
2073   for (tree field = fields; field != NULL_TREE; field = TREE_CHAIN (field))
2074     {
2075       if (DECL_NAME (field) == NULL_TREE
2076 	  && RECORD_OR_UNION_TYPE_P (TREE_TYPE (field))
2077 	  && ANON_AGGR_TYPE_P (TREE_TYPE (field)))
2078 	{
2079 	  /* Search nesting anonymous structs and unions.  */
2080 	  tree vfield = find_aggregate_field (TREE_TYPE (field),
2081 					      ident, offset);
2082 	  if (vfield != NULL_TREE)
2083 	    return vfield;
2084 	}
2085       else if (DECL_NAME (field) == ident
2086 	       && (offset == NULL_TREE
2087 		   || DECL_FIELD_OFFSET (field) == offset))
2088 	{
2089 	  /* Found matching field at offset.  */
2090 	  return field;
2091 	}
2092     }
2093 
2094   return NULL_TREE;
2095 }
2096 
2097 /* Helper function of build_new_class_expr.  Return a constructor that matches
2098    the layout of the class expression EXP.  */
2099 
2100 static tree
2101 build_class_instance (ClassReferenceExp *exp)
2102 {
2103   ClassDeclaration *cd = exp->originalClass ();
2104   tree type = TREE_TYPE (build_ctype (exp->value->stype));
2105   vec<constructor_elt, va_gc> *ve = NULL;
2106 
2107   /* The set base vtable field.  */
2108   tree vptr = build_address (get_vtable_decl (cd));
2109   CONSTRUCTOR_APPEND_ELT (ve, TYPE_FIELDS (type), vptr);
2110 
2111   /* Go through the inheritance graph from top to bottom.  This will add all
2112      values to the constructor out of order, however build_struct_literal
2113      will re-order all values before returning the finished literal.  */
2114   for (ClassDeclaration *bcd = cd; bcd != NULL; bcd = bcd->baseClass)
2115     {
2116       /* Anonymous vtable interface fields are laid out before the fields of
2117 	 each class.  The interface offset is used to determine where to put
2118 	 the classinfo offset reference.  */
2119       for (size_t i = 0; i < bcd->vtblInterfaces->dim; i++)
2120 	{
2121 	  BaseClass *bc = (*bcd->vtblInterfaces)[i];
2122 
2123 	  for (ClassDeclaration *cd2 = cd; 1; cd2 = cd2->baseClass)
2124 	    {
2125 	      gcc_assert (cd2 != NULL);
2126 
2127 	      unsigned csymoffset = base_vtable_offset (cd2, bc);
2128 	      /* If the base class vtable was found.  */
2129 	      if (csymoffset != ~0u)
2130 		{
2131 		  tree csym = build_address (get_classinfo_decl (cd2));
2132 		  csym = build_offset (csym, size_int (csymoffset));
2133 
2134 		  tree field = find_aggregate_field (type, NULL_TREE,
2135 						     size_int (bc->offset));
2136 		  gcc_assert (field != NULL_TREE);
2137 
2138 		  CONSTRUCTOR_APPEND_ELT (ve, field, csym);
2139 		  break;
2140 		}
2141 	    }
2142 	}
2143 
2144       /* Generate initial values of all fields owned by current class.
2145 	 Use both the name and offset to find the right field.  */
2146       for (size_t i = 0; i < bcd->fields.dim; i++)
2147 	{
2148 	  VarDeclaration *vfield = bcd->fields[i];
2149 	  int index = exp->findFieldIndexByName (vfield);
2150 	  gcc_assert (index != -1);
2151 
2152 	  Expression *value = (*exp->value->elements)[index];
2153 	  if (!value)
2154 	    continue;
2155 
2156 	  /* Use find_aggregate_field to get the overridden field decl,
2157 	     instead of the field associated with the base class.  */
2158 	  tree field = get_symbol_decl (bcd->fields[i]);
2159 	  field = find_aggregate_field (type, DECL_NAME (field),
2160 					DECL_FIELD_OFFSET (field));
2161 	  gcc_assert (field != NULL_TREE);
2162 
2163 	  CONSTRUCTOR_APPEND_ELT (ve, field, build_expr (value, true));
2164 	}
2165     }
2166 
2167   return build_struct_literal (type, ve);
2168 }
2169 
2170 /* Get the VAR_DECL of a class instance representing EXPR as static data.
2171    If this does not yet exist, create it.  This is used to support initializing
2172    a static variable that is of a class type using values known during CTFE.
2173    In user code, it is analogous to the following code snippet.
2174 
2175     enum E = new C(1, 2, 3);
2176 
2177    That we write the contents of `C(1, 2, 3)' to static data is only a compiler
2178    implementation detail.  The initialization of these symbols could be done at
2179    run-time using during as part of the module initialization or shared static
2180    constructors phase of run-time start-up - whichever comes after `gc_init()'.
2181    And infact that would be the better thing to do here eventually.  */
2182 
2183 tree
2184 build_new_class_expr (ClassReferenceExp *expr)
2185 {
2186   if (expr->value->sym)
2187     return expr->value->sym;
2188 
2189   /* Build the reference symbol.  */
2190   tree type = build_ctype (expr->value->stype);
2191   expr->value->sym = build_artificial_decl (TREE_TYPE (type), NULL_TREE, "C");
2192 
2193   DECL_INITIAL (expr->value->sym) = build_class_instance (expr);
2194   d_pushdecl (expr->value->sym);
2195   rest_of_decl_compilation (expr->value->sym, 1, 0);
2196 
2197   return expr->value->sym;
2198 }
2199 
2200 /* Get the VAR_DECL of the static initializer symbol for the struct/class DECL.
2201    If this does not yet exist, create it.  The static initializer data is
2202    accessible via TypeInfo, and is also used in 'new class' and default
2203    initializing struct literals.  */
2204 
2205 tree
2206 aggregate_initializer_decl (AggregateDeclaration *decl)
2207 {
2208   if (decl->sinit)
2209     return decl->sinit;
2210 
2211   /* Class is a reference, want the record type.  */
2212   tree type = build_ctype (decl->type);
2213   StructDeclaration *sd = decl->isStructDeclaration ();
2214   if (!sd)
2215     type = TREE_TYPE (type);
2216 
2217   tree ident = mangle_internal_decl (decl, "__init", "Z");
2218 
2219   decl->sinit = declare_extern_var (ident, type);
2220   DECL_LANG_SPECIFIC (decl->sinit) = build_lang_decl (NULL);
2221 
2222   DECL_CONTEXT (decl->sinit) = type;
2223   TREE_READONLY (decl->sinit) = 1;
2224 
2225   /* Honor struct alignment set by user.  */
2226   if (sd && sd->alignment != STRUCTALIGN_DEFAULT)
2227     {
2228       SET_DECL_ALIGN (decl->sinit, sd->alignment * BITS_PER_UNIT);
2229       DECL_USER_ALIGN (decl->sinit) = true;
2230     }
2231 
2232   return decl->sinit;
2233 }
2234 
2235 /* Generate the data for the static initializer.  */
2236 
2237 tree
2238 layout_class_initializer (ClassDeclaration *cd)
2239 {
2240   NewExp *ne = NewExp::create (cd->loc, NULL, NULL, cd->type, NULL);
2241   ne->type = cd->type;
2242 
2243   Expression *e = ne->ctfeInterpret ();
2244   gcc_assert (e->op == TOKclassreference);
2245 
2246   return build_class_instance ((ClassReferenceExp *) e);
2247 }
2248 
2249 tree
2250 layout_struct_initializer (StructDeclaration *sd)
2251 {
2252   StructLiteralExp *sle = StructLiteralExp::create (sd->loc, sd, NULL);
2253 
2254   if (!sd->fill (sd->loc, sle->elements, true))
2255     gcc_unreachable ();
2256 
2257   sle->type = sd->type;
2258   return build_expr (sle, true);
2259 }
2260 
2261 /* Get the VAR_DECL of the static initializer symbol for the enum DECL.
2262    If this does not yet exist, create it.  The static initializer data is
2263    accessible via TypeInfo_Enum, but the field member type is a byte[] that
2264    requires a pointer to a symbol reference.  */
2265 
2266 tree
2267 enum_initializer_decl (EnumDeclaration *decl)
2268 {
2269   if (decl->sinit)
2270     return decl->sinit;
2271 
2272   tree type = build_ctype (decl->type);
2273 
2274   Identifier *ident_save = decl->ident;
2275   if (!decl->ident)
2276     decl->ident = Identifier::generateId ("__enum");
2277   tree ident = mangle_internal_decl (decl, "__init", "Z");
2278   decl->ident = ident_save;
2279 
2280   decl->sinit = declare_extern_var (ident, type);
2281   DECL_LANG_SPECIFIC (decl->sinit) = build_lang_decl (NULL);
2282 
2283   DECL_CONTEXT (decl->sinit) = d_decl_context (decl);
2284   TREE_READONLY (decl->sinit) = 1;
2285 
2286   return decl->sinit;
2287 }
2288 
2289 /* Return an anonymous static variable of type TYPE, initialized with INIT,
2290    and optionally prefixing the name with PREFIX.  */
2291 
2292 tree
2293 build_artificial_decl (tree type, tree init, const char *prefix)
2294 {
2295   tree decl = build_decl (UNKNOWN_LOCATION, VAR_DECL, NULL_TREE, type);
2296   const char *name = prefix ? prefix : "___s";
2297   char *label;
2298 
2299   ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl));
2300   SET_DECL_ASSEMBLER_NAME (decl, get_identifier (label));
2301   DECL_NAME (decl) = DECL_ASSEMBLER_NAME (decl);
2302 
2303   TREE_PUBLIC (decl) = 0;
2304   TREE_STATIC (decl) = 1;
2305   TREE_USED (decl) = 1;
2306   DECL_IGNORED_P (decl) = 1;
2307   DECL_ARTIFICIAL (decl) = 1;
2308 
2309   /* Perhaps at some point the initializer constant should be hashed
2310      to remove duplicates.  */
2311   DECL_INITIAL (decl) = init;
2312 
2313   return decl;
2314 }
2315 
2316 /* Build TYPE_DECL for the declaration DSYM.  */
2317 
2318 void
2319 build_type_decl (tree type, Dsymbol *dsym)
2320 {
2321   if (TYPE_STUB_DECL (type))
2322     return;
2323 
2324   gcc_assert (!POINTER_TYPE_P (type));
2325 
2326   /* If a templated type, use the template instance name, as that includes all
2327      template parameters.  */
2328   const char *name = dsym->parent->isTemplateInstance ()
2329     ? ((TemplateInstance *) dsym->parent)->toChars () : dsym->ident->toChars ();
2330 
2331   tree decl = build_decl (make_location_t (dsym->loc), TYPE_DECL,
2332 			  get_identifier (name), type);
2333   SET_DECL_ASSEMBLER_NAME (decl, get_identifier (mangle_decl (dsym)));
2334   TREE_PUBLIC (decl) = 1;
2335   DECL_ARTIFICIAL (decl) = 1;
2336   DECL_CONTEXT (decl) = d_decl_context (dsym);
2337 
2338   TYPE_CONTEXT (type) = DECL_CONTEXT (decl);
2339   TYPE_NAME (type) = decl;
2340 
2341   /* Not sure if there is a need for separate TYPE_DECLs in
2342      TYPE_NAME and TYPE_STUB_DECL.  */
2343   if (TREE_CODE (type) == ENUMERAL_TYPE || RECORD_OR_UNION_TYPE_P (type))
2344     TYPE_STUB_DECL (type) = decl;
2345 
2346   rest_of_decl_compilation (decl, SCOPE_FILE_SCOPE_P (decl), 0);
2347 }
2348 
2349 /* Create a declaration for field NAME of a given TYPE, setting the flags
2350    for whether the field is ARTIFICIAL and/or IGNORED.  */
2351 
2352 tree
2353 create_field_decl (tree type, const char *name, int artificial, int ignored)
2354 {
2355   tree decl = build_decl (input_location, FIELD_DECL,
2356 			  name ? get_identifier (name) : NULL_TREE, type);
2357   DECL_ARTIFICIAL (decl) = artificial;
2358   DECL_IGNORED_P (decl) = ignored;
2359 
2360   return decl;
2361 }
2362 
2363 /* Return the COMDAT group into which DECL should be placed.  */
2364 
2365 static tree
2366 d_comdat_group (tree decl)
2367 {
2368   /* If already part of a comdat group, use that.  */
2369   if (DECL_COMDAT_GROUP (decl))
2370     return DECL_COMDAT_GROUP (decl);
2371 
2372   return DECL_ASSEMBLER_NAME (decl);
2373 }
2374 
2375 /* Set DECL up to have the closest approximation of "initialized common"
2376    linkage available.  */
2377 
2378 void
2379 d_comdat_linkage (tree decl)
2380 {
2381   if (flag_weak)
2382     make_decl_one_only (decl, d_comdat_group (decl));
2383   else if (TREE_CODE (decl) == FUNCTION_DECL
2384 	   || (VAR_P (decl) && DECL_ARTIFICIAL (decl)))
2385     /* We can just emit function and compiler-generated variables statically;
2386        having multiple copies is (for the most part) only a waste of space.  */
2387     TREE_PUBLIC (decl) = 0;
2388   else if (DECL_INITIAL (decl) == NULL_TREE
2389 	   || DECL_INITIAL (decl) == error_mark_node)
2390     /* Fallback, cannot have multiple copies.  */
2391     DECL_COMMON (decl) = 1;
2392 
2393   if (TREE_PUBLIC (decl))
2394     DECL_COMDAT (decl) = 1;
2395 }
2396 
2397 /* Set DECL up to have the closest approximation of "linkonce" linkage.  */
2398 
2399 void
2400 d_linkonce_linkage (tree decl)
2401 {
2402   /* Weak definitions have to be public.  */
2403   if (!TREE_PUBLIC (decl))
2404     return;
2405 
2406   /* Necessary to allow DECL_ONE_ONLY or DECL_WEAK functions to be inlined.  */
2407   if (TREE_CODE (decl) == FUNCTION_DECL)
2408     DECL_DECLARED_INLINE_P (decl) = 1;
2409 
2410   /* No weak support, fallback to COMDAT linkage.  */
2411   if (!flag_weak)
2412    return d_comdat_linkage (decl);
2413 
2414   make_decl_one_only (decl, d_comdat_group (decl));
2415 }
2416