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