1*67e74705SXin Li //===--- CGDeclCXX.cpp - Emit LLVM Code for C++ declarations --------------===//
2*67e74705SXin Li //
3*67e74705SXin Li // The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This contains code dealing with code generation of C++ declarations
11*67e74705SXin Li //
12*67e74705SXin Li //===----------------------------------------------------------------------===//
13*67e74705SXin Li
14*67e74705SXin Li #include "CodeGenFunction.h"
15*67e74705SXin Li #include "CGCXXABI.h"
16*67e74705SXin Li #include "CGObjCRuntime.h"
17*67e74705SXin Li #include "CGOpenMPRuntime.h"
18*67e74705SXin Li #include "clang/Frontend/CodeGenOptions.h"
19*67e74705SXin Li #include "llvm/ADT/StringExtras.h"
20*67e74705SXin Li #include "llvm/IR/Intrinsics.h"
21*67e74705SXin Li #include "llvm/Support/Path.h"
22*67e74705SXin Li
23*67e74705SXin Li using namespace clang;
24*67e74705SXin Li using namespace CodeGen;
25*67e74705SXin Li
EmitDeclInit(CodeGenFunction & CGF,const VarDecl & D,ConstantAddress DeclPtr)26*67e74705SXin Li static void EmitDeclInit(CodeGenFunction &CGF, const VarDecl &D,
27*67e74705SXin Li ConstantAddress DeclPtr) {
28*67e74705SXin Li assert(D.hasGlobalStorage() && "VarDecl must have global storage!");
29*67e74705SXin Li assert(!D.getType()->isReferenceType() &&
30*67e74705SXin Li "Should not call EmitDeclInit on a reference!");
31*67e74705SXin Li
32*67e74705SXin Li QualType type = D.getType();
33*67e74705SXin Li LValue lv = CGF.MakeAddrLValue(DeclPtr, type);
34*67e74705SXin Li
35*67e74705SXin Li const Expr *Init = D.getInit();
36*67e74705SXin Li switch (CGF.getEvaluationKind(type)) {
37*67e74705SXin Li case TEK_Scalar: {
38*67e74705SXin Li CodeGenModule &CGM = CGF.CGM;
39*67e74705SXin Li if (lv.isObjCStrong())
40*67e74705SXin Li CGM.getObjCRuntime().EmitObjCGlobalAssign(CGF, CGF.EmitScalarExpr(Init),
41*67e74705SXin Li DeclPtr, D.getTLSKind());
42*67e74705SXin Li else if (lv.isObjCWeak())
43*67e74705SXin Li CGM.getObjCRuntime().EmitObjCWeakAssign(CGF, CGF.EmitScalarExpr(Init),
44*67e74705SXin Li DeclPtr);
45*67e74705SXin Li else
46*67e74705SXin Li CGF.EmitScalarInit(Init, &D, lv, false);
47*67e74705SXin Li return;
48*67e74705SXin Li }
49*67e74705SXin Li case TEK_Complex:
50*67e74705SXin Li CGF.EmitComplexExprIntoLValue(Init, lv, /*isInit*/ true);
51*67e74705SXin Li return;
52*67e74705SXin Li case TEK_Aggregate:
53*67e74705SXin Li CGF.EmitAggExpr(Init, AggValueSlot::forLValue(lv,AggValueSlot::IsDestructed,
54*67e74705SXin Li AggValueSlot::DoesNotNeedGCBarriers,
55*67e74705SXin Li AggValueSlot::IsNotAliased));
56*67e74705SXin Li return;
57*67e74705SXin Li }
58*67e74705SXin Li llvm_unreachable("bad evaluation kind");
59*67e74705SXin Li }
60*67e74705SXin Li
61*67e74705SXin Li /// Emit code to cause the destruction of the given variable with
62*67e74705SXin Li /// static storage duration.
EmitDeclDestroy(CodeGenFunction & CGF,const VarDecl & D,ConstantAddress addr)63*67e74705SXin Li static void EmitDeclDestroy(CodeGenFunction &CGF, const VarDecl &D,
64*67e74705SXin Li ConstantAddress addr) {
65*67e74705SXin Li CodeGenModule &CGM = CGF.CGM;
66*67e74705SXin Li
67*67e74705SXin Li // FIXME: __attribute__((cleanup)) ?
68*67e74705SXin Li
69*67e74705SXin Li QualType type = D.getType();
70*67e74705SXin Li QualType::DestructionKind dtorKind = type.isDestructedType();
71*67e74705SXin Li
72*67e74705SXin Li switch (dtorKind) {
73*67e74705SXin Li case QualType::DK_none:
74*67e74705SXin Li return;
75*67e74705SXin Li
76*67e74705SXin Li case QualType::DK_cxx_destructor:
77*67e74705SXin Li break;
78*67e74705SXin Li
79*67e74705SXin Li case QualType::DK_objc_strong_lifetime:
80*67e74705SXin Li case QualType::DK_objc_weak_lifetime:
81*67e74705SXin Li // We don't care about releasing objects during process teardown.
82*67e74705SXin Li assert(!D.getTLSKind() && "should have rejected this");
83*67e74705SXin Li return;
84*67e74705SXin Li }
85*67e74705SXin Li
86*67e74705SXin Li llvm::Constant *function;
87*67e74705SXin Li llvm::Constant *argument;
88*67e74705SXin Li
89*67e74705SXin Li // Special-case non-array C++ destructors, if they have the right signature.
90*67e74705SXin Li // Under some ABIs, destructors return this instead of void, and cannot be
91*67e74705SXin Li // passed directly to __cxa_atexit if the target does not allow this mismatch.
92*67e74705SXin Li const CXXRecordDecl *Record = type->getAsCXXRecordDecl();
93*67e74705SXin Li bool CanRegisterDestructor =
94*67e74705SXin Li Record && (!CGM.getCXXABI().HasThisReturn(
95*67e74705SXin Li GlobalDecl(Record->getDestructor(), Dtor_Complete)) ||
96*67e74705SXin Li CGM.getCXXABI().canCallMismatchedFunctionType());
97*67e74705SXin Li // If __cxa_atexit is disabled via a flag, a different helper function is
98*67e74705SXin Li // generated elsewhere which uses atexit instead, and it takes the destructor
99*67e74705SXin Li // directly.
100*67e74705SXin Li bool UsingExternalHelper = !CGM.getCodeGenOpts().CXAAtExit;
101*67e74705SXin Li if (Record && (CanRegisterDestructor || UsingExternalHelper)) {
102*67e74705SXin Li assert(!Record->hasTrivialDestructor());
103*67e74705SXin Li CXXDestructorDecl *dtor = Record->getDestructor();
104*67e74705SXin Li
105*67e74705SXin Li function = CGM.getAddrOfCXXStructor(dtor, StructorType::Complete);
106*67e74705SXin Li argument = llvm::ConstantExpr::getBitCast(
107*67e74705SXin Li addr.getPointer(), CGF.getTypes().ConvertType(type)->getPointerTo());
108*67e74705SXin Li
109*67e74705SXin Li // Otherwise, the standard logic requires a helper function.
110*67e74705SXin Li } else {
111*67e74705SXin Li function = CodeGenFunction(CGM)
112*67e74705SXin Li .generateDestroyHelper(addr, type, CGF.getDestroyer(dtorKind),
113*67e74705SXin Li CGF.needsEHCleanup(dtorKind), &D);
114*67e74705SXin Li argument = llvm::Constant::getNullValue(CGF.Int8PtrTy);
115*67e74705SXin Li }
116*67e74705SXin Li
117*67e74705SXin Li CGM.getCXXABI().registerGlobalDtor(CGF, D, function, argument);
118*67e74705SXin Li }
119*67e74705SXin Li
120*67e74705SXin Li /// Emit code to cause the variable at the given address to be considered as
121*67e74705SXin Li /// constant from this point onwards.
EmitDeclInvariant(CodeGenFunction & CGF,const VarDecl & D,llvm::Constant * Addr)122*67e74705SXin Li static void EmitDeclInvariant(CodeGenFunction &CGF, const VarDecl &D,
123*67e74705SXin Li llvm::Constant *Addr) {
124*67e74705SXin Li // Don't emit the intrinsic if we're not optimizing.
125*67e74705SXin Li if (!CGF.CGM.getCodeGenOpts().OptimizationLevel)
126*67e74705SXin Li return;
127*67e74705SXin Li
128*67e74705SXin Li // Grab the llvm.invariant.start intrinsic.
129*67e74705SXin Li llvm::Intrinsic::ID InvStartID = llvm::Intrinsic::invariant_start;
130*67e74705SXin Li llvm::Constant *InvariantStart = CGF.CGM.getIntrinsic(InvStartID);
131*67e74705SXin Li
132*67e74705SXin Li // Emit a call with the size in bytes of the object.
133*67e74705SXin Li CharUnits WidthChars = CGF.getContext().getTypeSizeInChars(D.getType());
134*67e74705SXin Li uint64_t Width = WidthChars.getQuantity();
135*67e74705SXin Li llvm::Value *Args[2] = { llvm::ConstantInt::getSigned(CGF.Int64Ty, Width),
136*67e74705SXin Li llvm::ConstantExpr::getBitCast(Addr, CGF.Int8PtrTy)};
137*67e74705SXin Li CGF.Builder.CreateCall(InvariantStart, Args);
138*67e74705SXin Li }
139*67e74705SXin Li
EmitCXXGlobalVarDeclInit(const VarDecl & D,llvm::Constant * DeclPtr,bool PerformInit)140*67e74705SXin Li void CodeGenFunction::EmitCXXGlobalVarDeclInit(const VarDecl &D,
141*67e74705SXin Li llvm::Constant *DeclPtr,
142*67e74705SXin Li bool PerformInit) {
143*67e74705SXin Li
144*67e74705SXin Li const Expr *Init = D.getInit();
145*67e74705SXin Li QualType T = D.getType();
146*67e74705SXin Li
147*67e74705SXin Li // The address space of a static local variable (DeclPtr) may be different
148*67e74705SXin Li // from the address space of the "this" argument of the constructor. In that
149*67e74705SXin Li // case, we need an addrspacecast before calling the constructor.
150*67e74705SXin Li //
151*67e74705SXin Li // struct StructWithCtor {
152*67e74705SXin Li // __device__ StructWithCtor() {...}
153*67e74705SXin Li // };
154*67e74705SXin Li // __device__ void foo() {
155*67e74705SXin Li // __shared__ StructWithCtor s;
156*67e74705SXin Li // ...
157*67e74705SXin Li // }
158*67e74705SXin Li //
159*67e74705SXin Li // For example, in the above CUDA code, the static local variable s has a
160*67e74705SXin Li // "shared" address space qualifier, but the constructor of StructWithCtor
161*67e74705SXin Li // expects "this" in the "generic" address space.
162*67e74705SXin Li unsigned ExpectedAddrSpace = getContext().getTargetAddressSpace(T);
163*67e74705SXin Li unsigned ActualAddrSpace = DeclPtr->getType()->getPointerAddressSpace();
164*67e74705SXin Li if (ActualAddrSpace != ExpectedAddrSpace) {
165*67e74705SXin Li llvm::Type *LTy = CGM.getTypes().ConvertTypeForMem(T);
166*67e74705SXin Li llvm::PointerType *PTy = llvm::PointerType::get(LTy, ExpectedAddrSpace);
167*67e74705SXin Li DeclPtr = llvm::ConstantExpr::getAddrSpaceCast(DeclPtr, PTy);
168*67e74705SXin Li }
169*67e74705SXin Li
170*67e74705SXin Li ConstantAddress DeclAddr(DeclPtr, getContext().getDeclAlign(&D));
171*67e74705SXin Li
172*67e74705SXin Li if (!T->isReferenceType()) {
173*67e74705SXin Li if (getLangOpts().OpenMP && D.hasAttr<OMPThreadPrivateDeclAttr>())
174*67e74705SXin Li (void)CGM.getOpenMPRuntime().emitThreadPrivateVarDefinition(
175*67e74705SXin Li &D, DeclAddr, D.getAttr<OMPThreadPrivateDeclAttr>()->getLocation(),
176*67e74705SXin Li PerformInit, this);
177*67e74705SXin Li if (PerformInit)
178*67e74705SXin Li EmitDeclInit(*this, D, DeclAddr);
179*67e74705SXin Li if (CGM.isTypeConstant(D.getType(), true))
180*67e74705SXin Li EmitDeclInvariant(*this, D, DeclPtr);
181*67e74705SXin Li else
182*67e74705SXin Li EmitDeclDestroy(*this, D, DeclAddr);
183*67e74705SXin Li return;
184*67e74705SXin Li }
185*67e74705SXin Li
186*67e74705SXin Li assert(PerformInit && "cannot have constant initializer which needs "
187*67e74705SXin Li "destruction for reference");
188*67e74705SXin Li RValue RV = EmitReferenceBindingToExpr(Init);
189*67e74705SXin Li EmitStoreOfScalar(RV.getScalarVal(), DeclAddr, false, T);
190*67e74705SXin Li }
191*67e74705SXin Li
192*67e74705SXin Li /// Create a stub function, suitable for being passed to atexit,
193*67e74705SXin Li /// which passes the given address to the given destructor function.
createAtExitStub(const VarDecl & VD,llvm::Constant * dtor,llvm::Constant * addr)194*67e74705SXin Li llvm::Constant *CodeGenFunction::createAtExitStub(const VarDecl &VD,
195*67e74705SXin Li llvm::Constant *dtor,
196*67e74705SXin Li llvm::Constant *addr) {
197*67e74705SXin Li // Get the destructor function type, void(*)(void).
198*67e74705SXin Li llvm::FunctionType *ty = llvm::FunctionType::get(CGM.VoidTy, false);
199*67e74705SXin Li SmallString<256> FnName;
200*67e74705SXin Li {
201*67e74705SXin Li llvm::raw_svector_ostream Out(FnName);
202*67e74705SXin Li CGM.getCXXABI().getMangleContext().mangleDynamicAtExitDestructor(&VD, Out);
203*67e74705SXin Li }
204*67e74705SXin Li
205*67e74705SXin Li const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
206*67e74705SXin Li llvm::Function *fn = CGM.CreateGlobalInitOrDestructFunction(ty, FnName.str(),
207*67e74705SXin Li FI,
208*67e74705SXin Li VD.getLocation());
209*67e74705SXin Li
210*67e74705SXin Li CodeGenFunction CGF(CGM);
211*67e74705SXin Li
212*67e74705SXin Li CGF.StartFunction(&VD, CGM.getContext().VoidTy, fn, FI, FunctionArgList());
213*67e74705SXin Li
214*67e74705SXin Li llvm::CallInst *call = CGF.Builder.CreateCall(dtor, addr);
215*67e74705SXin Li
216*67e74705SXin Li // Make sure the call and the callee agree on calling convention.
217*67e74705SXin Li if (llvm::Function *dtorFn =
218*67e74705SXin Li dyn_cast<llvm::Function>(dtor->stripPointerCasts()))
219*67e74705SXin Li call->setCallingConv(dtorFn->getCallingConv());
220*67e74705SXin Li
221*67e74705SXin Li CGF.FinishFunction();
222*67e74705SXin Li
223*67e74705SXin Li return fn;
224*67e74705SXin Li }
225*67e74705SXin Li
226*67e74705SXin Li /// Register a global destructor using the C atexit runtime function.
registerGlobalDtorWithAtExit(const VarDecl & VD,llvm::Constant * dtor,llvm::Constant * addr)227*67e74705SXin Li void CodeGenFunction::registerGlobalDtorWithAtExit(const VarDecl &VD,
228*67e74705SXin Li llvm::Constant *dtor,
229*67e74705SXin Li llvm::Constant *addr) {
230*67e74705SXin Li // Create a function which calls the destructor.
231*67e74705SXin Li llvm::Constant *dtorStub = createAtExitStub(VD, dtor, addr);
232*67e74705SXin Li
233*67e74705SXin Li // extern "C" int atexit(void (*f)(void));
234*67e74705SXin Li llvm::FunctionType *atexitTy =
235*67e74705SXin Li llvm::FunctionType::get(IntTy, dtorStub->getType(), false);
236*67e74705SXin Li
237*67e74705SXin Li llvm::Constant *atexit =
238*67e74705SXin Li CGM.CreateRuntimeFunction(atexitTy, "atexit");
239*67e74705SXin Li if (llvm::Function *atexitFn = dyn_cast<llvm::Function>(atexit))
240*67e74705SXin Li atexitFn->setDoesNotThrow();
241*67e74705SXin Li
242*67e74705SXin Li EmitNounwindRuntimeCall(atexit, dtorStub);
243*67e74705SXin Li }
244*67e74705SXin Li
EmitCXXGuardedInit(const VarDecl & D,llvm::GlobalVariable * DeclPtr,bool PerformInit)245*67e74705SXin Li void CodeGenFunction::EmitCXXGuardedInit(const VarDecl &D,
246*67e74705SXin Li llvm::GlobalVariable *DeclPtr,
247*67e74705SXin Li bool PerformInit) {
248*67e74705SXin Li // If we've been asked to forbid guard variables, emit an error now.
249*67e74705SXin Li // This diagnostic is hard-coded for Darwin's use case; we can find
250*67e74705SXin Li // better phrasing if someone else needs it.
251*67e74705SXin Li if (CGM.getCodeGenOpts().ForbidGuardVariables)
252*67e74705SXin Li CGM.Error(D.getLocation(),
253*67e74705SXin Li "this initialization requires a guard variable, which "
254*67e74705SXin Li "the kernel does not support");
255*67e74705SXin Li
256*67e74705SXin Li CGM.getCXXABI().EmitGuardedInit(*this, D, DeclPtr, PerformInit);
257*67e74705SXin Li }
258*67e74705SXin Li
CreateGlobalInitOrDestructFunction(llvm::FunctionType * FTy,const Twine & Name,const CGFunctionInfo & FI,SourceLocation Loc,bool TLS)259*67e74705SXin Li llvm::Function *CodeGenModule::CreateGlobalInitOrDestructFunction(
260*67e74705SXin Li llvm::FunctionType *FTy, const Twine &Name, const CGFunctionInfo &FI,
261*67e74705SXin Li SourceLocation Loc, bool TLS) {
262*67e74705SXin Li llvm::Function *Fn =
263*67e74705SXin Li llvm::Function::Create(FTy, llvm::GlobalValue::InternalLinkage,
264*67e74705SXin Li Name, &getModule());
265*67e74705SXin Li if (!getLangOpts().AppleKext && !TLS) {
266*67e74705SXin Li // Set the section if needed.
267*67e74705SXin Li if (const char *Section = getTarget().getStaticInitSectionSpecifier())
268*67e74705SXin Li Fn->setSection(Section);
269*67e74705SXin Li }
270*67e74705SXin Li
271*67e74705SXin Li SetInternalFunctionAttributes(nullptr, Fn, FI);
272*67e74705SXin Li
273*67e74705SXin Li Fn->setCallingConv(getRuntimeCC());
274*67e74705SXin Li
275*67e74705SXin Li if (!getLangOpts().Exceptions)
276*67e74705SXin Li Fn->setDoesNotThrow();
277*67e74705SXin Li
278*67e74705SXin Li if (!isInSanitizerBlacklist(Fn, Loc)) {
279*67e74705SXin Li if (getLangOpts().Sanitize.hasOneOf(SanitizerKind::Address |
280*67e74705SXin Li SanitizerKind::KernelAddress))
281*67e74705SXin Li Fn->addFnAttr(llvm::Attribute::SanitizeAddress);
282*67e74705SXin Li if (getLangOpts().Sanitize.has(SanitizerKind::Thread))
283*67e74705SXin Li Fn->addFnAttr(llvm::Attribute::SanitizeThread);
284*67e74705SXin Li if (getLangOpts().Sanitize.has(SanitizerKind::Memory))
285*67e74705SXin Li Fn->addFnAttr(llvm::Attribute::SanitizeMemory);
286*67e74705SXin Li if (getLangOpts().Sanitize.has(SanitizerKind::SafeStack))
287*67e74705SXin Li Fn->addFnAttr(llvm::Attribute::SafeStack);
288*67e74705SXin Li }
289*67e74705SXin Li
290*67e74705SXin Li return Fn;
291*67e74705SXin Li }
292*67e74705SXin Li
293*67e74705SXin Li /// Create a global pointer to a function that will initialize a global
294*67e74705SXin Li /// variable. The user has requested that this pointer be emitted in a specific
295*67e74705SXin Li /// section.
EmitPointerToInitFunc(const VarDecl * D,llvm::GlobalVariable * GV,llvm::Function * InitFunc,InitSegAttr * ISA)296*67e74705SXin Li void CodeGenModule::EmitPointerToInitFunc(const VarDecl *D,
297*67e74705SXin Li llvm::GlobalVariable *GV,
298*67e74705SXin Li llvm::Function *InitFunc,
299*67e74705SXin Li InitSegAttr *ISA) {
300*67e74705SXin Li llvm::GlobalVariable *PtrArray = new llvm::GlobalVariable(
301*67e74705SXin Li TheModule, InitFunc->getType(), /*isConstant=*/true,
302*67e74705SXin Li llvm::GlobalValue::PrivateLinkage, InitFunc, "__cxx_init_fn_ptr");
303*67e74705SXin Li PtrArray->setSection(ISA->getSection());
304*67e74705SXin Li addUsedGlobal(PtrArray);
305*67e74705SXin Li
306*67e74705SXin Li // If the GV is already in a comdat group, then we have to join it.
307*67e74705SXin Li if (llvm::Comdat *C = GV->getComdat())
308*67e74705SXin Li PtrArray->setComdat(C);
309*67e74705SXin Li }
310*67e74705SXin Li
311*67e74705SXin Li void
EmitCXXGlobalVarDeclInitFunc(const VarDecl * D,llvm::GlobalVariable * Addr,bool PerformInit)312*67e74705SXin Li CodeGenModule::EmitCXXGlobalVarDeclInitFunc(const VarDecl *D,
313*67e74705SXin Li llvm::GlobalVariable *Addr,
314*67e74705SXin Li bool PerformInit) {
315*67e74705SXin Li
316*67e74705SXin Li // According to E.2.3.1 in CUDA-7.5 Programming guide: __device__,
317*67e74705SXin Li // __constant__ and __shared__ variables defined in namespace scope,
318*67e74705SXin Li // that are of class type, cannot have a non-empty constructor. All
319*67e74705SXin Li // the checks have been done in Sema by now. Whatever initializers
320*67e74705SXin Li // are allowed are empty and we just need to ignore them here.
321*67e74705SXin Li if (getLangOpts().CUDA && getLangOpts().CUDAIsDevice &&
322*67e74705SXin Li (D->hasAttr<CUDADeviceAttr>() || D->hasAttr<CUDAConstantAttr>() ||
323*67e74705SXin Li D->hasAttr<CUDASharedAttr>()))
324*67e74705SXin Li return;
325*67e74705SXin Li
326*67e74705SXin Li // Check if we've already initialized this decl.
327*67e74705SXin Li auto I = DelayedCXXInitPosition.find(D);
328*67e74705SXin Li if (I != DelayedCXXInitPosition.end() && I->second == ~0U)
329*67e74705SXin Li return;
330*67e74705SXin Li
331*67e74705SXin Li llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
332*67e74705SXin Li SmallString<256> FnName;
333*67e74705SXin Li {
334*67e74705SXin Li llvm::raw_svector_ostream Out(FnName);
335*67e74705SXin Li getCXXABI().getMangleContext().mangleDynamicInitializer(D, Out);
336*67e74705SXin Li }
337*67e74705SXin Li
338*67e74705SXin Li // Create a variable initialization function.
339*67e74705SXin Li llvm::Function *Fn =
340*67e74705SXin Li CreateGlobalInitOrDestructFunction(FTy, FnName.str(),
341*67e74705SXin Li getTypes().arrangeNullaryFunction(),
342*67e74705SXin Li D->getLocation());
343*67e74705SXin Li
344*67e74705SXin Li auto *ISA = D->getAttr<InitSegAttr>();
345*67e74705SXin Li CodeGenFunction(*this).GenerateCXXGlobalVarDeclInitFunc(Fn, D, Addr,
346*67e74705SXin Li PerformInit);
347*67e74705SXin Li
348*67e74705SXin Li llvm::GlobalVariable *COMDATKey =
349*67e74705SXin Li supportsCOMDAT() && D->isExternallyVisible() ? Addr : nullptr;
350*67e74705SXin Li
351*67e74705SXin Li if (D->getTLSKind()) {
352*67e74705SXin Li // FIXME: Should we support init_priority for thread_local?
353*67e74705SXin Li // FIXME: Ideally, initialization of instantiated thread_local static data
354*67e74705SXin Li // members of class templates should not trigger initialization of other
355*67e74705SXin Li // entities in the TU.
356*67e74705SXin Li // FIXME: We only need to register one __cxa_thread_atexit function for the
357*67e74705SXin Li // entire TU.
358*67e74705SXin Li CXXThreadLocalInits.push_back(Fn);
359*67e74705SXin Li CXXThreadLocalInitVars.push_back(D);
360*67e74705SXin Li } else if (PerformInit && ISA) {
361*67e74705SXin Li EmitPointerToInitFunc(D, Addr, Fn, ISA);
362*67e74705SXin Li } else if (auto *IPA = D->getAttr<InitPriorityAttr>()) {
363*67e74705SXin Li OrderGlobalInits Key(IPA->getPriority(), PrioritizedCXXGlobalInits.size());
364*67e74705SXin Li PrioritizedCXXGlobalInits.push_back(std::make_pair(Key, Fn));
365*67e74705SXin Li } else if (isTemplateInstantiation(D->getTemplateSpecializationKind())) {
366*67e74705SXin Li // C++ [basic.start.init]p2:
367*67e74705SXin Li // Definitions of explicitly specialized class template static data
368*67e74705SXin Li // members have ordered initialization. Other class template static data
369*67e74705SXin Li // members (i.e., implicitly or explicitly instantiated specializations)
370*67e74705SXin Li // have unordered initialization.
371*67e74705SXin Li //
372*67e74705SXin Li // As a consequence, we can put them into their own llvm.global_ctors entry.
373*67e74705SXin Li //
374*67e74705SXin Li // If the global is externally visible, put the initializer into a COMDAT
375*67e74705SXin Li // group with the global being initialized. On most platforms, this is a
376*67e74705SXin Li // minor startup time optimization. In the MS C++ ABI, there are no guard
377*67e74705SXin Li // variables, so this COMDAT key is required for correctness.
378*67e74705SXin Li AddGlobalCtor(Fn, 65535, COMDATKey);
379*67e74705SXin Li } else if (D->hasAttr<SelectAnyAttr>()) {
380*67e74705SXin Li // SelectAny globals will be comdat-folded. Put the initializer into a
381*67e74705SXin Li // COMDAT group associated with the global, so the initializers get folded
382*67e74705SXin Li // too.
383*67e74705SXin Li AddGlobalCtor(Fn, 65535, COMDATKey);
384*67e74705SXin Li } else {
385*67e74705SXin Li I = DelayedCXXInitPosition.find(D); // Re-do lookup in case of re-hash.
386*67e74705SXin Li if (I == DelayedCXXInitPosition.end()) {
387*67e74705SXin Li CXXGlobalInits.push_back(Fn);
388*67e74705SXin Li } else if (I->second != ~0U) {
389*67e74705SXin Li assert(I->second < CXXGlobalInits.size() &&
390*67e74705SXin Li CXXGlobalInits[I->second] == nullptr);
391*67e74705SXin Li CXXGlobalInits[I->second] = Fn;
392*67e74705SXin Li }
393*67e74705SXin Li }
394*67e74705SXin Li
395*67e74705SXin Li // Remember that we already emitted the initializer for this global.
396*67e74705SXin Li DelayedCXXInitPosition[D] = ~0U;
397*67e74705SXin Li }
398*67e74705SXin Li
EmitCXXThreadLocalInitFunc()399*67e74705SXin Li void CodeGenModule::EmitCXXThreadLocalInitFunc() {
400*67e74705SXin Li getCXXABI().EmitThreadLocalInitFuncs(
401*67e74705SXin Li *this, CXXThreadLocals, CXXThreadLocalInits, CXXThreadLocalInitVars);
402*67e74705SXin Li
403*67e74705SXin Li CXXThreadLocalInits.clear();
404*67e74705SXin Li CXXThreadLocalInitVars.clear();
405*67e74705SXin Li CXXThreadLocals.clear();
406*67e74705SXin Li }
407*67e74705SXin Li
408*67e74705SXin Li void
EmitCXXGlobalInitFunc()409*67e74705SXin Li CodeGenModule::EmitCXXGlobalInitFunc() {
410*67e74705SXin Li while (!CXXGlobalInits.empty() && !CXXGlobalInits.back())
411*67e74705SXin Li CXXGlobalInits.pop_back();
412*67e74705SXin Li
413*67e74705SXin Li if (CXXGlobalInits.empty() && PrioritizedCXXGlobalInits.empty())
414*67e74705SXin Li return;
415*67e74705SXin Li
416*67e74705SXin Li llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
417*67e74705SXin Li const CGFunctionInfo &FI = getTypes().arrangeNullaryFunction();
418*67e74705SXin Li
419*67e74705SXin Li // Create our global initialization function.
420*67e74705SXin Li if (!PrioritizedCXXGlobalInits.empty()) {
421*67e74705SXin Li SmallVector<llvm::Function *, 8> LocalCXXGlobalInits;
422*67e74705SXin Li llvm::array_pod_sort(PrioritizedCXXGlobalInits.begin(),
423*67e74705SXin Li PrioritizedCXXGlobalInits.end());
424*67e74705SXin Li // Iterate over "chunks" of ctors with same priority and emit each chunk
425*67e74705SXin Li // into separate function. Note - everything is sorted first by priority,
426*67e74705SXin Li // second - by lex order, so we emit ctor functions in proper order.
427*67e74705SXin Li for (SmallVectorImpl<GlobalInitData >::iterator
428*67e74705SXin Li I = PrioritizedCXXGlobalInits.begin(),
429*67e74705SXin Li E = PrioritizedCXXGlobalInits.end(); I != E; ) {
430*67e74705SXin Li SmallVectorImpl<GlobalInitData >::iterator
431*67e74705SXin Li PrioE = std::upper_bound(I + 1, E, *I, GlobalInitPriorityCmp());
432*67e74705SXin Li
433*67e74705SXin Li LocalCXXGlobalInits.clear();
434*67e74705SXin Li unsigned Priority = I->first.priority;
435*67e74705SXin Li // Compute the function suffix from priority. Prepend with zeroes to make
436*67e74705SXin Li // sure the function names are also ordered as priorities.
437*67e74705SXin Li std::string PrioritySuffix = llvm::utostr(Priority);
438*67e74705SXin Li // Priority is always <= 65535 (enforced by sema).
439*67e74705SXin Li PrioritySuffix = std::string(6-PrioritySuffix.size(), '0')+PrioritySuffix;
440*67e74705SXin Li llvm::Function *Fn = CreateGlobalInitOrDestructFunction(
441*67e74705SXin Li FTy, "_GLOBAL__I_" + PrioritySuffix, FI);
442*67e74705SXin Li
443*67e74705SXin Li for (; I < PrioE; ++I)
444*67e74705SXin Li LocalCXXGlobalInits.push_back(I->second);
445*67e74705SXin Li
446*67e74705SXin Li CodeGenFunction(*this).GenerateCXXGlobalInitFunc(Fn, LocalCXXGlobalInits);
447*67e74705SXin Li AddGlobalCtor(Fn, Priority);
448*67e74705SXin Li }
449*67e74705SXin Li PrioritizedCXXGlobalInits.clear();
450*67e74705SXin Li }
451*67e74705SXin Li
452*67e74705SXin Li SmallString<128> FileName;
453*67e74705SXin Li SourceManager &SM = Context.getSourceManager();
454*67e74705SXin Li if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID())) {
455*67e74705SXin Li // Include the filename in the symbol name. Including "sub_" matches gcc and
456*67e74705SXin Li // makes sure these symbols appear lexicographically behind the symbols with
457*67e74705SXin Li // priority emitted above.
458*67e74705SXin Li FileName = llvm::sys::path::filename(MainFile->getName());
459*67e74705SXin Li } else {
460*67e74705SXin Li FileName = "<null>";
461*67e74705SXin Li }
462*67e74705SXin Li
463*67e74705SXin Li for (size_t i = 0; i < FileName.size(); ++i) {
464*67e74705SXin Li // Replace everything that's not [a-zA-Z0-9._] with a _. This set happens
465*67e74705SXin Li // to be the set of C preprocessing numbers.
466*67e74705SXin Li if (!isPreprocessingNumberBody(FileName[i]))
467*67e74705SXin Li FileName[i] = '_';
468*67e74705SXin Li }
469*67e74705SXin Li
470*67e74705SXin Li llvm::Function *Fn = CreateGlobalInitOrDestructFunction(
471*67e74705SXin Li FTy, llvm::Twine("_GLOBAL__sub_I_", FileName), FI);
472*67e74705SXin Li
473*67e74705SXin Li CodeGenFunction(*this).GenerateCXXGlobalInitFunc(Fn, CXXGlobalInits);
474*67e74705SXin Li AddGlobalCtor(Fn);
475*67e74705SXin Li
476*67e74705SXin Li CXXGlobalInits.clear();
477*67e74705SXin Li }
478*67e74705SXin Li
EmitCXXGlobalDtorFunc()479*67e74705SXin Li void CodeGenModule::EmitCXXGlobalDtorFunc() {
480*67e74705SXin Li if (CXXGlobalDtors.empty())
481*67e74705SXin Li return;
482*67e74705SXin Li
483*67e74705SXin Li llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
484*67e74705SXin Li
485*67e74705SXin Li // Create our global destructor function.
486*67e74705SXin Li const CGFunctionInfo &FI = getTypes().arrangeNullaryFunction();
487*67e74705SXin Li llvm::Function *Fn =
488*67e74705SXin Li CreateGlobalInitOrDestructFunction(FTy, "_GLOBAL__D_a", FI);
489*67e74705SXin Li
490*67e74705SXin Li CodeGenFunction(*this).GenerateCXXGlobalDtorsFunc(Fn, CXXGlobalDtors);
491*67e74705SXin Li AddGlobalDtor(Fn);
492*67e74705SXin Li }
493*67e74705SXin Li
494*67e74705SXin Li /// Emit the code necessary to initialize the given global variable.
GenerateCXXGlobalVarDeclInitFunc(llvm::Function * Fn,const VarDecl * D,llvm::GlobalVariable * Addr,bool PerformInit)495*67e74705SXin Li void CodeGenFunction::GenerateCXXGlobalVarDeclInitFunc(llvm::Function *Fn,
496*67e74705SXin Li const VarDecl *D,
497*67e74705SXin Li llvm::GlobalVariable *Addr,
498*67e74705SXin Li bool PerformInit) {
499*67e74705SXin Li // Check if we need to emit debug info for variable initializer.
500*67e74705SXin Li if (D->hasAttr<NoDebugAttr>())
501*67e74705SXin Li DebugInfo = nullptr; // disable debug info indefinitely for this function
502*67e74705SXin Li
503*67e74705SXin Li CurEHLocation = D->getLocStart();
504*67e74705SXin Li
505*67e74705SXin Li StartFunction(GlobalDecl(D), getContext().VoidTy, Fn,
506*67e74705SXin Li getTypes().arrangeNullaryFunction(),
507*67e74705SXin Li FunctionArgList(), D->getLocation(),
508*67e74705SXin Li D->getInit()->getExprLoc());
509*67e74705SXin Li
510*67e74705SXin Li // Use guarded initialization if the global variable is weak. This
511*67e74705SXin Li // occurs for, e.g., instantiated static data members and
512*67e74705SXin Li // definitions explicitly marked weak.
513*67e74705SXin Li if (Addr->hasWeakLinkage() || Addr->hasLinkOnceLinkage()) {
514*67e74705SXin Li EmitCXXGuardedInit(*D, Addr, PerformInit);
515*67e74705SXin Li } else {
516*67e74705SXin Li EmitCXXGlobalVarDeclInit(*D, Addr, PerformInit);
517*67e74705SXin Li }
518*67e74705SXin Li
519*67e74705SXin Li FinishFunction();
520*67e74705SXin Li }
521*67e74705SXin Li
522*67e74705SXin Li void
GenerateCXXGlobalInitFunc(llvm::Function * Fn,ArrayRef<llvm::Function * > Decls,Address Guard)523*67e74705SXin Li CodeGenFunction::GenerateCXXGlobalInitFunc(llvm::Function *Fn,
524*67e74705SXin Li ArrayRef<llvm::Function *> Decls,
525*67e74705SXin Li Address Guard) {
526*67e74705SXin Li {
527*67e74705SXin Li auto NL = ApplyDebugLocation::CreateEmpty(*this);
528*67e74705SXin Li StartFunction(GlobalDecl(), getContext().VoidTy, Fn,
529*67e74705SXin Li getTypes().arrangeNullaryFunction(), FunctionArgList());
530*67e74705SXin Li // Emit an artificial location for this function.
531*67e74705SXin Li auto AL = ApplyDebugLocation::CreateArtificial(*this);
532*67e74705SXin Li
533*67e74705SXin Li llvm::BasicBlock *ExitBlock = nullptr;
534*67e74705SXin Li if (Guard.isValid()) {
535*67e74705SXin Li // If we have a guard variable, check whether we've already performed
536*67e74705SXin Li // these initializations. This happens for TLS initialization functions.
537*67e74705SXin Li llvm::Value *GuardVal = Builder.CreateLoad(Guard);
538*67e74705SXin Li llvm::Value *Uninit = Builder.CreateIsNull(GuardVal,
539*67e74705SXin Li "guard.uninitialized");
540*67e74705SXin Li llvm::BasicBlock *InitBlock = createBasicBlock("init");
541*67e74705SXin Li ExitBlock = createBasicBlock("exit");
542*67e74705SXin Li Builder.CreateCondBr(Uninit, InitBlock, ExitBlock);
543*67e74705SXin Li EmitBlock(InitBlock);
544*67e74705SXin Li // Mark as initialized before initializing anything else. If the
545*67e74705SXin Li // initializers use previously-initialized thread_local vars, that's
546*67e74705SXin Li // probably supposed to be OK, but the standard doesn't say.
547*67e74705SXin Li Builder.CreateStore(llvm::ConstantInt::get(GuardVal->getType(),1), Guard);
548*67e74705SXin Li }
549*67e74705SXin Li
550*67e74705SXin Li RunCleanupsScope Scope(*this);
551*67e74705SXin Li
552*67e74705SXin Li // When building in Objective-C++ ARC mode, create an autorelease pool
553*67e74705SXin Li // around the global initializers.
554*67e74705SXin Li if (getLangOpts().ObjCAutoRefCount && getLangOpts().CPlusPlus) {
555*67e74705SXin Li llvm::Value *token = EmitObjCAutoreleasePoolPush();
556*67e74705SXin Li EmitObjCAutoreleasePoolCleanup(token);
557*67e74705SXin Li }
558*67e74705SXin Li
559*67e74705SXin Li for (unsigned i = 0, e = Decls.size(); i != e; ++i)
560*67e74705SXin Li if (Decls[i])
561*67e74705SXin Li EmitRuntimeCall(Decls[i]);
562*67e74705SXin Li
563*67e74705SXin Li Scope.ForceCleanup();
564*67e74705SXin Li
565*67e74705SXin Li if (ExitBlock) {
566*67e74705SXin Li Builder.CreateBr(ExitBlock);
567*67e74705SXin Li EmitBlock(ExitBlock);
568*67e74705SXin Li }
569*67e74705SXin Li }
570*67e74705SXin Li
571*67e74705SXin Li FinishFunction();
572*67e74705SXin Li }
573*67e74705SXin Li
GenerateCXXGlobalDtorsFunc(llvm::Function * Fn,const std::vector<std::pair<llvm::WeakVH,llvm::Constant * >> & DtorsAndObjects)574*67e74705SXin Li void CodeGenFunction::GenerateCXXGlobalDtorsFunc(llvm::Function *Fn,
575*67e74705SXin Li const std::vector<std::pair<llvm::WeakVH, llvm::Constant*> >
576*67e74705SXin Li &DtorsAndObjects) {
577*67e74705SXin Li {
578*67e74705SXin Li auto NL = ApplyDebugLocation::CreateEmpty(*this);
579*67e74705SXin Li StartFunction(GlobalDecl(), getContext().VoidTy, Fn,
580*67e74705SXin Li getTypes().arrangeNullaryFunction(), FunctionArgList());
581*67e74705SXin Li // Emit an artificial location for this function.
582*67e74705SXin Li auto AL = ApplyDebugLocation::CreateArtificial(*this);
583*67e74705SXin Li
584*67e74705SXin Li // Emit the dtors, in reverse order from construction.
585*67e74705SXin Li for (unsigned i = 0, e = DtorsAndObjects.size(); i != e; ++i) {
586*67e74705SXin Li llvm::Value *Callee = DtorsAndObjects[e - i - 1].first;
587*67e74705SXin Li llvm::CallInst *CI = Builder.CreateCall(Callee,
588*67e74705SXin Li DtorsAndObjects[e - i - 1].second);
589*67e74705SXin Li // Make sure the call and the callee agree on calling convention.
590*67e74705SXin Li if (llvm::Function *F = dyn_cast<llvm::Function>(Callee))
591*67e74705SXin Li CI->setCallingConv(F->getCallingConv());
592*67e74705SXin Li }
593*67e74705SXin Li }
594*67e74705SXin Li
595*67e74705SXin Li FinishFunction();
596*67e74705SXin Li }
597*67e74705SXin Li
598*67e74705SXin Li /// generateDestroyHelper - Generates a helper function which, when
599*67e74705SXin Li /// invoked, destroys the given object. The address of the object
600*67e74705SXin Li /// should be in global memory.
generateDestroyHelper(Address addr,QualType type,Destroyer * destroyer,bool useEHCleanupForArray,const VarDecl * VD)601*67e74705SXin Li llvm::Function *CodeGenFunction::generateDestroyHelper(
602*67e74705SXin Li Address addr, QualType type, Destroyer *destroyer,
603*67e74705SXin Li bool useEHCleanupForArray, const VarDecl *VD) {
604*67e74705SXin Li FunctionArgList args;
605*67e74705SXin Li ImplicitParamDecl dst(getContext(), nullptr, SourceLocation(), nullptr,
606*67e74705SXin Li getContext().VoidPtrTy);
607*67e74705SXin Li args.push_back(&dst);
608*67e74705SXin Li
609*67e74705SXin Li const CGFunctionInfo &FI =
610*67e74705SXin Li CGM.getTypes().arrangeBuiltinFunctionDeclaration(getContext().VoidTy, args);
611*67e74705SXin Li llvm::FunctionType *FTy = CGM.getTypes().GetFunctionType(FI);
612*67e74705SXin Li llvm::Function *fn = CGM.CreateGlobalInitOrDestructFunction(
613*67e74705SXin Li FTy, "__cxx_global_array_dtor", FI, VD->getLocation());
614*67e74705SXin Li
615*67e74705SXin Li CurEHLocation = VD->getLocStart();
616*67e74705SXin Li
617*67e74705SXin Li StartFunction(VD, getContext().VoidTy, fn, FI, args);
618*67e74705SXin Li
619*67e74705SXin Li emitDestroy(addr, type, destroyer, useEHCleanupForArray);
620*67e74705SXin Li
621*67e74705SXin Li FinishFunction();
622*67e74705SXin Li
623*67e74705SXin Li return fn;
624*67e74705SXin Li }
625