xref: /aosp_15_r20/external/clang/lib/CodeGen/CGDeclCXX.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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