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