xref: /freebsd/contrib/llvm-project/clang/lib/CodeGen/CGDeclCXX.cpp (revision 2e3507c25e42292b45a5482e116d278f5515d04d)
1 //===--- CGDeclCXX.cpp - Emit LLVM Code for C++ declarations --------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This contains code dealing with code generation of C++ declarations
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "CGCXXABI.h"
14 #include "CGHLSLRuntime.h"
15 #include "CGObjCRuntime.h"
16 #include "CGOpenMPRuntime.h"
17 #include "CodeGenFunction.h"
18 #include "TargetInfo.h"
19 #include "clang/AST/Attr.h"
20 #include "clang/Basic/LangOptions.h"
21 #include "llvm/ADT/StringExtras.h"
22 #include "llvm/IR/Intrinsics.h"
23 #include "llvm/IR/MDBuilder.h"
24 #include "llvm/Support/Path.h"
25 
26 using namespace clang;
27 using namespace CodeGen;
28 
29 static void EmitDeclInit(CodeGenFunction &CGF, const VarDecl &D,
30                          ConstantAddress DeclPtr) {
31   assert(
32       (D.hasGlobalStorage() ||
33        (D.hasLocalStorage() && CGF.getContext().getLangOpts().OpenCLCPlusPlus)) &&
34       "VarDecl must have global or local (in the case of OpenCL) storage!");
35   assert(!D.getType()->isReferenceType() &&
36          "Should not call EmitDeclInit on a reference!");
37 
38   QualType type = D.getType();
39   LValue lv = CGF.MakeAddrLValue(DeclPtr, type);
40 
41   const Expr *Init = D.getInit();
42   switch (CGF.getEvaluationKind(type)) {
43   case TEK_Scalar: {
44     CodeGenModule &CGM = CGF.CGM;
45     if (lv.isObjCStrong())
46       CGM.getObjCRuntime().EmitObjCGlobalAssign(CGF, CGF.EmitScalarExpr(Init),
47                                                 DeclPtr, D.getTLSKind());
48     else if (lv.isObjCWeak())
49       CGM.getObjCRuntime().EmitObjCWeakAssign(CGF, CGF.EmitScalarExpr(Init),
50                                               DeclPtr);
51     else
52       CGF.EmitScalarInit(Init, &D, lv, false);
53     return;
54   }
55   case TEK_Complex:
56     CGF.EmitComplexExprIntoLValue(Init, lv, /*isInit*/ true);
57     return;
58   case TEK_Aggregate:
59     CGF.EmitAggExpr(Init,
60                     AggValueSlot::forLValue(lv, CGF, AggValueSlot::IsDestructed,
61                                             AggValueSlot::DoesNotNeedGCBarriers,
62                                             AggValueSlot::IsNotAliased,
63                                             AggValueSlot::DoesNotOverlap));
64     return;
65   }
66   llvm_unreachable("bad evaluation kind");
67 }
68 
69 /// Emit code to cause the destruction of the given variable with
70 /// static storage duration.
71 static void EmitDeclDestroy(CodeGenFunction &CGF, const VarDecl &D,
72                             ConstantAddress Addr) {
73   // Honor __attribute__((no_destroy)) and bail instead of attempting
74   // to emit a reference to a possibly nonexistent destructor, which
75   // in turn can cause a crash. This will result in a global constructor
76   // that isn't balanced out by a destructor call as intended by the
77   // attribute. This also checks for -fno-c++-static-destructors and
78   // bails even if the attribute is not present.
79   QualType::DestructionKind DtorKind = D.needsDestruction(CGF.getContext());
80 
81   // FIXME:  __attribute__((cleanup)) ?
82 
83   switch (DtorKind) {
84   case QualType::DK_none:
85     return;
86 
87   case QualType::DK_cxx_destructor:
88     break;
89 
90   case QualType::DK_objc_strong_lifetime:
91   case QualType::DK_objc_weak_lifetime:
92   case QualType::DK_nontrivial_c_struct:
93     // We don't care about releasing objects during process teardown.
94     assert(!D.getTLSKind() && "should have rejected this");
95     return;
96   }
97 
98   llvm::FunctionCallee Func;
99   llvm::Constant *Argument;
100 
101   CodeGenModule &CGM = CGF.CGM;
102   QualType Type = D.getType();
103 
104   // Special-case non-array C++ destructors, if they have the right signature.
105   // Under some ABIs, destructors return this instead of void, and cannot be
106   // passed directly to __cxa_atexit if the target does not allow this
107   // mismatch.
108   const CXXRecordDecl *Record = Type->getAsCXXRecordDecl();
109   bool CanRegisterDestructor =
110       Record && (!CGM.getCXXABI().HasThisReturn(
111                      GlobalDecl(Record->getDestructor(), Dtor_Complete)) ||
112                  CGM.getCXXABI().canCallMismatchedFunctionType());
113   // If __cxa_atexit is disabled via a flag, a different helper function is
114   // generated elsewhere which uses atexit instead, and it takes the destructor
115   // directly.
116   bool UsingExternalHelper = !CGM.getCodeGenOpts().CXAAtExit;
117   if (Record && (CanRegisterDestructor || UsingExternalHelper)) {
118     assert(!Record->hasTrivialDestructor());
119     CXXDestructorDecl *Dtor = Record->getDestructor();
120 
121     Func = CGM.getAddrAndTypeOfCXXStructor(GlobalDecl(Dtor, Dtor_Complete));
122     if (CGF.getContext().getLangOpts().OpenCL) {
123       auto DestAS =
124           CGM.getTargetCodeGenInfo().getAddrSpaceOfCxaAtexitPtrParam();
125       auto DestTy = llvm::PointerType::get(
126           CGM.getLLVMContext(), CGM.getContext().getTargetAddressSpace(DestAS));
127       auto SrcAS = D.getType().getQualifiers().getAddressSpace();
128       if (DestAS == SrcAS)
129         Argument = llvm::ConstantExpr::getBitCast(Addr.getPointer(), DestTy);
130       else
131         // FIXME: On addr space mismatch we are passing NULL. The generation
132         // of the global destructor function should be adjusted accordingly.
133         Argument = llvm::ConstantPointerNull::get(DestTy);
134     } else {
135       Argument = Addr.getPointer();
136     }
137   // Otherwise, the standard logic requires a helper function.
138   } else {
139     Addr = Addr.withElementType(CGF.ConvertTypeForMem(Type));
140     Func = CodeGenFunction(CGM)
141            .generateDestroyHelper(Addr, Type, CGF.getDestroyer(DtorKind),
142                                   CGF.needsEHCleanup(DtorKind), &D);
143     Argument = llvm::Constant::getNullValue(CGF.Int8PtrTy);
144   }
145 
146   CGM.getCXXABI().registerGlobalDtor(CGF, D, Func, Argument);
147 }
148 
149 /// Emit code to cause the variable at the given address to be considered as
150 /// constant from this point onwards.
151 static void EmitDeclInvariant(CodeGenFunction &CGF, const VarDecl &D,
152                               llvm::Constant *Addr) {
153   return CGF.EmitInvariantStart(
154       Addr, CGF.getContext().getTypeSizeInChars(D.getType()));
155 }
156 
157 void CodeGenFunction::EmitInvariantStart(llvm::Constant *Addr, CharUnits Size) {
158   // Do not emit the intrinsic if we're not optimizing.
159   if (!CGM.getCodeGenOpts().OptimizationLevel)
160     return;
161 
162   // Grab the llvm.invariant.start intrinsic.
163   llvm::Intrinsic::ID InvStartID = llvm::Intrinsic::invariant_start;
164   // Overloaded address space type.
165   llvm::Type *ObjectPtr[1] = {Int8PtrTy};
166   llvm::Function *InvariantStart = CGM.getIntrinsic(InvStartID, ObjectPtr);
167 
168   // Emit a call with the size in bytes of the object.
169   uint64_t Width = Size.getQuantity();
170   llvm::Value *Args[2] = { llvm::ConstantInt::getSigned(Int64Ty, Width),
171                            llvm::ConstantExpr::getBitCast(Addr, Int8PtrTy)};
172   Builder.CreateCall(InvariantStart, Args);
173 }
174 
175 void CodeGenFunction::EmitCXXGlobalVarDeclInit(const VarDecl &D,
176                                                llvm::GlobalVariable *GV,
177                                                bool PerformInit) {
178 
179   const Expr *Init = D.getInit();
180   QualType T = D.getType();
181 
182   // The address space of a static local variable (DeclPtr) may be different
183   // from the address space of the "this" argument of the constructor. In that
184   // case, we need an addrspacecast before calling the constructor.
185   //
186   // struct StructWithCtor {
187   //   __device__ StructWithCtor() {...}
188   // };
189   // __device__ void foo() {
190   //   __shared__ StructWithCtor s;
191   //   ...
192   // }
193   //
194   // For example, in the above CUDA code, the static local variable s has a
195   // "shared" address space qualifier, but the constructor of StructWithCtor
196   // expects "this" in the "generic" address space.
197   unsigned ExpectedAddrSpace = getTypes().getTargetAddressSpace(T);
198   unsigned ActualAddrSpace = GV->getAddressSpace();
199   llvm::Constant *DeclPtr = GV;
200   if (ActualAddrSpace != ExpectedAddrSpace) {
201     llvm::PointerType *PTy =
202         llvm::PointerType::get(getLLVMContext(), ExpectedAddrSpace);
203     DeclPtr = llvm::ConstantExpr::getAddrSpaceCast(DeclPtr, PTy);
204   }
205 
206   ConstantAddress DeclAddr(
207       DeclPtr, GV->getValueType(), getContext().getDeclAlign(&D));
208 
209   if (!T->isReferenceType()) {
210     if (getLangOpts().OpenMP && !getLangOpts().OpenMPSimd &&
211         D.hasAttr<OMPThreadPrivateDeclAttr>()) {
212       (void)CGM.getOpenMPRuntime().emitThreadPrivateVarDefinition(
213           &D, DeclAddr, D.getAttr<OMPThreadPrivateDeclAttr>()->getLocation(),
214           PerformInit, this);
215     }
216     bool NeedsDtor =
217         D.needsDestruction(getContext()) == QualType::DK_cxx_destructor;
218     if (PerformInit)
219       EmitDeclInit(*this, D, DeclAddr);
220     if (CGM.isTypeConstant(D.getType(), true, !NeedsDtor))
221       EmitDeclInvariant(*this, D, DeclPtr);
222     else
223       EmitDeclDestroy(*this, D, DeclAddr);
224     return;
225   }
226 
227   assert(PerformInit && "cannot have constant initializer which needs "
228          "destruction for reference");
229   RValue RV = EmitReferenceBindingToExpr(Init);
230   EmitStoreOfScalar(RV.getScalarVal(), DeclAddr, false, T);
231 }
232 
233 /// Create a stub function, suitable for being passed to atexit,
234 /// which passes the given address to the given destructor function.
235 llvm::Function *CodeGenFunction::createAtExitStub(const VarDecl &VD,
236                                                   llvm::FunctionCallee dtor,
237                                                   llvm::Constant *addr) {
238   // Get the destructor function type, void(*)(void).
239   llvm::FunctionType *ty = llvm::FunctionType::get(CGM.VoidTy, false);
240   SmallString<256> FnName;
241   {
242     llvm::raw_svector_ostream Out(FnName);
243     CGM.getCXXABI().getMangleContext().mangleDynamicAtExitDestructor(&VD, Out);
244   }
245 
246   const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
247   llvm::Function *fn = CGM.CreateGlobalInitOrCleanUpFunction(
248       ty, FnName.str(), FI, VD.getLocation());
249 
250   CodeGenFunction CGF(CGM);
251 
252   CGF.StartFunction(GlobalDecl(&VD, DynamicInitKind::AtExit),
253                     CGM.getContext().VoidTy, fn, FI, FunctionArgList(),
254                     VD.getLocation(), VD.getInit()->getExprLoc());
255   // Emit an artificial location for this function.
256   auto AL = ApplyDebugLocation::CreateArtificial(CGF);
257 
258   llvm::CallInst *call = CGF.Builder.CreateCall(dtor, addr);
259 
260   // Make sure the call and the callee agree on calling convention.
261   if (auto *dtorFn = dyn_cast<llvm::Function>(
262           dtor.getCallee()->stripPointerCastsAndAliases()))
263     call->setCallingConv(dtorFn->getCallingConv());
264 
265   CGF.FinishFunction();
266 
267   return fn;
268 }
269 
270 /// Create a stub function, suitable for being passed to __pt_atexit_np,
271 /// which passes the given address to the given destructor function.
272 llvm::Function *CodeGenFunction::createTLSAtExitStub(
273     const VarDecl &D, llvm::FunctionCallee Dtor, llvm::Constant *Addr,
274     llvm::FunctionCallee &AtExit) {
275   SmallString<256> FnName;
276   {
277     llvm::raw_svector_ostream Out(FnName);
278     CGM.getCXXABI().getMangleContext().mangleDynamicAtExitDestructor(&D, Out);
279   }
280 
281   const CGFunctionInfo &FI = CGM.getTypes().arrangeLLVMFunctionInfo(
282       getContext().IntTy, FnInfoOpts::None, {getContext().IntTy},
283       FunctionType::ExtInfo(), {}, RequiredArgs::All);
284 
285   // Get the stub function type, int(*)(int,...).
286   llvm::FunctionType *StubTy =
287       llvm::FunctionType::get(CGM.IntTy, {CGM.IntTy}, true);
288 
289   llvm::Function *DtorStub = CGM.CreateGlobalInitOrCleanUpFunction(
290       StubTy, FnName.str(), FI, D.getLocation());
291 
292   CodeGenFunction CGF(CGM);
293 
294   FunctionArgList Args;
295   ImplicitParamDecl IPD(CGM.getContext(), CGM.getContext().IntTy,
296                         ImplicitParamDecl::Other);
297   Args.push_back(&IPD);
298   QualType ResTy = CGM.getContext().IntTy;
299 
300   CGF.StartFunction(GlobalDecl(&D, DynamicInitKind::AtExit), ResTy, DtorStub,
301                     FI, Args, D.getLocation(), D.getInit()->getExprLoc());
302 
303   // Emit an artificial location for this function.
304   auto AL = ApplyDebugLocation::CreateArtificial(CGF);
305 
306   llvm::CallInst *call = CGF.Builder.CreateCall(Dtor, Addr);
307 
308   // Make sure the call and the callee agree on calling convention.
309   if (auto *DtorFn = dyn_cast<llvm::Function>(
310           Dtor.getCallee()->stripPointerCastsAndAliases()))
311     call->setCallingConv(DtorFn->getCallingConv());
312 
313   // Return 0 from function
314   CGF.Builder.CreateStore(llvm::Constant::getNullValue(CGM.IntTy),
315                           CGF.ReturnValue);
316 
317   CGF.FinishFunction();
318 
319   return DtorStub;
320 }
321 
322 /// Register a global destructor using the C atexit runtime function.
323 void CodeGenFunction::registerGlobalDtorWithAtExit(const VarDecl &VD,
324                                                    llvm::FunctionCallee dtor,
325                                                    llvm::Constant *addr) {
326   // Create a function which calls the destructor.
327   llvm::Constant *dtorStub = createAtExitStub(VD, dtor, addr);
328   registerGlobalDtorWithAtExit(dtorStub);
329 }
330 
331 void CodeGenFunction::registerGlobalDtorWithAtExit(llvm::Constant *dtorStub) {
332   // extern "C" int atexit(void (*f)(void));
333   assert(dtorStub->getType() ==
334              llvm::PointerType::get(
335                  llvm::FunctionType::get(CGM.VoidTy, false),
336                  dtorStub->getType()->getPointerAddressSpace()) &&
337          "Argument to atexit has a wrong type.");
338 
339   llvm::FunctionType *atexitTy =
340       llvm::FunctionType::get(IntTy, dtorStub->getType(), false);
341 
342   llvm::FunctionCallee atexit =
343       CGM.CreateRuntimeFunction(atexitTy, "atexit", llvm::AttributeList(),
344                                 /*Local=*/true);
345   if (llvm::Function *atexitFn = dyn_cast<llvm::Function>(atexit.getCallee()))
346     atexitFn->setDoesNotThrow();
347 
348   EmitNounwindRuntimeCall(atexit, dtorStub);
349 }
350 
351 llvm::Value *
352 CodeGenFunction::unregisterGlobalDtorWithUnAtExit(llvm::Constant *dtorStub) {
353   // The unatexit subroutine unregisters __dtor functions that were previously
354   // registered by the atexit subroutine. If the referenced function is found,
355   // it is removed from the list of functions that are called at normal program
356   // termination and the unatexit returns a value of 0, otherwise a non-zero
357   // value is returned.
358   //
359   // extern "C" int unatexit(void (*f)(void));
360   assert(dtorStub->getType() ==
361              llvm::PointerType::get(
362                  llvm::FunctionType::get(CGM.VoidTy, false),
363                  dtorStub->getType()->getPointerAddressSpace()) &&
364          "Argument to unatexit has a wrong type.");
365 
366   llvm::FunctionType *unatexitTy =
367       llvm::FunctionType::get(IntTy, {dtorStub->getType()}, /*isVarArg=*/false);
368 
369   llvm::FunctionCallee unatexit =
370       CGM.CreateRuntimeFunction(unatexitTy, "unatexit", llvm::AttributeList());
371 
372   cast<llvm::Function>(unatexit.getCallee())->setDoesNotThrow();
373 
374   return EmitNounwindRuntimeCall(unatexit, dtorStub);
375 }
376 
377 void CodeGenFunction::EmitCXXGuardedInit(const VarDecl &D,
378                                          llvm::GlobalVariable *DeclPtr,
379                                          bool PerformInit) {
380   // If we've been asked to forbid guard variables, emit an error now.
381   // This diagnostic is hard-coded for Darwin's use case;  we can find
382   // better phrasing if someone else needs it.
383   if (CGM.getCodeGenOpts().ForbidGuardVariables)
384     CGM.Error(D.getLocation(),
385               "this initialization requires a guard variable, which "
386               "the kernel does not support");
387 
388   CGM.getCXXABI().EmitGuardedInit(*this, D, DeclPtr, PerformInit);
389 }
390 
391 void CodeGenFunction::EmitCXXGuardedInitBranch(llvm::Value *NeedsInit,
392                                                llvm::BasicBlock *InitBlock,
393                                                llvm::BasicBlock *NoInitBlock,
394                                                GuardKind Kind,
395                                                const VarDecl *D) {
396   assert((Kind == GuardKind::TlsGuard || D) && "no guarded variable");
397 
398   // A guess at how many times we will enter the initialization of a
399   // variable, depending on the kind of variable.
400   static const uint64_t InitsPerTLSVar = 1024;
401   static const uint64_t InitsPerLocalVar = 1024 * 1024;
402 
403   llvm::MDNode *Weights;
404   if (Kind == GuardKind::VariableGuard && !D->isLocalVarDecl()) {
405     // For non-local variables, don't apply any weighting for now. Due to our
406     // use of COMDATs, we expect there to be at most one initialization of the
407     // variable per DSO, but we have no way to know how many DSOs will try to
408     // initialize the variable.
409     Weights = nullptr;
410   } else {
411     uint64_t NumInits;
412     // FIXME: For the TLS case, collect and use profiling information to
413     // determine a more accurate brach weight.
414     if (Kind == GuardKind::TlsGuard || D->getTLSKind())
415       NumInits = InitsPerTLSVar;
416     else
417       NumInits = InitsPerLocalVar;
418 
419     // The probability of us entering the initializer is
420     //   1 / (total number of times we attempt to initialize the variable).
421     llvm::MDBuilder MDHelper(CGM.getLLVMContext());
422     Weights = MDHelper.createBranchWeights(1, NumInits - 1);
423   }
424 
425   Builder.CreateCondBr(NeedsInit, InitBlock, NoInitBlock, Weights);
426 }
427 
428 llvm::Function *CodeGenModule::CreateGlobalInitOrCleanUpFunction(
429     llvm::FunctionType *FTy, const Twine &Name, const CGFunctionInfo &FI,
430     SourceLocation Loc, bool TLS, llvm::GlobalVariable::LinkageTypes Linkage) {
431   llvm::Function *Fn = llvm::Function::Create(FTy, Linkage, Name, &getModule());
432 
433   if (!getLangOpts().AppleKext && !TLS) {
434     // Set the section if needed.
435     if (const char *Section = getTarget().getStaticInitSectionSpecifier())
436       Fn->setSection(Section);
437   }
438 
439   if (Linkage == llvm::GlobalVariable::InternalLinkage)
440     SetInternalFunctionAttributes(GlobalDecl(), Fn, FI);
441 
442   Fn->setCallingConv(getRuntimeCC());
443 
444   if (!getLangOpts().Exceptions)
445     Fn->setDoesNotThrow();
446 
447   if (getLangOpts().Sanitize.has(SanitizerKind::Address) &&
448       !isInNoSanitizeList(SanitizerKind::Address, Fn, Loc))
449     Fn->addFnAttr(llvm::Attribute::SanitizeAddress);
450 
451   if (getLangOpts().Sanitize.has(SanitizerKind::KernelAddress) &&
452       !isInNoSanitizeList(SanitizerKind::KernelAddress, Fn, Loc))
453     Fn->addFnAttr(llvm::Attribute::SanitizeAddress);
454 
455   if (getLangOpts().Sanitize.has(SanitizerKind::HWAddress) &&
456       !isInNoSanitizeList(SanitizerKind::HWAddress, Fn, Loc))
457     Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress);
458 
459   if (getLangOpts().Sanitize.has(SanitizerKind::KernelHWAddress) &&
460       !isInNoSanitizeList(SanitizerKind::KernelHWAddress, Fn, Loc))
461     Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress);
462 
463   if (getLangOpts().Sanitize.has(SanitizerKind::MemtagStack) &&
464       !isInNoSanitizeList(SanitizerKind::MemtagStack, Fn, Loc))
465     Fn->addFnAttr(llvm::Attribute::SanitizeMemTag);
466 
467   if (getLangOpts().Sanitize.has(SanitizerKind::Thread) &&
468       !isInNoSanitizeList(SanitizerKind::Thread, Fn, Loc))
469     Fn->addFnAttr(llvm::Attribute::SanitizeThread);
470 
471   if (getLangOpts().Sanitize.has(SanitizerKind::Memory) &&
472       !isInNoSanitizeList(SanitizerKind::Memory, Fn, Loc))
473     Fn->addFnAttr(llvm::Attribute::SanitizeMemory);
474 
475   if (getLangOpts().Sanitize.has(SanitizerKind::KernelMemory) &&
476       !isInNoSanitizeList(SanitizerKind::KernelMemory, Fn, Loc))
477     Fn->addFnAttr(llvm::Attribute::SanitizeMemory);
478 
479   if (getLangOpts().Sanitize.has(SanitizerKind::SafeStack) &&
480       !isInNoSanitizeList(SanitizerKind::SafeStack, Fn, Loc))
481     Fn->addFnAttr(llvm::Attribute::SafeStack);
482 
483   if (getLangOpts().Sanitize.has(SanitizerKind::ShadowCallStack) &&
484       !isInNoSanitizeList(SanitizerKind::ShadowCallStack, Fn, Loc))
485     Fn->addFnAttr(llvm::Attribute::ShadowCallStack);
486 
487   return Fn;
488 }
489 
490 /// Create a global pointer to a function that will initialize a global
491 /// variable.  The user has requested that this pointer be emitted in a specific
492 /// section.
493 void CodeGenModule::EmitPointerToInitFunc(const VarDecl *D,
494                                           llvm::GlobalVariable *GV,
495                                           llvm::Function *InitFunc,
496                                           InitSegAttr *ISA) {
497   llvm::GlobalVariable *PtrArray = new llvm::GlobalVariable(
498       TheModule, InitFunc->getType(), /*isConstant=*/true,
499       llvm::GlobalValue::PrivateLinkage, InitFunc, "__cxx_init_fn_ptr");
500   PtrArray->setSection(ISA->getSection());
501   addUsedGlobal(PtrArray);
502 
503   // If the GV is already in a comdat group, then we have to join it.
504   if (llvm::Comdat *C = GV->getComdat())
505     PtrArray->setComdat(C);
506 }
507 
508 void
509 CodeGenModule::EmitCXXGlobalVarDeclInitFunc(const VarDecl *D,
510                                             llvm::GlobalVariable *Addr,
511                                             bool PerformInit) {
512 
513   // According to E.2.3.1 in CUDA-7.5 Programming guide: __device__,
514   // __constant__ and __shared__ variables defined in namespace scope,
515   // that are of class type, cannot have a non-empty constructor. All
516   // the checks have been done in Sema by now. Whatever initializers
517   // are allowed are empty and we just need to ignore them here.
518   if (getLangOpts().CUDAIsDevice && !getLangOpts().GPUAllowDeviceInit &&
519       (D->hasAttr<CUDADeviceAttr>() || D->hasAttr<CUDAConstantAttr>() ||
520        D->hasAttr<CUDASharedAttr>()))
521     return;
522 
523   if (getLangOpts().OpenMP &&
524       getOpenMPRuntime().emitDeclareTargetVarDefinition(D, Addr, PerformInit))
525     return;
526 
527   // Check if we've already initialized this decl.
528   auto I = DelayedCXXInitPosition.find(D);
529   if (I != DelayedCXXInitPosition.end() && I->second == ~0U)
530     return;
531 
532   llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
533   SmallString<256> FnName;
534   {
535     llvm::raw_svector_ostream Out(FnName);
536     getCXXABI().getMangleContext().mangleDynamicInitializer(D, Out);
537   }
538 
539   // Create a variable initialization function.
540   llvm::Function *Fn = CreateGlobalInitOrCleanUpFunction(
541       FTy, FnName.str(), getTypes().arrangeNullaryFunction(), D->getLocation());
542 
543   auto *ISA = D->getAttr<InitSegAttr>();
544   CodeGenFunction(*this).GenerateCXXGlobalVarDeclInitFunc(Fn, D, Addr,
545                                                           PerformInit);
546 
547   llvm::GlobalVariable *COMDATKey =
548       supportsCOMDAT() && D->isExternallyVisible() ? Addr : nullptr;
549 
550   if (D->getTLSKind()) {
551     // FIXME: Should we support init_priority for thread_local?
552     // FIXME: We only need to register one __cxa_thread_atexit function for the
553     // entire TU.
554     CXXThreadLocalInits.push_back(Fn);
555     CXXThreadLocalInitVars.push_back(D);
556   } else if (PerformInit && ISA) {
557     // Contract with backend that "init_seg(compiler)" corresponds to priority
558     // 200 and "init_seg(lib)" corresponds to priority 400.
559     int Priority = -1;
560     if (ISA->getSection() == ".CRT$XCC")
561       Priority = 200;
562     else if (ISA->getSection() == ".CRT$XCL")
563       Priority = 400;
564 
565     if (Priority != -1)
566       AddGlobalCtor(Fn, Priority, ~0U, COMDATKey);
567     else
568       EmitPointerToInitFunc(D, Addr, Fn, ISA);
569   } else if (auto *IPA = D->getAttr<InitPriorityAttr>()) {
570     OrderGlobalInitsOrStermFinalizers Key(IPA->getPriority(),
571                                           PrioritizedCXXGlobalInits.size());
572     PrioritizedCXXGlobalInits.push_back(std::make_pair(Key, Fn));
573   } else if (isTemplateInstantiation(D->getTemplateSpecializationKind()) ||
574              getContext().GetGVALinkageForVariable(D) == GVA_DiscardableODR ||
575              D->hasAttr<SelectAnyAttr>()) {
576     // C++ [basic.start.init]p2:
577     //   Definitions of explicitly specialized class template static data
578     //   members have ordered initialization. Other class template static data
579     //   members (i.e., implicitly or explicitly instantiated specializations)
580     //   have unordered initialization.
581     //
582     // As a consequence, we can put them into their own llvm.global_ctors entry.
583     //
584     // If the global is externally visible, put the initializer into a COMDAT
585     // group with the global being initialized.  On most platforms, this is a
586     // minor startup time optimization.  In the MS C++ ABI, there are no guard
587     // variables, so this COMDAT key is required for correctness.
588     //
589     // SelectAny globals will be comdat-folded. Put the initializer into a
590     // COMDAT group associated with the global, so the initializers get folded
591     // too.
592     I = DelayedCXXInitPosition.find(D);
593     // CXXGlobalInits.size() is the lex order number for the next deferred
594     // VarDecl. Use it when the current VarDecl is non-deferred. Although this
595     // lex order number is shared between current VarDecl and some following
596     // VarDecls, their order of insertion into `llvm.global_ctors` is the same
597     // as the lexing order and the following stable sort would preserve such
598     // order.
599     unsigned LexOrder =
600         I == DelayedCXXInitPosition.end() ? CXXGlobalInits.size() : I->second;
601     AddGlobalCtor(Fn, 65535, LexOrder, COMDATKey);
602     if (COMDATKey && (getTriple().isOSBinFormatELF() ||
603                       getTarget().getCXXABI().isMicrosoft())) {
604       // When COMDAT is used on ELF or in the MS C++ ABI, the key must be in
605       // llvm.used to prevent linker GC.
606       addUsedGlobal(COMDATKey);
607     }
608 
609     // If we used a COMDAT key for the global ctor, the init function can be
610     // discarded if the global ctor entry is discarded.
611     // FIXME: Do we need to restrict this to ELF and Wasm?
612     llvm::Comdat *C = Addr->getComdat();
613     if (COMDATKey && C &&
614         (getTarget().getTriple().isOSBinFormatELF() ||
615          getTarget().getTriple().isOSBinFormatWasm())) {
616       Fn->setComdat(C);
617     }
618   } else {
619     I = DelayedCXXInitPosition.find(D); // Re-do lookup in case of re-hash.
620     if (I == DelayedCXXInitPosition.end()) {
621       CXXGlobalInits.push_back(Fn);
622     } else if (I->second != ~0U) {
623       assert(I->second < CXXGlobalInits.size() &&
624              CXXGlobalInits[I->second] == nullptr);
625       CXXGlobalInits[I->second] = Fn;
626     }
627   }
628 
629   // Remember that we already emitted the initializer for this global.
630   DelayedCXXInitPosition[D] = ~0U;
631 }
632 
633 void CodeGenModule::EmitCXXThreadLocalInitFunc() {
634   getCXXABI().EmitThreadLocalInitFuncs(
635       *this, CXXThreadLocals, CXXThreadLocalInits, CXXThreadLocalInitVars);
636 
637   CXXThreadLocalInits.clear();
638   CXXThreadLocalInitVars.clear();
639   CXXThreadLocals.clear();
640 }
641 
642 /* Build the initializer for a C++20 module:
643    This is arranged to be run only once regardless of how many times the module
644    might be included transitively.  This arranged by using a guard variable.
645 
646    If there are no initializers at all (and also no imported modules) we reduce
647    this to an empty function (since the Itanium ABI requires that this function
648    be available to a caller, which might be produced by a different
649    implementation).
650 
651    First we call any initializers for imported modules.
652    We then call initializers for the Global Module Fragment (if present)
653    We then call initializers for the current module.
654    We then call initializers for the Private Module Fragment (if present)
655 */
656 
657 void CodeGenModule::EmitCXXModuleInitFunc(Module *Primary) {
658   while (!CXXGlobalInits.empty() && !CXXGlobalInits.back())
659     CXXGlobalInits.pop_back();
660 
661   // As noted above, we create the function, even if it is empty.
662   // Module initializers for imported modules are emitted first.
663 
664   // Collect all the modules that we import
665   SmallVector<Module *> AllImports;
666   // Ones that we export
667   for (auto I : Primary->Exports)
668     AllImports.push_back(I.getPointer());
669   // Ones that we only import.
670   for (Module *M : Primary->Imports)
671     AllImports.push_back(M);
672 
673   SmallVector<llvm::Function *, 8> ModuleInits;
674   for (Module *M : AllImports) {
675     // No Itanium initializer in header like modules.
676     if (M->isHeaderLikeModule())
677       continue; // TODO: warn of mixed use of module map modules and C++20?
678     llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
679     SmallString<256> FnName;
680     {
681       llvm::raw_svector_ostream Out(FnName);
682       cast<ItaniumMangleContext>(getCXXABI().getMangleContext())
683           .mangleModuleInitializer(M, Out);
684     }
685     assert(!GetGlobalValue(FnName.str()) &&
686            "We should only have one use of the initializer call");
687     llvm::Function *Fn = llvm::Function::Create(
688         FTy, llvm::Function::ExternalLinkage, FnName.str(), &getModule());
689     ModuleInits.push_back(Fn);
690   }
691 
692   // Add any initializers with specified priority; this uses the same  approach
693   // as EmitCXXGlobalInitFunc().
694   if (!PrioritizedCXXGlobalInits.empty()) {
695     SmallVector<llvm::Function *, 8> LocalCXXGlobalInits;
696     llvm::array_pod_sort(PrioritizedCXXGlobalInits.begin(),
697                          PrioritizedCXXGlobalInits.end());
698     for (SmallVectorImpl<GlobalInitData>::iterator
699              I = PrioritizedCXXGlobalInits.begin(),
700              E = PrioritizedCXXGlobalInits.end();
701          I != E;) {
702       SmallVectorImpl<GlobalInitData>::iterator PrioE =
703           std::upper_bound(I + 1, E, *I, GlobalInitPriorityCmp());
704 
705       for (; I < PrioE; ++I)
706         ModuleInits.push_back(I->second);
707     }
708   }
709 
710   // Now append the ones without specified priority.
711   for (auto *F : CXXGlobalInits)
712     ModuleInits.push_back(F);
713 
714   llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
715   const CGFunctionInfo &FI = getTypes().arrangeNullaryFunction();
716 
717   // We now build the initializer for this module, which has a mangled name
718   // as per the Itanium ABI .  The action of the initializer is guarded so that
719   // each init is run just once (even though a module might be imported
720   // multiple times via nested use).
721   llvm::Function *Fn;
722   {
723     SmallString<256> InitFnName;
724     llvm::raw_svector_ostream Out(InitFnName);
725     cast<ItaniumMangleContext>(getCXXABI().getMangleContext())
726         .mangleModuleInitializer(Primary, Out);
727     Fn = CreateGlobalInitOrCleanUpFunction(
728         FTy, llvm::Twine(InitFnName), FI, SourceLocation(), false,
729         llvm::GlobalVariable::ExternalLinkage);
730 
731     // If we have a completely empty initializer then we do not want to create
732     // the guard variable.
733     ConstantAddress GuardAddr = ConstantAddress::invalid();
734     if (!AllImports.empty() || !PrioritizedCXXGlobalInits.empty() ||
735         !CXXGlobalInits.empty()) {
736       // Create the guard var.
737       llvm::GlobalVariable *Guard = new llvm::GlobalVariable(
738           getModule(), Int8Ty, /*isConstant=*/false,
739           llvm::GlobalVariable::InternalLinkage,
740           llvm::ConstantInt::get(Int8Ty, 0), InitFnName.str() + "__in_chrg");
741       CharUnits GuardAlign = CharUnits::One();
742       Guard->setAlignment(GuardAlign.getAsAlign());
743       GuardAddr = ConstantAddress(Guard, Int8Ty, GuardAlign);
744     }
745     CodeGenFunction(*this).GenerateCXXGlobalInitFunc(Fn, ModuleInits,
746                                                      GuardAddr);
747   }
748 
749   // We allow for the case that a module object is added to a linked binary
750   // without a specific call to the the initializer.  This also ensures that
751   // implementation partition initializers are called when the partition
752   // is not imported as an interface.
753   AddGlobalCtor(Fn);
754 
755   // See the comment in EmitCXXGlobalInitFunc about OpenCL global init
756   // functions.
757   if (getLangOpts().OpenCL) {
758     GenKernelArgMetadata(Fn);
759     Fn->setCallingConv(llvm::CallingConv::SPIR_KERNEL);
760   }
761 
762   assert(!getLangOpts().CUDA || !getLangOpts().CUDAIsDevice ||
763          getLangOpts().GPUAllowDeviceInit);
764   if (getLangOpts().HIP && getLangOpts().CUDAIsDevice) {
765     Fn->setCallingConv(llvm::CallingConv::AMDGPU_KERNEL);
766     Fn->addFnAttr("device-init");
767   }
768 
769   // We are done with the inits.
770   AllImports.clear();
771   PrioritizedCXXGlobalInits.clear();
772   CXXGlobalInits.clear();
773   ModuleInits.clear();
774 }
775 
776 static SmallString<128> getTransformedFileName(llvm::Module &M) {
777   SmallString<128> FileName = llvm::sys::path::filename(M.getName());
778 
779   if (FileName.empty())
780     FileName = "<null>";
781 
782   for (size_t i = 0; i < FileName.size(); ++i) {
783     // Replace everything that's not [a-zA-Z0-9._] with a _. This set happens
784     // to be the set of C preprocessing numbers.
785     if (!isPreprocessingNumberBody(FileName[i]))
786       FileName[i] = '_';
787   }
788 
789   return FileName;
790 }
791 
792 static std::string getPrioritySuffix(unsigned int Priority) {
793   assert(Priority <= 65535 && "Priority should always be <= 65535.");
794 
795   // Compute the function suffix from priority. Prepend with zeroes to make
796   // sure the function names are also ordered as priorities.
797   std::string PrioritySuffix = llvm::utostr(Priority);
798   PrioritySuffix = std::string(6 - PrioritySuffix.size(), '0') + PrioritySuffix;
799 
800   return PrioritySuffix;
801 }
802 
803 void
804 CodeGenModule::EmitCXXGlobalInitFunc() {
805   while (!CXXGlobalInits.empty() && !CXXGlobalInits.back())
806     CXXGlobalInits.pop_back();
807 
808   // When we import C++20 modules, we must run their initializers first.
809   SmallVector<llvm::Function *, 8> ModuleInits;
810   if (CXX20ModuleInits)
811     for (Module *M : ImportedModules) {
812       // No Itanium initializer in header like modules.
813       if (M->isHeaderLikeModule())
814         continue;
815       llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
816       SmallString<256> FnName;
817       {
818         llvm::raw_svector_ostream Out(FnName);
819         cast<ItaniumMangleContext>(getCXXABI().getMangleContext())
820             .mangleModuleInitializer(M, Out);
821       }
822       assert(!GetGlobalValue(FnName.str()) &&
823              "We should only have one use of the initializer call");
824       llvm::Function *Fn = llvm::Function::Create(
825           FTy, llvm::Function::ExternalLinkage, FnName.str(), &getModule());
826       ModuleInits.push_back(Fn);
827     }
828 
829   if (ModuleInits.empty() && CXXGlobalInits.empty() &&
830       PrioritizedCXXGlobalInits.empty())
831     return;
832 
833   llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
834   const CGFunctionInfo &FI = getTypes().arrangeNullaryFunction();
835 
836   // Create our global prioritized initialization function.
837   if (!PrioritizedCXXGlobalInits.empty()) {
838     SmallVector<llvm::Function *, 8> LocalCXXGlobalInits;
839     llvm::array_pod_sort(PrioritizedCXXGlobalInits.begin(),
840                          PrioritizedCXXGlobalInits.end());
841     // Iterate over "chunks" of ctors with same priority and emit each chunk
842     // into separate function. Note - everything is sorted first by priority,
843     // second - by lex order, so we emit ctor functions in proper order.
844     for (SmallVectorImpl<GlobalInitData >::iterator
845            I = PrioritizedCXXGlobalInits.begin(),
846            E = PrioritizedCXXGlobalInits.end(); I != E; ) {
847       SmallVectorImpl<GlobalInitData >::iterator
848         PrioE = std::upper_bound(I + 1, E, *I, GlobalInitPriorityCmp());
849 
850       LocalCXXGlobalInits.clear();
851 
852       unsigned int Priority = I->first.priority;
853       llvm::Function *Fn = CreateGlobalInitOrCleanUpFunction(
854           FTy, "_GLOBAL__I_" + getPrioritySuffix(Priority), FI);
855 
856       // Prepend the module inits to the highest priority set.
857       if (!ModuleInits.empty()) {
858         for (auto *F : ModuleInits)
859           LocalCXXGlobalInits.push_back(F);
860         ModuleInits.clear();
861       }
862 
863       for (; I < PrioE; ++I)
864         LocalCXXGlobalInits.push_back(I->second);
865 
866       CodeGenFunction(*this).GenerateCXXGlobalInitFunc(Fn, LocalCXXGlobalInits);
867       AddGlobalCtor(Fn, Priority);
868     }
869     PrioritizedCXXGlobalInits.clear();
870   }
871 
872   if (getCXXABI().useSinitAndSterm() && ModuleInits.empty() &&
873       CXXGlobalInits.empty())
874     return;
875 
876   for (auto *F : CXXGlobalInits)
877     ModuleInits.push_back(F);
878   CXXGlobalInits.clear();
879 
880   // Include the filename in the symbol name. Including "sub_" matches gcc
881   // and makes sure these symbols appear lexicographically behind the symbols
882   // with priority emitted above.  Module implementation units behave the same
883   // way as a non-modular TU with imports.
884   llvm::Function *Fn;
885   if (CXX20ModuleInits && getContext().getCurrentNamedModule() &&
886       !getContext().getCurrentNamedModule()->isModuleImplementation()) {
887     SmallString<256> InitFnName;
888     llvm::raw_svector_ostream Out(InitFnName);
889     cast<ItaniumMangleContext>(getCXXABI().getMangleContext())
890         .mangleModuleInitializer(getContext().getCurrentNamedModule(), Out);
891     Fn = CreateGlobalInitOrCleanUpFunction(
892         FTy, llvm::Twine(InitFnName), FI, SourceLocation(), false,
893         llvm::GlobalVariable::ExternalLinkage);
894   } else
895     Fn = CreateGlobalInitOrCleanUpFunction(
896         FTy,
897         llvm::Twine("_GLOBAL__sub_I_", getTransformedFileName(getModule())),
898         FI);
899 
900   CodeGenFunction(*this).GenerateCXXGlobalInitFunc(Fn, ModuleInits);
901   AddGlobalCtor(Fn);
902 
903   // In OpenCL global init functions must be converted to kernels in order to
904   // be able to launch them from the host.
905   // FIXME: Some more work might be needed to handle destructors correctly.
906   // Current initialization function makes use of function pointers callbacks.
907   // We can't support function pointers especially between host and device.
908   // However it seems global destruction has little meaning without any
909   // dynamic resource allocation on the device and program scope variables are
910   // destroyed by the runtime when program is released.
911   if (getLangOpts().OpenCL) {
912     GenKernelArgMetadata(Fn);
913     Fn->setCallingConv(llvm::CallingConv::SPIR_KERNEL);
914   }
915 
916   assert(!getLangOpts().CUDA || !getLangOpts().CUDAIsDevice ||
917          getLangOpts().GPUAllowDeviceInit);
918   if (getLangOpts().HIP && getLangOpts().CUDAIsDevice) {
919     Fn->setCallingConv(llvm::CallingConv::AMDGPU_KERNEL);
920     Fn->addFnAttr("device-init");
921   }
922 
923   ModuleInits.clear();
924 }
925 
926 void CodeGenModule::EmitCXXGlobalCleanUpFunc() {
927   if (CXXGlobalDtorsOrStermFinalizers.empty() &&
928       PrioritizedCXXStermFinalizers.empty())
929     return;
930 
931   llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
932   const CGFunctionInfo &FI = getTypes().arrangeNullaryFunction();
933 
934   // Create our global prioritized cleanup function.
935   if (!PrioritizedCXXStermFinalizers.empty()) {
936     SmallVector<CXXGlobalDtorsOrStermFinalizer_t, 8> LocalCXXStermFinalizers;
937     llvm::array_pod_sort(PrioritizedCXXStermFinalizers.begin(),
938                          PrioritizedCXXStermFinalizers.end());
939     // Iterate over "chunks" of dtors with same priority and emit each chunk
940     // into separate function. Note - everything is sorted first by priority,
941     // second - by lex order, so we emit dtor functions in proper order.
942     for (SmallVectorImpl<StermFinalizerData>::iterator
943              I = PrioritizedCXXStermFinalizers.begin(),
944              E = PrioritizedCXXStermFinalizers.end();
945          I != E;) {
946       SmallVectorImpl<StermFinalizerData>::iterator PrioE =
947           std::upper_bound(I + 1, E, *I, StermFinalizerPriorityCmp());
948 
949       LocalCXXStermFinalizers.clear();
950 
951       unsigned int Priority = I->first.priority;
952       llvm::Function *Fn = CreateGlobalInitOrCleanUpFunction(
953           FTy, "_GLOBAL__a_" + getPrioritySuffix(Priority), FI);
954 
955       for (; I < PrioE; ++I) {
956         llvm::FunctionCallee DtorFn = I->second;
957         LocalCXXStermFinalizers.emplace_back(DtorFn.getFunctionType(),
958                                              DtorFn.getCallee(), nullptr);
959       }
960 
961       CodeGenFunction(*this).GenerateCXXGlobalCleanUpFunc(
962           Fn, LocalCXXStermFinalizers);
963       AddGlobalDtor(Fn, Priority);
964     }
965     PrioritizedCXXStermFinalizers.clear();
966   }
967 
968   if (CXXGlobalDtorsOrStermFinalizers.empty())
969     return;
970 
971   // Create our global cleanup function.
972   llvm::Function *Fn =
973       CreateGlobalInitOrCleanUpFunction(FTy, "_GLOBAL__D_a", FI);
974 
975   CodeGenFunction(*this).GenerateCXXGlobalCleanUpFunc(
976       Fn, CXXGlobalDtorsOrStermFinalizers);
977   AddGlobalDtor(Fn);
978   CXXGlobalDtorsOrStermFinalizers.clear();
979 }
980 
981 /// Emit the code necessary to initialize the given global variable.
982 void CodeGenFunction::GenerateCXXGlobalVarDeclInitFunc(llvm::Function *Fn,
983                                                        const VarDecl *D,
984                                                  llvm::GlobalVariable *Addr,
985                                                        bool PerformInit) {
986   // Check if we need to emit debug info for variable initializer.
987   if (D->hasAttr<NoDebugAttr>())
988     DebugInfo = nullptr; // disable debug info indefinitely for this function
989 
990   CurEHLocation = D->getBeginLoc();
991 
992   StartFunction(GlobalDecl(D, DynamicInitKind::Initializer),
993                 getContext().VoidTy, Fn, getTypes().arrangeNullaryFunction(),
994                 FunctionArgList());
995   // Emit an artificial location for this function.
996   auto AL = ApplyDebugLocation::CreateArtificial(*this);
997 
998   // Use guarded initialization if the global variable is weak. This
999   // occurs for, e.g., instantiated static data members and
1000   // definitions explicitly marked weak.
1001   //
1002   // Also use guarded initialization for a variable with dynamic TLS and
1003   // unordered initialization. (If the initialization is ordered, the ABI
1004   // layer will guard the whole-TU initialization for us.)
1005   if (Addr->hasWeakLinkage() || Addr->hasLinkOnceLinkage() ||
1006       (D->getTLSKind() == VarDecl::TLS_Dynamic &&
1007        isTemplateInstantiation(D->getTemplateSpecializationKind()))) {
1008     EmitCXXGuardedInit(*D, Addr, PerformInit);
1009   } else {
1010     EmitCXXGlobalVarDeclInit(*D, Addr, PerformInit);
1011   }
1012 
1013   if (getLangOpts().HLSL)
1014     CGM.getHLSLRuntime().annotateHLSLResource(D, Addr);
1015 
1016   FinishFunction();
1017 }
1018 
1019 void
1020 CodeGenFunction::GenerateCXXGlobalInitFunc(llvm::Function *Fn,
1021                                            ArrayRef<llvm::Function *> Decls,
1022                                            ConstantAddress Guard) {
1023   {
1024     auto NL = ApplyDebugLocation::CreateEmpty(*this);
1025     StartFunction(GlobalDecl(), getContext().VoidTy, Fn,
1026                   getTypes().arrangeNullaryFunction(), FunctionArgList());
1027     // Emit an artificial location for this function.
1028     auto AL = ApplyDebugLocation::CreateArtificial(*this);
1029 
1030     llvm::BasicBlock *ExitBlock = nullptr;
1031     if (Guard.isValid()) {
1032       // If we have a guard variable, check whether we've already performed
1033       // these initializations. This happens for TLS initialization functions.
1034       llvm::Value *GuardVal = Builder.CreateLoad(Guard);
1035       llvm::Value *Uninit = Builder.CreateIsNull(GuardVal,
1036                                                  "guard.uninitialized");
1037       llvm::BasicBlock *InitBlock = createBasicBlock("init");
1038       ExitBlock = createBasicBlock("exit");
1039       EmitCXXGuardedInitBranch(Uninit, InitBlock, ExitBlock,
1040                                GuardKind::TlsGuard, nullptr);
1041       EmitBlock(InitBlock);
1042       // Mark as initialized before initializing anything else. If the
1043       // initializers use previously-initialized thread_local vars, that's
1044       // probably supposed to be OK, but the standard doesn't say.
1045       Builder.CreateStore(llvm::ConstantInt::get(GuardVal->getType(),1), Guard);
1046 
1047       // The guard variable can't ever change again.
1048       EmitInvariantStart(
1049           Guard.getPointer(),
1050           CharUnits::fromQuantity(
1051               CGM.getDataLayout().getTypeAllocSize(GuardVal->getType())));
1052     }
1053 
1054     RunCleanupsScope Scope(*this);
1055 
1056     // When building in Objective-C++ ARC mode, create an autorelease pool
1057     // around the global initializers.
1058     if (getLangOpts().ObjCAutoRefCount && getLangOpts().CPlusPlus) {
1059       llvm::Value *token = EmitObjCAutoreleasePoolPush();
1060       EmitObjCAutoreleasePoolCleanup(token);
1061     }
1062 
1063     for (unsigned i = 0, e = Decls.size(); i != e; ++i)
1064       if (Decls[i])
1065         EmitRuntimeCall(Decls[i]);
1066 
1067     Scope.ForceCleanup();
1068 
1069     if (ExitBlock) {
1070       Builder.CreateBr(ExitBlock);
1071       EmitBlock(ExitBlock);
1072     }
1073   }
1074 
1075   FinishFunction();
1076 }
1077 
1078 void CodeGenFunction::GenerateCXXGlobalCleanUpFunc(
1079     llvm::Function *Fn,
1080     ArrayRef<std::tuple<llvm::FunctionType *, llvm::WeakTrackingVH,
1081                         llvm::Constant *>>
1082         DtorsOrStermFinalizers) {
1083   {
1084     auto NL = ApplyDebugLocation::CreateEmpty(*this);
1085     StartFunction(GlobalDecl(), getContext().VoidTy, Fn,
1086                   getTypes().arrangeNullaryFunction(), FunctionArgList());
1087     // Emit an artificial location for this function.
1088     auto AL = ApplyDebugLocation::CreateArtificial(*this);
1089 
1090     // Emit the cleanups, in reverse order from construction.
1091     for (unsigned i = 0, e = DtorsOrStermFinalizers.size(); i != e; ++i) {
1092       llvm::FunctionType *CalleeTy;
1093       llvm::Value *Callee;
1094       llvm::Constant *Arg;
1095       std::tie(CalleeTy, Callee, Arg) = DtorsOrStermFinalizers[e - i - 1];
1096 
1097       llvm::CallInst *CI = nullptr;
1098       if (Arg == nullptr) {
1099         assert(
1100             CGM.getCXXABI().useSinitAndSterm() &&
1101             "Arg could not be nullptr unless using sinit and sterm functions.");
1102         CI = Builder.CreateCall(CalleeTy, Callee);
1103       } else
1104         CI = Builder.CreateCall(CalleeTy, Callee, Arg);
1105 
1106       // Make sure the call and the callee agree on calling convention.
1107       if (llvm::Function *F = dyn_cast<llvm::Function>(Callee))
1108         CI->setCallingConv(F->getCallingConv());
1109     }
1110   }
1111 
1112   FinishFunction();
1113 }
1114 
1115 /// generateDestroyHelper - Generates a helper function which, when
1116 /// invoked, destroys the given object.  The address of the object
1117 /// should be in global memory.
1118 llvm::Function *CodeGenFunction::generateDestroyHelper(
1119     Address addr, QualType type, Destroyer *destroyer,
1120     bool useEHCleanupForArray, const VarDecl *VD) {
1121   FunctionArgList args;
1122   ImplicitParamDecl Dst(getContext(), getContext().VoidPtrTy,
1123                         ImplicitParamDecl::Other);
1124   args.push_back(&Dst);
1125 
1126   const CGFunctionInfo &FI =
1127     CGM.getTypes().arrangeBuiltinFunctionDeclaration(getContext().VoidTy, args);
1128   llvm::FunctionType *FTy = CGM.getTypes().GetFunctionType(FI);
1129   llvm::Function *fn = CGM.CreateGlobalInitOrCleanUpFunction(
1130       FTy, "__cxx_global_array_dtor", FI, VD->getLocation());
1131 
1132   CurEHLocation = VD->getBeginLoc();
1133 
1134   StartFunction(GlobalDecl(VD, DynamicInitKind::GlobalArrayDestructor),
1135                 getContext().VoidTy, fn, FI, args);
1136   // Emit an artificial location for this function.
1137   auto AL = ApplyDebugLocation::CreateArtificial(*this);
1138 
1139   emitDestroy(addr, type, destroyer, useEHCleanupForArray);
1140 
1141   FinishFunction();
1142 
1143   return fn;
1144 }
1145