clang 22.0.0git
CGDeclCXX.cpp
Go to the documentation of this file.
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 "CGDebugInfo.h"
15#include "CGHLSLRuntime.h"
16#include "CGObjCRuntime.h"
17#include "CGOpenMPRuntime.h"
18#include "CodeGenFunction.h"
19#include "TargetInfo.h"
20#include "clang/AST/Attr.h"
22#include "llvm/ADT/StringExtras.h"
23#include "llvm/IR/Intrinsics.h"
24#include "llvm/IR/MDBuilder.h"
25#include "llvm/Support/Path.h"
26
27using namespace clang;
28using namespace CodeGen;
29
30static void EmitDeclInit(CodeGenFunction &CGF, const VarDecl &D,
31 ConstantAddress DeclPtr) {
32 assert(
33 (D.hasGlobalStorage() ||
34 (D.hasLocalStorage() && CGF.getContext().getLangOpts().OpenCLCPlusPlus)) &&
35 "VarDecl must have global or local (in the case of OpenCL) storage!");
36 assert(!D.getType()->isReferenceType() &&
37 "Should not call EmitDeclInit on a reference!");
38
39 QualType type = D.getType();
40 LValue lv = CGF.MakeAddrLValue(DeclPtr, type);
41
42 const Expr *Init = D.getInit();
43 switch (CGF.getEvaluationKind(type)) {
44 case TEK_Scalar: {
45 CodeGenModule &CGM = CGF.CGM;
46 if (lv.isObjCStrong())
48 DeclPtr, D.getTLSKind());
49 else if (lv.isObjCWeak())
51 DeclPtr);
52 else
53 CGF.EmitScalarInit(Init, &D, lv, false);
54 return;
55 }
56 case TEK_Complex:
57 CGF.EmitComplexExprIntoLValue(Init, lv, /*isInit*/ true);
58 return;
59 case TEK_Aggregate:
60 CGF.EmitAggExpr(Init,
65 return;
66 }
67 llvm_unreachable("bad evaluation kind");
68}
69
70/// Emit code to cause the destruction of the given variable with
71/// static storage duration.
72static void EmitDeclDestroy(CodeGenFunction &CGF, const VarDecl &D,
74 // Honor __attribute__((no_destroy)) and bail instead of attempting
75 // to emit a reference to a possibly nonexistent destructor, which
76 // in turn can cause a crash. This will result in a global constructor
77 // that isn't balanced out by a destructor call as intended by the
78 // attribute. This also checks for -fno-c++-static-destructors and
79 // bails even if the attribute is not present.
80 QualType::DestructionKind DtorKind = D.needsDestruction(CGF.getContext());
81
82 // FIXME: __attribute__((cleanup)) ?
83
84 switch (DtorKind) {
86 return;
87
89 break;
90
94 // We don't care about releasing objects during process teardown.
95 assert(!D.getTLSKind() && "should have rejected this");
96 return;
97 }
98
99 llvm::FunctionCallee Func;
100 llvm::Constant *Argument;
101
102 CodeGenModule &CGM = CGF.CGM;
103 QualType Type = D.getType();
104
105 // Special-case non-array C++ destructors, if they have the right signature.
106 // Under some ABIs, destructors return this instead of void, and cannot be
107 // passed directly to __cxa_atexit if the target does not allow this
108 // mismatch.
110 bool CanRegisterDestructor =
111 Record && (!CGM.getCXXABI().HasThisReturn(
112 GlobalDecl(Record->getDestructor(), Dtor_Complete)) ||
114 // If __cxa_atexit is disabled via a flag, a different helper function is
115 // generated elsewhere which uses atexit instead, and it takes the destructor
116 // directly.
117 bool UsingExternalHelper = !CGM.getCodeGenOpts().CXAAtExit;
118 if (Record && (CanRegisterDestructor || UsingExternalHelper)) {
119 assert(!Record->hasTrivialDestructor());
120 CXXDestructorDecl *Dtor = Record->getDestructor();
121
123 if (CGF.getContext().getLangOpts().OpenCL) {
124 auto DestAS =
126 auto DestTy = llvm::PointerType::get(
127 CGM.getLLVMContext(), CGM.getContext().getTargetAddressSpace(DestAS));
128 auto SrcAS = D.getType().getQualifiers().getAddressSpace();
129 if (DestAS == SrcAS)
130 Argument = Addr.getPointer();
131 else
132 // FIXME: On addr space mismatch we are passing NULL. The generation
133 // of the global destructor function should be adjusted accordingly.
134 Argument = llvm::ConstantPointerNull::get(DestTy);
135 } else {
136 Argument = Addr.getPointer();
137 }
138 // Otherwise, the standard logic requires a helper function.
139 } else {
140 Addr = Addr.withElementType(CGF.ConvertTypeForMem(Type));
141 Func = CodeGenFunction(CGM)
143 CGF.needsEHCleanup(DtorKind), &D);
144 Argument = llvm::Constant::getNullValue(CGF.Int8PtrTy);
145 }
146
147 CGM.getCXXABI().registerGlobalDtor(CGF, D, Func, Argument);
148}
149
150/// Emit code to cause the variable at the given address to be considered as
151/// constant from this point onwards.
153 llvm::Constant *Addr) {
154 return CGF.EmitInvariantStart(
155 Addr, CGF.getContext().getTypeSizeInChars(D.getType()));
156}
157
159 // Do not emit the intrinsic if we're not optimizing.
160 if (!CGM.getCodeGenOpts().OptimizationLevel)
161 return;
162
163 // Grab the llvm.invariant.start intrinsic.
164 llvm::Intrinsic::ID InvStartID = llvm::Intrinsic::invariant_start;
165 // Overloaded address space type.
166 assert(Addr->getType()->isPointerTy() && "Address must be a pointer");
167 llvm::Type *ObjectPtr[1] = {Addr->getType()};
168 llvm::Function *InvariantStart = CGM.getIntrinsic(InvStartID, ObjectPtr);
169
170 // Emit a call with the size in bytes of the object.
171 uint64_t Width = Size.getQuantity();
172 llvm::Value *Args[2] = {llvm::ConstantInt::getSigned(Int64Ty, Width), Addr};
173 Builder.CreateCall(InvariantStart, Args);
174}
175
177 llvm::GlobalVariable *GV,
178 bool PerformInit) {
179
180 const Expr *Init = D.getInit();
181 QualType T = D.getType();
182
183 // The address space of a static local variable (DeclPtr) may be different
184 // from the address space of the "this" argument of the constructor. In that
185 // case, we need an addrspacecast before calling the constructor.
186 //
187 // struct StructWithCtor {
188 // __device__ StructWithCtor() {...}
189 // };
190 // __device__ void foo() {
191 // __shared__ StructWithCtor s;
192 // ...
193 // }
194 //
195 // For example, in the above CUDA code, the static local variable s has a
196 // "shared" address space qualifier, but the constructor of StructWithCtor
197 // expects "this" in the "generic" address space.
198 unsigned ExpectedAddrSpace = getTypes().getTargetAddressSpace(T);
199 unsigned ActualAddrSpace = GV->getAddressSpace();
200 llvm::Constant *DeclPtr = GV;
201 if (ActualAddrSpace != ExpectedAddrSpace) {
202 llvm::PointerType *PTy =
203 llvm::PointerType::get(getLLVMContext(), ExpectedAddrSpace);
204 DeclPtr = llvm::ConstantExpr::getAddrSpaceCast(DeclPtr, PTy);
205 }
206
207 ConstantAddress DeclAddr(
208 DeclPtr, GV->getValueType(), getContext().getDeclAlign(&D));
209
210 if (!T->isReferenceType()) {
211 if (getLangOpts().OpenMP && !getLangOpts().OpenMPSimd &&
212 D.hasAttr<OMPThreadPrivateDeclAttr>()) {
214 &D, DeclAddr, D.getAttr<OMPThreadPrivateDeclAttr>()->getLocation(),
215 PerformInit, this);
216 }
217 bool NeedsDtor =
218 D.needsDestruction(getContext()) == QualType::DK_cxx_destructor;
219 if (PerformInit)
220 EmitDeclInit(*this, D, DeclAddr);
221 if (D.getType().isConstantStorage(getContext(), true, !NeedsDtor))
222 EmitDeclInvariant(*this, D, DeclPtr);
223 else
224 EmitDeclDestroy(*this, D, DeclAddr);
225 return;
226 }
227
228 assert(PerformInit && "cannot have constant initializer which needs "
229 "destruction for reference");
231 EmitStoreOfScalar(RV.getScalarVal(), DeclAddr, false, T);
232}
233
234/// Create a stub function, suitable for being passed to atexit,
235/// which passes the given address to the given destructor function.
237 llvm::FunctionCallee dtor,
238 llvm::Constant *addr) {
239 // Get the destructor function type, void(*)(void).
240 llvm::FunctionType *ty = llvm::FunctionType::get(CGM.VoidTy, false);
241 SmallString<256> FnName;
242 {
243 llvm::raw_svector_ostream Out(FnName);
245 }
246
248 llvm::Function *fn = CGM.CreateGlobalInitOrCleanUpFunction(
249 ty, FnName.str(), FI, VD.getLocation());
250
251 CodeGenFunction CGF(CGM);
252
255 VD.getLocation(), VD.getInit()->getExprLoc());
256 // Emit an artificial location for this function.
258
259 llvm::CallInst *call = CGF.Builder.CreateCall(dtor, addr);
260
261 // Make sure the call and the callee agree on calling convention.
262 if (auto *dtorFn = dyn_cast<llvm::Function>(
263 dtor.getCallee()->stripPointerCastsAndAliases()))
264 call->setCallingConv(dtorFn->getCallingConv());
265
266 CGF.FinishFunction();
267
268 // Get a proper function pointer.
269 FunctionProtoType::ExtProtoInfo EPI(getContext().getDefaultCallingConvention(
270 /*IsVariadic=*/false, /*IsCXXMethod=*/false));
272 {getContext().VoidPtrTy}, EPI);
273 return CGM.getFunctionPointer(fn, fnType);
274}
275
276/// Create a stub function, suitable for being passed to __pt_atexit_np,
277/// which passes the given address to the given destructor function.
279 const VarDecl &D, llvm::FunctionCallee Dtor, llvm::Constant *Addr,
280 llvm::FunctionCallee &AtExit) {
281 SmallString<256> FnName;
282 {
283 llvm::raw_svector_ostream Out(FnName);
285 }
286
290
291 // Get the stub function type, int(*)(int,...).
292 llvm::FunctionType *StubTy =
293 llvm::FunctionType::get(CGM.IntTy, {CGM.IntTy}, true);
294
295 llvm::Function *DtorStub = CGM.CreateGlobalInitOrCleanUpFunction(
296 StubTy, FnName.str(), FI, D.getLocation());
297
298 CodeGenFunction CGF(CGM);
299
300 FunctionArgList Args;
303 Args.push_back(&IPD);
304 QualType ResTy = CGM.getContext().IntTy;
305
306 CGF.StartFunction(GlobalDecl(&D, DynamicInitKind::AtExit), ResTy, DtorStub,
307 FI, Args, D.getLocation(), D.getInit()->getExprLoc());
308
309 // Emit an artificial location for this function.
311
312 llvm::CallInst *call = CGF.Builder.CreateCall(Dtor, Addr);
313
314 // Make sure the call and the callee agree on calling convention.
315 if (auto *DtorFn = dyn_cast<llvm::Function>(
316 Dtor.getCallee()->stripPointerCastsAndAliases()))
317 call->setCallingConv(DtorFn->getCallingConv());
318
319 // Return 0 from function
320 CGF.Builder.CreateStore(llvm::Constant::getNullValue(CGM.IntTy),
321 CGF.ReturnValue);
322
323 CGF.FinishFunction();
324
325 return DtorStub;
326}
327
328/// Register a global destructor using the C atexit runtime function.
330 llvm::FunctionCallee dtor,
331 llvm::Constant *addr) {
332 // Create a function which calls the destructor.
333 llvm::Constant *dtorStub = createAtExitStub(VD, dtor, addr);
335}
336
337/// Register a global destructor using the LLVM 'llvm.global_dtors' global.
339 llvm::FunctionCallee Dtor,
340 llvm::Constant *Addr) {
341 // Create a function which calls the destructor.
342 llvm::Function *dtorStub =
343 cast<llvm::Function>(createAtExitStub(VD, Dtor, Addr));
344 CGM.AddGlobalDtor(dtorStub);
345}
346
347void CodeGenFunction::registerGlobalDtorWithAtExit(llvm::Constant *dtorStub) {
348 // extern "C" int atexit(void (*f)(void));
349 assert(dtorStub->getType()->isPointerTy() &&
350 "Argument to atexit has a wrong type.");
351
352 llvm::FunctionType *atexitTy =
353 llvm::FunctionType::get(IntTy, dtorStub->getType(), false);
354
355 llvm::FunctionCallee atexit =
356 CGM.CreateRuntimeFunction(atexitTy, "atexit", llvm::AttributeList(),
357 /*Local=*/true);
358 if (llvm::Function *atexitFn = dyn_cast<llvm::Function>(atexit.getCallee()))
359 atexitFn->setDoesNotThrow();
360
361 EmitNounwindRuntimeCall(atexit, dtorStub);
362}
363
364llvm::Value *
366 // The unatexit subroutine unregisters __dtor functions that were previously
367 // registered by the atexit subroutine. If the referenced function is found,
368 // it is removed from the list of functions that are called at normal program
369 // termination and the unatexit returns a value of 0, otherwise a non-zero
370 // value is returned.
371 //
372 // extern "C" int unatexit(void (*f)(void));
373 assert(dtorStub->getType()->isPointerTy() &&
374 "Argument to unatexit has a wrong type.");
375
376 llvm::FunctionType *unatexitTy =
377 llvm::FunctionType::get(IntTy, {dtorStub->getType()}, /*isVarArg=*/false);
378
379 llvm::FunctionCallee unatexit =
380 CGM.CreateRuntimeFunction(unatexitTy, "unatexit", llvm::AttributeList());
381
382 cast<llvm::Function>(unatexit.getCallee())->setDoesNotThrow();
383
384 return EmitNounwindRuntimeCall(unatexit, dtorStub);
385}
386
388 llvm::GlobalVariable *DeclPtr,
389 bool PerformInit) {
390 // If we've been asked to forbid guard variables, emit an error now.
391 // This diagnostic is hard-coded for Darwin's use case; we can find
392 // better phrasing if someone else needs it.
393 if (CGM.getCodeGenOpts().ForbidGuardVariables)
395 "this initialization requires a guard variable, which "
396 "the kernel does not support");
397
398 CGM.getCXXABI().EmitGuardedInit(*this, D, DeclPtr, PerformInit);
399}
400
402 llvm::BasicBlock *InitBlock,
403 llvm::BasicBlock *NoInitBlock,
404 GuardKind Kind,
405 const VarDecl *D) {
406 assert((Kind == GuardKind::TlsGuard || D) && "no guarded variable");
407
408 // A guess at how many times we will enter the initialization of a
409 // variable, depending on the kind of variable.
410 static const uint64_t InitsPerTLSVar = 1024;
411 static const uint64_t InitsPerLocalVar = 1024 * 1024;
412
413 llvm::MDNode *Weights;
414 if (Kind == GuardKind::VariableGuard && !D->isLocalVarDecl()) {
415 // For non-local variables, don't apply any weighting for now. Due to our
416 // use of COMDATs, we expect there to be at most one initialization of the
417 // variable per DSO, but we have no way to know how many DSOs will try to
418 // initialize the variable.
419 Weights = nullptr;
420 } else {
421 uint64_t NumInits;
422 // FIXME: For the TLS case, collect and use profiling information to
423 // determine a more accurate brach weight.
424 if (Kind == GuardKind::TlsGuard || D->getTLSKind())
425 NumInits = InitsPerTLSVar;
426 else
427 NumInits = InitsPerLocalVar;
428
429 // The probability of us entering the initializer is
430 // 1 / (total number of times we attempt to initialize the variable).
431 llvm::MDBuilder MDHelper(CGM.getLLVMContext());
432 Weights = MDHelper.createBranchWeights(1, NumInits - 1);
433 }
434
435 Builder.CreateCondBr(NeedsInit, InitBlock, NoInitBlock, Weights);
436}
437
439 llvm::FunctionType *FTy, const Twine &Name, const CGFunctionInfo &FI,
440 SourceLocation Loc, bool TLS, llvm::GlobalVariable::LinkageTypes Linkage) {
441 llvm::Function *Fn = llvm::Function::Create(FTy, Linkage, Name, &getModule());
442
443 if (!getLangOpts().AppleKext && !TLS) {
444 // Set the section if needed.
445 if (const char *Section = getTarget().getStaticInitSectionSpecifier())
446 Fn->setSection(Section);
447 }
448
449 if (Linkage == llvm::GlobalVariable::InternalLinkage)
451 else {
452 SetLLVMFunctionAttributes(GlobalDecl(), FI, Fn, false);
454 getTargetCodeGenInfo().setTargetAttributes(nullptr, Fn, *this);
455 }
456
457 Fn->setCallingConv(getRuntimeCC());
458
459 if (!getLangOpts().Exceptions)
460 Fn->setDoesNotThrow();
461
462 if (getLangOpts().Sanitize.has(SanitizerKind::Address) &&
463 !isInNoSanitizeList(SanitizerKind::Address, Fn, Loc))
464 Fn->addFnAttr(llvm::Attribute::SanitizeAddress);
465
466 if (getLangOpts().Sanitize.has(SanitizerKind::KernelAddress) &&
467 !isInNoSanitizeList(SanitizerKind::KernelAddress, Fn, Loc))
468 Fn->addFnAttr(llvm::Attribute::SanitizeAddress);
469
470 if (getLangOpts().Sanitize.has(SanitizerKind::HWAddress) &&
471 !isInNoSanitizeList(SanitizerKind::HWAddress, Fn, Loc))
472 Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress);
473
474 if (getLangOpts().Sanitize.has(SanitizerKind::KernelHWAddress) &&
475 !isInNoSanitizeList(SanitizerKind::KernelHWAddress, Fn, Loc))
476 Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress);
477
478 if (getLangOpts().Sanitize.has(SanitizerKind::MemtagStack) &&
479 !isInNoSanitizeList(SanitizerKind::MemtagStack, Fn, Loc))
480 Fn->addFnAttr(llvm::Attribute::SanitizeMemTag);
481
482 if (getLangOpts().Sanitize.has(SanitizerKind::Type) &&
483 !isInNoSanitizeList(SanitizerKind::Type, Fn, Loc))
484 Fn->addFnAttr(llvm::Attribute::SanitizeType);
485
486 if (getLangOpts().Sanitize.has(SanitizerKind::Thread) &&
487 !isInNoSanitizeList(SanitizerKind::Thread, Fn, Loc))
488 Fn->addFnAttr(llvm::Attribute::SanitizeThread);
489
490 if (getLangOpts().Sanitize.has(SanitizerKind::NumericalStability) &&
491 !isInNoSanitizeList(SanitizerKind::NumericalStability, Fn, Loc))
492 Fn->addFnAttr(llvm::Attribute::SanitizeNumericalStability);
493
494 if (getLangOpts().Sanitize.has(SanitizerKind::Memory) &&
495 !isInNoSanitizeList(SanitizerKind::Memory, Fn, Loc))
496 Fn->addFnAttr(llvm::Attribute::SanitizeMemory);
497
498 if (getLangOpts().Sanitize.has(SanitizerKind::KernelMemory) &&
499 !isInNoSanitizeList(SanitizerKind::KernelMemory, Fn, Loc))
500 Fn->addFnAttr(llvm::Attribute::SanitizeMemory);
501
502 if (getLangOpts().Sanitize.has(SanitizerKind::SafeStack) &&
503 !isInNoSanitizeList(SanitizerKind::SafeStack, Fn, Loc))
504 Fn->addFnAttr(llvm::Attribute::SafeStack);
505
506 if (getLangOpts().Sanitize.has(SanitizerKind::ShadowCallStack) &&
507 !isInNoSanitizeList(SanitizerKind::ShadowCallStack, Fn, Loc))
508 Fn->addFnAttr(llvm::Attribute::ShadowCallStack);
509
510 return Fn;
511}
512
513/// Create a global pointer to a function that will initialize a global
514/// variable. The user has requested that this pointer be emitted in a specific
515/// section.
516void CodeGenModule::EmitPointerToInitFunc(const VarDecl *D,
517 llvm::GlobalVariable *GV,
518 llvm::Function *InitFunc,
519 InitSegAttr *ISA) {
520 llvm::GlobalVariable *PtrArray = new llvm::GlobalVariable(
521 TheModule, InitFunc->getType(), /*isConstant=*/true,
522 llvm::GlobalValue::PrivateLinkage, InitFunc, "__cxx_init_fn_ptr");
523 PtrArray->setSection(ISA->getSection());
524 addUsedGlobal(PtrArray);
525
526 // If the GV is already in a comdat group, then we have to join it.
527 if (llvm::Comdat *C = GV->getComdat())
528 PtrArray->setComdat(C);
529}
530
531void
532CodeGenModule::EmitCXXGlobalVarDeclInitFunc(const VarDecl *D,
533 llvm::GlobalVariable *Addr,
534 bool PerformInit) {
535
536 // According to E.2.3.1 in CUDA-7.5 Programming guide: __device__,
537 // __constant__ and __shared__ variables defined in namespace scope,
538 // that are of class type, cannot have a non-empty constructor. All
539 // the checks have been done in Sema by now. Whatever initializers
540 // are allowed are empty and we just need to ignore them here.
541 if (getLangOpts().CUDAIsDevice && !getLangOpts().GPUAllowDeviceInit &&
542 (D->hasAttr<CUDADeviceAttr>() || D->hasAttr<CUDAConstantAttr>() ||
543 D->hasAttr<CUDASharedAttr>()))
544 return;
545
546 // Check if we've already initialized this decl.
547 auto I = DelayedCXXInitPosition.find(D);
548 if (I != DelayedCXXInitPosition.end() && I->second == ~0U)
549 return;
550
551 llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
552 SmallString<256> FnName;
553 {
554 llvm::raw_svector_ostream Out(FnName);
556 }
557
558 // Create a variable initialization function.
559 llvm::Function *Fn = CreateGlobalInitOrCleanUpFunction(
560 FTy, FnName.str(), getTypes().arrangeNullaryFunction(), D->getLocation());
561
562 auto *ISA = D->getAttr<InitSegAttr>();
564 PerformInit);
565
566 llvm::GlobalVariable *COMDATKey =
567 supportsCOMDAT() && D->isExternallyVisible() ? Addr : nullptr;
568
569 if (D->getTLSKind()) {
570 // FIXME: Should we support init_priority for thread_local?
571 // FIXME: We only need to register one __cxa_thread_atexit function for the
572 // entire TU.
573 CXXThreadLocalInits.push_back(Fn);
574 CXXThreadLocalInitVars.push_back(D);
575 } else if (PerformInit && ISA) {
576 // Contract with backend that "init_seg(compiler)" corresponds to priority
577 // 200 and "init_seg(lib)" corresponds to priority 400.
578 int Priority = -1;
579 if (ISA->getSection() == ".CRT$XCC")
580 Priority = 200;
581 else if (ISA->getSection() == ".CRT$XCL")
582 Priority = 400;
583
584 if (Priority != -1)
585 AddGlobalCtor(Fn, Priority, ~0U, COMDATKey);
586 else
587 EmitPointerToInitFunc(D, Addr, Fn, ISA);
588 } else if (auto *IPA = D->getAttr<InitPriorityAttr>()) {
589 OrderGlobalInitsOrStermFinalizers Key(IPA->getPriority(),
590 PrioritizedCXXGlobalInits.size());
591 PrioritizedCXXGlobalInits.push_back(std::make_pair(Key, Fn));
592 } else if (isTemplateInstantiation(D->getTemplateSpecializationKind()) ||
593 !isUniqueGVALinkage(getContext().GetGVALinkageForVariable(D)) ||
594 D->hasAttr<SelectAnyAttr>()) {
595 // For vague linkage globals, put the initializer into its own global_ctors
596 // entry with the global as a comdat key. This ensures at most one
597 // initializer per DSO runs during DSO dynamic initialization.
598 //
599 // For ELF platforms, this is an important code size and startup time
600 // optimization. For dynamic, non-hidden symbols, the weak guard variable
601 // remains to ensure that other DSOs do not re-initialize the global.
602 //
603 // For PE-COFF platforms, there is no guard variable, and COMDAT
604 // associativity is the only way to ensure vauge linkage globals are
605 // initialized exactly once.
606 //
607 // MachO is the only remaining platform with no comdats that doesn't
608 // benefit from this optimization. The rest are mainly modeled on ELF
609 // behavior.
610 //
611 // C++ requires that inline global variables are initialized in source
612 // order, but this requirement does not exist for templated entities.
613 // llvm.global_ctors does not guarantee initialization order, so in
614 // general, Clang does not fully conform to the ordering requirement.
615 // However, in practice, LLVM emits global_ctors in the provided order, and
616 // users typically don't rely on ordering between inline globals in
617 // different headers which are then transitively included in varying order.
618 // Clang's current behavior is a practical tradeoff, since dropping the
619 // comdat would lead to unacceptable impact on code size and startup time.
620 //
621 // FIXME: Find a solution to guarantee source-order initialization of
622 // inline variables.
623 //
624 // C++ [basic.start.init]p2:
625 // Definitions of explicitly specialized class template static data
626 // members have ordered initialization. Other class template static data
627 // members (i.e., implicitly or explicitly instantiated specializations)
628 // have unordered initialization.
629 //
630 // CXXGlobalInits.size() is the lex order number for the next deferred
631 // VarDecl. Use it when the current VarDecl is non-deferred. Although this
632 // lex order number is shared between current VarDecl and some following
633 // VarDecls, their order of insertion into `llvm.global_ctors` is the same
634 // as the lexing order and the following stable sort would preserve such
635 // order.
636 I = DelayedCXXInitPosition.find(D);
637 unsigned LexOrder =
638 I == DelayedCXXInitPosition.end() ? CXXGlobalInits.size() : I->second;
639 AddGlobalCtor(Fn, 65535, LexOrder, COMDATKey);
640 if (COMDATKey && (getTriple().isOSBinFormatELF() ||
641 getTarget().getCXXABI().isMicrosoft())) {
642 // When COMDAT is used on ELF or in the MS C++ ABI, the key must be in
643 // llvm.used to prevent linker GC.
644 addUsedGlobal(COMDATKey);
645 }
646
647 // If we used a COMDAT key for the global ctor, the init function can be
648 // discarded if the global ctor entry is discarded.
649 // FIXME: Do we need to restrict this to ELF and Wasm?
650 llvm::Comdat *C = Addr->getComdat();
651 if (COMDATKey && C &&
652 (getTarget().getTriple().isOSBinFormatELF() ||
653 getTarget().getTriple().isOSBinFormatWasm())) {
654 Fn->setComdat(C);
655 }
656 } else {
657 I = DelayedCXXInitPosition.find(D); // Re-do lookup in case of re-hash.
658 if (I == DelayedCXXInitPosition.end()) {
659 CXXGlobalInits.push_back(Fn);
660 } else if (I->second != ~0U) {
661 assert(I->second < CXXGlobalInits.size() &&
662 CXXGlobalInits[I->second] == nullptr);
663 CXXGlobalInits[I->second] = Fn;
664 }
665 }
666
667 // Remember that we already emitted the initializer for this global.
668 DelayedCXXInitPosition[D] = ~0U;
669}
670
671void CodeGenModule::EmitCXXThreadLocalInitFunc() {
673 *this, CXXThreadLocals, CXXThreadLocalInits, CXXThreadLocalInitVars);
674
675 CXXThreadLocalInits.clear();
676 CXXThreadLocalInitVars.clear();
677 CXXThreadLocals.clear();
678}
679
680/* Build the initializer for a C++20 module:
681 This is arranged to be run only once regardless of how many times the module
682 might be included transitively. This arranged by using a guard variable.
683
684 If there are no initializers at all (and also no imported modules) we reduce
685 this to an empty function (since the Itanium ABI requires that this function
686 be available to a caller, which might be produced by a different
687 implementation).
688
689 First we call any initializers for imported modules.
690 We then call initializers for the Global Module Fragment (if present)
691 We then call initializers for the current module.
692 We then call initializers for the Private Module Fragment (if present)
693*/
694
695void CodeGenModule::EmitCXXModuleInitFunc(Module *Primary) {
696 assert(Primary->isInterfaceOrPartition() &&
697 "The function should only be called for C++20 named module interface"
698 " or partition.");
699
700 while (!CXXGlobalInits.empty() && !CXXGlobalInits.back())
701 CXXGlobalInits.pop_back();
702
703 // As noted above, we create the function, even if it is empty.
704 // Module initializers for imported modules are emitted first.
705
706 // Collect all the modules that we import
708 // Ones that we export
709 for (auto I : Primary->Exports)
710 AllImports.insert(I.getPointer());
711 // Ones that we only import.
712 AllImports.insert_range(Primary->Imports);
713 // Ones that we import in the global module fragment or the private module
714 // fragment.
715 for (Module *SubM : Primary->submodules()) {
716 assert((SubM->isGlobalModule() || SubM->isPrivateModule()) &&
717 "The sub modules of C++20 module unit should only be global module "
718 "fragments or private module framents.");
719 assert(SubM->Exports.empty() &&
720 "The global mdoule fragments and the private module fragments are "
721 "not allowed to export import modules.");
722 AllImports.insert_range(SubM->Imports);
723 }
724
726 for (Module *M : AllImports) {
727 // No Itanium initializer in header like modules.
728 if (M->isHeaderLikeModule())
729 continue; // TODO: warn of mixed use of module map modules and C++20?
730 // We're allowed to skip the initialization if we are sure it doesn't
731 // do any thing.
732 if (!M->isNamedModuleInterfaceHasInit())
733 continue;
734 llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
735 SmallString<256> FnName;
736 {
737 llvm::raw_svector_ostream Out(FnName);
738 cast<ItaniumMangleContext>(getCXXABI().getMangleContext())
739 .mangleModuleInitializer(M, Out);
740 }
741 assert(!GetGlobalValue(FnName.str()) &&
742 "We should only have one use of the initializer call");
743 llvm::Function *Fn = llvm::Function::Create(
744 FTy, llvm::Function::ExternalLinkage, FnName.str(), &getModule());
745 ModuleInits.push_back(Fn);
746 }
747
748 // Add any initializers with specified priority; this uses the same approach
749 // as EmitCXXGlobalInitFunc().
750 if (!PrioritizedCXXGlobalInits.empty()) {
751 llvm::array_pod_sort(PrioritizedCXXGlobalInits.begin(),
752 PrioritizedCXXGlobalInits.end());
754 I = PrioritizedCXXGlobalInits.begin(),
755 E = PrioritizedCXXGlobalInits.end();
756 I != E;) {
758 std::upper_bound(I + 1, E, *I, GlobalInitPriorityCmp());
759
760 for (; I < PrioE; ++I)
761 ModuleInits.push_back(I->second);
762 }
763 }
764
765 // Now append the ones without specified priority.
766 for (auto *F : CXXGlobalInits)
767 ModuleInits.push_back(F);
768
769 llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
771
772 // We now build the initializer for this module, which has a mangled name
773 // as per the Itanium ABI . The action of the initializer is guarded so that
774 // each init is run just once (even though a module might be imported
775 // multiple times via nested use).
776 llvm::Function *Fn;
777 {
778 SmallString<256> InitFnName;
779 llvm::raw_svector_ostream Out(InitFnName);
780 cast<ItaniumMangleContext>(getCXXABI().getMangleContext())
781 .mangleModuleInitializer(Primary, Out);
783 FTy, llvm::Twine(InitFnName), FI, SourceLocation(), false,
784 llvm::GlobalVariable::ExternalLinkage);
785
786 // If we have a completely empty initializer then we do not want to create
787 // the guard variable.
789 if (!ModuleInits.empty()) {
790 // Create the guard var.
791 llvm::GlobalVariable *Guard = new llvm::GlobalVariable(
792 getModule(), Int8Ty, /*isConstant=*/false,
793 llvm::GlobalVariable::InternalLinkage,
794 llvm::ConstantInt::get(Int8Ty, 0), InitFnName.str() + "__in_chrg");
795 CharUnits GuardAlign = CharUnits::One();
796 Guard->setAlignment(GuardAlign.getAsAlign());
797 GuardAddr = ConstantAddress(Guard, Int8Ty, GuardAlign);
798 }
799 CodeGenFunction(*this).GenerateCXXGlobalInitFunc(Fn, ModuleInits,
800 GuardAddr);
801 }
802
803 // We allow for the case that a module object is added to a linked binary
804 // without a specific call to the the initializer. This also ensures that
805 // implementation partition initializers are called when the partition
806 // is not imported as an interface.
807 AddGlobalCtor(Fn);
808
809 // See the comment in EmitCXXGlobalInitFunc about OpenCL global init
810 // functions.
811 if (getLangOpts().OpenCL) {
813 Fn->setCallingConv(llvm::CallingConv::SPIR_KERNEL);
814 }
815
816 assert(!getLangOpts().CUDA || !getLangOpts().CUDAIsDevice ||
817 getLangOpts().GPUAllowDeviceInit);
818 if (getLangOpts().HIP && getLangOpts().CUDAIsDevice) {
819 if (getTriple().isSPIRV())
820 Fn->setCallingConv(llvm::CallingConv::SPIR_KERNEL);
821 else
822 Fn->setCallingConv(llvm::CallingConv::AMDGPU_KERNEL);
823 Fn->addFnAttr("device-init");
824 }
825
826 // We are done with the inits.
827 AllImports.clear();
828 PrioritizedCXXGlobalInits.clear();
829 CXXGlobalInits.clear();
830 ModuleInits.clear();
831}
832
834 SmallString<128> FileName = llvm::sys::path::filename(M.getName());
835
836 if (FileName.empty())
837 FileName = "<null>";
838
839 for (size_t i = 0; i < FileName.size(); ++i) {
840 // Replace everything that's not [a-zA-Z0-9._] with a _. This set happens
841 // to be the set of C preprocessing numbers.
843 FileName[i] = '_';
844 }
845
846 return FileName;
847}
848
849static std::string getPrioritySuffix(unsigned int Priority) {
850 assert(Priority <= 65535 && "Priority should always be <= 65535.");
851
852 // Compute the function suffix from priority. Prepend with zeroes to make
853 // sure the function names are also ordered as priorities.
854 std::string PrioritySuffix = llvm::utostr(Priority);
855 PrioritySuffix = std::string(6 - PrioritySuffix.size(), '0') + PrioritySuffix;
856
857 return PrioritySuffix;
858}
859
860void
861CodeGenModule::EmitCXXGlobalInitFunc() {
862 while (!CXXGlobalInits.empty() && !CXXGlobalInits.back())
863 CXXGlobalInits.pop_back();
864
865 // When we import C++20 modules, we must run their initializers first.
867 if (CXX20ModuleInits)
868 for (Module *M : ImportedModules) {
869 // No Itanium initializer in header like modules.
870 if (M->isHeaderLikeModule())
871 continue;
872 // We're allowed to skip the initialization if we are sure it doesn't
873 // do any thing.
874 if (!M->isNamedModuleInterfaceHasInit())
875 continue;
876 llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
877 SmallString<256> FnName;
878 {
879 llvm::raw_svector_ostream Out(FnName);
880 cast<ItaniumMangleContext>(getCXXABI().getMangleContext())
881 .mangleModuleInitializer(M, Out);
882 }
883 assert(!GetGlobalValue(FnName.str()) &&
884 "We should only have one use of the initializer call");
885 llvm::Function *Fn = llvm::Function::Create(
886 FTy, llvm::Function::ExternalLinkage, FnName.str(), &getModule());
887 ModuleInits.push_back(Fn);
888 }
889
890 if (ModuleInits.empty() && CXXGlobalInits.empty() &&
891 PrioritizedCXXGlobalInits.empty())
892 return;
893
894 llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
896
897 // Create our global prioritized initialization function.
898 if (!PrioritizedCXXGlobalInits.empty()) {
899 SmallVector<llvm::Function *, 8> LocalCXXGlobalInits;
900 llvm::array_pod_sort(PrioritizedCXXGlobalInits.begin(),
901 PrioritizedCXXGlobalInits.end());
902 // Iterate over "chunks" of ctors with same priority and emit each chunk
903 // into separate function. Note - everything is sorted first by priority,
904 // second - by lex order, so we emit ctor functions in proper order.
906 I = PrioritizedCXXGlobalInits.begin(),
907 E = PrioritizedCXXGlobalInits.end(); I != E; ) {
909 PrioE = std::upper_bound(I + 1, E, *I, GlobalInitPriorityCmp());
910
911 LocalCXXGlobalInits.clear();
912
913 unsigned int Priority = I->first.priority;
914 llvm::Function *Fn = CreateGlobalInitOrCleanUpFunction(
915 FTy, "_GLOBAL__I_" + getPrioritySuffix(Priority), FI);
916
917 // Prepend the module inits to the highest priority set.
918 if (!ModuleInits.empty()) {
919 for (auto *F : ModuleInits)
920 LocalCXXGlobalInits.push_back(F);
921 ModuleInits.clear();
922 }
923
924 for (; I < PrioE; ++I)
925 LocalCXXGlobalInits.push_back(I->second);
926
927 CodeGenFunction(*this).GenerateCXXGlobalInitFunc(Fn, LocalCXXGlobalInits);
928 AddGlobalCtor(Fn, Priority);
929 }
930 PrioritizedCXXGlobalInits.clear();
931 }
932
933 if (getCXXABI().useSinitAndSterm() && ModuleInits.empty() &&
934 CXXGlobalInits.empty())
935 return;
936
937 for (auto *F : CXXGlobalInits)
938 ModuleInits.push_back(F);
939 CXXGlobalInits.clear();
940
941 // Include the filename in the symbol name. Including "sub_" matches gcc
942 // and makes sure these symbols appear lexicographically behind the symbols
943 // with priority emitted above. Module implementation units behave the same
944 // way as a non-modular TU with imports.
945 llvm::Function *Fn;
946 if (CXX20ModuleInits && getContext().getCurrentNamedModule() &&
947 !getContext().getCurrentNamedModule()->isModuleImplementation()) {
948 SmallString<256> InitFnName;
949 llvm::raw_svector_ostream Out(InitFnName);
950 cast<ItaniumMangleContext>(getCXXABI().getMangleContext())
951 .mangleModuleInitializer(getContext().getCurrentNamedModule(), Out);
953 FTy, llvm::Twine(InitFnName), FI, SourceLocation(), false,
954 llvm::GlobalVariable::ExternalLinkage);
955 } else
957 FTy,
958 llvm::Twine("_GLOBAL__sub_I_", getTransformedFileName(getModule())),
959 FI);
960
961 CodeGenFunction(*this).GenerateCXXGlobalInitFunc(Fn, ModuleInits);
962 AddGlobalCtor(Fn);
963
964 // In OpenCL global init functions must be converted to kernels in order to
965 // be able to launch them from the host.
966 // FIXME: Some more work might be needed to handle destructors correctly.
967 // Current initialization function makes use of function pointers callbacks.
968 // We can't support function pointers especially between host and device.
969 // However it seems global destruction has little meaning without any
970 // dynamic resource allocation on the device and program scope variables are
971 // destroyed by the runtime when program is released.
972 if (getLangOpts().OpenCL) {
974 Fn->setCallingConv(llvm::CallingConv::SPIR_KERNEL);
975 }
976
977 assert(!getLangOpts().CUDA || !getLangOpts().CUDAIsDevice ||
978 getLangOpts().GPUAllowDeviceInit);
979 if (getLangOpts().HIP && getLangOpts().CUDAIsDevice) {
980 if (getTriple().isSPIRV())
981 Fn->setCallingConv(llvm::CallingConv::SPIR_KERNEL);
982 else
983 Fn->setCallingConv(llvm::CallingConv::AMDGPU_KERNEL);
984 Fn->addFnAttr("device-init");
985 }
986
987 ModuleInits.clear();
988}
989
990void CodeGenModule::EmitCXXGlobalCleanUpFunc() {
991 if (CXXGlobalDtorsOrStermFinalizers.empty() &&
992 PrioritizedCXXStermFinalizers.empty())
993 return;
994
995 llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
997
998 // Create our global prioritized cleanup function.
999 if (!PrioritizedCXXStermFinalizers.empty()) {
1001 llvm::array_pod_sort(PrioritizedCXXStermFinalizers.begin(),
1002 PrioritizedCXXStermFinalizers.end());
1003 // Iterate over "chunks" of dtors with same priority and emit each chunk
1004 // into separate function. Note - everything is sorted first by priority,
1005 // second - by lex order, so we emit dtor functions in proper order.
1007 I = PrioritizedCXXStermFinalizers.begin(),
1008 E = PrioritizedCXXStermFinalizers.end();
1009 I != E;) {
1011 std::upper_bound(I + 1, E, *I, StermFinalizerPriorityCmp());
1012
1013 LocalCXXStermFinalizers.clear();
1014
1015 unsigned int Priority = I->first.priority;
1016 llvm::Function *Fn = CreateGlobalInitOrCleanUpFunction(
1017 FTy, "_GLOBAL__a_" + getPrioritySuffix(Priority), FI);
1018
1019 for (; I < PrioE; ++I) {
1020 llvm::FunctionCallee DtorFn = I->second;
1021 LocalCXXStermFinalizers.emplace_back(DtorFn.getFunctionType(),
1022 DtorFn.getCallee(), nullptr);
1023 }
1024
1026 Fn, LocalCXXStermFinalizers);
1027 AddGlobalDtor(Fn, Priority);
1028 }
1029 PrioritizedCXXStermFinalizers.clear();
1030 }
1031
1032 if (CXXGlobalDtorsOrStermFinalizers.empty())
1033 return;
1034
1035 // Create our global cleanup function.
1036 llvm::Function *Fn =
1037 CreateGlobalInitOrCleanUpFunction(FTy, "_GLOBAL__D_a", FI);
1038
1040 Fn, CXXGlobalDtorsOrStermFinalizers);
1041 AddGlobalDtor(Fn);
1042 CXXGlobalDtorsOrStermFinalizers.clear();
1043}
1044
1045/// Emit the code necessary to initialize the given global variable.
1047 const VarDecl *D,
1048 llvm::GlobalVariable *Addr,
1049 bool PerformInit) {
1050 // Check if we need to emit debug info for variable initializer.
1051 if (D->hasAttr<NoDebugAttr>())
1052 DebugInfo = nullptr; // disable debug info indefinitely for this function
1053
1054 CurEHLocation = D->getBeginLoc();
1055
1057 getContext().VoidTy, Fn, getTypes().arrangeNullaryFunction(),
1058 FunctionArgList());
1059 // Emit an artificial location for this function.
1060 auto AL = ApplyDebugLocation::CreateArtificial(*this);
1061
1062 // Use guarded initialization if the global variable is weak. This
1063 // occurs for, e.g., instantiated static data members and
1064 // definitions explicitly marked weak.
1065 //
1066 // Also use guarded initialization for a variable with dynamic TLS and
1067 // unordered initialization. (If the initialization is ordered, the ABI
1068 // layer will guard the whole-TU initialization for us.)
1069 if (Addr->hasWeakLinkage() || Addr->hasLinkOnceLinkage() ||
1070 (D->getTLSKind() == VarDecl::TLS_Dynamic &&
1071 isTemplateInstantiation(D->getTemplateSpecializationKind()))) {
1072 EmitCXXGuardedInit(*D, Addr, PerformInit);
1073 } else {
1074 EmitCXXGlobalVarDeclInit(*D, Addr, PerformInit);
1075 }
1076
1078}
1079
1080void
1083 ConstantAddress Guard) {
1084 {
1085 auto NL = ApplyDebugLocation::CreateEmpty(*this);
1087 getTypes().arrangeNullaryFunction(), FunctionArgList());
1088 // Emit an artificial location for this function.
1089 auto AL = ApplyDebugLocation::CreateArtificial(*this);
1090
1091 llvm::BasicBlock *ExitBlock = nullptr;
1092 if (Guard.isValid()) {
1093 // If we have a guard variable, check whether we've already performed
1094 // these initializations. This happens for TLS initialization functions.
1095 llvm::Value *GuardVal = Builder.CreateLoad(Guard);
1096 llvm::Value *Uninit = Builder.CreateIsNull(GuardVal,
1097 "guard.uninitialized");
1098 llvm::BasicBlock *InitBlock = createBasicBlock("init");
1099 ExitBlock = createBasicBlock("exit");
1100 EmitCXXGuardedInitBranch(Uninit, InitBlock, ExitBlock,
1101 GuardKind::TlsGuard, nullptr);
1102 EmitBlock(InitBlock);
1103 // Mark as initialized before initializing anything else. If the
1104 // initializers use previously-initialized thread_local vars, that's
1105 // probably supposed to be OK, but the standard doesn't say.
1106 Builder.CreateStore(llvm::ConstantInt::get(GuardVal->getType(),1), Guard);
1107
1108 // The guard variable can't ever change again.
1110 Guard.getPointer(),
1112 CGM.getDataLayout().getTypeAllocSize(GuardVal->getType())));
1113 }
1114
1115 RunCleanupsScope Scope(*this);
1116
1117 // When building in Objective-C++ ARC mode, create an autorelease pool
1118 // around the global initializers.
1119 if (getLangOpts().ObjCAutoRefCount && getLangOpts().CPlusPlus) {
1120 llvm::Value *token = EmitObjCAutoreleasePoolPush();
1122 }
1123
1124 for (llvm::Function *Decl : Decls)
1125 if (Decl)
1127
1128 Scope.ForceCleanup();
1129
1130 if (ExitBlock) {
1131 Builder.CreateBr(ExitBlock);
1132 EmitBlock(ExitBlock);
1133 }
1134 }
1135
1137}
1138
1140 llvm::Function *Fn,
1141 ArrayRef<std::tuple<llvm::FunctionType *, llvm::WeakTrackingVH,
1142 llvm::Constant *>>
1143 DtorsOrStermFinalizers) {
1144 {
1145 auto NL = ApplyDebugLocation::CreateEmpty(*this);
1147 getTypes().arrangeNullaryFunction(), FunctionArgList());
1148 // Emit an artificial location for this function.
1149 auto AL = ApplyDebugLocation::CreateArtificial(*this);
1150
1151 // Emit the cleanups, in reverse order from construction.
1152 for (unsigned i = 0, e = DtorsOrStermFinalizers.size(); i != e; ++i) {
1153 llvm::FunctionType *CalleeTy;
1154 llvm::Value *Callee;
1155 llvm::Constant *Arg;
1156 std::tie(CalleeTy, Callee, Arg) = DtorsOrStermFinalizers[e - i - 1];
1157
1158 llvm::CallBase *CI = nullptr;
1159 if (Arg == nullptr) {
1160 assert(
1162 "Arg could not be nullptr unless using sinit and sterm functions.");
1163 CI = Builder.CreateCall(CalleeTy, Callee);
1164 } else {
1165 // If the object lives in a different address space, the `this` pointer
1166 // address space won't match the dtor `this` param. An addrspacecast is
1167 // required.
1168 assert(Arg->getType()->isPointerTy());
1169 assert(CalleeTy->getParamType(0)->isPointerTy());
1170 unsigned ActualAddrSpace = Arg->getType()->getPointerAddressSpace();
1171 unsigned ExpectedAddrSpace =
1172 CalleeTy->getParamType(0)->getPointerAddressSpace();
1173 if (ActualAddrSpace != ExpectedAddrSpace) {
1174 llvm::PointerType *PTy =
1175 llvm::PointerType::get(getLLVMContext(), ExpectedAddrSpace);
1176 Arg = llvm::ConstantExpr::getAddrSpaceCast(Arg, PTy);
1177 }
1178 CI = Builder.CreateCall(CalleeTy, Callee, Arg);
1179 }
1180
1181 // Make sure the call and the callee agree on calling convention.
1182 if (llvm::Function *F = dyn_cast<llvm::Function>(Callee))
1183 CI->setCallingConv(F->getCallingConv());
1184
1185 if (CGM.shouldEmitConvergenceTokens() && CI->isConvergent())
1186 CI = addConvergenceControlToken(CI);
1187 }
1188 }
1189
1191}
1192
1193/// generateDestroyHelper - Generates a helper function which, when
1194/// invoked, destroys the given object. The address of the object
1195/// should be in global memory.
1197 Address addr, QualType type, Destroyer *destroyer,
1198 bool useEHCleanupForArray, const VarDecl *VD) {
1199 FunctionArgList args;
1202 args.push_back(&Dst);
1203
1204 const CGFunctionInfo &FI =
1206 llvm::FunctionType *FTy = CGM.getTypes().GetFunctionType(FI);
1207 llvm::Function *fn = CGM.CreateGlobalInitOrCleanUpFunction(
1208 FTy, "__cxx_global_array_dtor", FI, VD->getLocation());
1209
1210 CurEHLocation = VD->getBeginLoc();
1211
1213 getContext().VoidTy, fn, FI, args);
1214 // Emit an artificial location for this function.
1215 auto AL = ApplyDebugLocation::CreateArtificial(*this);
1216
1217 emitDestroy(addr, type, destroyer, useEHCleanupForArray);
1218
1220
1221 return fn;
1222}
static std::string getPrioritySuffix(unsigned int Priority)
Definition: CGDeclCXX.cpp:849
static void EmitDeclInit(CodeGenFunction &CGF, const VarDecl &D, ConstantAddress DeclPtr)
Definition: CGDeclCXX.cpp:30
static SmallString< 128 > getTransformedFileName(llvm::Module &M)
Definition: CGDeclCXX.cpp:833
static void EmitDeclDestroy(CodeGenFunction &CGF, const VarDecl &D, ConstantAddress Addr)
Emit code to cause the destruction of the given variable with static storage duration.
Definition: CGDeclCXX.cpp:72
static void EmitDeclInvariant(CodeGenFunction &CGF, const VarDecl &D, llvm::Constant *Addr)
Emit code to cause the variable at the given address to be considered as constant from this point onw...
Definition: CGDeclCXX.cpp:152
const Decl * D
Expr * E
int Priority
Definition: Format.cpp:3181
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
Definition: MachO.h:31
SourceLocation Loc
Definition: SemaObjC.cpp:754
CanQualType VoidPtrTy
Definition: ASTContext.h:1249
const LangOptions & getLangOpts() const
Definition: ASTContext.h:894
CanQualType IntTy
Definition: ASTContext.h:1231
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
CanQualType VoidTy
Definition: ASTContext.h:1222
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
Definition: ASTContext.h:1750
unsigned getTargetAddressSpace(LangAS AS) const
Represents a C++ destructor within a class.
Definition: DeclCXX.h:2869
Represents a C++ struct/union/class.
Definition: DeclCXX.h:258
CharUnits - This is an opaque type for sizes expressed in character units.
Definition: CharUnits.h:38
llvm::Align getAsAlign() const
getAsAlign - Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit b...
Definition: CharUnits.h:189
static CharUnits One()
One - Construct a CharUnits quantity of one.
Definition: CharUnits.h:58
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
Definition: CharUnits.h:63
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
Definition: Address.h:128
static AggValueSlot forLValue(const LValue &LV, IsDestructed_t isDestructed, NeedsGCBarriers_t needsGC, IsAliased_t isAliased, Overlap_t mayOverlap, IsZeroed_t isZeroed=IsNotZeroed, IsSanitizerChecked_t isChecked=IsNotSanitizerChecked)
Definition: CGValue.h:602
static ApplyDebugLocation CreateArtificial(CodeGenFunction &CGF)
Apply TemporaryLocation if it is valid.
Definition: CGDebugInfo.h:946
static ApplyDebugLocation CreateEmpty(CodeGenFunction &CGF)
Set the IRBuilder to not attach debug locations.
Definition: CGDebugInfo.h:963
llvm::StoreInst * CreateStore(llvm::Value *Val, Address Addr, bool IsVolatile=false)
Definition: CGBuilder.h:140
llvm::Value * CreateIsNull(Address Addr, const Twine &Name="")
Definition: CGBuilder.h:360
llvm::LoadInst * CreateLoad(Address Addr, const llvm::Twine &Name="")
Definition: CGBuilder.h:112
virtual bool HasThisReturn(GlobalDecl GD) const
Returns true if the given constructor or destructor is one of the kinds that the ABI says returns 'th...
Definition: CGCXXABI.h:123
virtual bool useSinitAndSterm() const
Definition: CGCXXABI.h:133
virtual void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D, llvm::GlobalVariable *DeclPtr, bool PerformInit)=0
Emits the guarded initializer and destructor setup for the given variable, given that it couldn't be ...
virtual void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D, llvm::FunctionCallee Dtor, llvm::Constant *Addr)=0
Emit code to force the execution of a destructor during global teardown.
virtual bool canCallMismatchedFunctionType() const
Returns true if the target allows calling a function through a pointer with a different signature tha...
Definition: CGCXXABI.h:143
virtual void EmitThreadLocalInitFuncs(CodeGenModule &CGM, ArrayRef< const VarDecl * > CXXThreadLocals, ArrayRef< llvm::Function * > CXXThreadLocalInits, ArrayRef< const VarDecl * > CXXThreadLocalInitVars)=0
Emits ABI-required functions necessary to initialize thread_local variables in this translation unit.
MangleContext & getMangleContext()
Gets the mangle context.
Definition: CGCXXABI.h:113
CGFunctionInfo - Class to encapsulate the information about a function definition.
virtual void EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF, llvm::Value *src, Address dest)=0
virtual void EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF, llvm::Value *src, Address dest, bool threadlocal=false)=0
virtual llvm::Function * emitThreadPrivateVarDefinition(const VarDecl *VD, Address VDAddr, SourceLocation Loc, bool PerformInit, CodeGenFunction *CGF=nullptr)
Emit a code for initialization of threadprivate variable.
Enters a new scope for capturing cleanups, all of which will be executed once the scope is exited.
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
void EmitCXXGuardedInit(const VarDecl &D, llvm::GlobalVariable *DeclPtr, bool PerformInit)
Emit code in this function to perform a guarded variable initialization.
Definition: CGDeclCXX.cpp:387
llvm::Constant * createAtExitStub(const VarDecl &VD, llvm::FunctionCallee Dtor, llvm::Constant *Addr)
Create a stub function, suitable for being passed to atexit, which passes the given address to the gi...
Definition: CGDeclCXX.cpp:236
void emitDestroy(Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray)
emitDestroy - Immediately perform the destruction of the given object.
Definition: CGDecl.cpp:2395
llvm::Function * createTLSAtExitStub(const VarDecl &VD, llvm::FunctionCallee Dtor, llvm::Constant *Addr, llvm::FunctionCallee &AtExit)
Create a stub function, suitable for being passed to __pt_atexit_np, which passes the given address t...
Definition: CGDeclCXX.cpp:278
void EmitComplexExprIntoLValue(const Expr *E, LValue dest, bool isInit)
EmitComplexExprIntoLValue - Emit the given expression of complex type and place its result into the s...
void registerGlobalDtorWithAtExit(const VarDecl &D, llvm::FunctionCallee fn, llvm::Constant *addr)
Call atexit() with a function that passes the given argument to the given function.
Definition: CGDeclCXX.cpp:329
void EmitObjCAutoreleasePoolCleanup(llvm::Value *Ptr)
Definition: CGObjC.cpp:2916
llvm::BasicBlock * createBasicBlock(const Twine &name="", llvm::Function *parent=nullptr, llvm::BasicBlock *before=nullptr)
createBasicBlock - Create an LLVM basic block.
const LangOptions & getLangOpts() const
RValue EmitReferenceBindingToExpr(const Expr *E)
Emits a reference binding to the passed in expression.
Definition: CGExpr.cpp:684
void EmitScalarInit(const Expr *init, const ValueDecl *D, LValue lvalue, bool capturedByInit)
Definition: CGDecl.cpp:786
Destroyer * getDestroyer(QualType::DestructionKind destructionKind)
Definition: CGDecl.cpp:2252
void EmitCXXGlobalVarDeclInit(const VarDecl &D, llvm::GlobalVariable *GV, bool PerformInit)
EmitCXXGlobalVarDeclInit - Create the initializer for a C++ variable with global storage.
Definition: CGDeclCXX.cpp:176
void StartFunction(GlobalDecl GD, QualType RetTy, llvm::Function *Fn, const CGFunctionInfo &FnInfo, const FunctionArgList &Args, SourceLocation Loc=SourceLocation(), SourceLocation StartLoc=SourceLocation())
Emit code for the start of a function.
void GenerateCXXGlobalInitFunc(llvm::Function *Fn, ArrayRef< llvm::Function * > CXXThreadLocals, ConstantAddress Guard=ConstantAddress::invalid())
GenerateCXXGlobalInitFunc - Generates code for initializing global variables.
Definition: CGDeclCXX.cpp:1081
void GenerateCXXGlobalVarDeclInitFunc(llvm::Function *Fn, const VarDecl *D, llvm::GlobalVariable *Addr, bool PerformInit)
Emit the code necessary to initialize the given global variable.
Definition: CGDeclCXX.cpp:1046
void EmitCXXGuardedInitBranch(llvm::Value *NeedsInit, llvm::BasicBlock *InitBlock, llvm::BasicBlock *NoInitBlock, GuardKind Kind, const VarDecl *D)
Emit a branch to select whether or not to perform guarded initialization.
Definition: CGDeclCXX.cpp:401
void EmitInvariantStart(llvm::Constant *Addr, CharUnits Size)
Definition: CGDeclCXX.cpp:158
llvm::Value * unregisterGlobalDtorWithUnAtExit(llvm::Constant *dtorStub)
Call unatexit() with function dtorStub.
Definition: CGDeclCXX.cpp:365
llvm::CallInst * EmitNounwindRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
void registerGlobalDtorWithLLVM(const VarDecl &D, llvm::FunctionCallee fn, llvm::Constant *addr)
Registers the dtor using 'llvm.global_dtors' for platforms that do not support an 'atexit()' function...
Definition: CGDeclCXX.cpp:338
bool needsEHCleanup(QualType::DestructionKind kind)
Determines whether an EH cleanup is required to destroy a type with the given destruction kind.
llvm::CallInst * EmitRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
llvm::Type * ConvertTypeForMem(QualType T)
void GenerateCXXGlobalCleanUpFunc(llvm::Function *Fn, ArrayRef< std::tuple< llvm::FunctionType *, llvm::WeakTrackingVH, llvm::Constant * > > DtorsOrStermFinalizers)
GenerateCXXGlobalCleanUpFunc - Generates code for cleaning up global variables.
Definition: CGDeclCXX.cpp:1139
llvm::Value * EmitObjCAutoreleasePoolPush()
Produce the code to do a objc_autoreleasepool_push.
Definition: CGObjC.cpp:2724
CodeGenTypes & getTypes() const
static TypeEvaluationKind getEvaluationKind(QualType T)
getEvaluationKind - Return the TypeEvaluationKind of QualType T.
void EmitAggExpr(const Expr *E, AggValueSlot AS)
EmitAggExpr - Emit the computation of the specified expression of aggregate type.
Definition: CGExprAgg.cpp:2205
llvm::Value * EmitScalarExpr(const Expr *E, bool IgnoreResultAssign=false)
EmitScalarExpr - Emit the computation of the specified expression of LLVM scalar type,...
LValue MakeAddrLValue(Address Addr, QualType T, AlignmentSource Source=AlignmentSource::Type)
void FinishFunction(SourceLocation EndLoc=SourceLocation())
FinishFunction - Complete IR generation of the current function.
llvm::Function * generateDestroyHelper(Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray, const VarDecl *VD)
generateDestroyHelper - Generates a helper function which, when invoked, destroys the given object.
Definition: CGDeclCXX.cpp:1196
Address ReturnValue
ReturnValue - The temporary alloca to hold the return value.
llvm::LLVMContext & getLLVMContext()
void EmitStoreOfScalar(llvm::Value *Value, Address Addr, bool Volatile, QualType Ty, AlignmentSource Source=AlignmentSource::Type, bool isInit=false, bool isNontemporal=false)
EmitStoreOfScalar - Store a scalar value to an address, taking care to appropriately convert from the...
void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false)
EmitBlock - Emit the given block.
Definition: CGStmt.cpp:652
This class organizes the cross-function state that is used while generating LLVM code.
void SetInternalFunctionAttributes(GlobalDecl GD, llvm::Function *F, const CGFunctionInfo &FI)
Set the attributes on the LLVM function for the given decl and function info.
llvm::Module & getModule() const
llvm::FunctionCallee CreateRuntimeFunction(llvm::FunctionType *Ty, StringRef Name, llvm::AttributeList ExtraAttrs=llvm::AttributeList(), bool Local=false, bool AssumeConvergent=false)
Create or return a runtime function declaration with the specified type and name.
llvm::FunctionCallee getAddrAndTypeOfCXXStructor(GlobalDecl GD, const CGFunctionInfo *FnInfo=nullptr, llvm::FunctionType *FnType=nullptr, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
Definition: CGCXX.cpp:217
llvm::Constant * getFunctionPointer(GlobalDecl GD, llvm::Type *Ty=nullptr)
Return the ABI-correct function pointer value for a reference to the given function.
bool isInNoSanitizeList(SanitizerMask Kind, llvm::Function *Fn, SourceLocation Loc) const
const LangOptions & getLangOpts() const
const TargetInfo & getTarget() const
void addUsedGlobal(llvm::GlobalValue *GV)
Add a global to a list to be added to the llvm.used metadata.
const llvm::DataLayout & getDataLayout() const
void Error(SourceLocation loc, StringRef error)
Emit a general error that something can't be done.
bool shouldEmitConvergenceTokens() const
CGCXXABI & getCXXABI() const
CGOpenMPRuntime & getOpenMPRuntime()
Return a reference to the configured OpenMP runtime.
const llvm::Triple & getTriple() const
void AddGlobalDtor(llvm::Function *Dtor, int Priority=65535, bool IsDtorAttrFunc=false)
AddGlobalDtor - Add a function to the list that will be called when the module is unloaded.
ASTContext & getContext() const
const TargetCodeGenInfo & getTargetCodeGenInfo()
const CodeGenOptions & getCodeGenOpts() const
llvm::LLVMContext & getLLVMContext()
llvm::GlobalValue * GetGlobalValue(StringRef Ref)
void GenKernelArgMetadata(llvm::Function *FN, const FunctionDecl *FD=nullptr, CodeGenFunction *CGF=nullptr)
OpenCL v1.2 s5.6.4.6 allows the compiler to store kernel argument information in the program executab...
llvm::Function * getIntrinsic(unsigned IID, ArrayRef< llvm::Type * > Tys={})
CGObjCRuntime & getObjCRuntime()
Return a reference to the configured Objective-C runtime.
void SetLLVMFunctionAttributes(GlobalDecl GD, const CGFunctionInfo &Info, llvm::Function *F, bool IsThunk)
Set the LLVM function attributes (sext, zext, etc).
void AddGlobalCtor(llvm::Function *Ctor, int Priority=65535, unsigned LexOrder=~0U, llvm::Constant *AssociatedData=nullptr)
AddGlobalCtor - Add a function to the list that will be called before main() runs.
void SetLLVMFunctionAttributesForDefinition(const Decl *D, llvm::Function *F)
Set the LLVM function attributes which only apply to a function definition.
llvm::Function * CreateGlobalInitOrCleanUpFunction(llvm::FunctionType *ty, const Twine &name, const CGFunctionInfo &FI, SourceLocation Loc=SourceLocation(), bool TLS=false, llvm::GlobalVariable::LinkageTypes Linkage=llvm::GlobalVariable::InternalLinkage)
Definition: CGDeclCXX.cpp:438
const CGFunctionInfo & arrangeLLVMFunctionInfo(CanQualType returnType, FnInfoOpts opts, ArrayRef< CanQualType > argTypes, FunctionType::ExtInfo info, ArrayRef< FunctionProtoType::ExtParameterInfo > paramInfos, RequiredArgs args)
"Arrange" the LLVM information for a call or type with the given signature.
Definition: CGCall.cpp:831
llvm::FunctionType * GetFunctionType(const CGFunctionInfo &Info)
GetFunctionType - Get the LLVM function type for.
Definition: CGCall.cpp:1702
const CGFunctionInfo & arrangeBuiltinFunctionDeclaration(QualType resultType, const FunctionArgList &args)
A builtin function is a freestanding function using the default C conventions.
Definition: CGCall.cpp:739
unsigned getTargetAddressSpace(QualType T) const
const CGFunctionInfo & arrangeNullaryFunction()
A nullary function is a freestanding function of type 'void ()'.
Definition: CGCall.cpp:788
A specialization of Address that requires the address to be an LLVM Constant.
Definition: Address.h:296
static ConstantAddress invalid()
Definition: Address.h:304
llvm::Constant * getPointer() const
Definition: Address.h:308
FunctionArgList - Type for representing both the decl and type of parameters to a function.
Definition: CGCall.h:375
LValue - This represents an lvalue references.
Definition: CGValue.h:182
bool isObjCStrong() const
Definition: CGValue.h:324
bool isObjCWeak() const
Definition: CGValue.h:321
RValue - This trivial value class is used to represent the result of an expression that is evaluated.
Definition: CGValue.h:42
llvm::Value * getScalarVal() const
getScalarVal() - Return the Value* of this scalar value.
Definition: CGValue.h:71
bool isValid() const
Definition: Address.h:62
virtual void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &M) const
setTargetAttributes - Provides a convenient hook to handle extra target-specific attributes for the g...
Definition: TargetInfo.h:80
virtual LangAS getAddrSpaceOfCxaAtexitPtrParam() const
Get address space of pointer parameter for __cxa_atexit.
Definition: TargetInfo.h:348
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
T * getAttr() const
Definition: DeclBase.h:573
SourceLocation getLocation() const
Definition: DeclBase.h:439
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: DeclBase.h:431
bool hasAttr() const
Definition: DeclBase.h:577
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: Decl.h:830
This represents one expression.
Definition: Expr.h:112
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition: Expr.cpp:273
A class which abstracts out some details necessary for making a call.
Definition: TypeBase.h:4589
GlobalDecl - represents a global declaration.
Definition: GlobalDecl.h:57
virtual void mangleDynamicAtExitDestructor(const VarDecl *D, raw_ostream &)=0
virtual void mangleDynamicInitializer(const VarDecl *D, raw_ostream &)=0
Describes a module or submodule.
Definition: Module.h:144
SmallVector< ExportDecl, 2 > Exports
The set of export declarations.
Definition: Module.h:471
bool isInterfaceOrPartition() const
Definition: Module.h:671
llvm::SmallSetVector< Module *, 2 > Imports
The set of modules imported by this module, and on which this module depends.
Definition: Module.h:458
llvm::iterator_range< submodule_iterator > submodules()
Definition: Module.h:838
A (possibly-)qualified type.
Definition: TypeBase.h:937
@ DK_nontrivial_c_struct
Definition: TypeBase.h:1538
@ DK_objc_strong_lifetime
Definition: TypeBase.h:1536
Scope - A scope is a transient data structure that is used while parsing the program.
Definition: Scope.h:41
Encodes a location in the source.
The base class of the type hierarchy.
Definition: TypeBase.h:1833
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition: Type.h:26
bool isReferenceType() const
Definition: TypeBase.h:8604
Represents a variable declaration or definition.
Definition: Decl.h:925
const Expr * getInit() const
Definition: Decl.h:1367
@ TLS_Dynamic
TLS with a dynamic initializer.
Definition: Decl.h:951
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
The JSON file list parser is used to communicate input to InstallAPI.
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
Definition: Specifiers.h:212
@ OpenCL
Definition: LangStandard.h:65
@ CPlusPlus
Definition: LangStandard.h:55
bool isUniqueGVALinkage(GVALinkage L)
Do we know that this will be the only definition of this symbol (excluding inlining-only definitions)...
Definition: Linkage.h:86
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
Definition: Linkage.h:24
@ Dtor_Complete
Complete object dtor.
Definition: ABI.h:35
LLVM_READONLY bool isPreprocessingNumberBody(unsigned char c)
Return true if this is the body character of a C preprocessing number, which is [a-zA-Z0-9_.
Definition: CharInfo.h:168
const FunctionProtoType * T
@ Other
Other implicit parameter.
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
llvm::CallingConv::ID getRuntimeCC() const
llvm::IntegerType * IntTy
int
Extra information about a function prototype.
Definition: TypeBase.h:5367