1 //===--- CGDeclCXX.cpp - Emit LLVM Code for C++ declarations --------------===//
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
7 //===----------------------------------------------------------------------===//
9 // This contains code dealing with code generation of C++ declarations
11 //===----------------------------------------------------------------------===//
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"
26 using namespace clang
;
27 using namespace CodeGen
;
29 static void EmitDeclInit(CodeGenFunction
&CGF
, const VarDecl
&D
,
30 ConstantAddress DeclPtr
) {
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!");
38 QualType type
= D
.getType();
39 LValue lv
= CGF
.MakeAddrLValue(DeclPtr
, type
);
41 const Expr
*Init
= D
.getInit();
42 switch (CGF
.getEvaluationKind(type
)) {
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
),
52 CGF
.EmitScalarInit(Init
, &D
, lv
, false);
56 CGF
.EmitComplexExprIntoLValue(Init
, lv
, /*isInit*/ true);
60 AggValueSlot::forLValue(lv
, AggValueSlot::IsDestructed
,
61 AggValueSlot::DoesNotNeedGCBarriers
,
62 AggValueSlot::IsNotAliased
,
63 AggValueSlot::DoesNotOverlap
));
66 llvm_unreachable("bad evaluation kind");
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());
81 // FIXME: __attribute__((cleanup)) ?
84 case QualType::DK_none
:
87 case QualType::DK_cxx_destructor
:
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");
98 llvm::FunctionCallee Func
;
99 llvm::Constant
*Argument
;
101 CodeGenModule
&CGM
= CGF
.CGM
;
102 QualType Type
= D
.getType();
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
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
116 bool UsingExternalHelper
= !CGM
.getCodeGenOpts().CXAAtExit
;
117 if (Record
&& (CanRegisterDestructor
|| UsingExternalHelper
)) {
118 assert(!Record
->hasTrivialDestructor());
119 CXXDestructorDecl
*Dtor
= Record
->getDestructor();
121 Func
= CGM
.getAddrAndTypeOfCXXStructor(GlobalDecl(Dtor
, Dtor_Complete
));
122 if (CGF
.getContext().getLangOpts().OpenCL
) {
124 CGM
.getTargetCodeGenInfo().getAddrSpaceOfCxaAtexitPtrParam();
125 auto DestTy
= llvm::PointerType::get(
126 CGM
.getLLVMContext(), CGM
.getContext().getTargetAddressSpace(DestAS
));
127 auto SrcAS
= D
.getType().getQualifiers().getAddressSpace();
129 Argument
= Addr
.getPointer();
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
);
135 Argument
= Addr
.getPointer();
137 // Otherwise, the standard logic requires a helper function.
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
);
146 CGM
.getCXXABI().registerGlobalDtor(CGF
, D
, Func
, Argument
);
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()));
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
)
162 // Grab the llvm.invariant.start intrinsic.
163 llvm::Intrinsic::ID InvStartID
= llvm::Intrinsic::invariant_start
;
164 // Overloaded address space type.
165 assert(Addr
->getType()->isPointerTy() && "Address must be a pointer");
166 llvm::Type
*ObjectPtr
[1] = {Addr
->getType()};
167 llvm::Function
*InvariantStart
= CGM
.getIntrinsic(InvStartID
, ObjectPtr
);
169 // Emit a call with the size in bytes of the object.
170 uint64_t Width
= Size
.getQuantity();
171 llvm::Value
*Args
[2] = {llvm::ConstantInt::getSigned(Int64Ty
, Width
), Addr
};
172 Builder
.CreateCall(InvariantStart
, Args
);
175 void CodeGenFunction::EmitCXXGlobalVarDeclInit(const VarDecl
&D
,
176 llvm::GlobalVariable
*GV
,
179 const Expr
*Init
= D
.getInit();
180 QualType T
= D
.getType();
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.
186 // struct StructWithCtor {
187 // __device__ StructWithCtor() {...}
189 // __device__ void foo() {
190 // __shared__ StructWithCtor s;
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
);
206 ConstantAddress
DeclAddr(
207 DeclPtr
, GV
->getValueType(), getContext().getDeclAlign(&D
));
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(),
217 D
.needsDestruction(getContext()) == QualType::DK_cxx_destructor
;
219 EmitDeclInit(*this, D
, DeclAddr
);
220 if (D
.getType().isConstantStorage(getContext(), true, !NeedsDtor
))
221 EmitDeclInvariant(*this, D
, DeclPtr
);
223 EmitDeclDestroy(*this, D
, DeclAddr
);
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
);
233 /// Create a stub function, suitable for being passed to atexit,
234 /// which passes the given address to the given destructor function.
235 llvm::Constant
*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
;
242 llvm::raw_svector_ostream
Out(FnName
);
243 CGM
.getCXXABI().getMangleContext().mangleDynamicAtExitDestructor(&VD
, Out
);
246 const CGFunctionInfo
&FI
= CGM
.getTypes().arrangeNullaryFunction();
247 llvm::Function
*fn
= CGM
.CreateGlobalInitOrCleanUpFunction(
248 ty
, FnName
.str(), FI
, VD
.getLocation());
250 CodeGenFunction
CGF(CGM
);
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
);
258 llvm::CallInst
*call
= CGF
.Builder
.CreateCall(dtor
, addr
);
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());
265 CGF
.FinishFunction();
267 // Get a proper function pointer.
268 FunctionProtoType::ExtProtoInfo
EPI(getContext().getDefaultCallingConvention(
269 /*IsVariadic=*/false, /*IsCXXMethod=*/false));
270 QualType fnType
= getContext().getFunctionType(getContext().VoidTy
,
271 {getContext().VoidPtrTy
}, EPI
);
272 return CGM
.getFunctionPointer(fn
, fnType
);
275 /// Create a stub function, suitable for being passed to __pt_atexit_np,
276 /// which passes the given address to the given destructor function.
277 llvm::Function
*CodeGenFunction::createTLSAtExitStub(
278 const VarDecl
&D
, llvm::FunctionCallee Dtor
, llvm::Constant
*Addr
,
279 llvm::FunctionCallee
&AtExit
) {
280 SmallString
<256> FnName
;
282 llvm::raw_svector_ostream
Out(FnName
);
283 CGM
.getCXXABI().getMangleContext().mangleDynamicAtExitDestructor(&D
, Out
);
286 const CGFunctionInfo
&FI
= CGM
.getTypes().arrangeLLVMFunctionInfo(
287 getContext().IntTy
, FnInfoOpts::None
, {getContext().IntTy
},
288 FunctionType::ExtInfo(), {}, RequiredArgs::All
);
290 // Get the stub function type, int(*)(int,...).
291 llvm::FunctionType
*StubTy
=
292 llvm::FunctionType::get(CGM
.IntTy
, {CGM
.IntTy
}, true);
294 llvm::Function
*DtorStub
= CGM
.CreateGlobalInitOrCleanUpFunction(
295 StubTy
, FnName
.str(), FI
, D
.getLocation());
297 CodeGenFunction
CGF(CGM
);
299 FunctionArgList Args
;
300 ImplicitParamDecl
IPD(CGM
.getContext(), CGM
.getContext().IntTy
,
301 ImplicitParamKind::Other
);
302 Args
.push_back(&IPD
);
303 QualType ResTy
= CGM
.getContext().IntTy
;
305 CGF
.StartFunction(GlobalDecl(&D
, DynamicInitKind::AtExit
), ResTy
, DtorStub
,
306 FI
, Args
, D
.getLocation(), D
.getInit()->getExprLoc());
308 // Emit an artificial location for this function.
309 auto AL
= ApplyDebugLocation::CreateArtificial(CGF
);
311 llvm::CallInst
*call
= CGF
.Builder
.CreateCall(Dtor
, Addr
);
313 // Make sure the call and the callee agree on calling convention.
314 if (auto *DtorFn
= dyn_cast
<llvm::Function
>(
315 Dtor
.getCallee()->stripPointerCastsAndAliases()))
316 call
->setCallingConv(DtorFn
->getCallingConv());
318 // Return 0 from function
319 CGF
.Builder
.CreateStore(llvm::Constant::getNullValue(CGM
.IntTy
),
322 CGF
.FinishFunction();
327 /// Register a global destructor using the C atexit runtime function.
328 void CodeGenFunction::registerGlobalDtorWithAtExit(const VarDecl
&VD
,
329 llvm::FunctionCallee dtor
,
330 llvm::Constant
*addr
) {
331 // Create a function which calls the destructor.
332 llvm::Constant
*dtorStub
= createAtExitStub(VD
, dtor
, addr
);
333 registerGlobalDtorWithAtExit(dtorStub
);
336 /// Register a global destructor using the LLVM 'llvm.global_dtors' global.
337 void CodeGenFunction::registerGlobalDtorWithLLVM(const VarDecl
&VD
,
338 llvm::FunctionCallee Dtor
,
339 llvm::Constant
*Addr
) {
340 // Create a function which calls the destructor.
341 llvm::Function
*dtorStub
=
342 cast
<llvm::Function
>(createAtExitStub(VD
, Dtor
, Addr
));
343 CGM
.AddGlobalDtor(dtorStub
);
346 void CodeGenFunction::registerGlobalDtorWithAtExit(llvm::Constant
*dtorStub
) {
347 // extern "C" int atexit(void (*f)(void));
348 assert(dtorStub
->getType() ==
349 llvm::PointerType::get(
350 llvm::FunctionType::get(CGM
.VoidTy
, false),
351 dtorStub
->getType()->getPointerAddressSpace()) &&
352 "Argument to atexit has a wrong type.");
354 llvm::FunctionType
*atexitTy
=
355 llvm::FunctionType::get(IntTy
, dtorStub
->getType(), false);
357 llvm::FunctionCallee atexit
=
358 CGM
.CreateRuntimeFunction(atexitTy
, "atexit", llvm::AttributeList(),
360 if (llvm::Function
*atexitFn
= dyn_cast
<llvm::Function
>(atexit
.getCallee()))
361 atexitFn
->setDoesNotThrow();
363 EmitNounwindRuntimeCall(atexit
, dtorStub
);
367 CodeGenFunction::unregisterGlobalDtorWithUnAtExit(llvm::Constant
*dtorStub
) {
368 // The unatexit subroutine unregisters __dtor functions that were previously
369 // registered by the atexit subroutine. If the referenced function is found,
370 // it is removed from the list of functions that are called at normal program
371 // termination and the unatexit returns a value of 0, otherwise a non-zero
372 // value is returned.
374 // extern "C" int unatexit(void (*f)(void));
375 assert(dtorStub
->getType() ==
376 llvm::PointerType::get(
377 llvm::FunctionType::get(CGM
.VoidTy
, false),
378 dtorStub
->getType()->getPointerAddressSpace()) &&
379 "Argument to unatexit has a wrong type.");
381 llvm::FunctionType
*unatexitTy
=
382 llvm::FunctionType::get(IntTy
, {dtorStub
->getType()}, /*isVarArg=*/false);
384 llvm::FunctionCallee unatexit
=
385 CGM
.CreateRuntimeFunction(unatexitTy
, "unatexit", llvm::AttributeList());
387 cast
<llvm::Function
>(unatexit
.getCallee())->setDoesNotThrow();
389 return EmitNounwindRuntimeCall(unatexit
, dtorStub
);
392 void CodeGenFunction::EmitCXXGuardedInit(const VarDecl
&D
,
393 llvm::GlobalVariable
*DeclPtr
,
395 // If we've been asked to forbid guard variables, emit an error now.
396 // This diagnostic is hard-coded for Darwin's use case; we can find
397 // better phrasing if someone else needs it.
398 if (CGM
.getCodeGenOpts().ForbidGuardVariables
)
399 CGM
.Error(D
.getLocation(),
400 "this initialization requires a guard variable, which "
401 "the kernel does not support");
403 CGM
.getCXXABI().EmitGuardedInit(*this, D
, DeclPtr
, PerformInit
);
406 void CodeGenFunction::EmitCXXGuardedInitBranch(llvm::Value
*NeedsInit
,
407 llvm::BasicBlock
*InitBlock
,
408 llvm::BasicBlock
*NoInitBlock
,
411 assert((Kind
== GuardKind::TlsGuard
|| D
) && "no guarded variable");
413 // A guess at how many times we will enter the initialization of a
414 // variable, depending on the kind of variable.
415 static const uint64_t InitsPerTLSVar
= 1024;
416 static const uint64_t InitsPerLocalVar
= 1024 * 1024;
418 llvm::MDNode
*Weights
;
419 if (Kind
== GuardKind::VariableGuard
&& !D
->isLocalVarDecl()) {
420 // For non-local variables, don't apply any weighting for now. Due to our
421 // use of COMDATs, we expect there to be at most one initialization of the
422 // variable per DSO, but we have no way to know how many DSOs will try to
423 // initialize the variable.
427 // FIXME: For the TLS case, collect and use profiling information to
428 // determine a more accurate brach weight.
429 if (Kind
== GuardKind::TlsGuard
|| D
->getTLSKind())
430 NumInits
= InitsPerTLSVar
;
432 NumInits
= InitsPerLocalVar
;
434 // The probability of us entering the initializer is
435 // 1 / (total number of times we attempt to initialize the variable).
436 llvm::MDBuilder
MDHelper(CGM
.getLLVMContext());
437 Weights
= MDHelper
.createBranchWeights(1, NumInits
- 1);
440 Builder
.CreateCondBr(NeedsInit
, InitBlock
, NoInitBlock
, Weights
);
443 llvm::Function
*CodeGenModule::CreateGlobalInitOrCleanUpFunction(
444 llvm::FunctionType
*FTy
, const Twine
&Name
, const CGFunctionInfo
&FI
,
445 SourceLocation Loc
, bool TLS
, llvm::GlobalVariable::LinkageTypes Linkage
) {
446 llvm::Function
*Fn
= llvm::Function::Create(FTy
, Linkage
, Name
, &getModule());
448 if (!getLangOpts().AppleKext
&& !TLS
) {
449 // Set the section if needed.
450 if (const char *Section
= getTarget().getStaticInitSectionSpecifier())
451 Fn
->setSection(Section
);
454 if (Linkage
== llvm::GlobalVariable::InternalLinkage
)
455 SetInternalFunctionAttributes(GlobalDecl(), Fn
, FI
);
457 Fn
->setCallingConv(getRuntimeCC());
459 if (!getLangOpts().Exceptions
)
460 Fn
->setDoesNotThrow();
462 if (getLangOpts().Sanitize
.has(SanitizerKind::Address
) &&
463 !isInNoSanitizeList(SanitizerKind::Address
, Fn
, Loc
))
464 Fn
->addFnAttr(llvm::Attribute::SanitizeAddress
);
466 if (getLangOpts().Sanitize
.has(SanitizerKind::KernelAddress
) &&
467 !isInNoSanitizeList(SanitizerKind::KernelAddress
, Fn
, Loc
))
468 Fn
->addFnAttr(llvm::Attribute::SanitizeAddress
);
470 if (getLangOpts().Sanitize
.has(SanitizerKind::HWAddress
) &&
471 !isInNoSanitizeList(SanitizerKind::HWAddress
, Fn
, Loc
))
472 Fn
->addFnAttr(llvm::Attribute::SanitizeHWAddress
);
474 if (getLangOpts().Sanitize
.has(SanitizerKind::KernelHWAddress
) &&
475 !isInNoSanitizeList(SanitizerKind::KernelHWAddress
, Fn
, Loc
))
476 Fn
->addFnAttr(llvm::Attribute::SanitizeHWAddress
);
478 if (getLangOpts().Sanitize
.has(SanitizerKind::MemtagStack
) &&
479 !isInNoSanitizeList(SanitizerKind::MemtagStack
, Fn
, Loc
))
480 Fn
->addFnAttr(llvm::Attribute::SanitizeMemTag
);
482 if (getLangOpts().Sanitize
.has(SanitizerKind::Thread
) &&
483 !isInNoSanitizeList(SanitizerKind::Thread
, Fn
, Loc
))
484 Fn
->addFnAttr(llvm::Attribute::SanitizeThread
);
486 if (getLangOpts().Sanitize
.has(SanitizerKind::NumericalStability
) &&
487 !isInNoSanitizeList(SanitizerKind::NumericalStability
, Fn
, Loc
))
488 Fn
->addFnAttr(llvm::Attribute::SanitizeNumericalStability
);
490 if (getLangOpts().Sanitize
.has(SanitizerKind::Memory
) &&
491 !isInNoSanitizeList(SanitizerKind::Memory
, Fn
, Loc
))
492 Fn
->addFnAttr(llvm::Attribute::SanitizeMemory
);
494 if (getLangOpts().Sanitize
.has(SanitizerKind::KernelMemory
) &&
495 !isInNoSanitizeList(SanitizerKind::KernelMemory
, Fn
, Loc
))
496 Fn
->addFnAttr(llvm::Attribute::SanitizeMemory
);
498 if (getLangOpts().Sanitize
.has(SanitizerKind::SafeStack
) &&
499 !isInNoSanitizeList(SanitizerKind::SafeStack
, Fn
, Loc
))
500 Fn
->addFnAttr(llvm::Attribute::SafeStack
);
502 if (getLangOpts().Sanitize
.has(SanitizerKind::ShadowCallStack
) &&
503 !isInNoSanitizeList(SanitizerKind::ShadowCallStack
, Fn
, Loc
))
504 Fn
->addFnAttr(llvm::Attribute::ShadowCallStack
);
509 /// Create a global pointer to a function that will initialize a global
510 /// variable. The user has requested that this pointer be emitted in a specific
512 void CodeGenModule::EmitPointerToInitFunc(const VarDecl
*D
,
513 llvm::GlobalVariable
*GV
,
514 llvm::Function
*InitFunc
,
516 llvm::GlobalVariable
*PtrArray
= new llvm::GlobalVariable(
517 TheModule
, InitFunc
->getType(), /*isConstant=*/true,
518 llvm::GlobalValue::PrivateLinkage
, InitFunc
, "__cxx_init_fn_ptr");
519 PtrArray
->setSection(ISA
->getSection());
520 addUsedGlobal(PtrArray
);
522 // If the GV is already in a comdat group, then we have to join it.
523 if (llvm::Comdat
*C
= GV
->getComdat())
524 PtrArray
->setComdat(C
);
528 CodeGenModule::EmitCXXGlobalVarDeclInitFunc(const VarDecl
*D
,
529 llvm::GlobalVariable
*Addr
,
532 // According to E.2.3.1 in CUDA-7.5 Programming guide: __device__,
533 // __constant__ and __shared__ variables defined in namespace scope,
534 // that are of class type, cannot have a non-empty constructor. All
535 // the checks have been done in Sema by now. Whatever initializers
536 // are allowed are empty and we just need to ignore them here.
537 if (getLangOpts().CUDAIsDevice
&& !getLangOpts().GPUAllowDeviceInit
&&
538 (D
->hasAttr
<CUDADeviceAttr
>() || D
->hasAttr
<CUDAConstantAttr
>() ||
539 D
->hasAttr
<CUDASharedAttr
>()))
542 // Check if we've already initialized this decl.
543 auto I
= DelayedCXXInitPosition
.find(D
);
544 if (I
!= DelayedCXXInitPosition
.end() && I
->second
== ~0U)
547 llvm::FunctionType
*FTy
= llvm::FunctionType::get(VoidTy
, false);
548 SmallString
<256> FnName
;
550 llvm::raw_svector_ostream
Out(FnName
);
551 getCXXABI().getMangleContext().mangleDynamicInitializer(D
, Out
);
554 // Create a variable initialization function.
555 llvm::Function
*Fn
= CreateGlobalInitOrCleanUpFunction(
556 FTy
, FnName
.str(), getTypes().arrangeNullaryFunction(), D
->getLocation());
558 auto *ISA
= D
->getAttr
<InitSegAttr
>();
559 CodeGenFunction(*this).GenerateCXXGlobalVarDeclInitFunc(Fn
, D
, Addr
,
562 llvm::GlobalVariable
*COMDATKey
=
563 supportsCOMDAT() && D
->isExternallyVisible() ? Addr
: nullptr;
565 if (D
->getTLSKind()) {
566 // FIXME: Should we support init_priority for thread_local?
567 // FIXME: We only need to register one __cxa_thread_atexit function for the
569 CXXThreadLocalInits
.push_back(Fn
);
570 CXXThreadLocalInitVars
.push_back(D
);
571 } else if (PerformInit
&& ISA
) {
572 // Contract with backend that "init_seg(compiler)" corresponds to priority
573 // 200 and "init_seg(lib)" corresponds to priority 400.
575 if (ISA
->getSection() == ".CRT$XCC")
577 else if (ISA
->getSection() == ".CRT$XCL")
581 AddGlobalCtor(Fn
, Priority
, ~0U, COMDATKey
);
583 EmitPointerToInitFunc(D
, Addr
, Fn
, ISA
);
584 } else if (auto *IPA
= D
->getAttr
<InitPriorityAttr
>()) {
585 OrderGlobalInitsOrStermFinalizers
Key(IPA
->getPriority(),
586 PrioritizedCXXGlobalInits
.size());
587 PrioritizedCXXGlobalInits
.push_back(std::make_pair(Key
, Fn
));
588 } else if (isTemplateInstantiation(D
->getTemplateSpecializationKind()) ||
589 getContext().GetGVALinkageForVariable(D
) == GVA_DiscardableODR
||
590 D
->hasAttr
<SelectAnyAttr
>()) {
591 // C++ [basic.start.init]p2:
592 // Definitions of explicitly specialized class template static data
593 // members have ordered initialization. Other class template static data
594 // members (i.e., implicitly or explicitly instantiated specializations)
595 // have unordered initialization.
597 // As a consequence, we can put them into their own llvm.global_ctors entry.
599 // If the global is externally visible, put the initializer into a COMDAT
600 // group with the global being initialized. On most platforms, this is a
601 // minor startup time optimization. In the MS C++ ABI, there are no guard
602 // variables, so this COMDAT key is required for correctness.
604 // SelectAny globals will be comdat-folded. Put the initializer into a
605 // COMDAT group associated with the global, so the initializers get folded
607 I
= DelayedCXXInitPosition
.find(D
);
608 // CXXGlobalInits.size() is the lex order number for the next deferred
609 // VarDecl. Use it when the current VarDecl is non-deferred. Although this
610 // lex order number is shared between current VarDecl and some following
611 // VarDecls, their order of insertion into `llvm.global_ctors` is the same
612 // as the lexing order and the following stable sort would preserve such
615 I
== DelayedCXXInitPosition
.end() ? CXXGlobalInits
.size() : I
->second
;
616 AddGlobalCtor(Fn
, 65535, LexOrder
, COMDATKey
);
617 if (COMDATKey
&& (getTriple().isOSBinFormatELF() ||
618 getTarget().getCXXABI().isMicrosoft())) {
619 // When COMDAT is used on ELF or in the MS C++ ABI, the key must be in
620 // llvm.used to prevent linker GC.
621 addUsedGlobal(COMDATKey
);
624 // If we used a COMDAT key for the global ctor, the init function can be
625 // discarded if the global ctor entry is discarded.
626 // FIXME: Do we need to restrict this to ELF and Wasm?
627 llvm::Comdat
*C
= Addr
->getComdat();
628 if (COMDATKey
&& C
&&
629 (getTarget().getTriple().isOSBinFormatELF() ||
630 getTarget().getTriple().isOSBinFormatWasm())) {
634 I
= DelayedCXXInitPosition
.find(D
); // Re-do lookup in case of re-hash.
635 if (I
== DelayedCXXInitPosition
.end()) {
636 CXXGlobalInits
.push_back(Fn
);
637 } else if (I
->second
!= ~0U) {
638 assert(I
->second
< CXXGlobalInits
.size() &&
639 CXXGlobalInits
[I
->second
] == nullptr);
640 CXXGlobalInits
[I
->second
] = Fn
;
644 // Remember that we already emitted the initializer for this global.
645 DelayedCXXInitPosition
[D
] = ~0U;
648 void CodeGenModule::EmitCXXThreadLocalInitFunc() {
649 getCXXABI().EmitThreadLocalInitFuncs(
650 *this, CXXThreadLocals
, CXXThreadLocalInits
, CXXThreadLocalInitVars
);
652 CXXThreadLocalInits
.clear();
653 CXXThreadLocalInitVars
.clear();
654 CXXThreadLocals
.clear();
657 /* Build the initializer for a C++20 module:
658 This is arranged to be run only once regardless of how many times the module
659 might be included transitively. This arranged by using a guard variable.
661 If there are no initializers at all (and also no imported modules) we reduce
662 this to an empty function (since the Itanium ABI requires that this function
663 be available to a caller, which might be produced by a different
666 First we call any initializers for imported modules.
667 We then call initializers for the Global Module Fragment (if present)
668 We then call initializers for the current module.
669 We then call initializers for the Private Module Fragment (if present)
672 void CodeGenModule::EmitCXXModuleInitFunc(Module
*Primary
) {
673 assert(Primary
->isInterfaceOrPartition() &&
674 "The function should only be called for C++20 named module interface"
677 while (!CXXGlobalInits
.empty() && !CXXGlobalInits
.back())
678 CXXGlobalInits
.pop_back();
680 // As noted above, we create the function, even if it is empty.
681 // Module initializers for imported modules are emitted first.
683 // Collect all the modules that we import
684 llvm::SmallSetVector
<Module
*, 8> AllImports
;
685 // Ones that we export
686 for (auto I
: Primary
->Exports
)
687 AllImports
.insert(I
.getPointer());
688 // Ones that we only import.
689 for (Module
*M
: Primary
->Imports
)
690 AllImports
.insert(M
);
691 // Ones that we import in the global module fragment or the private module
693 for (Module
*SubM
: Primary
->submodules()) {
694 assert((SubM
->isGlobalModule() || SubM
->isPrivateModule()) &&
695 "The sub modules of C++20 module unit should only be global module "
696 "fragments or private module framents.");
697 assert(SubM
->Exports
.empty() &&
698 "The global mdoule fragments and the private module fragments are "
699 "not allowed to export import modules.");
700 for (Module
*M
: SubM
->Imports
)
701 AllImports
.insert(M
);
704 SmallVector
<llvm::Function
*, 8> ModuleInits
;
705 for (Module
*M
: AllImports
) {
706 // No Itanium initializer in header like modules.
707 if (M
->isHeaderLikeModule())
708 continue; // TODO: warn of mixed use of module map modules and C++20?
709 // We're allowed to skip the initialization if we are sure it doesn't
711 if (!M
->isNamedModuleInterfaceHasInit())
713 llvm::FunctionType
*FTy
= llvm::FunctionType::get(VoidTy
, false);
714 SmallString
<256> FnName
;
716 llvm::raw_svector_ostream
Out(FnName
);
717 cast
<ItaniumMangleContext
>(getCXXABI().getMangleContext())
718 .mangleModuleInitializer(M
, Out
);
720 assert(!GetGlobalValue(FnName
.str()) &&
721 "We should only have one use of the initializer call");
722 llvm::Function
*Fn
= llvm::Function::Create(
723 FTy
, llvm::Function::ExternalLinkage
, FnName
.str(), &getModule());
724 ModuleInits
.push_back(Fn
);
727 // Add any initializers with specified priority; this uses the same approach
728 // as EmitCXXGlobalInitFunc().
729 if (!PrioritizedCXXGlobalInits
.empty()) {
730 SmallVector
<llvm::Function
*, 8> LocalCXXGlobalInits
;
731 llvm::array_pod_sort(PrioritizedCXXGlobalInits
.begin(),
732 PrioritizedCXXGlobalInits
.end());
733 for (SmallVectorImpl
<GlobalInitData
>::iterator
734 I
= PrioritizedCXXGlobalInits
.begin(),
735 E
= PrioritizedCXXGlobalInits
.end();
737 SmallVectorImpl
<GlobalInitData
>::iterator PrioE
=
738 std::upper_bound(I
+ 1, E
, *I
, GlobalInitPriorityCmp());
740 for (; I
< PrioE
; ++I
)
741 ModuleInits
.push_back(I
->second
);
745 // Now append the ones without specified priority.
746 for (auto *F
: CXXGlobalInits
)
747 ModuleInits
.push_back(F
);
749 llvm::FunctionType
*FTy
= llvm::FunctionType::get(VoidTy
, false);
750 const CGFunctionInfo
&FI
= getTypes().arrangeNullaryFunction();
752 // We now build the initializer for this module, which has a mangled name
753 // as per the Itanium ABI . The action of the initializer is guarded so that
754 // each init is run just once (even though a module might be imported
755 // multiple times via nested use).
758 SmallString
<256> InitFnName
;
759 llvm::raw_svector_ostream
Out(InitFnName
);
760 cast
<ItaniumMangleContext
>(getCXXABI().getMangleContext())
761 .mangleModuleInitializer(Primary
, Out
);
762 Fn
= CreateGlobalInitOrCleanUpFunction(
763 FTy
, llvm::Twine(InitFnName
), FI
, SourceLocation(), false,
764 llvm::GlobalVariable::ExternalLinkage
);
766 // If we have a completely empty initializer then we do not want to create
767 // the guard variable.
768 ConstantAddress GuardAddr
= ConstantAddress::invalid();
769 if (!ModuleInits
.empty()) {
770 // Create the guard var.
771 llvm::GlobalVariable
*Guard
= new llvm::GlobalVariable(
772 getModule(), Int8Ty
, /*isConstant=*/false,
773 llvm::GlobalVariable::InternalLinkage
,
774 llvm::ConstantInt::get(Int8Ty
, 0), InitFnName
.str() + "__in_chrg");
775 CharUnits GuardAlign
= CharUnits::One();
776 Guard
->setAlignment(GuardAlign
.getAsAlign());
777 GuardAddr
= ConstantAddress(Guard
, Int8Ty
, GuardAlign
);
779 CodeGenFunction(*this).GenerateCXXGlobalInitFunc(Fn
, ModuleInits
,
783 // We allow for the case that a module object is added to a linked binary
784 // without a specific call to the the initializer. This also ensures that
785 // implementation partition initializers are called when the partition
786 // is not imported as an interface.
789 // See the comment in EmitCXXGlobalInitFunc about OpenCL global init
791 if (getLangOpts().OpenCL
) {
792 GenKernelArgMetadata(Fn
);
793 Fn
->setCallingConv(llvm::CallingConv::SPIR_KERNEL
);
796 assert(!getLangOpts().CUDA
|| !getLangOpts().CUDAIsDevice
||
797 getLangOpts().GPUAllowDeviceInit
);
798 if (getLangOpts().HIP
&& getLangOpts().CUDAIsDevice
) {
799 Fn
->setCallingConv(llvm::CallingConv::AMDGPU_KERNEL
);
800 Fn
->addFnAttr("device-init");
803 // We are done with the inits.
805 PrioritizedCXXGlobalInits
.clear();
806 CXXGlobalInits
.clear();
810 static SmallString
<128> getTransformedFileName(llvm::Module
&M
) {
811 SmallString
<128> FileName
= llvm::sys::path::filename(M
.getName());
813 if (FileName
.empty())
816 for (size_t i
= 0; i
< FileName
.size(); ++i
) {
817 // Replace everything that's not [a-zA-Z0-9._] with a _. This set happens
818 // to be the set of C preprocessing numbers.
819 if (!isPreprocessingNumberBody(FileName
[i
]))
826 static std::string
getPrioritySuffix(unsigned int Priority
) {
827 assert(Priority
<= 65535 && "Priority should always be <= 65535.");
829 // Compute the function suffix from priority. Prepend with zeroes to make
830 // sure the function names are also ordered as priorities.
831 std::string PrioritySuffix
= llvm::utostr(Priority
);
832 PrioritySuffix
= std::string(6 - PrioritySuffix
.size(), '0') + PrioritySuffix
;
834 return PrioritySuffix
;
838 CodeGenModule::EmitCXXGlobalInitFunc() {
839 while (!CXXGlobalInits
.empty() && !CXXGlobalInits
.back())
840 CXXGlobalInits
.pop_back();
842 // When we import C++20 modules, we must run their initializers first.
843 SmallVector
<llvm::Function
*, 8> ModuleInits
;
844 if (CXX20ModuleInits
)
845 for (Module
*M
: ImportedModules
) {
846 // No Itanium initializer in header like modules.
847 if (M
->isHeaderLikeModule())
849 // We're allowed to skip the initialization if we are sure it doesn't
851 if (!M
->isNamedModuleInterfaceHasInit())
853 llvm::FunctionType
*FTy
= llvm::FunctionType::get(VoidTy
, false);
854 SmallString
<256> FnName
;
856 llvm::raw_svector_ostream
Out(FnName
);
857 cast
<ItaniumMangleContext
>(getCXXABI().getMangleContext())
858 .mangleModuleInitializer(M
, Out
);
860 assert(!GetGlobalValue(FnName
.str()) &&
861 "We should only have one use of the initializer call");
862 llvm::Function
*Fn
= llvm::Function::Create(
863 FTy
, llvm::Function::ExternalLinkage
, FnName
.str(), &getModule());
864 ModuleInits
.push_back(Fn
);
867 if (ModuleInits
.empty() && CXXGlobalInits
.empty() &&
868 PrioritizedCXXGlobalInits
.empty())
871 llvm::FunctionType
*FTy
= llvm::FunctionType::get(VoidTy
, false);
872 const CGFunctionInfo
&FI
= getTypes().arrangeNullaryFunction();
874 // Create our global prioritized initialization function.
875 if (!PrioritizedCXXGlobalInits
.empty()) {
876 SmallVector
<llvm::Function
*, 8> LocalCXXGlobalInits
;
877 llvm::array_pod_sort(PrioritizedCXXGlobalInits
.begin(),
878 PrioritizedCXXGlobalInits
.end());
879 // Iterate over "chunks" of ctors with same priority and emit each chunk
880 // into separate function. Note - everything is sorted first by priority,
881 // second - by lex order, so we emit ctor functions in proper order.
882 for (SmallVectorImpl
<GlobalInitData
>::iterator
883 I
= PrioritizedCXXGlobalInits
.begin(),
884 E
= PrioritizedCXXGlobalInits
.end(); I
!= E
; ) {
885 SmallVectorImpl
<GlobalInitData
>::iterator
886 PrioE
= std::upper_bound(I
+ 1, E
, *I
, GlobalInitPriorityCmp());
888 LocalCXXGlobalInits
.clear();
890 unsigned int Priority
= I
->first
.priority
;
891 llvm::Function
*Fn
= CreateGlobalInitOrCleanUpFunction(
892 FTy
, "_GLOBAL__I_" + getPrioritySuffix(Priority
), FI
);
894 // Prepend the module inits to the highest priority set.
895 if (!ModuleInits
.empty()) {
896 for (auto *F
: ModuleInits
)
897 LocalCXXGlobalInits
.push_back(F
);
901 for (; I
< PrioE
; ++I
)
902 LocalCXXGlobalInits
.push_back(I
->second
);
904 CodeGenFunction(*this).GenerateCXXGlobalInitFunc(Fn
, LocalCXXGlobalInits
);
905 AddGlobalCtor(Fn
, Priority
);
907 PrioritizedCXXGlobalInits
.clear();
910 if (getCXXABI().useSinitAndSterm() && ModuleInits
.empty() &&
911 CXXGlobalInits
.empty())
914 for (auto *F
: CXXGlobalInits
)
915 ModuleInits
.push_back(F
);
916 CXXGlobalInits
.clear();
918 // Include the filename in the symbol name. Including "sub_" matches gcc
919 // and makes sure these symbols appear lexicographically behind the symbols
920 // with priority emitted above. Module implementation units behave the same
921 // way as a non-modular TU with imports.
923 if (CXX20ModuleInits
&& getContext().getCurrentNamedModule() &&
924 !getContext().getCurrentNamedModule()->isModuleImplementation()) {
925 SmallString
<256> InitFnName
;
926 llvm::raw_svector_ostream
Out(InitFnName
);
927 cast
<ItaniumMangleContext
>(getCXXABI().getMangleContext())
928 .mangleModuleInitializer(getContext().getCurrentNamedModule(), Out
);
929 Fn
= CreateGlobalInitOrCleanUpFunction(
930 FTy
, llvm::Twine(InitFnName
), FI
, SourceLocation(), false,
931 llvm::GlobalVariable::ExternalLinkage
);
933 Fn
= CreateGlobalInitOrCleanUpFunction(
935 llvm::Twine("_GLOBAL__sub_I_", getTransformedFileName(getModule())),
938 CodeGenFunction(*this).GenerateCXXGlobalInitFunc(Fn
, ModuleInits
);
941 // In OpenCL global init functions must be converted to kernels in order to
942 // be able to launch them from the host.
943 // FIXME: Some more work might be needed to handle destructors correctly.
944 // Current initialization function makes use of function pointers callbacks.
945 // We can't support function pointers especially between host and device.
946 // However it seems global destruction has little meaning without any
947 // dynamic resource allocation on the device and program scope variables are
948 // destroyed by the runtime when program is released.
949 if (getLangOpts().OpenCL
) {
950 GenKernelArgMetadata(Fn
);
951 Fn
->setCallingConv(llvm::CallingConv::SPIR_KERNEL
);
954 assert(!getLangOpts().CUDA
|| !getLangOpts().CUDAIsDevice
||
955 getLangOpts().GPUAllowDeviceInit
);
956 if (getLangOpts().HIP
&& getLangOpts().CUDAIsDevice
) {
957 Fn
->setCallingConv(llvm::CallingConv::AMDGPU_KERNEL
);
958 Fn
->addFnAttr("device-init");
964 void CodeGenModule::EmitCXXGlobalCleanUpFunc() {
965 if (CXXGlobalDtorsOrStermFinalizers
.empty() &&
966 PrioritizedCXXStermFinalizers
.empty())
969 llvm::FunctionType
*FTy
= llvm::FunctionType::get(VoidTy
, false);
970 const CGFunctionInfo
&FI
= getTypes().arrangeNullaryFunction();
972 // Create our global prioritized cleanup function.
973 if (!PrioritizedCXXStermFinalizers
.empty()) {
974 SmallVector
<CXXGlobalDtorsOrStermFinalizer_t
, 8> LocalCXXStermFinalizers
;
975 llvm::array_pod_sort(PrioritizedCXXStermFinalizers
.begin(),
976 PrioritizedCXXStermFinalizers
.end());
977 // Iterate over "chunks" of dtors with same priority and emit each chunk
978 // into separate function. Note - everything is sorted first by priority,
979 // second - by lex order, so we emit dtor functions in proper order.
980 for (SmallVectorImpl
<StermFinalizerData
>::iterator
981 I
= PrioritizedCXXStermFinalizers
.begin(),
982 E
= PrioritizedCXXStermFinalizers
.end();
984 SmallVectorImpl
<StermFinalizerData
>::iterator PrioE
=
985 std::upper_bound(I
+ 1, E
, *I
, StermFinalizerPriorityCmp());
987 LocalCXXStermFinalizers
.clear();
989 unsigned int Priority
= I
->first
.priority
;
990 llvm::Function
*Fn
= CreateGlobalInitOrCleanUpFunction(
991 FTy
, "_GLOBAL__a_" + getPrioritySuffix(Priority
), FI
);
993 for (; I
< PrioE
; ++I
) {
994 llvm::FunctionCallee DtorFn
= I
->second
;
995 LocalCXXStermFinalizers
.emplace_back(DtorFn
.getFunctionType(),
996 DtorFn
.getCallee(), nullptr);
999 CodeGenFunction(*this).GenerateCXXGlobalCleanUpFunc(
1000 Fn
, LocalCXXStermFinalizers
);
1001 AddGlobalDtor(Fn
, Priority
);
1003 PrioritizedCXXStermFinalizers
.clear();
1006 if (CXXGlobalDtorsOrStermFinalizers
.empty())
1009 // Create our global cleanup function.
1010 llvm::Function
*Fn
=
1011 CreateGlobalInitOrCleanUpFunction(FTy
, "_GLOBAL__D_a", FI
);
1013 CodeGenFunction(*this).GenerateCXXGlobalCleanUpFunc(
1014 Fn
, CXXGlobalDtorsOrStermFinalizers
);
1016 CXXGlobalDtorsOrStermFinalizers
.clear();
1019 /// Emit the code necessary to initialize the given global variable.
1020 void CodeGenFunction::GenerateCXXGlobalVarDeclInitFunc(llvm::Function
*Fn
,
1022 llvm::GlobalVariable
*Addr
,
1024 // Check if we need to emit debug info for variable initializer.
1025 if (D
->hasAttr
<NoDebugAttr
>())
1026 DebugInfo
= nullptr; // disable debug info indefinitely for this function
1028 CurEHLocation
= D
->getBeginLoc();
1030 StartFunction(GlobalDecl(D
, DynamicInitKind::Initializer
),
1031 getContext().VoidTy
, Fn
, getTypes().arrangeNullaryFunction(),
1033 // Emit an artificial location for this function.
1034 auto AL
= ApplyDebugLocation::CreateArtificial(*this);
1036 // Use guarded initialization if the global variable is weak. This
1037 // occurs for, e.g., instantiated static data members and
1038 // definitions explicitly marked weak.
1040 // Also use guarded initialization for a variable with dynamic TLS and
1041 // unordered initialization. (If the initialization is ordered, the ABI
1042 // layer will guard the whole-TU initialization for us.)
1043 if (Addr
->hasWeakLinkage() || Addr
->hasLinkOnceLinkage() ||
1044 (D
->getTLSKind() == VarDecl::TLS_Dynamic
&&
1045 isTemplateInstantiation(D
->getTemplateSpecializationKind()))) {
1046 EmitCXXGuardedInit(*D
, Addr
, PerformInit
);
1048 EmitCXXGlobalVarDeclInit(*D
, Addr
, PerformInit
);
1051 if (getLangOpts().HLSL
)
1052 CGM
.getHLSLRuntime().annotateHLSLResource(D
, Addr
);
1058 CodeGenFunction::GenerateCXXGlobalInitFunc(llvm::Function
*Fn
,
1059 ArrayRef
<llvm::Function
*> Decls
,
1060 ConstantAddress Guard
) {
1062 auto NL
= ApplyDebugLocation::CreateEmpty(*this);
1063 StartFunction(GlobalDecl(), getContext().VoidTy
, Fn
,
1064 getTypes().arrangeNullaryFunction(), FunctionArgList());
1065 // Emit an artificial location for this function.
1066 auto AL
= ApplyDebugLocation::CreateArtificial(*this);
1068 llvm::BasicBlock
*ExitBlock
= nullptr;
1069 if (Guard
.isValid()) {
1070 // If we have a guard variable, check whether we've already performed
1071 // these initializations. This happens for TLS initialization functions.
1072 llvm::Value
*GuardVal
= Builder
.CreateLoad(Guard
);
1073 llvm::Value
*Uninit
= Builder
.CreateIsNull(GuardVal
,
1074 "guard.uninitialized");
1075 llvm::BasicBlock
*InitBlock
= createBasicBlock("init");
1076 ExitBlock
= createBasicBlock("exit");
1077 EmitCXXGuardedInitBranch(Uninit
, InitBlock
, ExitBlock
,
1078 GuardKind::TlsGuard
, nullptr);
1079 EmitBlock(InitBlock
);
1080 // Mark as initialized before initializing anything else. If the
1081 // initializers use previously-initialized thread_local vars, that's
1082 // probably supposed to be OK, but the standard doesn't say.
1083 Builder
.CreateStore(llvm::ConstantInt::get(GuardVal
->getType(),1), Guard
);
1085 // The guard variable can't ever change again.
1088 CharUnits::fromQuantity(
1089 CGM
.getDataLayout().getTypeAllocSize(GuardVal
->getType())));
1092 RunCleanupsScope
Scope(*this);
1094 // When building in Objective-C++ ARC mode, create an autorelease pool
1095 // around the global initializers.
1096 if (getLangOpts().ObjCAutoRefCount
&& getLangOpts().CPlusPlus
) {
1097 llvm::Value
*token
= EmitObjCAutoreleasePoolPush();
1098 EmitObjCAutoreleasePoolCleanup(token
);
1101 for (unsigned i
= 0, e
= Decls
.size(); i
!= e
; ++i
)
1103 EmitRuntimeCall(Decls
[i
]);
1105 Scope
.ForceCleanup();
1108 Builder
.CreateBr(ExitBlock
);
1109 EmitBlock(ExitBlock
);
1116 void CodeGenFunction::GenerateCXXGlobalCleanUpFunc(
1118 ArrayRef
<std::tuple
<llvm::FunctionType
*, llvm::WeakTrackingVH
,
1120 DtorsOrStermFinalizers
) {
1122 auto NL
= ApplyDebugLocation::CreateEmpty(*this);
1123 StartFunction(GlobalDecl(), getContext().VoidTy
, Fn
,
1124 getTypes().arrangeNullaryFunction(), FunctionArgList());
1125 // Emit an artificial location for this function.
1126 auto AL
= ApplyDebugLocation::CreateArtificial(*this);
1128 // Emit the cleanups, in reverse order from construction.
1129 for (unsigned i
= 0, e
= DtorsOrStermFinalizers
.size(); i
!= e
; ++i
) {
1130 llvm::FunctionType
*CalleeTy
;
1131 llvm::Value
*Callee
;
1132 llvm::Constant
*Arg
;
1133 std::tie(CalleeTy
, Callee
, Arg
) = DtorsOrStermFinalizers
[e
- i
- 1];
1135 llvm::CallInst
*CI
= nullptr;
1136 if (Arg
== nullptr) {
1138 CGM
.getCXXABI().useSinitAndSterm() &&
1139 "Arg could not be nullptr unless using sinit and sterm functions.");
1140 CI
= Builder
.CreateCall(CalleeTy
, Callee
);
1142 CI
= Builder
.CreateCall(CalleeTy
, Callee
, Arg
);
1144 // Make sure the call and the callee agree on calling convention.
1145 if (llvm::Function
*F
= dyn_cast
<llvm::Function
>(Callee
))
1146 CI
->setCallingConv(F
->getCallingConv());
1153 /// generateDestroyHelper - Generates a helper function which, when
1154 /// invoked, destroys the given object. The address of the object
1155 /// should be in global memory.
1156 llvm::Function
*CodeGenFunction::generateDestroyHelper(
1157 Address addr
, QualType type
, Destroyer
*destroyer
,
1158 bool useEHCleanupForArray
, const VarDecl
*VD
) {
1159 FunctionArgList args
;
1160 ImplicitParamDecl
Dst(getContext(), getContext().VoidPtrTy
,
1161 ImplicitParamKind::Other
);
1162 args
.push_back(&Dst
);
1164 const CGFunctionInfo
&FI
=
1165 CGM
.getTypes().arrangeBuiltinFunctionDeclaration(getContext().VoidTy
, args
);
1166 llvm::FunctionType
*FTy
= CGM
.getTypes().GetFunctionType(FI
);
1167 llvm::Function
*fn
= CGM
.CreateGlobalInitOrCleanUpFunction(
1168 FTy
, "__cxx_global_array_dtor", FI
, VD
->getLocation());
1170 CurEHLocation
= VD
->getBeginLoc();
1172 StartFunction(GlobalDecl(VD
, DynamicInitKind::GlobalArrayDestructor
),
1173 getContext().VoidTy
, fn
, FI
, args
);
1174 // Emit an artificial location for this function.
1175 auto AL
= ApplyDebugLocation::CreateArtificial(*this);
1177 emitDestroy(addr
, type
, destroyer
, useEHCleanupForArray
);