Lines Matching +full:ipa +full:- +full:shared
1 //===--- CGDeclCXX.cpp - Emit LLVM Code for C++ declarations --------------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
11 //===----------------------------------------------------------------------===//
35 assert(!D.getType()->isReferenceType() && in EmitDeclInit()
77 // attribute. This also checks for -fno-c++-static-destructors and in EmitDeclDestroy()
104 // Special-case non-array C++ destructors, if they have the right signature. in EmitDeclDestroy()
108 const CXXRecordDecl *Record = Type->getAsCXXRecordDecl(); in EmitDeclDestroy()
111 GlobalDecl(Record->getDestructor(), Dtor_Complete)) || in EmitDeclDestroy()
118 assert(!Record->hasTrivialDestructor()); in EmitDeclDestroy()
119 CXXDestructorDecl *Dtor = Record->getDestructor(); in EmitDeclDestroy()
165 assert(Addr->getType()->isPointerTy() && "Address must be a pointer"); in EmitInvariantStart()
166 llvm::Type *ObjectPtr[1] = {Addr->getType()}; in EmitInvariantStart()
195 // "shared" address space qualifier, but the constructor of StructWithCtor in EmitCXXGlobalVarDeclInit()
198 unsigned ActualAddrSpace = GV->getAddressSpace(); in EmitCXXGlobalVarDeclInit()
207 DeclPtr, GV->getValueType(), getContext().getDeclAlign(&D)); in EmitCXXGlobalVarDeclInit()
209 if (!T->isReferenceType()) { in EmitCXXGlobalVarDeclInit()
213 &D, DeclAddr, D.getAttr<OMPThreadPrivateDeclAttr>()->getLocation(), in EmitCXXGlobalVarDeclInit()
254 VD.getLocation(), VD.getInit()->getExprLoc()); in createAtExitStub()
262 dtor.getCallee()->stripPointerCastsAndAliases())) in createAtExitStub()
263 call->setCallingConv(dtorFn->getCallingConv()); in createAtExitStub()
306 FI, Args, D.getLocation(), D.getInit()->getExprLoc()); in createTLSAtExitStub()
315 Dtor.getCallee()->stripPointerCastsAndAliases())) in createTLSAtExitStub()
316 call->setCallingConv(DtorFn->getCallingConv()); in createTLSAtExitStub()
348 assert(dtorStub->getType() == in registerGlobalDtorWithAtExit()
351 dtorStub->getType()->getPointerAddressSpace()) && in registerGlobalDtorWithAtExit()
355 llvm::FunctionType::get(IntTy, dtorStub->getType(), false); in registerGlobalDtorWithAtExit()
361 atexitFn->setDoesNotThrow(); in registerGlobalDtorWithAtExit()
371 // termination and the unatexit returns a value of 0, otherwise a non-zero in unregisterGlobalDtorWithUnAtExit()
375 assert(dtorStub->getType() == in unregisterGlobalDtorWithUnAtExit()
378 dtorStub->getType()->getPointerAddressSpace()) && in unregisterGlobalDtorWithUnAtExit()
382 llvm::FunctionType::get(IntTy, {dtorStub->getType()}, /*isVarArg=*/false); in unregisterGlobalDtorWithUnAtExit()
387 cast<llvm::Function>(unatexit.getCallee())->setDoesNotThrow(); in unregisterGlobalDtorWithUnAtExit()
396 // This diagnostic is hard-coded for Darwin's use case; we can find in EmitCXXGuardedInit()
419 if (Kind == GuardKind::VariableGuard && !D->isLocalVarDecl()) { in EmitCXXGuardedInitBranch()
420 // For non-local variables, don't apply any weighting for now. Due to our in EmitCXXGuardedInitBranch()
429 if (Kind == GuardKind::TlsGuard || D->getTLSKind()) in EmitCXXGuardedInitBranch()
437 Weights = MDHelper.createBranchWeights(1, NumInits - 1); in EmitCXXGuardedInitBranch()
451 Fn->setSection(Section); in CreateGlobalInitOrCleanUpFunction()
457 Fn->setCallingConv(getRuntimeCC()); in CreateGlobalInitOrCleanUpFunction()
460 Fn->setDoesNotThrow(); in CreateGlobalInitOrCleanUpFunction()
464 Fn->addFnAttr(llvm::Attribute::SanitizeAddress); in CreateGlobalInitOrCleanUpFunction()
468 Fn->addFnAttr(llvm::Attribute::SanitizeAddress); in CreateGlobalInitOrCleanUpFunction()
472 Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress); in CreateGlobalInitOrCleanUpFunction()
476 Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress); in CreateGlobalInitOrCleanUpFunction()
480 Fn->addFnAttr(llvm::Attribute::SanitizeMemTag); in CreateGlobalInitOrCleanUpFunction()
484 Fn->addFnAttr(llvm::Attribute::SanitizeThread); in CreateGlobalInitOrCleanUpFunction()
488 Fn->addFnAttr(llvm::Attribute::SanitizeNumericalStability); in CreateGlobalInitOrCleanUpFunction()
492 Fn->addFnAttr(llvm::Attribute::SanitizeMemory); in CreateGlobalInitOrCleanUpFunction()
496 Fn->addFnAttr(llvm::Attribute::SanitizeMemory); in CreateGlobalInitOrCleanUpFunction()
500 Fn->addFnAttr(llvm::Attribute::SafeStack); in CreateGlobalInitOrCleanUpFunction()
504 Fn->addFnAttr(llvm::Attribute::ShadowCallStack); in CreateGlobalInitOrCleanUpFunction()
517 TheModule, InitFunc->getType(), /*isConstant=*/true, in EmitPointerToInitFunc()
519 PtrArray->setSection(ISA->getSection()); in EmitPointerToInitFunc()
523 if (llvm::Comdat *C = GV->getComdat()) in EmitPointerToInitFunc()
524 PtrArray->setComdat(C); in EmitPointerToInitFunc()
532 // According to E.2.3.1 in CUDA-7.5 Programming guide: __device__, in EmitCXXGlobalVarDeclInitFunc()
534 // that are of class type, cannot have a non-empty constructor. All in EmitCXXGlobalVarDeclInitFunc()
538 (D->hasAttr<CUDADeviceAttr>() || D->hasAttr<CUDAConstantAttr>() || in EmitCXXGlobalVarDeclInitFunc()
539 D->hasAttr<CUDASharedAttr>())) in EmitCXXGlobalVarDeclInitFunc()
544 if (I != DelayedCXXInitPosition.end() && I->second == ~0U) in EmitCXXGlobalVarDeclInitFunc()
556 FTy, FnName.str(), getTypes().arrangeNullaryFunction(), D->getLocation()); in EmitCXXGlobalVarDeclInitFunc()
558 auto *ISA = D->getAttr<InitSegAttr>(); in EmitCXXGlobalVarDeclInitFunc()
563 supportsCOMDAT() && D->isExternallyVisible() ? Addr : nullptr; in EmitCXXGlobalVarDeclInitFunc()
565 if (D->getTLSKind()) { in EmitCXXGlobalVarDeclInitFunc()
574 int Priority = -1; in EmitCXXGlobalVarDeclInitFunc()
575 if (ISA->getSection() == ".CRT$XCC") in EmitCXXGlobalVarDeclInitFunc()
577 else if (ISA->getSection() == ".CRT$XCL") in EmitCXXGlobalVarDeclInitFunc()
580 if (Priority != -1) in EmitCXXGlobalVarDeclInitFunc()
584 } else if (auto *IPA = D->getAttr<InitPriorityAttr>()) { in EmitCXXGlobalVarDeclInitFunc() local
585 OrderGlobalInitsOrStermFinalizers Key(IPA->getPriority(), in EmitCXXGlobalVarDeclInitFunc()
588 } else if (isTemplateInstantiation(D->getTemplateSpecializationKind()) || in EmitCXXGlobalVarDeclInitFunc()
590 D->hasAttr<SelectAnyAttr>()) { in EmitCXXGlobalVarDeclInitFunc()
604 // SelectAny globals will be comdat-folded. Put the initializer into a in EmitCXXGlobalVarDeclInitFunc()
609 // VarDecl. Use it when the current VarDecl is non-deferred. Although this in EmitCXXGlobalVarDeclInitFunc()
610 // lex order number is shared between current VarDecl and some following in EmitCXXGlobalVarDeclInitFunc()
615 I == DelayedCXXInitPosition.end() ? CXXGlobalInits.size() : I->second; in EmitCXXGlobalVarDeclInitFunc()
627 llvm::Comdat *C = Addr->getComdat(); in EmitCXXGlobalVarDeclInitFunc()
631 Fn->setComdat(C); in EmitCXXGlobalVarDeclInitFunc()
634 I = DelayedCXXInitPosition.find(D); // Re-do lookup in case of re-hash. in EmitCXXGlobalVarDeclInitFunc()
637 } else if (I->second != ~0U) { in EmitCXXGlobalVarDeclInitFunc()
638 assert(I->second < CXXGlobalInits.size() && in EmitCXXGlobalVarDeclInitFunc()
639 CXXGlobalInits[I->second] == nullptr); in EmitCXXGlobalVarDeclInitFunc()
640 CXXGlobalInits[I->second] = Fn; in EmitCXXGlobalVarDeclInitFunc()
673 assert(Primary->isInterfaceOrPartition() && in EmitCXXModuleInitFunc()
686 for (auto I : Primary->Exports) in EmitCXXModuleInitFunc()
689 for (Module *M : Primary->Imports) in EmitCXXModuleInitFunc()
693 for (Module *SubM : Primary->submodules()) { in EmitCXXModuleInitFunc()
694 assert((SubM->isGlobalModule() || SubM->isPrivateModule()) && in EmitCXXModuleInitFunc()
697 assert(SubM->Exports.empty() && in EmitCXXModuleInitFunc()
700 for (Module *M : SubM->Imports) in EmitCXXModuleInitFunc()
707 if (M->isHeaderLikeModule()) in EmitCXXModuleInitFunc()
711 if (!M->isNamedModuleInterfaceHasInit()) in EmitCXXModuleInitFunc()
741 ModuleInits.push_back(I->second); in EmitCXXModuleInitFunc()
776 Guard->setAlignment(GuardAlign.getAsAlign()); in EmitCXXModuleInitFunc()
793 Fn->setCallingConv(llvm::CallingConv::SPIR_KERNEL); in EmitCXXModuleInitFunc()
799 Fn->setCallingConv(llvm::CallingConv::AMDGPU_KERNEL); in EmitCXXModuleInitFunc()
800 Fn->addFnAttr("device-init"); in EmitCXXModuleInitFunc()
817 // Replace everything that's not [a-zA-Z0-9._] with a _. This set happens in getTransformedFileName()
832 PrioritySuffix = std::string(6 - PrioritySuffix.size(), '0') + PrioritySuffix; in getPrioritySuffix()
847 if (M->isHeaderLikeModule()) in EmitCXXGlobalInitFunc()
851 if (!M->isNamedModuleInterfaceHasInit()) in EmitCXXGlobalInitFunc()
880 // into separate function. Note - everything is sorted first by priority, in EmitCXXGlobalInitFunc()
881 // second - by lex order, so we emit ctor functions in proper order. in EmitCXXGlobalInitFunc()
890 unsigned int Priority = I->first.priority; in EmitCXXGlobalInitFunc()
902 LocalCXXGlobalInits.push_back(I->second); in EmitCXXGlobalInitFunc()
921 // way as a non-modular TU with imports. in EmitCXXGlobalInitFunc()
924 !getContext().getCurrentNamedModule()->isModuleImplementation()) { in EmitCXXGlobalInitFunc()
951 Fn->setCallingConv(llvm::CallingConv::SPIR_KERNEL); in EmitCXXGlobalInitFunc()
957 Fn->setCallingConv(llvm::CallingConv::AMDGPU_KERNEL); in EmitCXXGlobalInitFunc()
958 Fn->addFnAttr("device-init"); in EmitCXXGlobalInitFunc()
978 // into separate function. Note - everything is sorted first by priority, in EmitCXXGlobalCleanUpFunc()
979 // second - by lex order, so we emit dtor functions in proper order. in EmitCXXGlobalCleanUpFunc()
989 unsigned int Priority = I->first.priority; in EmitCXXGlobalCleanUpFunc()
994 llvm::FunctionCallee DtorFn = I->second; in EmitCXXGlobalCleanUpFunc()
1025 if (D->hasAttr<NoDebugAttr>()) in GenerateCXXGlobalVarDeclInitFunc()
1028 CurEHLocation = D->getBeginLoc(); in GenerateCXXGlobalVarDeclInitFunc()
1042 // layer will guard the whole-TU initialization for us.) in GenerateCXXGlobalVarDeclInitFunc()
1043 if (Addr->hasWeakLinkage() || Addr->hasLinkOnceLinkage() || in GenerateCXXGlobalVarDeclInitFunc()
1044 (D->getTLSKind() == VarDecl::TLS_Dynamic && in GenerateCXXGlobalVarDeclInitFunc()
1045 isTemplateInstantiation(D->getTemplateSpecializationKind()))) { in GenerateCXXGlobalVarDeclInitFunc()
1081 // initializers use previously-initialized thread_local vars, that's in GenerateCXXGlobalInitFunc()
1083 Builder.CreateStore(llvm::ConstantInt::get(GuardVal->getType(),1), Guard); in GenerateCXXGlobalInitFunc()
1089 CGM.getDataLayout().getTypeAllocSize(GuardVal->getType()))); in GenerateCXXGlobalInitFunc()
1094 // When building in Objective-C++ ARC mode, create an autorelease pool in GenerateCXXGlobalInitFunc()
1133 std::tie(CalleeTy, Callee, Arg) = DtorsOrStermFinalizers[e - i - 1]; in GenerateCXXGlobalCleanUpFunc()
1146 CI->setCallingConv(F->getCallingConv()); in GenerateCXXGlobalCleanUpFunc()
1153 /// generateDestroyHelper - Generates a helper function which, when
1168 FTy, "__cxx_global_array_dtor", FI, VD->getLocation()); in generateDestroyHelper()
1170 CurEHLocation = VD->getBeginLoc(); in generateDestroyHelper()