clang 24.0.0git
CGDecl.cpp
Go to the documentation of this file.
1//===--- CGDecl.cpp - Emit LLVM Code for 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 to emit Decl nodes as LLVM code.
10//
11//===----------------------------------------------------------------------===//
12
13#include "CGBlocks.h"
14#include "CGCXXABI.h"
15#include "CGCleanup.h"
16#include "CGDebugInfo.h"
17#include "CGOpenCLRuntime.h"
18#include "CGOpenMPRuntime.h"
19#include "CodeGenFunction.h"
20#include "CodeGenModule.h"
21#include "CodeGenPGO.h"
22#include "ConstantEmitter.h"
23#include "EHScopeStack.h"
24#include "PatternInit.h"
25#include "TargetInfo.h"
27#include "clang/AST/Attr.h"
28#include "clang/AST/CharUnits.h"
29#include "clang/AST/Decl.h"
30#include "clang/AST/DeclObjC.h"
36#include "clang/Sema/Sema.h"
37#include "llvm/Analysis/ConstantFolding.h"
38#include "llvm/Analysis/ValueTracking.h"
39#include "llvm/IR/DataLayout.h"
40#include "llvm/IR/GlobalVariable.h"
41#include "llvm/IR/Instructions.h"
42#include "llvm/IR/Intrinsics.h"
43#include "llvm/IR/Type.h"
44#include <optional>
45
46using namespace clang;
47using namespace CodeGen;
48
49static_assert(clang::Sema::MaximumAlignment <= llvm::Value::MaximumAlignment,
50 "Clang max alignment greater than what LLVM supports?");
51
52void CodeGenFunction::EmitDecl(const Decl &D, bool EvaluateConditionDecl) {
53 switch (D.getKind()) {
54 case Decl::BuiltinTemplate:
55 case Decl::TranslationUnit:
56 case Decl::ExternCContext:
57 case Decl::Namespace:
58 case Decl::UnresolvedUsingTypename:
59 case Decl::ClassTemplateSpecialization:
60 case Decl::ClassTemplatePartialSpecialization:
61 case Decl::VarTemplateSpecialization:
62 case Decl::VarTemplatePartialSpecialization:
63 case Decl::TemplateTypeParm:
64 case Decl::UnresolvedUsingValue:
65 case Decl::NonTypeTemplateParm:
66 case Decl::CXXDeductionGuide:
67 case Decl::CXXMethod:
68 case Decl::CXXConstructor:
69 case Decl::CXXDestructor:
70 case Decl::CXXConversion:
71 case Decl::Field:
72 case Decl::MSProperty:
73 case Decl::IndirectField:
74 case Decl::ObjCIvar:
75 case Decl::ObjCAtDefsField:
76 case Decl::ParmVar:
77 case Decl::ImplicitParam:
78 case Decl::ClassTemplate:
79 case Decl::VarTemplate:
80 case Decl::FunctionTemplate:
81 case Decl::TypeAliasTemplate:
82 case Decl::TemplateTemplateParm:
83 case Decl::ObjCMethod:
84 case Decl::ObjCCategory:
85 case Decl::ObjCProtocol:
86 case Decl::ObjCInterface:
87 case Decl::ObjCCategoryImpl:
88 case Decl::ObjCImplementation:
89 case Decl::ObjCProperty:
90 case Decl::ObjCCompatibleAlias:
91 case Decl::PragmaComment:
92 case Decl::PragmaDetectMismatch:
93 case Decl::AccessSpec:
94 case Decl::LinkageSpec:
95 case Decl::Export:
96 case Decl::ObjCPropertyImpl:
97 case Decl::FileScopeAsm:
98 case Decl::TopLevelStmt:
99 case Decl::Friend:
100 case Decl::FriendTemplate:
101 case Decl::Block:
102 case Decl::OutlinedFunction:
103 case Decl::Captured:
104 case Decl::UsingShadow:
105 case Decl::ConstructorUsingShadow:
106 case Decl::ObjCTypeParam:
107 case Decl::Binding:
108 case Decl::UnresolvedUsingIfExists:
109 case Decl::HLSLBuffer:
110 case Decl::HLSLRootSignature:
111 llvm_unreachable("Declaration should not be in declstmts!");
112 case Decl::Record: // struct/union/class X;
113 case Decl::CXXRecord: // struct/union/class X; [C++]
114 if (CGDebugInfo *DI = getDebugInfo())
116 DI->EmitAndRetainType(
117 getContext().getCanonicalTagType(cast<RecordDecl>(&D)));
118 return;
119 case Decl::Enum: // enum X;
120 if (CGDebugInfo *DI = getDebugInfo())
122 DI->EmitAndRetainType(
123 getContext().getCanonicalTagType(cast<EnumDecl>(&D)));
124 return;
125 case Decl::Function: // void X();
126 case Decl::EnumConstant: // enum ? { X = ? }
127 case Decl::StaticAssert: // static_assert(X, ""); [C++0x]
128 case Decl::ExplicitInstantiation:
129 case Decl::Label: // __label__ x;
130 case Decl::Import:
131 case Decl::MSGuid: // __declspec(uuid("..."))
132 case Decl::UnnamedGlobalConstant:
133 case Decl::TemplateParamObject:
134 case Decl::OMPThreadPrivate:
135 case Decl::OMPGroupPrivate:
136 case Decl::OMPAllocate:
137 case Decl::OMPCapturedExpr:
138 case Decl::OMPRequires:
139 case Decl::Empty:
140 case Decl::Concept:
141 case Decl::ImplicitConceptSpecialization:
142 case Decl::LifetimeExtendedTemporary:
143 case Decl::RequiresExprBody:
144 // None of these decls require codegen support.
145 return;
146
147 case Decl::CXXExpansionStmt: {
148 const auto *ESD = cast<CXXExpansionStmtDecl>(&D);
149 assert(ESD->getInstantiations() && "expansion statement not expanded?");
150 EmitStmt(ESD->getInstantiations());
151 return;
152 }
153
154 case Decl::NamespaceAlias:
155 if (CGDebugInfo *DI = getDebugInfo())
156 DI->EmitNamespaceAlias(cast<NamespaceAliasDecl>(D));
157 return;
158 case Decl::Using: // using X; [C++]
159 if (CGDebugInfo *DI = getDebugInfo())
160 DI->EmitUsingDecl(cast<UsingDecl>(D));
161 return;
162 case Decl::UsingEnum: // using enum X; [C++]
163 if (CGDebugInfo *DI = getDebugInfo())
164 DI->EmitUsingEnumDecl(cast<UsingEnumDecl>(D));
165 return;
166 case Decl::UsingPack:
167 for (auto *Using : cast<UsingPackDecl>(D).expansions())
168 EmitDecl(*Using, /*EvaluateConditionDecl=*/EvaluateConditionDecl);
169 return;
170 case Decl::UsingDirective: // using namespace X; [C++]
171 if (CGDebugInfo *DI = getDebugInfo())
172 DI->EmitUsingDirective(cast<UsingDirectiveDecl>(D));
173 return;
174 case Decl::Var:
175 case Decl::Decomposition: {
176 const VarDecl &VD = cast<VarDecl>(D);
177 assert(VD.isLocalVarDecl() &&
178 "Should not see file-scope variables inside a function!");
179 EmitVarDecl(VD);
180 if (EvaluateConditionDecl)
182
183 return;
184 }
185
186 case Decl::OMPDeclareReduction:
187 return CGM.EmitOMPDeclareReduction(cast<OMPDeclareReductionDecl>(&D), this);
188
189 case Decl::OMPDeclareMapper:
190 return CGM.EmitOMPDeclareMapper(cast<OMPDeclareMapperDecl>(&D), this);
191
192 case Decl::OpenACCDeclare:
193 return CGM.EmitOpenACCDeclare(cast<OpenACCDeclareDecl>(&D), this);
194 case Decl::OpenACCRoutine:
195 return CGM.EmitOpenACCRoutine(cast<OpenACCRoutineDecl>(&D), this);
196
197 case Decl::Typedef: // typedef int X;
198 case Decl::TypeAlias: { // using X = int; [C++0x]
199 QualType Ty = cast<TypedefNameDecl>(D).getUnderlyingType();
200 if (CGDebugInfo *DI = getDebugInfo())
201 DI->EmitAndRetainType(Ty);
202 if (Ty->isVariablyModifiedType())
204 return;
205 }
206 }
207}
208
209/// EmitVarDecl - This method handles emission of any variable declaration
210/// inside a function, including static vars etc.
212 if (D.hasExternalStorage())
213 // Don't emit it now, allow it to be emitted lazily on its first use.
214 return;
215
216 // Some function-scope variable does not have static storage but still
217 // needs to be emitted like a static variable, e.g. a function-scope
218 // variable in constant address space in OpenCL.
219 if (D.getStorageDuration() != SD_Automatic) {
220 // Static sampler variables translated to function calls.
221 if (D.getType()->isSamplerT())
222 return;
223
224 llvm::GlobalValue::LinkageTypes Linkage =
225 CGM.getLLVMLinkageVarDefinition(&D);
226
227 // FIXME: We need to force the emission/use of a guard variable for
228 // some variables even if we can constant-evaluate them because
229 // we can't guarantee every translation unit will constant-evaluate them.
230
231 return EmitStaticVarDecl(D, Linkage);
232 }
233
235 return CGM.getOpenCLRuntime().EmitWorkGroupLocalVarDecl(*this, D);
236
237 assert(D.hasLocalStorage());
238 return EmitAutoVarDecl(D);
239}
240
241static std::string getStaticDeclName(CodeGenModule &CGM, const VarDecl &D) {
242 if (CGM.getLangOpts().CPlusPlus)
243 return CGM.getMangledName(&D).str();
244
245 // If this isn't C++, we don't need a mangled name, just a pretty one.
246 assert(!D.isExternallyVisible() && "name shouldn't matter");
247 std::string ContextName;
248 const DeclContext *DC = D.getDeclContext();
249 if (auto *CD = dyn_cast<CapturedDecl>(DC))
250 DC = cast<DeclContext>(CD->getNonClosureContext());
251 if (const auto *FD = dyn_cast<FunctionDecl>(DC))
252 ContextName = std::string(CGM.getMangledName(FD));
253 else if (const auto *BD = dyn_cast<BlockDecl>(DC))
254 ContextName = std::string(CGM.getBlockMangledName(GlobalDecl(), BD));
255 else if (const auto *OMD = dyn_cast<ObjCMethodDecl>(DC))
256 ContextName = OMD->getSelector().getAsString();
257 else
258 llvm_unreachable("Unknown context for static var decl");
259
260 ContextName += "." + D.getNameAsString();
261 return ContextName;
262}
263
265 const VarDecl &D, llvm::GlobalValue::LinkageTypes Linkage) {
266 // In general, we don't always emit static var decls once before we reference
267 // them. It is possible to reference them before emitting the function that
268 // contains them, and it is possible to emit the containing function multiple
269 // times.
270 if (llvm::Constant *ExistingGV = StaticLocalDeclMap[&D])
271 return ExistingGV;
272
273 QualType Ty = D.getType();
274 assert(Ty->isConstantSizeType() && "VLAs can't be static");
275
276 // Use the label if the variable is renamed with the asm-label extension.
277 std::string Name;
278 if (D.hasAttr<AsmLabelAttr>())
279 Name = std::string(getMangledName(&D));
280 else
281 Name = getStaticDeclName(*this, D);
282
283 llvm::Type *LTy = getTypes().ConvertTypeForMem(Ty);
285 unsigned TargetAS = getContext().getTargetAddressSpace(AS);
286
287 // OpenCL variables in local address space and CUDA shared
288 // variables cannot have an initializer.
289 llvm::Constant *Init = nullptr;
291 D.hasAttr<CUDASharedAttr>() || D.hasAttr<LoaderUninitializedAttr>())
292 Init = llvm::UndefValue::get(LTy);
293 else
295
296 llvm::GlobalVariable *GV = new llvm::GlobalVariable(
297 getModule(), LTy, Ty.isConstant(getContext()), Linkage, Init, Name,
298 nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
299 GV->setAlignment(getContext().getDeclAlign(&D).getAsAlign());
300
301 if (supportsCOMDAT() && GV->isWeakForLinker())
302 GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
303
304 if (D.getTLSKind())
305 setTLSMode(GV, D);
306
307 setGVProperties(GV, &D);
309
310 // Make sure the result is of the correct type.
311 LangAS ExpectedAS = Ty.getAddressSpace();
312 llvm::Constant *Addr = GV;
313 if (AS != ExpectedAS) {
315 GV,
316 llvm::PointerType::get(getLLVMContext(),
317 getContext().getTargetAddressSpace(ExpectedAS)));
318 }
319
321
322 // Ensure that the static local gets initialized by making sure the parent
323 // function gets emitted eventually.
324 const Decl *DC = cast<Decl>(D.getDeclContext());
325
326 // We can't name blocks or captured statements directly, so try to emit their
327 // parents.
328 if (isa<BlockDecl>(DC) || isa<CapturedDecl>(DC)) {
329 DC = DC->getNonClosureContext();
330 // FIXME: Ensure that global blocks get emitted.
331 if (!DC)
332 return Addr;
333 }
334
335 GlobalDecl GD;
336 if (const auto *CD = dyn_cast<CXXConstructorDecl>(DC))
337 GD = GlobalDecl(CD, Ctor_Base);
338 else if (const auto *DD = dyn_cast<CXXDestructorDecl>(DC))
339 GD = GlobalDecl(DD, Dtor_Base);
340 else if (const auto *FD = dyn_cast<FunctionDecl>(DC))
341 GD = GlobalDecl(FD);
342 else {
343 // Don't do anything for Obj-C method decls or global closures. We should
344 // never defer them.
345 assert(isa<ObjCMethodDecl>(DC) && "unexpected parent code decl");
346 }
347 if (GD.getDecl()) {
348 // Disable emission of the parent function for the OpenMP device codegen.
350 (void)GetAddrOfGlobal(GD);
351 }
352
353 return Addr;
354}
355
356/// AddInitializerToStaticVarDecl - Add the initializer for 'D' to the
357/// global variable that has already been created for it. If the initializer
358/// has a different type than GV does, this may free GV and return a different
359/// one. Otherwise it just returns GV.
360llvm::GlobalVariable *
362 llvm::GlobalVariable *GV) {
363 ConstantEmitter emitter(*this);
364 llvm::Constant *Init = emitter.tryEmitForInitializer(D);
365
366 // If constant emission failed, then this should be a C++ static
367 // initializer.
368 if (!Init) {
369 if (!getLangOpts().CPlusPlus)
370 CGM.ErrorUnsupported(D.getInit(), "constant l-value expression");
371 else if (D.hasFlexibleArrayInit(getContext()))
372 CGM.ErrorUnsupported(D.getInit(), "flexible array initializer");
373 else if (HaveInsertPoint()) {
374 // Since we have a static initializer, this global variable can't
375 // be constant.
376 GV->setConstant(false);
377
378 EmitCXXGuardedInit(D, GV, /*PerformInit*/true);
379 }
380 return GV;
381 }
382
383 PGO->markStmtMaybeUsed(D.getInit()); // FIXME: Too lazy
384
385#ifndef NDEBUG
386 CharUnits VarSize = CGM.getContext().getTypeSizeInChars(D.getType()) +
389 CGM.getDataLayout().getTypeAllocSize(Init->getType()));
390 assert(VarSize == CstSize && "Emitted constant has unexpected size");
391#endif
392
393 bool NeedsDtor =
395
396 GV->setConstant(
397 D.getType().isConstantStorage(getContext(), true, !NeedsDtor));
398 GV->replaceInitializer(Init);
399
400 emitter.finalize(GV);
401
402 if (NeedsDtor && HaveInsertPoint()) {
403 // We have a constant initializer, but a nontrivial destructor. We still
404 // need to perform a guarded "initialization" in order to register the
405 // destructor.
406 EmitCXXGuardedInit(D, GV, /*PerformInit*/false);
407 }
408
409 return GV;
410}
411
413 llvm::GlobalValue::LinkageTypes Linkage) {
414 // Check to see if we already have a global variable for this
415 // declaration. This can happen when double-emitting function
416 // bodies, e.g. with complete and base constructors.
417 llvm::Constant *addr = CGM.getOrCreateStaticVarDecl(D, Linkage);
418 CharUnits alignment = getContext().getDeclAlign(&D);
419
420 // Store into LocalDeclMap before generating initializer to handle
421 // circular references.
422 llvm::Type *elemTy = ConvertTypeForMem(D.getType());
423 setAddrOfLocalVar(&D, Address(addr, elemTy, alignment));
424
425 // We can't have a VLA here, but we can have a pointer to a VLA,
426 // even though that doesn't really make any sense.
427 // Make sure to evaluate VLA bounds now so that we have them for later.
430
431 // Save the type in case adding the initializer forces a type change.
432 llvm::Type *expectedType = addr->getType();
433
434 llvm::GlobalVariable *var =
435 cast<llvm::GlobalVariable>(addr->stripPointerCasts());
436
437 // CUDA's local and local static __shared__ variables should not
438 // have any non-empty initializers. This is ensured by Sema.
439 // Whatever initializer such variable may have when it gets here is
440 // a no-op and should not be emitted.
441 bool isCudaSharedVar = getLangOpts().CUDA && getLangOpts().CUDAIsDevice &&
442 D.hasAttr<CUDASharedAttr>();
443 // If this value has an initializer, emit it.
444 if (D.getInit() && !isCudaSharedVar) {
446 var = AddInitializerToStaticVarDecl(D, var);
447 }
448
449 var->setAlignment(alignment.getAsAlign());
450
451 if (D.hasAttr<AnnotateAttr>())
452 CGM.AddGlobalAnnotations(&D, var);
453
454 if (auto *SA = D.getAttr<PragmaClangBSSSectionAttr>())
455 var->addAttribute("bss-section", SA->getName());
456 if (auto *SA = D.getAttr<PragmaClangDataSectionAttr>())
457 var->addAttribute("data-section", SA->getName());
458 if (auto *SA = D.getAttr<PragmaClangRodataSectionAttr>())
459 var->addAttribute("rodata-section", SA->getName());
460 if (auto *SA = D.getAttr<PragmaClangRelroSectionAttr>())
461 var->addAttribute("relro-section", SA->getName());
462
463 if (const SectionAttr *SA = D.getAttr<SectionAttr>())
464 var->setSection(SA->getName());
465
466 if (D.hasAttr<RetainAttr>())
467 CGM.addUsedGlobal(var);
468 else if (D.hasAttr<UsedAttr>())
469 CGM.addUsedOrCompilerUsedGlobal(var);
470
471 if (CGM.getCodeGenOpts().KeepPersistentStorageVariables)
472 CGM.addUsedOrCompilerUsedGlobal(var);
473
474 // We may have to cast the constant because of the initializer
475 // mismatch above.
476 //
477 // FIXME: It is really dangerous to store this in the map; if anyone
478 // RAUW's the GV uses of this constant will be invalid.
479 llvm::Constant *castedAddr =
480 llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(var, expectedType);
481 LocalDeclMap.find(&D)->second = Address(castedAddr, elemTy, alignment);
482 CGM.setStaticLocalDeclAddress(&D, castedAddr);
483
484 CGM.getSanitizerMetadata()->reportGlobal(var, D);
485
486 // Emit global variable debug descriptor for static vars.
488 if (DI && CGM.getCodeGenOpts().hasReducedDebugInfo()) {
489 DI->setLocation(D.getLocation());
490 DI->EmitGlobalVariable(var, &D);
491 }
492}
493
494namespace {
495 struct DestroyObject final : EHScopeStack::Cleanup {
496 DestroyObject(Address addr, QualType type,
498 bool useEHCleanupForArray)
499 : addr(addr), type(type), destroyer(destroyer),
500 useEHCleanupForArray(useEHCleanupForArray) {}
501
502 Address addr;
505 bool useEHCleanupForArray;
506
507 void Emit(CodeGenFunction &CGF, Flags flags) override {
508 // Don't use an EH cleanup recursively from an EH cleanup.
509 bool useEHCleanupForArray =
510 flags.isForNormalCleanup() && this->useEHCleanupForArray;
511
512 CGF.emitDestroy(addr, type, destroyer, useEHCleanupForArray);
513 }
514 };
515
516 template <class Derived>
517 struct DestroyNRVOVariable : EHScopeStack::Cleanup {
518 DestroyNRVOVariable(Address addr, QualType type, llvm::Value *NRVOFlag)
519 : NRVOFlag(NRVOFlag), Loc(addr), Ty(type) {}
520
521 llvm::Value *NRVOFlag;
522 Address Loc;
523 QualType Ty;
524
525 void Emit(CodeGenFunction &CGF, Flags flags) override {
526 // Along the exceptions path we always execute the dtor.
527 bool NRVO = flags.isForNormalCleanup() && NRVOFlag;
528
529 llvm::BasicBlock *SkipDtorBB = nullptr;
530 if (NRVO) {
531 // If we exited via NRVO, we skip the destructor call.
532 llvm::BasicBlock *RunDtorBB = CGF.createBasicBlock("nrvo.unused");
533 SkipDtorBB = CGF.createBasicBlock("nrvo.skipdtor");
534 llvm::Value *DidNRVO =
535 CGF.Builder.CreateFlagLoad(NRVOFlag, "nrvo.val");
536 CGF.Builder.CreateCondBr(DidNRVO, SkipDtorBB, RunDtorBB);
537 CGF.EmitBlock(RunDtorBB);
538 }
539
540 static_cast<Derived *>(this)->emitDestructorCall(CGF);
541
542 if (NRVO) CGF.EmitBlock(SkipDtorBB);
543 }
544
545 virtual ~DestroyNRVOVariable() = default;
546 };
547
548 struct DestroyNRVOVariableCXX final
549 : DestroyNRVOVariable<DestroyNRVOVariableCXX> {
550 DestroyNRVOVariableCXX(Address addr, QualType type,
551 const CXXDestructorDecl *Dtor, llvm::Value *NRVOFlag)
552 : DestroyNRVOVariable<DestroyNRVOVariableCXX>(addr, type, NRVOFlag),
553 Dtor(Dtor) {}
554
555 const CXXDestructorDecl *Dtor;
556
557 void emitDestructorCall(CodeGenFunction &CGF) {
559 /*ForVirtualBase=*/false,
560 /*Delegating=*/false, Loc, Ty);
561 }
562 };
563
564 struct DestroyNRVOVariableC final
565 : DestroyNRVOVariable<DestroyNRVOVariableC> {
566 DestroyNRVOVariableC(Address addr, llvm::Value *NRVOFlag, QualType Ty)
567 : DestroyNRVOVariable<DestroyNRVOVariableC>(addr, Ty, NRVOFlag) {}
568
569 void emitDestructorCall(CodeGenFunction &CGF) {
570 CGF.destroyNonTrivialCStruct(CGF, Loc, Ty);
571 }
572 };
573
574 struct CallStackRestore final : EHScopeStack::Cleanup {
575 Address Stack;
576 CallStackRestore(Address Stack) : Stack(Stack) {}
577 bool isRedundantBeforeReturn() override { return true; }
578 void Emit(CodeGenFunction &CGF, Flags flags) override {
579 llvm::Value *V = CGF.Builder.CreateLoad(Stack);
580 CGF.Builder.CreateStackRestore(V);
581 }
582 };
583
584 struct KmpcAllocFree final : EHScopeStack::Cleanup {
585 std::pair<llvm::Value *, llvm::Value *> AddrSizePair;
586 KmpcAllocFree(const std::pair<llvm::Value *, llvm::Value *> &AddrSizePair)
587 : AddrSizePair(AddrSizePair) {}
588 void Emit(CodeGenFunction &CGF, Flags EmissionFlags) override {
589 auto &RT = CGF.CGM.getOpenMPRuntime();
590 RT.getKmpcFreeShared(CGF, AddrSizePair);
591 }
592 };
593
594 struct ExtendGCLifetime final : EHScopeStack::Cleanup {
595 const VarDecl &Var;
596 ExtendGCLifetime(const VarDecl *var) : Var(*var) {}
597
598 void Emit(CodeGenFunction &CGF, Flags flags) override {
599 // Compute the address of the local variable, in case it's a
600 // byref or something.
601 DeclRefExpr DRE(CGF.getContext(), const_cast<VarDecl *>(&Var), false,
602 Var.getType(), VK_LValue, SourceLocation());
603 llvm::Value *value = CGF.EmitLoadOfScalar(CGF.EmitDeclRefLValue(&DRE),
604 SourceLocation());
605 CGF.EmitExtendGCLifetime(value);
606 }
607 };
608
609 struct CallCleanupFunction final : EHScopeStack::Cleanup {
610 llvm::Constant *CleanupFn;
611 const CGFunctionInfo &FnInfo;
612 const VarDecl &Var;
613 const CleanupAttr *Attribute;
614
615 CallCleanupFunction(llvm::Constant *CleanupFn, const CGFunctionInfo *Info,
616 const VarDecl *Var, const CleanupAttr *Attr)
617 : CleanupFn(CleanupFn), FnInfo(*Info), Var(*Var), Attribute(Attr) {}
618
619 void Emit(CodeGenFunction &CGF, Flags flags) override {
620 DeclRefExpr DRE(CGF.getContext(), const_cast<VarDecl *>(&Var), false,
621 Var.getType(), VK_LValue, SourceLocation());
622 // Compute the address of the local variable, in case it's a byref
623 // or something.
624 llvm::Value *Addr = CGF.EmitDeclRefLValue(&DRE).getPointer(CGF);
625
626 // In some cases, the type of the function argument will be different from
627 // the type of the pointer. An example of this is
628 // void f(void* arg);
629 // __attribute__((cleanup(f))) void *g;
630 //
631 // To fix this we insert a bitcast here.
632 QualType ArgTy = FnInfo.arg_begin()->type;
633 llvm::Value *Arg =
634 CGF.Builder.CreateBitCast(Addr, CGF.ConvertType(ArgTy));
635
636 CallArgList Args;
637 Args.add(RValue::get(Arg),
638 CGF.getContext().getPointerType(Var.getType()));
639 GlobalDecl GD = GlobalDecl(Attribute->getFunctionDecl());
640 auto Callee = CGCallee::forDirect(CleanupFn, CGCalleeInfo(GD));
641 CGF.EmitCall(FnInfo, Callee, ReturnValueSlot(), Args,
642 /*callOrInvoke*/ nullptr, /*IsMustTail*/ false,
643 Attribute->getLoc());
644 }
645 };
646} // end anonymous namespace
647
648/// EmitAutoVarWithLifetime - Does the setup required for an automatic
649/// variable with lifetime.
651 Address addr,
652 Qualifiers::ObjCLifetime lifetime) {
653 switch (lifetime) {
655 llvm_unreachable("present but none");
656
658 // nothing to do
659 break;
660
662 CodeGenFunction::Destroyer *destroyer =
663 (var.hasAttr<ObjCPreciseLifetimeAttr>()
666
667 CleanupKind cleanupKind = CGF.getARCCleanupKind();
668 CGF.pushDestroy(cleanupKind, addr, var.getType(), destroyer,
669 cleanupKind & EHCleanup);
670 break;
671 }
673 // nothing to do
674 break;
675
677 // __weak objects always get EH cleanups; otherwise, exceptions
678 // could cause really nasty crashes instead of mere leaks.
679 CGF.pushDestroy(NormalAndEHCleanup, addr, var.getType(),
681 /*useEHCleanup*/ true);
682 break;
683 }
684}
685
686static bool isAccessedBy(const VarDecl &var, const Stmt *s) {
687 if (const Expr *e = dyn_cast<Expr>(s)) {
688 // Skip the most common kinds of expressions that make
689 // hierarchy-walking expensive.
690 s = e = e->IgnoreParenCasts();
691
692 if (const DeclRefExpr *ref = dyn_cast<DeclRefExpr>(e))
693 return (ref->getDecl() == &var);
694 if (const BlockExpr *be = dyn_cast<BlockExpr>(e)) {
695 const BlockDecl *block = be->getBlockDecl();
696 for (const auto &I : block->captures()) {
697 if (I.getVariable() == &var)
698 return true;
699 }
700 }
701 }
702
703 for (const Stmt *SubStmt : s->children())
704 // SubStmt might be null; as in missing decl or conditional of an if-stmt.
705 if (SubStmt && isAccessedBy(var, SubStmt))
706 return true;
707
708 return false;
709}
710
711static bool isAccessedBy(const ValueDecl *decl, const Expr *e) {
712 if (!decl) return false;
713 if (!isa<VarDecl>(decl)) return false;
714 const VarDecl *var = cast<VarDecl>(decl);
715 return isAccessedBy(*var, e);
716}
717
719 const LValue &destLV, const Expr *init) {
720 bool needsCast = false;
721
722 while (auto castExpr = dyn_cast<CastExpr>(init->IgnoreParens())) {
723 switch (castExpr->getCastKind()) {
724 // Look through casts that don't require representation changes.
725 case CK_NoOp:
726 case CK_BitCast:
727 case CK_BlockPointerToObjCPointerCast:
728 needsCast = true;
729 break;
730
731 // If we find an l-value to r-value cast from a __weak variable,
732 // emit this operation as a copy or move.
733 case CK_LValueToRValue: {
734 const Expr *srcExpr = castExpr->getSubExpr();
735 if (srcExpr->getType().getObjCLifetime() != Qualifiers::OCL_Weak)
736 return false;
737
738 // Emit the source l-value.
739 LValue srcLV = CGF.EmitLValue(srcExpr);
740
741 // Handle a formal type change to avoid asserting.
742 auto srcAddr = srcLV.getAddress();
743 if (needsCast) {
744 srcAddr = srcAddr.withElementType(destLV.getAddress().getElementType());
745 }
746
747 // If it was an l-value, use objc_copyWeak.
748 if (srcExpr->isLValue()) {
749 CGF.EmitARCCopyWeak(destLV.getAddress(), srcAddr);
750 } else {
751 assert(srcExpr->isXValue());
752 CGF.EmitARCMoveWeak(destLV.getAddress(), srcAddr);
753 }
754 return true;
755 }
756
757 // Stop at anything else.
758 default:
759 return false;
760 }
761
762 init = castExpr->getSubExpr();
763 }
764 return false;
765}
766
768 LValue &lvalue,
769 const VarDecl *var) {
770 lvalue.setAddress(CGF.emitBlockByrefAddress(lvalue.getAddress(), var));
771}
772
774 SourceLocation Loc) {
775 if (!SanOpts.has(SanitizerKind::NullabilityAssign))
776 return;
777
778 auto Nullability = LHS.getType()->getNullability();
779 if (!Nullability || *Nullability != NullabilityKind::NonNull)
780 return;
781
782 // Check if the right hand side of the assignment is nonnull, if the left
783 // hand side must be nonnull.
784 auto CheckOrdinal = SanitizerKind::SO_NullabilityAssign;
785 auto CheckHandler = SanitizerHandler::TypeMismatch;
786 SanitizerDebugLocation SanScope(this, {CheckOrdinal}, CheckHandler);
787 llvm::Value *IsNotNull = Builder.CreateIsNotNull(RHS);
788 llvm::Constant *StaticData[] = {
790 llvm::ConstantInt::get(Int8Ty, 0), // The LogAlignment info is unused.
791 llvm::ConstantInt::get(Int8Ty, TCK_NonnullAssign)};
792 EmitCheck({{IsNotNull, CheckOrdinal}}, CheckHandler, StaticData, RHS);
793}
794
796 LValue lvalue, bool capturedByInit) {
797 Qualifiers::ObjCLifetime lifetime = lvalue.getObjCLifetime();
798 if (!lifetime) {
799 llvm::Value *Value;
800 if (PointerAuthQualifier PtrAuth = lvalue.getQuals().getPointerAuth()) {
801 Value = EmitPointerAuthQualify(PtrAuth, init, lvalue.getAddress());
802 lvalue.getQuals().removePointerAuth();
803 } else {
804 Value = EmitScalarExpr(init);
805 }
806 if (capturedByInit)
807 drillIntoBlockVariable(*this, lvalue, cast<VarDecl>(D));
808 EmitNullabilityCheck(lvalue, Value, init->getExprLoc());
810 return;
811 }
812
813 if (const CXXDefaultInitExpr *DIE = dyn_cast<CXXDefaultInitExpr>(init))
814 init = DIE->getExpr();
815
816 // If we're emitting a value with lifetime, we have to do the
817 // initialization *before* we leave the cleanup scopes.
818 if (auto *EWC = dyn_cast<ExprWithCleanups>(init)) {
820 return EmitScalarInit(EWC->getSubExpr(), D, lvalue, capturedByInit);
821 }
822
823 // We have to maintain the illusion that the variable is
824 // zero-initialized. If the variable might be accessed in its
825 // initializer, zero-initialize before running the initializer, then
826 // actually perform the initialization with an assign.
827 bool accessedByInit = false;
828 if (lifetime != Qualifiers::OCL_ExplicitNone)
829 accessedByInit = (capturedByInit || isAccessedBy(D, init));
830 if (accessedByInit) {
831 LValue tempLV = lvalue;
832 // Drill down to the __block object if necessary.
833 if (capturedByInit) {
834 // We can use a simple GEP for this because it can't have been
835 // moved yet.
837 cast<VarDecl>(D),
838 /*follow*/ false));
839 }
840
842 llvm::Value *zero = CGM.getNullPointer(ty, tempLV.getType());
843
844 // If __weak, we want to use a barrier under certain conditions.
845 if (lifetime == Qualifiers::OCL_Weak)
846 EmitARCInitWeak(tempLV.getAddress(), zero);
847
848 // Otherwise just do a simple store.
849 else
850 EmitStoreOfScalar(zero, tempLV, /* isInitialization */ true);
851 }
852
853 // Emit the initializer.
854 llvm::Value *value = nullptr;
855
856 switch (lifetime) {
858 llvm_unreachable("present but none");
859
861 if (!D || !isa<VarDecl>(D) || !cast<VarDecl>(D)->isARCPseudoStrong()) {
862 value = EmitARCRetainScalarExpr(init);
863 break;
864 }
865 // If D is pseudo-strong, treat it like __unsafe_unretained here. This means
866 // that we omit the retain, and causes non-autoreleased return values to be
867 // immediately released.
868 [[fallthrough]];
869 }
870
873 break;
874
876 // If it's not accessed by the initializer, try to emit the
877 // initialization with a copy or move.
878 if (!accessedByInit && tryEmitARCCopyWeakInit(*this, lvalue, init)) {
879 return;
880 }
881
882 // No way to optimize a producing initializer into this. It's not
883 // worth optimizing for, because the value will immediately
884 // disappear in the common case.
885 value = EmitScalarExpr(init);
886
887 if (capturedByInit) drillIntoBlockVariable(*this, lvalue, cast<VarDecl>(D));
888 if (accessedByInit)
889 EmitARCStoreWeak(lvalue.getAddress(), value, /*ignored*/ true);
890 else
891 EmitARCInitWeak(lvalue.getAddress(), value);
892 return;
893 }
894
897 break;
898 }
899
900 if (capturedByInit) drillIntoBlockVariable(*this, lvalue, cast<VarDecl>(D));
901
902 EmitNullabilityCheck(lvalue, value, init->getExprLoc());
903
904 // If the variable might have been accessed by its initializer, we
905 // might have to initialize with a barrier. We have to do this for
906 // both __weak and __strong, but __weak got filtered out above.
907 if (accessedByInit && lifetime == Qualifiers::OCL_Strong) {
908 llvm::Value *oldValue = EmitLoadOfScalar(lvalue, init->getExprLoc());
909 EmitStoreOfScalar(value, lvalue, /* isInitialization */ true);
911 return;
912 }
913
914 EmitStoreOfScalar(value, lvalue, /* isInitialization */ true);
915}
916
917/// Decide whether we can emit the non-zero parts of the specified initializer
918/// with equal or fewer than NumStores scalar stores.
919static bool canEmitInitWithFewStoresAfterBZero(llvm::Constant *Init,
920 unsigned &NumStores) {
921 // Zero and Undef never requires any extra stores.
925 return true;
929 return Init->isNullValue() || NumStores--;
930
931 // See if we can emit each element.
933 for (unsigned i = 0, e = Init->getNumOperands(); i != e; ++i) {
934 llvm::Constant *Elt = cast<llvm::Constant>(Init->getOperand(i));
935 if (!canEmitInitWithFewStoresAfterBZero(Elt, NumStores))
936 return false;
937 }
938 return true;
939 }
940
941 if (llvm::ConstantDataSequential *CDS =
942 dyn_cast<llvm::ConstantDataSequential>(Init)) {
943 for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) {
944 llvm::Constant *Elt = CDS->getElementAsConstant(i);
945 if (!canEmitInitWithFewStoresAfterBZero(Elt, NumStores))
946 return false;
947 }
948 return true;
949 }
950
951 // Anything else is hard and scary.
952 return false;
953}
954
955/// For inits that canEmitInitWithFewStoresAfterBZero returned true for, emit
956/// the scalar stores that would be required.
957void CodeGenFunction::emitStoresForInitAfterBZero(llvm::Constant *Init,
958 Address Loc, bool isVolatile,
959 bool IsAutoInit) {
960 assert(!Init->isNullValue() && !isa<llvm::UndefValue>(Init) &&
961 "called emitStoresForInitAfterBZero for zero or undef value.");
962
966 auto *I = Builder.CreateStore(Init, Loc, isVolatile);
967 addInstToCurrentSourceAtom(I, nullptr);
968 if (IsAutoInit)
969 I->addAnnotationMetadata("auto-init");
970 return;
971 }
972
973 if (llvm::ConstantDataSequential *CDS =
974 dyn_cast<llvm::ConstantDataSequential>(Init)) {
975 for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) {
976 llvm::Constant *Elt = CDS->getElementAsConstant(i);
977
978 // If necessary, get a pointer to the element and emit it.
979 if (!Elt->isNullValue() && !isa<llvm::UndefValue>(Elt))
980 emitStoresForInitAfterBZero(
981 Elt, Builder.CreateConstInBoundsGEP2_32(Loc, 0, i), isVolatile,
982 IsAutoInit);
983 }
984 return;
985 }
986
988 "Unknown value type!");
989
990 for (unsigned i = 0, e = Init->getNumOperands(); i != e; ++i) {
991 llvm::Constant *Elt = cast<llvm::Constant>(Init->getOperand(i));
992
993 // If necessary, get a pointer to the element and emit it.
994 if (!Elt->isNullValue() && !isa<llvm::UndefValue>(Elt))
995 emitStoresForInitAfterBZero(Elt,
996 Builder.CreateConstInBoundsGEP2_32(Loc, 0, i),
997 isVolatile, IsAutoInit);
998 }
999}
1000
1001/// Decide whether we should use bzero plus some stores to initialize a local
1002/// variable instead of using a memcpy from a constant global. It is beneficial
1003/// to use bzero if the global is all zeros, or mostly zeros and large.
1004static bool shouldUseBZeroPlusStoresToInitialize(llvm::Constant *Init,
1005 uint64_t GlobalSize) {
1006 // If a global is all zeros, always use a bzero.
1007 if (isa<llvm::ConstantAggregateZero>(Init)) return true;
1008
1009 // If a non-zero global is <= 32 bytes, always use a memcpy. If it is large,
1010 // do it if it will require 6 or fewer scalar stores.
1011 // TODO: Should budget depends on the size? Avoiding a large global warrants
1012 // plopping in more stores.
1013 unsigned StoreBudget = 6;
1014 uint64_t SizeLimit = 32;
1015
1016 return GlobalSize > SizeLimit &&
1018}
1019
1020/// Decide whether we should use memset to initialize a local variable instead
1021/// of using a memcpy from a constant global. Assumes we've already decided to
1022/// not user bzero.
1023/// FIXME We could be more clever, as we are for bzero above, and generate
1024/// memset followed by stores. It's unclear that's worth the effort.
1025static llvm::Value *shouldUseMemSetToInitialize(llvm::Constant *Init,
1026 uint64_t GlobalSize,
1027 const llvm::DataLayout &DL) {
1028 uint64_t SizeLimit = 32;
1029 if (GlobalSize <= SizeLimit)
1030 return nullptr;
1031 return llvm::isBytewiseValue(Init, DL);
1032}
1033
1034/// Decide whether we want to split a constant structure or array store into a
1035/// sequence of its fields' stores. This may cost us code size and compilation
1036/// speed, but plays better with store optimizations.
1038 uint64_t GlobalByteSize) {
1039 // Don't break things that occupy more than one cacheline.
1040 uint64_t ByteSizeLimit = 64;
1041 if (CGM.getCodeGenOpts().OptimizationLevel == 0)
1042 return false;
1043 if (GlobalByteSize <= ByteSizeLimit)
1044 return true;
1045 return false;
1046}
1047
1048enum class IsPattern { No, Yes };
1049
1050/// Generate a constant filled with either a pattern or zeroes.
1051static llvm::Constant *patternOrZeroFor(CodeGenModule &CGM, IsPattern isPattern,
1052 llvm::Type *Ty) {
1053 if (isPattern == IsPattern::Yes)
1054 return initializationPatternFor(CGM, Ty);
1055 else
1056 return llvm::Constant::getNullValue(Ty);
1057}
1058
1059static llvm::Constant *constWithPadding(CodeGenModule &CGM, IsPattern isPattern,
1060 llvm::Constant *constant);
1061
1062/// Helper function for constWithPadding() to deal with padding in structures.
1063static llvm::Constant *constStructWithPadding(CodeGenModule &CGM,
1064 IsPattern isPattern,
1065 llvm::StructType *STy,
1066 llvm::Constant *constant) {
1067 const llvm::DataLayout &DL = CGM.getDataLayout();
1068 const llvm::StructLayout *Layout = DL.getStructLayout(STy);
1069 llvm::Type *Int8Ty = llvm::IntegerType::getInt8Ty(CGM.getLLVMContext());
1070 unsigned SizeSoFar = 0;
1072 bool NestedIntact = true;
1073 for (unsigned i = 0, e = STy->getNumElements(); i != e; i++) {
1074 unsigned CurOff = Layout->getElementOffset(i);
1075 if (SizeSoFar < CurOff) {
1076 assert(!STy->isPacked());
1077 auto *PadTy = llvm::ArrayType::get(Int8Ty, CurOff - SizeSoFar);
1078 Values.push_back(patternOrZeroFor(CGM, isPattern, PadTy));
1079 }
1080 llvm::Constant *CurOp;
1081 if (constant->isNullValue())
1082 CurOp = llvm::Constant::getNullValue(STy->getElementType(i));
1083 else
1084 CurOp = cast<llvm::Constant>(constant->getAggregateElement(i));
1085 auto *NewOp = constWithPadding(CGM, isPattern, CurOp);
1086 if (CurOp != NewOp)
1087 NestedIntact = false;
1088 Values.push_back(NewOp);
1089 SizeSoFar = CurOff + DL.getTypeAllocSize(CurOp->getType());
1090 }
1091 unsigned TotalSize = Layout->getSizeInBytes();
1092 if (SizeSoFar < TotalSize) {
1093 auto *PadTy = llvm::ArrayType::get(Int8Ty, TotalSize - SizeSoFar);
1094 Values.push_back(patternOrZeroFor(CGM, isPattern, PadTy));
1095 }
1096 if (NestedIntact && Values.size() == STy->getNumElements())
1097 return constant;
1098 return llvm::ConstantStruct::getAnon(Values, STy->isPacked());
1099}
1100
1101/// Replace all padding bytes in a given constant with either a pattern byte or
1102/// 0x00.
1103static llvm::Constant *constWithPadding(CodeGenModule &CGM, IsPattern isPattern,
1104 llvm::Constant *constant) {
1105 llvm::Type *OrigTy = constant->getType();
1106 if (const auto STy = dyn_cast<llvm::StructType>(OrigTy))
1107 return constStructWithPadding(CGM, isPattern, STy, constant);
1108 if (auto *ArrayTy = dyn_cast<llvm::ArrayType>(OrigTy)) {
1110 uint64_t Size = ArrayTy->getNumElements();
1111 if (!Size)
1112 return constant;
1113 llvm::Type *ElemTy = ArrayTy->getElementType();
1114 bool ZeroInitializer = constant->isNullValue();
1115 llvm::Constant *OpValue, *PaddedOp;
1116 if (ZeroInitializer) {
1117 OpValue = llvm::Constant::getNullValue(ElemTy);
1118 PaddedOp = constWithPadding(CGM, isPattern, OpValue);
1119 }
1120 for (unsigned Op = 0; Op != Size; ++Op) {
1121 if (!ZeroInitializer) {
1122 OpValue = constant->getAggregateElement(Op);
1123 PaddedOp = constWithPadding(CGM, isPattern, OpValue);
1124 }
1125 Values.push_back(PaddedOp);
1126 }
1127 auto *NewElemTy = Values[0]->getType();
1128 if (NewElemTy == ElemTy)
1129 return constant;
1130 auto *NewArrayTy = llvm::ArrayType::get(NewElemTy, Size);
1131 return llvm::ConstantArray::get(NewArrayTy, Values);
1132 }
1133 // FIXME: Add handling for tail padding in vectors. Vectors don't
1134 // have padding between or inside elements, but the total amount of
1135 // data can be less than the allocated size.
1136 return constant;
1137}
1138
1140 llvm::Constant *Constant,
1141 CharUnits Align) {
1142 auto FunctionName = [&](const DeclContext *DC) -> std::string {
1143 if (const auto *FD = dyn_cast<FunctionDecl>(DC)) {
1144 if (const auto *CC = dyn_cast<CXXConstructorDecl>(FD))
1145 return CC->getNameAsString();
1146 if (const auto *CD = dyn_cast<CXXDestructorDecl>(FD))
1147 return CD->getNameAsString();
1148 return std::string(getMangledName(FD));
1149 } else if (const auto *OM = dyn_cast<ObjCMethodDecl>(DC)) {
1150 return OM->getNameAsString();
1151 } else if (isa<BlockDecl>(DC)) {
1152 return "<block>";
1153 } else if (isa<CapturedDecl>(DC)) {
1154 return "<captured>";
1155 } else {
1156 llvm_unreachable("expected a function or method");
1157 }
1158 };
1159
1160 // Form a simple per-variable cache of these values in case we find we
1161 // want to reuse them.
1162 llvm::GlobalVariable *&CacheEntry = InitializerConstants[&D];
1163 if (!CacheEntry || CacheEntry->getInitializer() != Constant) {
1164 auto *Ty = Constant->getType();
1165 bool isConstant = true;
1166 llvm::GlobalVariable *InsertBefore = nullptr;
1167 unsigned AS =
1169 std::string Name;
1170 if (D.hasGlobalStorage())
1171 Name = getMangledName(&D).str() + ".const";
1172 else if (const DeclContext *DC = D.getParentFunctionOrMethod())
1173 Name = ("__const." + FunctionName(DC) + "." + D.getName()).str();
1174 else
1175 llvm_unreachable("local variable has no parent function or method");
1176 llvm::GlobalVariable *GV = new llvm::GlobalVariable(
1177 getModule(), Ty, isConstant, llvm::GlobalValue::PrivateLinkage,
1178 Constant, Name, InsertBefore, llvm::GlobalValue::NotThreadLocal, AS);
1179 GV->setAlignment(Align.getAsAlign());
1180 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
1181 CacheEntry = GV;
1182 } else if (CacheEntry->getAlignment() < uint64_t(Align.getQuantity())) {
1183 CacheEntry->setAlignment(Align.getAsAlign());
1184 }
1185
1186 return Address(CacheEntry, CacheEntry->getValueType(), Align);
1187}
1188
1190 const VarDecl &D,
1191 CGBuilderTy &Builder,
1192 llvm::Constant *Constant,
1193 CharUnits Align) {
1194 Address SrcPtr = CGM.createUnnamedGlobalFrom(D, Constant, Align);
1195 return SrcPtr.withElementType(CGM.Int8Ty);
1196}
1197
1198void CodeGenFunction::emitStoresForConstant(const VarDecl &D, Address Loc,
1199 bool isVolatile,
1200 llvm::Constant *constant,
1201 bool IsAutoInit) {
1202 auto *Ty = constant->getType();
1203 uint64_t ConstantSize = CGM.getDataLayout().getTypeAllocSize(Ty);
1204 if (!ConstantSize)
1205 return;
1206
1207 bool canDoSingleStore = Ty->isIntOrIntVectorTy() ||
1208 Ty->isPtrOrPtrVectorTy() || Ty->isFPOrFPVectorTy();
1209 if (canDoSingleStore) {
1210 auto *I = Builder.CreateStore(constant, Loc, isVolatile);
1211 addInstToCurrentSourceAtom(I, nullptr);
1212 if (IsAutoInit)
1213 I->addAnnotationMetadata("auto-init");
1214 return;
1215 }
1216
1217 auto *SizeVal = llvm::ConstantInt::get(CGM.IntPtrTy, ConstantSize);
1218
1219 // If the initializer is all or mostly the same, codegen with bzero / memset
1220 // then do a few stores afterward.
1221 if (shouldUseBZeroPlusStoresToInitialize(constant, ConstantSize)) {
1222 auto *I = Builder.CreateMemSet(Loc, llvm::ConstantInt::get(CGM.Int8Ty, 0),
1223 SizeVal, isVolatile);
1224 addInstToCurrentSourceAtom(I, nullptr);
1225
1226 if (IsAutoInit)
1227 I->addAnnotationMetadata("auto-init");
1228
1229 bool valueAlreadyCorrect =
1230 constant->isNullValue() || isa<llvm::UndefValue>(constant);
1231 if (!valueAlreadyCorrect) {
1232 Loc = Loc.withElementType(Ty);
1233 emitStoresForInitAfterBZero(constant, Loc, isVolatile, IsAutoInit);
1234 }
1235 return;
1236 }
1237
1238 // If the initializer is a repeated byte pattern, use memset.
1239 llvm::Value *Pattern =
1240 shouldUseMemSetToInitialize(constant, ConstantSize, CGM.getDataLayout());
1241 if (Pattern) {
1242 uint64_t Value = 0x00;
1243 if (!isa<llvm::UndefValue>(Pattern)) {
1244 const llvm::APInt &AP = cast<llvm::ConstantInt>(Pattern)->getValue();
1245 assert(AP.getBitWidth() <= 8);
1246 Value = AP.getLimitedValue();
1247 }
1248 auto *I = Builder.CreateMemSet(
1249 Loc, llvm::ConstantInt::get(CGM.Int8Ty, Value), SizeVal, isVolatile);
1250 addInstToCurrentSourceAtom(I, nullptr);
1251 if (IsAutoInit)
1252 I->addAnnotationMetadata("auto-init");
1253 return;
1254 }
1255
1256 // If the initializer is small or trivialAutoVarInit is set, use a handful of
1257 // stores.
1258 bool IsTrivialAutoVarInitPattern =
1259 CGM.getContext().getLangOpts().getTrivialAutoVarInit() ==
1261 if (shouldSplitConstantStore(CGM, ConstantSize)) {
1262 if (auto *STy = dyn_cast<llvm::StructType>(Ty)) {
1263 if (STy == Loc.getElementType() || IsTrivialAutoVarInitPattern) {
1264 const llvm::StructLayout *Layout =
1265 CGM.getDataLayout().getStructLayout(STy);
1266 for (unsigned i = 0; i != constant->getNumOperands(); i++) {
1267 CharUnits CurOff =
1268 CharUnits::fromQuantity(Layout->getElementOffset(i));
1269 Address EltPtr = Builder.CreateConstInBoundsByteGEP(
1270 Loc.withElementType(CGM.Int8Ty), CurOff);
1271 emitStoresForConstant(D, EltPtr, isVolatile,
1272 constant->getAggregateElement(i), IsAutoInit);
1273 }
1274 return;
1275 }
1276 } else if (auto *ATy = dyn_cast<llvm::ArrayType>(Ty)) {
1277 if (ATy == Loc.getElementType() || IsTrivialAutoVarInitPattern) {
1278 for (unsigned i = 0; i != ATy->getNumElements(); i++) {
1279 Address EltPtr = Builder.CreateConstGEP(
1280 Loc.withElementType(ATy->getElementType()), i);
1281 emitStoresForConstant(D, EltPtr, isVolatile,
1282 constant->getAggregateElement(i), IsAutoInit);
1283 }
1284 return;
1285 }
1286 }
1287 }
1288
1289 // Copy from a global.
1290 auto *I =
1291 Builder.CreateMemCpy(Loc,
1293 CGM, D, Builder, constant, Loc.getAlignment()),
1294 SizeVal, isVolatile);
1295 addInstToCurrentSourceAtom(I, nullptr);
1296
1297 if (IsAutoInit)
1298 I->addAnnotationMetadata("auto-init");
1299}
1300
1301void CodeGenFunction::emitStoresForZeroInit(const VarDecl &D, Address Loc,
1302 bool isVolatile) {
1303 llvm::Type *ElTy = Loc.getElementType();
1304 llvm::Constant *constant =
1305 constWithPadding(CGM, IsPattern::No, llvm::Constant::getNullValue(ElTy));
1306 emitStoresForConstant(D, Loc, isVolatile, constant,
1307 /*IsAutoInit=*/true);
1308}
1309
1310void CodeGenFunction::emitStoresForPatternInit(const VarDecl &D, Address Loc,
1311 bool isVolatile) {
1312 llvm::Type *ElTy = Loc.getElementType();
1313 llvm::Constant *constant = constWithPadding(
1315 assert(!isa<llvm::UndefValue>(constant));
1316 emitStoresForConstant(D, Loc, isVolatile, constant,
1317 /*IsAutoInit=*/true);
1318}
1319
1320static bool containsUndef(llvm::Constant *constant) {
1321 auto *Ty = constant->getType();
1322 if (isa<llvm::UndefValue>(constant))
1323 return true;
1324 if (Ty->isStructTy() || Ty->isArrayTy() || Ty->isVectorTy())
1325 for (llvm::Use &Op : constant->operands())
1327 return true;
1328 return false;
1329}
1330
1331static llvm::Constant *replaceUndef(CodeGenModule &CGM, IsPattern isPattern,
1332 llvm::Constant *constant) {
1333 auto *Ty = constant->getType();
1334 if (isa<llvm::UndefValue>(constant))
1335 return patternOrZeroFor(CGM, isPattern, Ty);
1336 if (!(Ty->isStructTy() || Ty->isArrayTy() || Ty->isVectorTy()))
1337 return constant;
1338 if (!containsUndef(constant))
1339 return constant;
1340 llvm::SmallVector<llvm::Constant *, 8> Values(constant->getNumOperands());
1341 for (unsigned Op = 0, NumOp = constant->getNumOperands(); Op != NumOp; ++Op) {
1342 auto *OpValue = cast<llvm::Constant>(constant->getOperand(Op));
1343 Values[Op] = replaceUndef(CGM, isPattern, OpValue);
1344 }
1345 if (Ty->isStructTy())
1346 return llvm::ConstantStruct::get(cast<llvm::StructType>(Ty), Values);
1347 if (Ty->isArrayTy())
1348 return llvm::ConstantArray::get(cast<llvm::ArrayType>(Ty), Values);
1349 assert(Ty->isVectorTy());
1350 return llvm::ConstantVector::get(Values);
1351}
1352
1353/// EmitAutoVarDecl - Emit code and set up an entry in LocalDeclMap for a
1354/// variable declaration with auto, register, or no storage class specifier.
1355/// These turn into simple stack objects, or GlobalValues depending on target.
1357 AutoVarEmission emission = EmitAutoVarAlloca(D);
1358 EmitAutoVarInit(emission);
1359 EmitAutoVarCleanups(emission);
1360}
1361
1362/// Emit a lifetime.begin marker if some criteria are satisfied.
1363/// \return whether the marker was emitted.
1365 if (!ShouldEmitLifetimeMarkers)
1366 return false;
1367
1368 assert(Addr->getType()->getPointerAddressSpace() ==
1369 CGM.getDataLayout().getAllocaAddrSpace() &&
1370 "Pointer should be in alloca address space");
1371 llvm::CallInst *C = Builder.CreateCall(CGM.getLLVMLifetimeStartFn(), {Addr});
1372 C->setDoesNotThrow();
1373 return true;
1374}
1375
1377 if (!ShouldEmitLifetimeMarkers)
1378 return;
1379
1380 assert(Addr->getType()->getPointerAddressSpace() ==
1381 CGM.getDataLayout().getAllocaAddrSpace() &&
1382 "Pointer should be in alloca address space");
1383 llvm::CallInst *C = Builder.CreateCall(CGM.getLLVMLifetimeEndFn(), {Addr});
1384 C->setDoesNotThrow();
1385}
1386
1388 auto NL = ApplyDebugLocation::CreateEmpty(*this);
1389 llvm::Value *V = Builder.CreateLoad(Addr, "fake.use");
1390 llvm::CallInst *C = Builder.CreateCall(CGM.getLLVMFakeUseFn(), {V});
1391 C->setDoesNotThrow();
1392 C->setTailCallKind(llvm::CallInst::TCK_NoTail);
1393}
1394
1396 CGDebugInfo *DI, const VarDecl &D, bool EmitDebugInfo) {
1397 // For each dimension stores its QualType and corresponding
1398 // size-expression Value.
1401
1402 // Break down the array into individual dimensions.
1403 QualType Type1D = D.getType();
1404 while (getContext().getAsVariableArrayType(Type1D)) {
1405 auto VlaSize = getVLAElements1D(Type1D);
1406 if (auto *C = dyn_cast<llvm::ConstantInt>(VlaSize.NumElts))
1407 Dimensions.emplace_back(C, Type1D.getUnqualifiedType());
1408 else {
1409 // Generate a locally unique name for the size expression.
1410 Twine Name = Twine("__vla_expr") + Twine(VLAExprCounter++);
1411 SmallString<12> Buffer;
1412 StringRef NameRef = Name.toStringRef(Buffer);
1413 auto &Ident = getContext().Idents.getOwn(NameRef);
1414 VLAExprNames.push_back(&Ident);
1415 auto SizeExprAddr =
1416 CreateDefaultAlignTempAlloca(VlaSize.NumElts->getType(), NameRef);
1417 Builder.CreateStore(VlaSize.NumElts, SizeExprAddr);
1418 Dimensions.emplace_back(SizeExprAddr.getPointer(),
1419 Type1D.getUnqualifiedType());
1420 }
1421 Type1D = VlaSize.Type;
1422 }
1423
1424 if (!EmitDebugInfo)
1425 return;
1426
1427 // Register each dimension's size-expression with a DILocalVariable,
1428 // so that it can be used by CGDebugInfo when instantiating a DISubrange
1429 // to describe this array.
1430 unsigned NameIdx = 0;
1431 for (auto &VlaSize : Dimensions) {
1432 llvm::Metadata *MD;
1433 if (auto *C = dyn_cast<llvm::ConstantInt>(VlaSize.NumElts))
1434 MD = llvm::ConstantAsMetadata::get(C);
1435 else {
1436 // Create an artificial VarDecl to generate debug info for.
1437 const IdentifierInfo *NameIdent = VLAExprNames[NameIdx++];
1439 SizeTy->getScalarSizeInBits(), false);
1440 auto *ArtificialDecl = VarDecl::Create(
1441 getContext(), const_cast<DeclContext *>(D.getDeclContext()),
1442 D.getLocation(), D.getLocation(), NameIdent, QT,
1443 getContext().CreateTypeSourceInfo(QT), SC_Auto);
1444 ArtificialDecl->setImplicit();
1445
1446 MD = DI->EmitDeclareOfAutoVariable(ArtificialDecl, VlaSize.NumElts,
1447 Builder);
1448 }
1449 assert(MD && "No Size expression debug node created");
1450 DI->registerVLASizeExpression(VlaSize.Type, MD);
1451 }
1452}
1453
1454/// Return the maximum size of an aggregate for which we generate a fake use
1455/// intrinsic when -fextend-variable-liveness is in effect.
1456static uint64_t maxFakeUseAggregateSize(const ASTContext &C) {
1457 return 4 * C.getTypeSize(C.UnsignedIntTy);
1458}
1459
1460// Helper function to determine whether a variable's or parameter's lifetime
1461// should be extended.
1462static bool shouldExtendLifetime(const ASTContext &Context,
1463 const Decl *FuncDecl, const VarDecl &D,
1464 ImplicitParamDecl *CXXABIThisDecl) {
1465 // When we're not inside a valid function it is unlikely that any
1466 // lifetime extension is useful.
1467 if (!FuncDecl)
1468 return false;
1469 if (FuncDecl->isImplicit())
1470 return false;
1471 // Do not extend compiler-created variables except for the this pointer.
1472 if (D.isImplicit() && &D != CXXABIThisDecl)
1473 return false;
1474 QualType Ty = D.getType();
1475 // No need to extend volatiles, they have a memory location.
1476 if (Ty.isVolatileQualified())
1477 return false;
1478 // Don't extend variables that exceed a certain size.
1479 if (Context.getTypeSize(Ty) > maxFakeUseAggregateSize(Context))
1480 return false;
1481 // Do not extend variables in nodebug or optnone functions.
1482 if (FuncDecl->hasAttr<NoDebugAttr>() || FuncDecl->hasAttr<OptimizeNoneAttr>())
1483 return false;
1484 return true;
1485}
1486
1487/// EmitAutoVarAlloca - Emit the alloca and debug information for a
1488/// local variable. Does not emit initialization or destruction.
1491 QualType Ty = D.getType();
1492 assert(
1495
1496 AutoVarEmission emission(D);
1497
1498 bool isEscapingByRef = D.isEscapingByref();
1499 emission.IsEscapingByRef = isEscapingByRef;
1500
1501 CharUnits alignment = getContext().getDeclAlign(&D);
1502
1503 // If the type is variably-modified, emit all the VLA sizes for it.
1504 if (Ty->isVariablyModifiedType())
1506
1507 auto *DI = getDebugInfo();
1508 bool EmitDebugInfo = DI && CGM.getCodeGenOpts().hasReducedDebugInfo();
1509
1510 Address address = Address::invalid();
1511 RawAddress AllocaAddr = RawAddress::invalid();
1512 Address OpenMPLocalAddr = Address::invalid();
1513 if (CGM.getLangOpts().OpenMPIRBuilder)
1514 OpenMPLocalAddr = OMPBuilderCBHelpers::getAddressOfLocalVariable(*this, &D);
1515 else
1516 OpenMPLocalAddr =
1517 getLangOpts().OpenMP
1518 ? CGM.getOpenMPRuntime().getAddressOfLocalVariable(*this, &D)
1519 : Address::invalid();
1520
1521 bool NRVO = getLangOpts().ElideConstructors && D.isNRVOVariable();
1522
1523 if (getLangOpts().OpenMP && OpenMPLocalAddr.isValid()) {
1524 address = OpenMPLocalAddr;
1525 AllocaAddr = OpenMPLocalAddr;
1526 } else if (Ty->isConstantSizeType()) {
1527 // If this value is an array or struct with a statically determinable
1528 // constant initializer, there are optimizations we can do.
1529 //
1530 // TODO: We should constant-evaluate the initializer of any variable,
1531 // as long as it is initialized by a constant expression. Currently,
1532 // isConstantInitializer produces wrong answers for structs with
1533 // reference or bitfield members, and a few other cases, and checking
1534 // for POD-ness protects us from some of these.
1535 if (D.getInit() && (Ty->isArrayType() || Ty->isRecordType()) &&
1536 (D.isConstexpr() ||
1537 ((Ty.isPODType(getContext()) ||
1538 getContext().getBaseElementType(Ty)->isObjCObjectPointerType()) &&
1540
1541 // If the variable's a const type, and it's neither an NRVO
1542 // candidate nor a __block variable and has no mutable members,
1543 // emit it as a global instead.
1544 // Exception is if a variable is located in non-constant address space
1545 // in OpenCL.
1546 bool NeedsDtor =
1548 if ((!getLangOpts().OpenCL ||
1550 (CGM.getCodeGenOpts().MergeAllConstants && !NRVO &&
1551 !isEscapingByRef &&
1552 Ty.isConstantStorage(getContext(), true, !NeedsDtor))) {
1553 EmitStaticVarDecl(D, llvm::GlobalValue::InternalLinkage);
1554
1555 // Signal this condition to later callbacks.
1556 emission.Addr = Address::invalid();
1557 assert(emission.wasEmittedAsGlobal());
1558 return emission;
1559 }
1560
1561 // Otherwise, tell the initialization code that we're in this case.
1562 emission.IsConstantAggregate = true;
1563 }
1564
1565 // A normal fixed sized variable becomes an alloca in the entry block,
1566 // unless:
1567 // - it's an NRVO variable.
1568 // - we are compiling OpenMP and it's an OpenMP local variable.
1569 if (NRVO) {
1570 // The named return value optimization: allocate this variable in the
1571 // return slot, so that we can elide the copy when returning this
1572 // variable (C++0x [class.copy]p34).
1573 AllocaAddr =
1574 RawAddress(ReturnValue.emitRawPointer(*this),
1575 ReturnValue.getElementType(), ReturnValue.getAlignment());
1576 address = MaybeCastStackAddressSpace(AllocaAddr, Ty.getAddressSpace());
1577
1578 if (const auto *RD = Ty->getAsRecordDecl()) {
1579 if (const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD);
1580 (CXXRD && !CXXRD->hasTrivialDestructor()) ||
1581 RD->isNonTrivialToPrimitiveDestroy()) {
1582 // Create a flag that is used to indicate when the NRVO was applied
1583 // to this variable. Set it to zero to indicate that NRVO was not
1584 // applied.
1585 llvm::Value *Zero = Builder.getFalse();
1586 RawAddress NRVOFlag =
1587 CreateTempAlloca(Zero->getType(), CharUnits::One(), "nrvo");
1589 Builder.CreateStore(Zero, NRVOFlag);
1590
1591 // Record the NRVO flag for this variable.
1592 NRVOFlags[&D] = NRVOFlag.getPointer();
1593 emission.NRVOFlag = NRVOFlag.getPointer();
1594 }
1595 }
1596 } else {
1597 CharUnits allocaAlignment;
1598 llvm::Type *allocaTy;
1599 if (isEscapingByRef) {
1600 auto &byrefInfo = getBlockByrefInfo(&D);
1601 allocaTy = byrefInfo.Type;
1602 allocaAlignment = byrefInfo.ByrefAlignment;
1603 } else {
1604 allocaTy = ConvertTypeForMem(Ty);
1605 allocaAlignment = alignment;
1606 }
1607
1608 // Create the alloca. Note that we set the name separately from
1609 // building the instruction so that it's there even in no-asserts
1610 // builds.
1611 address = CreateTempAlloca(allocaTy, Ty.getAddressSpace(),
1612 allocaAlignment, D.getName(),
1613 /*ArraySize=*/nullptr, &AllocaAddr);
1614
1615 // Don't emit lifetime markers for MSVC catch parameters. The lifetime of
1616 // the catch parameter starts in the catchpad instruction, and we can't
1617 // insert code in those basic blocks.
1618 bool IsMSCatchParam =
1620
1621 // Emit a lifetime intrinsic if meaningful. There's no point in doing this
1622 // if we don't have a valid insertion point (?).
1623 if (HaveInsertPoint() && !IsMSCatchParam) {
1624 // If there's a jump into the lifetime of this variable, its lifetime
1625 // gets broken up into several regions in IR, which requires more work
1626 // to handle correctly. For now, just omit the intrinsics; this is a
1627 // rare case, and it's better to just be conservatively correct.
1628 // PR28267.
1629 //
1630 // We have to do this in all language modes if there's a jump past the
1631 // declaration. We also have to do it in C if there's a jump to an
1632 // earlier point in the current block because non-VLA lifetimes begin as
1633 // soon as the containing block is entered, not when its variables
1634 // actually come into scope; suppressing the lifetime annotations
1635 // completely in this case is unnecessarily pessimistic, but again, this
1636 // is rare.
1637 if (!Bypasses.IsBypassed(&D) &&
1639 emission.UseLifetimeMarkers =
1640 EmitLifetimeStart(AllocaAddr.getPointer());
1641 }
1642 } else {
1643 assert(!emission.useLifetimeMarkers());
1644 }
1645 }
1646
1647 if (D.hasAttr<StackProtectorIgnoreAttr>()) {
1648 if (auto *AI = dyn_cast<llvm::AllocaInst>(address.getBasePointer())) {
1649 llvm::LLVMContext &Ctx = Builder.getContext();
1650 auto *Operand = llvm::ConstantAsMetadata::get(Builder.getInt32(0));
1651 AI->setMetadata("stack-protector", llvm::MDNode::get(Ctx, {Operand}));
1652 }
1653
1654 std::optional<llvm::Attribute::AttrKind> Attr =
1655 CGM.StackProtectorAttribute(&D);
1656 if (Attr && (*Attr == llvm::Attribute::StackProtectReq)) {
1657 CGM.getDiags().Report(D.getLocation(),
1658 diag::warn_stack_protection_ignore_attribute);
1659 }
1660 }
1661 } else {
1663
1664 // Delayed globalization for variable length declarations. This ensures that
1665 // the expression representing the length has been emitted and can be used
1666 // by the definition of the VLA. Since this is an escaped declaration, in
1667 // OpenMP we have to use a call to __kmpc_alloc_shared(). The matching
1668 // deallocation call to __kmpc_free_shared() is emitted later.
1669 bool VarAllocated = false;
1670 if (getLangOpts().OpenMPIsTargetDevice) {
1671 auto &RT = CGM.getOpenMPRuntime();
1672 if (RT.isDelayedVariableLengthDecl(*this, &D)) {
1673 // Emit call to __kmpc_alloc_shared() instead of the alloca.
1674 std::pair<llvm::Value *, llvm::Value *> AddrSizePair =
1675 RT.getKmpcAllocShared(*this, &D);
1676
1677 // Save the address of the allocation:
1678 LValue Base = MakeAddrLValue(AddrSizePair.first, D.getType(),
1679 CGM.getContext().getDeclAlign(&D),
1681 address = Base.getAddress();
1682
1683 // Push a cleanup block to emit the call to __kmpc_free_shared in the
1684 // appropriate location at the end of the scope of the
1685 // __kmpc_alloc_shared functions:
1686 pushKmpcAllocFree(NormalCleanup, AddrSizePair);
1687
1688 // Mark variable as allocated:
1689 VarAllocated = true;
1690 }
1691 }
1692
1693 if (!VarAllocated) {
1694 if (!DidCallStackSave) {
1695 // Save the stack.
1696 Address Stack =
1698
1699 llvm::Value *V = Builder.CreateStackSave();
1700 assert(V->getType() == AllocaInt8PtrTy);
1701 Builder.CreateStore(V, Stack);
1702
1703 DidCallStackSave = true;
1704
1705 // Push a cleanup block and restore the stack there.
1706 // FIXME: in general circumstances, this should be an EH cleanup.
1708 }
1709
1710 auto VlaSize = getVLASize(Ty);
1711 llvm::Type *llvmTy = ConvertTypeForMem(VlaSize.Type);
1712
1713 // Allocate memory for the array.
1714 address = CreateTempAlloca(llvmTy, alignment, "vla", VlaSize.NumElts,
1715 &AllocaAddr);
1716 }
1717
1718 // If we have debug info enabled, properly describe the VLA dimensions for
1719 // this type by registering the vla size expression for each of the
1720 // dimensions.
1721 EmitAndRegisterVariableArrayDimensions(DI, D, EmitDebugInfo);
1722 }
1723
1724 setAddrOfLocalVar(&D, address);
1725 emission.Addr = address;
1726 emission.AllocaAddr = AllocaAddr;
1727
1728 // Emit debug info for local var declaration.
1729 if (EmitDebugInfo && HaveInsertPoint()) {
1730 Address DebugAddr = address;
1731 bool UsePointerValue = NRVO && ReturnValuePointer.isValid();
1732 DI->setLocation(D.getLocation());
1733
1734 // If NRVO, use a pointer to the return address.
1735 if (UsePointerValue) {
1736 DebugAddr = ReturnValuePointer;
1737 AllocaAddr = ReturnValuePointer;
1738 }
1739 (void)DI->EmitDeclareOfAutoVariable(&D, AllocaAddr.getPointer(), Builder,
1740 UsePointerValue);
1741 }
1742
1743 if (D.hasAttr<AnnotateAttr>() && HaveInsertPoint())
1744 EmitVarAnnotations(&D, address.emitRawPointer(*this));
1745
1746 // Make sure we call @llvm.lifetime.end.
1747 if (emission.useLifetimeMarkers())
1748 EHStack.pushCleanup<CallLifetimeEnd>(
1750
1751 // Analogous to lifetime markers, we use a 'cleanup' to emit fake.use
1752 // calls for local variables. We are exempting volatile variables and
1753 // non-scalars larger than 4 times the size of an unsigned int. Larger
1754 // non-scalars are often allocated in memory and may create unnecessary
1755 // overhead.
1756 if (CGM.getCodeGenOpts().getExtendVariableLiveness() ==
1758 if (shouldExtendLifetime(getContext(), CurCodeDecl, D, CXXABIThisDecl))
1759 EHStack.pushCleanup<FakeUse>(NormalFakeUse,
1760 emission.getAllocatedAddress());
1761 }
1762
1763 return emission;
1764}
1765
1766static bool isCapturedBy(const VarDecl &, const Expr *);
1767
1768/// Determines whether the given __block variable is potentially
1769/// captured by the given statement.
1770static bool isCapturedBy(const VarDecl &Var, const Stmt *S) {
1771 if (const Expr *E = dyn_cast<Expr>(S))
1772 return isCapturedBy(Var, E);
1773 for (const Stmt *SubStmt : S->children())
1774 if (isCapturedBy(Var, SubStmt))
1775 return true;
1776 return false;
1777}
1778
1779/// Determines whether the given __block variable is potentially
1780/// captured by the given expression.
1781static bool isCapturedBy(const VarDecl &Var, const Expr *E) {
1782 // Skip the most common kinds of expressions that make
1783 // hierarchy-walking expensive.
1784 E = E->IgnoreParenCasts();
1785
1786 if (const BlockExpr *BE = dyn_cast<BlockExpr>(E)) {
1787 const BlockDecl *Block = BE->getBlockDecl();
1788 for (const auto &I : Block->captures()) {
1789 if (I.getVariable() == &Var)
1790 return true;
1791 }
1792
1793 // No need to walk into the subexpressions.
1794 return false;
1795 }
1796
1797 if (const StmtExpr *SE = dyn_cast<StmtExpr>(E)) {
1798 const CompoundStmt *CS = SE->getSubStmt();
1799 for (const auto *BI : CS->body())
1800 if (const auto *BIE = dyn_cast<Expr>(BI)) {
1801 if (isCapturedBy(Var, BIE))
1802 return true;
1803 }
1804 else if (const auto *DS = dyn_cast<DeclStmt>(BI)) {
1805 // special case declarations
1806 for (const auto *I : DS->decls()) {
1807 if (const auto *VD = dyn_cast<VarDecl>((I))) {
1808 const Expr *Init = VD->getInit();
1809 if (Init && isCapturedBy(Var, Init))
1810 return true;
1811 }
1812 }
1813 }
1814 else
1815 // FIXME. Make safe assumption assuming arbitrary statements cause capturing.
1816 // Later, provide code to poke into statements for capture analysis.
1817 return true;
1818 return false;
1819 }
1820
1821 for (const Stmt *SubStmt : E->children())
1822 if (isCapturedBy(Var, SubStmt))
1823 return true;
1824
1825 return false;
1826}
1827
1828/// Determine whether the given initializer is trivial in the sense
1829/// that it requires no code to be generated.
1831 if (!Init)
1832 return true;
1833
1834 if (const CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init))
1835 if (CXXConstructorDecl *Constructor = Construct->getConstructor())
1836 if (Constructor->isTrivial() &&
1837 Constructor->isDefaultConstructor() &&
1838 !Construct->requiresZeroInitialization())
1839 return true;
1840
1841 return false;
1842}
1843
1844void CodeGenFunction::emitZeroOrPatternForAutoVarInit(QualType type,
1845 const VarDecl &D,
1846 Address Loc) {
1847 auto trivialAutoVarInit = getContext().getLangOpts().getTrivialAutoVarInit();
1848 auto trivialAutoVarInitMaxSize =
1849 getContext().getLangOpts().TrivialAutoVarInitMaxSize;
1851 bool isVolatile = type.isVolatileQualified();
1852 if (!Size.isZero()) {
1853 // We skip auto-init variables by their alloc size. Take this as an example:
1854 // "struct Foo {int x; char buff[1024];}" Assume the max-size flag is 1023.
1855 // All Foo type variables will be skipped. Ideally, we only skip the buff
1856 // array and still auto-init X in this example.
1857 // TODO: Improve the size filtering to by member size.
1858 auto allocSize = CGM.getDataLayout().getTypeAllocSize(Loc.getElementType());
1859 switch (trivialAutoVarInit) {
1861 llvm_unreachable("Uninitialized handled by caller");
1863 if (CGM.stopAutoInit())
1864 return;
1865 if (trivialAutoVarInitMaxSize > 0 &&
1866 allocSize > trivialAutoVarInitMaxSize)
1867 return;
1868 emitStoresForZeroInit(D, Loc, isVolatile);
1869 break;
1871 if (CGM.stopAutoInit())
1872 return;
1873 if (trivialAutoVarInitMaxSize > 0 &&
1874 allocSize > trivialAutoVarInitMaxSize)
1875 return;
1876 emitStoresForPatternInit(D, Loc, isVolatile);
1877 break;
1878 }
1879 return;
1880 }
1881
1882 // VLAs look zero-sized to getTypeInfo. We can't emit constant stores to
1883 // them, so emit a memcpy with the VLA size to initialize each element.
1884 // Technically zero-sized or negative-sized VLAs are undefined, and UBSan
1885 // will catch that code, but there exists code which generates zero-sized
1886 // VLAs. Be nice and initialize whatever they requested.
1887 const auto *VlaType = getContext().getAsVariableArrayType(type);
1888 if (!VlaType)
1889 return;
1890 auto VlaSize = getVLASize(VlaType);
1891 auto SizeVal = VlaSize.NumElts;
1892 CharUnits EltSize = getContext().getTypeSizeInChars(VlaSize.Type);
1893 switch (trivialAutoVarInit) {
1895 llvm_unreachable("Uninitialized handled by caller");
1896
1898 if (CGM.stopAutoInit())
1899 return;
1900 if (!EltSize.isOne())
1901 SizeVal = Builder.CreateNUWMul(SizeVal, CGM.getSize(EltSize));
1902 auto *I = Builder.CreateMemSet(Loc, llvm::ConstantInt::get(Int8Ty, 0),
1903 SizeVal, isVolatile);
1904 I->addAnnotationMetadata("auto-init");
1905 break;
1906 }
1907
1909 if (CGM.stopAutoInit())
1910 return;
1911 llvm::Type *ElTy = Loc.getElementType();
1912 llvm::Constant *Constant = constWithPadding(
1914 CharUnits ConstantAlign = getContext().getTypeAlignInChars(VlaSize.Type);
1915 llvm::BasicBlock *SetupBB = createBasicBlock("vla-setup.loop");
1916 llvm::BasicBlock *LoopBB = createBasicBlock("vla-init.loop");
1917 llvm::BasicBlock *ContBB = createBasicBlock("vla-init.cont");
1918 llvm::Value *IsZeroSizedVLA = Builder.CreateICmpEQ(
1919 SizeVal, llvm::ConstantInt::get(SizeVal->getType(), 0),
1920 "vla.iszerosized");
1921 Builder.CreateCondBr(IsZeroSizedVLA, ContBB, SetupBB);
1922 EmitBlock(SetupBB);
1923 if (!EltSize.isOne())
1924 SizeVal = Builder.CreateNUWMul(SizeVal, CGM.getSize(EltSize));
1925 llvm::Value *BaseSizeInChars =
1926 llvm::ConstantInt::get(IntPtrTy, EltSize.getQuantity());
1927 Address Begin = Loc.withElementType(Int8Ty);
1928 llvm::Value *End = Builder.CreateInBoundsGEP(Begin.getElementType(),
1929 Begin.emitRawPointer(*this),
1930 SizeVal, "vla.end");
1931 llvm::BasicBlock *OriginBB = Builder.GetInsertBlock();
1932 EmitBlock(LoopBB);
1933 llvm::PHINode *Cur = Builder.CreatePHI(Begin.getType(), 2, "vla.cur");
1934 Cur->addIncoming(Begin.emitRawPointer(*this), OriginBB);
1935 CharUnits CurAlign = Loc.getAlignment().alignmentOfArrayElement(EltSize);
1936 auto *I =
1937 Builder.CreateMemCpy(Address(Cur, Int8Ty, CurAlign),
1939 CGM, D, Builder, Constant, ConstantAlign),
1940 BaseSizeInChars, isVolatile);
1941 I->addAnnotationMetadata("auto-init");
1942 llvm::Value *Next =
1943 Builder.CreateInBoundsGEP(Int8Ty, Cur, BaseSizeInChars, "vla.next");
1944 llvm::Value *Done = Builder.CreateICmpEQ(Next, End, "vla-init.isdone");
1945 Builder.CreateCondBr(Done, ContBB, LoopBB);
1946 Cur->addIncoming(Next, LoopBB);
1947 EmitBlock(ContBB);
1948 } break;
1949 }
1950}
1951
1953 assert(emission.Variable && "emission was not valid!");
1954
1955 // If this was emitted as a global constant, we're done.
1956 if (emission.wasEmittedAsGlobal()) return;
1957
1958 const VarDecl &D = *emission.Variable;
1961 QualType type = D.getType();
1962
1963 // If this local has an initializer, emit it now.
1964 const Expr *Init = D.getInit();
1965
1966 // If we are at an unreachable point, we don't need to emit the initializer
1967 // unless it contains a label.
1968 if (!HaveInsertPoint()) {
1969 if (!Init || !ContainsLabel(Init)) {
1970 PGO->markStmtMaybeUsed(Init);
1971 return;
1972 }
1974 }
1975
1976 // Initialize the structure of a __block variable.
1977 if (emission.IsEscapingByRef)
1978 emitByrefStructureInit(emission);
1979
1980 // Initialize the variable here if it doesn't have a initializer and it is a
1981 // C struct that is non-trivial to initialize or an array containing such a
1982 // struct.
1983 if (!Init &&
1984 type.isNonTrivialToPrimitiveDefaultInitialize() ==
1986 LValue Dst = MakeAddrLValue(emission.getAllocatedAddress(), type);
1987 if (emission.IsEscapingByRef)
1988 drillIntoBlockVariable(*this, Dst, &D);
1990 return;
1991 }
1992
1993 // Check whether this is a byref variable that's potentially
1994 // captured and moved by its own initializer. If so, we'll need to
1995 // emit the initializer first, then copy into the variable.
1996 bool capturedByInit =
1997 Init && emission.IsEscapingByRef && isCapturedBy(D, Init);
1998
1999 bool locIsByrefHeader = !capturedByInit;
2000 const Address Loc =
2001 locIsByrefHeader ? emission.getObjectAddress(*this) : emission.Addr;
2002
2003 auto hasNoTrivialAutoVarInitAttr = [&](const Decl *D) {
2004 return D && D->hasAttr<NoTrivialAutoVarInitAttr>();
2005 };
2006 // Note: constexpr already initializes everything correctly.
2007 LangOptions::TrivialAutoVarInitKind trivialAutoVarInit =
2008 ((D.isConstexpr() || D.getAttr<UninitializedAttr>() ||
2009 hasNoTrivialAutoVarInitAttr(type->getAsTagDecl()) ||
2010 hasNoTrivialAutoVarInitAttr(CurFuncDecl))
2012 : getContext().getLangOpts().getTrivialAutoVarInit());
2013
2014 auto initializeWhatIsTechnicallyUninitialized = [&](Address Loc) {
2015 if (trivialAutoVarInit ==
2017 return;
2018
2019 // Only initialize a __block's storage: we always initialize the header.
2020 if (emission.IsEscapingByRef && !locIsByrefHeader)
2021 Loc = emitBlockByrefAddress(Loc, &D, /*follow=*/false);
2022
2023 return emitZeroOrPatternForAutoVarInit(type, D, Loc);
2024 };
2025
2027 return initializeWhatIsTechnicallyUninitialized(Loc);
2028
2029 llvm::Constant *constant = nullptr;
2030 if (emission.IsConstantAggregate ||
2032 assert(!capturedByInit && "constant init contains a capturing block?");
2034 if (constant && !constant->isNullValue() &&
2035 (trivialAutoVarInit !=
2037 IsPattern isPattern =
2038 (trivialAutoVarInit == LangOptions::TrivialAutoVarInitKind::Pattern)
2040 : IsPattern::No;
2041 // C guarantees that brace-init with fewer initializers than members in
2042 // the aggregate will initialize the rest of the aggregate as-if it were
2043 // static initialization. In turn static initialization guarantees that
2044 // padding is initialized to zero bits. We could instead pattern-init if D
2045 // has any ImplicitValueInitExpr, but that seems to be unintuitive
2046 // behavior.
2048 replaceUndef(CGM, isPattern, constant));
2049 }
2050
2051 if (constant && type->isBitIntType() &&
2052 CGM.getTypes().typeRequiresSplitIntoByteArray(type)) {
2053 // Constants for long _BitInt types are split into individual bytes.
2054 // Try to fold these back into an integer constant so it can be stored
2055 // properly.
2056 llvm::Type *LoadType =
2057 CGM.getTypes().convertTypeForLoadStore(type, constant->getType());
2058 constant = llvm::ConstantFoldLoadFromConst(
2059 constant, LoadType, llvm::APInt::getZero(32), CGM.getDataLayout());
2060 }
2061 }
2062
2063 if (!constant) {
2064 if (trivialAutoVarInit !=
2066 // At this point, we know D has an Init expression, but isn't a constant.
2067 // - If D is not a scalar, auto-var-init conservatively (members may be
2068 // left uninitialized by constructor Init expressions for example).
2069 // - If D is a scalar, we only need to auto-var-init if there is a
2070 // self-reference. Otherwise, the Init expression should be sufficient.
2071 // It may be that the Init expression uses other uninitialized memory,
2072 // but auto-var-init here would not help, as auto-init would get
2073 // overwritten by Init.
2074 if (!type->isScalarType() || capturedByInit || isAccessedBy(D, Init)) {
2075 initializeWhatIsTechnicallyUninitialized(Loc);
2076 }
2077 }
2078 LValue lv = MakeAddrLValue(Loc, type);
2079 lv.setNonGC(true);
2080 return EmitExprAsInit(Init, &D, lv, capturedByInit);
2081 }
2082
2083 PGO->markStmtMaybeUsed(Init);
2084
2085 if (!emission.IsConstantAggregate) {
2086 // For simple scalar/complex initialization, store the value directly.
2087 LValue lv = MakeAddrLValue(Loc, type);
2088 lv.setNonGC(true);
2089 return EmitStoreThroughLValue(RValue::get(constant), lv, true);
2090 }
2091
2092 emitStoresForConstant(D, Loc.withElementType(CGM.Int8Ty),
2093 type.isVolatileQualified(), constant,
2094 /*IsAutoInit=*/false);
2095}
2096
2098 if (auto *DD = dyn_cast_if_present<DecompositionDecl>(VD)) {
2099 for (auto *B : DD->flat_bindings())
2100 if (auto *HD = B->getHoldingVar())
2101 EmitVarDecl(*HD);
2102 }
2103}
2104
2105/// Emit an expression as an initializer for an object (variable, field, etc.)
2106/// at the given location. The expression is not necessarily the normal
2107/// initializer for the object, and the address is not necessarily
2108/// its normal location.
2109///
2110/// \param init the initializing expression
2111/// \param D the object to act as if we're initializing
2112/// \param lvalue the lvalue to initialize
2113/// \param capturedByInit true if \p D is a __block variable
2114/// whose address is potentially changed by the initializer
2116 LValue lvalue, bool capturedByInit) {
2117 QualType type = D->getType();
2118
2119 if (type->isReferenceType()) {
2120 RValue rvalue = EmitReferenceBindingToExpr(init);
2121 if (capturedByInit)
2122 drillIntoBlockVariable(*this, lvalue, cast<VarDecl>(D));
2123 EmitStoreThroughLValue(rvalue, lvalue, true);
2124 return;
2125 }
2126 switch (getEvaluationKind(type)) {
2127 case TEK_Scalar:
2128 EmitScalarInit(init, D, lvalue, capturedByInit);
2129 return;
2130 case TEK_Complex: {
2131 ComplexPairTy complex = EmitComplexExpr(init);
2132 if (capturedByInit)
2133 drillIntoBlockVariable(*this, lvalue, cast<VarDecl>(D));
2134 EmitStoreOfComplex(complex, lvalue, /*init*/ true);
2135 return;
2136 }
2137 case TEK_Aggregate:
2138 if (type->isAtomicType()) {
2139 EmitAtomicInit(const_cast<Expr*>(init), lvalue);
2140 } else {
2142 if (isa<VarDecl>(D))
2144 else if (auto *FD = dyn_cast<FieldDecl>(D))
2145 Overlap = getOverlapForFieldInit(FD);
2146 // TODO: how can we delay here if D is captured by its initializer?
2147 EmitAggExpr(init,
2150 AggValueSlot::IsNotAliased, Overlap));
2151 }
2152 return;
2153 }
2154 llvm_unreachable("bad evaluation kind");
2155}
2156
2157/// Enter a destroy cleanup for the given local variable.
2159 const CodeGenFunction::AutoVarEmission &emission,
2160 QualType::DestructionKind dtorKind) {
2161 assert(dtorKind != QualType::DK_none);
2162
2163 // Note that for __block variables, we want to destroy the
2164 // original stack object, not the possibly forwarded object.
2165 Address addr = emission.getObjectAddress(*this);
2166
2167 const VarDecl *var = emission.Variable;
2168 QualType type = var->getType();
2169
2170 CleanupKind cleanupKind = NormalAndEHCleanup;
2171 CodeGenFunction::Destroyer *destroyer = nullptr;
2172
2173 switch (dtorKind) {
2174 case QualType::DK_none:
2175 llvm_unreachable("no cleanup for trivially-destructible variable");
2176
2178 // If there's an NRVO flag on the emission, we need a different
2179 // cleanup.
2180 if (emission.NRVOFlag) {
2181 assert(!type->isArrayType());
2182 CXXDestructorDecl *dtor = type->getAsCXXRecordDecl()->getDestructor();
2183 EHStack.pushCleanup<DestroyNRVOVariableCXX>(cleanupKind, addr, type, dtor,
2184 emission.NRVOFlag);
2185 return;
2186 }
2187 break;
2188
2190 // Suppress cleanups for pseudo-strong variables.
2191 if (var->isARCPseudoStrong()) return;
2192
2193 // Otherwise, consider whether to use an EH cleanup or not.
2194 cleanupKind = getARCCleanupKind();
2195
2196 // Use the imprecise destroyer by default.
2197 if (!var->hasAttr<ObjCPreciseLifetimeAttr>())
2199 break;
2200
2202 break;
2203
2206 if (emission.NRVOFlag) {
2207 assert(!type->isArrayType());
2208 EHStack.pushCleanup<DestroyNRVOVariableC>(cleanupKind, addr,
2209 emission.NRVOFlag, type);
2210 return;
2211 }
2212 break;
2213 }
2214
2215 // If we haven't chosen a more specific destroyer, use the default.
2216 if (!destroyer) destroyer = getDestroyer(dtorKind);
2217
2218 // Use an EH cleanup in array destructors iff the destructor itself
2219 // is being pushed as an EH cleanup.
2220 bool useEHCleanup = (cleanupKind & EHCleanup);
2221 EHStack.pushCleanup<DestroyObject>(cleanupKind, addr, type, destroyer,
2222 useEHCleanup);
2223}
2224
2226 assert(emission.Variable && "emission was not valid!");
2227
2228 // If this was emitted as a global constant, we're done.
2229 if (emission.wasEmittedAsGlobal()) return;
2230
2231 // If we don't have an insertion point, we're done. Sema prevents
2232 // us from jumping into any of these scopes anyway.
2233 if (!HaveInsertPoint()) return;
2234
2235 const VarDecl &D = *emission.Variable;
2236
2237 // Check the type for a cleanup.
2239 // Check if we're in a SEH block with /EH, prevent it
2240 if (getLangOpts().CXXExceptions && currentFunctionUsesSEHTry())
2242 diag::err_seh_object_unwinding);
2243 emitAutoVarTypeCleanup(emission, dtorKind);
2244 }
2245
2246 // In GC mode, honor objc_precise_lifetime.
2247 if (getLangOpts().getGC() != LangOptions::NonGC &&
2248 D.hasAttr<ObjCPreciseLifetimeAttr>()) {
2249 EHStack.pushCleanup<ExtendGCLifetime>(NormalCleanup, &D);
2250 }
2251
2252 // Handle the cleanup attribute.
2253 if (const CleanupAttr *CA = D.getAttr<CleanupAttr>()) {
2254 const FunctionDecl *FD = CA->getFunctionDecl();
2255
2256 llvm::Constant *F = CGM.GetAddrOfFunction(FD);
2257 assert(F && "Could not find function!");
2258
2259 const CGFunctionInfo &Info = CGM.getTypes().arrangeFunctionDeclaration(FD);
2260 EHStack.pushCleanup<CallCleanupFunction>(NormalAndEHCleanup, F, &Info, &D,
2261 CA);
2262 }
2263
2264 // If this is a block variable, call _Block_object_destroy
2265 // (on the unforwarded address). Don't enter this cleanup if we're in pure-GC
2266 // mode.
2267 if (emission.IsEscapingByRef &&
2268 CGM.getLangOpts().getGC() != LangOptions::GCOnly) {
2270 if (emission.Variable->getType().isObjCGCWeak())
2271 Flags |= BLOCK_FIELD_IS_WEAK;
2272 enterByrefCleanup(NormalAndEHCleanup, emission.Addr, Flags,
2273 /*LoadBlockVarAddr*/ false,
2274 cxxDestructorCanThrow(emission.Variable->getType()));
2275 }
2276}
2277
2280 switch (kind) {
2281 case QualType::DK_none: llvm_unreachable("no destroyer for trivial dtor");
2283 return destroyCXXObject;
2287 return destroyARCWeak;
2290 }
2291 llvm_unreachable("Unknown DestructionKind");
2292}
2293
2294/// pushEHDestroy - Push the standard destructor for the given type as
2295/// an EH-only cleanup.
2297 Address addr, QualType type) {
2298 assert(dtorKind && "cannot push destructor for trivial type");
2299 assert(needsEHCleanup(dtorKind));
2300
2301 pushDestroy(EHCleanup, addr, type, getDestroyer(dtorKind), true);
2302}
2303
2304/// pushDestroy - Push the standard destructor for the given type as
2305/// at least a normal cleanup.
2307 Address addr, QualType type) {
2308 assert(dtorKind && "cannot push destructor for trivial type");
2309
2310 CleanupKind cleanupKind = getCleanupKind(dtorKind);
2311 pushDestroy(cleanupKind, addr, type, getDestroyer(dtorKind),
2312 cleanupKind & EHCleanup);
2313}
2314
2317 CleanupKind cleanupKind = getCleanupKind(dtorKind);
2318 pushLifetimeExtendedDestroy(cleanupKind, addr, type, getDestroyer(dtorKind),
2319 cleanupKind & EHCleanup);
2320}
2321
2323 QualType type, Destroyer *destroyer,
2324 bool useEHCleanupForArray) {
2325 pushFullExprCleanup<DestroyObject>(cleanupKind, addr, type, destroyer,
2326 useEHCleanupForArray);
2327}
2328
2329// Pushes a destroy and defers its deactivation until its
2330// CleanupDeactivationScope is exited.
2333 assert(dtorKind && "cannot push destructor for trivial type");
2334
2335 CleanupKind cleanupKind = getCleanupKind(dtorKind);
2337 cleanupKind, addr, type, getDestroyer(dtorKind), cleanupKind & EHCleanup);
2338}
2339
2341 CleanupKind cleanupKind, Address addr, QualType type, Destroyer *destroyer,
2342 bool useEHCleanupForArray) {
2343 llvm::Instruction *DominatingIP =
2344 Builder.CreateFlagLoad(llvm::Constant::getNullValue(Int8PtrTy));
2345 pushDestroy(cleanupKind, addr, type, destroyer, useEHCleanupForArray);
2347 {EHStack.stable_begin(), DominatingIP});
2348}
2349
2351 EHStack.pushCleanup<CallStackRestore>(Kind, SPMem);
2352}
2353
2355 CleanupKind Kind, std::pair<llvm::Value *, llvm::Value *> AddrSizePair) {
2356 EHStack.pushCleanup<KmpcAllocFree>(Kind, AddrSizePair);
2357}
2358
2360 Address addr, QualType type,
2361 Destroyer *destroyer,
2362 bool useEHCleanupForArray) {
2363 // If we're not in a conditional branch, we don't need to bother generating a
2364 // conditional cleanup.
2365 if (!isInConditionalBranch()) {
2366 // FIXME: When popping normal cleanups, we need to keep this EH cleanup
2367 // around in case a temporary's destructor throws an exception.
2368
2369 // Add the cleanup to the EHStack. After the full-expr, this would be
2370 // deactivated before being popped from the stack.
2371 pushDestroyAndDeferDeactivation(cleanupKind, addr, type, destroyer,
2372 useEHCleanupForArray);
2373
2374 // Since this is lifetime-extended, push it once again to the EHStack after
2375 // the full expression.
2377 cleanupKind, Address::invalid(), addr, type, destroyer,
2378 useEHCleanupForArray);
2379 }
2380
2381 // Otherwise, we should only destroy the object if it's been initialized.
2382
2383 using ConditionalCleanupType =
2385 Destroyer *, bool>;
2387
2388 // Remember to emit cleanup if we branch-out before end of full-expression
2389 // (eg: through stmt-expr or coro suspensions).
2390 AllocaTrackerRAII DeactivationAllocas(*this);
2391 Address ActiveFlagForDeactivation = createCleanupActiveFlag();
2392
2394 cleanupKind, SavedAddr, type, destroyer, useEHCleanupForArray);
2395 initFullExprCleanupWithFlag(ActiveFlagForDeactivation);
2397 // Erase the active flag if the cleanup was not emitted.
2398 cleanup.AddAuxAllocas(std::move(DeactivationAllocas).Take());
2399
2400 // Since this is lifetime-extended, push it once again to the EHStack after
2401 // the full expression.
2402 // The previous active flag would always be 'false' due to forced deferred
2403 // deactivation. Use a separate flag for lifetime-extension to correctly
2404 // remember if this branch was taken and the object was initialized.
2405 Address ActiveFlagForLifetimeExt = createCleanupActiveFlag();
2407 cleanupKind, ActiveFlagForLifetimeExt, SavedAddr, type, destroyer,
2408 useEHCleanupForArray);
2409}
2410
2411/// emitDestroy - Immediately perform the destruction of the given
2412/// object.
2413///
2414/// \param addr - the address of the object; a type*
2415/// \param type - the type of the object; if an array type, all
2416/// objects are destroyed in reverse order
2417/// \param destroyer - the function to call to destroy individual
2418/// elements
2419/// \param useEHCleanupForArray - whether an EH cleanup should be
2420/// used when destroying array elements, in case one of the
2421/// destructions throws an exception
2423 Destroyer *destroyer,
2424 bool useEHCleanupForArray) {
2426 if (!arrayType)
2427 return destroyer(*this, addr, type);
2428
2429 llvm::Value *length = emitArrayLength(arrayType, type, addr);
2430
2431 CharUnits elementAlign =
2432 addr.getAlignment()
2433 .alignmentOfArrayElement(getContext().getTypeSizeInChars(type));
2434
2435 // Normally we have to check whether the array is zero-length.
2436 bool checkZeroLength = true;
2437
2438 // But if the array length is constant, we can suppress that.
2439 if (llvm::ConstantInt *constLength = dyn_cast<llvm::ConstantInt>(length)) {
2440 // ...and if it's constant zero, we can just skip the entire thing.
2441 if (constLength->isZero()) return;
2442 checkZeroLength = false;
2443 }
2444
2445 llvm::Value *begin = addr.emitRawPointer(*this);
2446 llvm::Value *end =
2447 Builder.CreateInBoundsGEP(addr.getElementType(), begin, length);
2448 emitArrayDestroy(begin, end, type, elementAlign, destroyer,
2449 checkZeroLength, useEHCleanupForArray);
2450}
2451
2452/// emitArrayDestroy - Destroys all the elements of the given array,
2453/// beginning from last to first. The array cannot be zero-length.
2454///
2455/// \param begin - a type* denoting the first element of the array
2456/// \param end - a type* denoting one past the end of the array
2457/// \param elementType - the element type of the array
2458/// \param destroyer - the function to call to destroy elements
2459/// \param useEHCleanup - whether to push an EH cleanup to destroy
2460/// the remaining elements in case the destruction of a single
2461/// element throws
2463 llvm::Value *end,
2464 QualType elementType,
2465 CharUnits elementAlign,
2466 Destroyer *destroyer,
2467 bool checkZeroLength,
2468 bool useEHCleanup) {
2469 assert(!elementType->isArrayType());
2470
2471 // The basic structure here is a do-while loop, because we don't
2472 // need to check for the zero-element case.
2473 llvm::BasicBlock *bodyBB = createBasicBlock("arraydestroy.body");
2474 llvm::BasicBlock *doneBB = createBasicBlock("arraydestroy.done");
2475
2476 if (checkZeroLength) {
2477 llvm::Value *isEmpty = Builder.CreateICmpEQ(begin, end,
2478 "arraydestroy.isempty");
2479 Builder.CreateCondBr(isEmpty, doneBB, bodyBB);
2480 }
2481
2482 // Enter the loop body, making that address the current address.
2483 llvm::BasicBlock *entryBB = Builder.GetInsertBlock();
2484 EmitBlock(bodyBB);
2485 llvm::PHINode *elementPast =
2486 Builder.CreatePHI(begin->getType(), 2, "arraydestroy.elementPast");
2487 elementPast->addIncoming(end, entryBB);
2488
2489 // Shift the address back by one element.
2490 llvm::Value *negativeOne = llvm::ConstantInt::get(SizeTy, -1, true);
2491 llvm::Type *llvmElementType = ConvertTypeForMem(elementType);
2492 llvm::Value *element = Builder.CreateInBoundsGEP(
2493 llvmElementType, elementPast, negativeOne, "arraydestroy.element");
2494
2495 if (useEHCleanup)
2496 pushRegularPartialArrayCleanup(begin, element, elementType, elementAlign,
2497 destroyer);
2498
2499 // Perform the actual destruction there.
2500 destroyer(*this, Address(element, llvmElementType, elementAlign),
2501 elementType);
2502
2503 if (useEHCleanup)
2505
2506 // Check whether we've reached the end.
2507 llvm::Value *done = Builder.CreateICmpEQ(element, begin, "arraydestroy.done");
2508 Builder.CreateCondBr(done, doneBB, bodyBB);
2509 elementPast->addIncoming(element, Builder.GetInsertBlock());
2510
2511 // Done.
2512 EmitBlock(doneBB);
2513}
2514
2515/// Perform partial array destruction as if in an EH cleanup. Unlike
2516/// emitArrayDestroy, the element type here may still be an array type.
2518 llvm::Value *begin, llvm::Value *end,
2519 QualType type, CharUnits elementAlign,
2520 CodeGenFunction::Destroyer *destroyer) {
2521 llvm::Type *elemTy = CGF.ConvertTypeForMem(type);
2522
2523 // If the element type is itself an array, drill down.
2524 unsigned arrayDepth = 0;
2525 while (const ArrayType *arrayType = CGF.getContext().getAsArrayType(type)) {
2526 // VLAs don't require a GEP index to walk into.
2528 arrayDepth++;
2529 type = arrayType->getElementType();
2530 }
2531
2532 if (arrayDepth) {
2533 llvm::Value *zero = llvm::ConstantInt::get(CGF.SizeTy, 0);
2534
2535 SmallVector<llvm::Value*,4> gepIndices(arrayDepth+1, zero);
2536 begin = CGF.Builder.CreateInBoundsGEP(
2537 elemTy, begin, gepIndices, "pad.arraybegin");
2538 end = CGF.Builder.CreateInBoundsGEP(
2539 elemTy, end, gepIndices, "pad.arrayend");
2540 }
2541
2542 // Destroy the array. We don't ever need an EH cleanup because we
2543 // assume that we're in an EH cleanup ourselves, so a throwing
2544 // destructor causes an immediate terminate.
2545 CGF.emitArrayDestroy(begin, end, type, elementAlign, destroyer,
2546 /*checkZeroLength*/ true, /*useEHCleanup*/ false);
2547}
2548
2549namespace {
2550 /// RegularPartialArrayDestroy - a cleanup which performs a partial
2551 /// array destroy where the end pointer is regularly determined and
2552 /// does not need to be loaded from a local.
2553 class RegularPartialArrayDestroy final : public EHScopeStack::Cleanup {
2554 llvm::Value *ArrayBegin;
2555 llvm::Value *ArrayEnd;
2556 QualType ElementType;
2557 CodeGenFunction::Destroyer *Destroyer;
2558 CharUnits ElementAlign;
2559 public:
2560 RegularPartialArrayDestroy(llvm::Value *arrayBegin, llvm::Value *arrayEnd,
2561 QualType elementType, CharUnits elementAlign,
2562 CodeGenFunction::Destroyer *destroyer)
2563 : ArrayBegin(arrayBegin), ArrayEnd(arrayEnd),
2564 ElementType(elementType), Destroyer(destroyer),
2565 ElementAlign(elementAlign) {}
2566
2567 void Emit(CodeGenFunction &CGF, Flags flags) override {
2568 emitPartialArrayDestroy(CGF, ArrayBegin, ArrayEnd,
2569 ElementType, ElementAlign, Destroyer);
2570 }
2571 };
2572
2573 /// IrregularPartialArrayDestroy - a cleanup which performs a
2574 /// partial array destroy where the end pointer is irregularly
2575 /// determined and must be loaded from a local.
2576 class IrregularPartialArrayDestroy final : public EHScopeStack::Cleanup {
2577 llvm::Value *ArrayBegin;
2578 Address ArrayEndPointer;
2579 QualType ElementType;
2580 CodeGenFunction::Destroyer *Destroyer;
2581 CharUnits ElementAlign;
2582 public:
2583 IrregularPartialArrayDestroy(llvm::Value *arrayBegin,
2584 Address arrayEndPointer,
2585 QualType elementType,
2586 CharUnits elementAlign,
2587 CodeGenFunction::Destroyer *destroyer)
2588 : ArrayBegin(arrayBegin), ArrayEndPointer(arrayEndPointer),
2589 ElementType(elementType), Destroyer(destroyer),
2590 ElementAlign(elementAlign) {}
2591
2592 void Emit(CodeGenFunction &CGF, Flags flags) override {
2593 llvm::Value *arrayEnd = CGF.Builder.CreateLoad(ArrayEndPointer);
2594 emitPartialArrayDestroy(CGF, ArrayBegin, arrayEnd,
2595 ElementType, ElementAlign, Destroyer);
2596 }
2597 };
2598} // end anonymous namespace
2599
2600/// pushIrregularPartialArrayCleanup - Push a NormalAndEHCleanup to
2601/// destroy already-constructed elements of the given array. The cleanup may be
2602/// popped with DeactivateCleanupBlock or PopCleanupBlock.
2603///
2604/// \param elementType - the immediate element type of the array;
2605/// possibly still an array type
2607 Address arrayEndPointer,
2608 QualType elementType,
2609 CharUnits elementAlign,
2610 Destroyer *destroyer) {
2612 NormalAndEHCleanup, arrayBegin, arrayEndPointer, elementType,
2613 elementAlign, destroyer);
2614}
2615
2616/// pushRegularPartialArrayCleanup - Push an EH cleanup to destroy
2617/// already-constructed elements of the given array. The cleanup
2618/// may be popped with DeactivateCleanupBlock or PopCleanupBlock.
2619///
2620/// \param elementType - the immediate element type of the array;
2621/// possibly still an array type
2623 llvm::Value *arrayEnd,
2624 QualType elementType,
2625 CharUnits elementAlign,
2626 Destroyer *destroyer) {
2628 arrayBegin, arrayEnd,
2629 elementType, elementAlign,
2630 destroyer);
2631}
2632
2633/// Lazily declare the @llvm.lifetime.start intrinsic.
2635 if (LifetimeStartFn)
2636 return LifetimeStartFn;
2637 LifetimeStartFn = llvm::Intrinsic::getOrInsertDeclaration(
2638 &getModule(), llvm::Intrinsic::lifetime_start, AllocaInt8PtrTy);
2639 return LifetimeStartFn;
2640}
2641
2642/// Lazily declare the @llvm.lifetime.end intrinsic.
2644 if (LifetimeEndFn)
2645 return LifetimeEndFn;
2646 LifetimeEndFn = llvm::Intrinsic::getOrInsertDeclaration(
2647 &getModule(), llvm::Intrinsic::lifetime_end, AllocaInt8PtrTy);
2648 return LifetimeEndFn;
2649}
2650
2651/// Lazily declare the @llvm.fake.use intrinsic.
2653 if (FakeUseFn)
2654 return FakeUseFn;
2655 FakeUseFn = llvm::Intrinsic::getOrInsertDeclaration(
2656 &getModule(), llvm::Intrinsic::fake_use);
2657 return FakeUseFn;
2658}
2659
2660namespace {
2661 /// A cleanup to perform a release of an object at the end of a
2662 /// function. This is used to balance out the incoming +1 of a
2663 /// ns_consumed argument when we can't reasonably do that just by
2664 /// not doing the initial retain for a __block argument.
2665 struct ConsumeARCParameter final : EHScopeStack::Cleanup {
2666 ConsumeARCParameter(llvm::Value *param,
2667 ARCPreciseLifetime_t precise)
2668 : Param(param), Precise(precise) {}
2669
2670 llvm::Value *Param;
2671 ARCPreciseLifetime_t Precise;
2672
2673 void Emit(CodeGenFunction &CGF, Flags flags) override {
2674 CGF.EmitARCRelease(Param, Precise);
2675 }
2676 };
2677} // end anonymous namespace
2678
2679/// Emit an alloca (or GlobalValue depending on target)
2680/// for the specified parameter and set up LocalDeclMap.
2682 unsigned ArgNo) {
2683 bool NoDebugInfo = false;
2684 // FIXME: Why isn't ImplicitParamDecl a ParmVarDecl?
2685 assert((isa<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D)) &&
2686 "Invalid argument to EmitParmDecl");
2687
2688 // Set the name of the parameter's initial value to make IR easier to
2689 // read. Don't modify the names of globals.
2691 Arg.getAnyValue()->setName(D.getName());
2692
2693 QualType Ty = D.getType();
2694 assert((getLangOpts().OpenCL || Ty.getAddressSpace() == LangAS::Default) &&
2695 "parameter has non-default address space in non-OpenCL mode");
2696
2697 // Use better IR generation for certain implicit parameters.
2698 if (auto IPD = dyn_cast<ImplicitParamDecl>(&D)) {
2699 // The only implicit argument a block has is its literal.
2700 // This may be passed as an inalloca'ed value on Windows x86.
2701 if (BlockInfo) {
2702 llvm::Value *V = Arg.isIndirect()
2703 ? Builder.CreateLoad(Arg.getIndirectAddress())
2704 : Arg.getDirectValue();
2705 setBlockContextParameter(IPD, ArgNo, V);
2706 return;
2707 }
2708 // Suppressing debug info for ThreadPrivateVar parameters, else it hides
2709 // debug info of TLS variables.
2710 NoDebugInfo =
2711 (IPD->getParameterKind() == ImplicitParamKind::ThreadPrivateVar);
2712 }
2713
2714 Address DeclPtr = Address::invalid();
2715 RawAddress AllocaPtr = Address::invalid();
2716 bool DoStore = false;
2717 bool IsScalar = hasScalarEvaluationKind(Ty);
2718 bool UseIndirectDebugAddress = false;
2719
2720 // If we already have a pointer to the argument, reuse the input pointer.
2721 if (Arg.isIndirect()) {
2722 DeclPtr = Arg.getIndirectAddress();
2723 DeclPtr = DeclPtr.withElementType(ConvertTypeForMem(Ty));
2724 auto *V = DeclPtr.emitRawPointer(*this);
2725 AllocaPtr = RawAddress(V, DeclPtr.getElementType(), DeclPtr.getAlignment());
2726
2727 // For truly ABI indirect arguments -- those that are not `byval` -- store
2728 // the address of the argument on the stack to preserve debug information.
2729 ABIArgInfo ArgInfo = CurFnInfo->arguments()[ArgNo - 1].info;
2730 if (ArgInfo.isIndirect())
2731 UseIndirectDebugAddress = !ArgInfo.getIndirectByVal();
2732 if (UseIndirectDebugAddress) {
2733 auto PtrTy = getContext().getPointerType(Ty);
2734 AllocaPtr = CreateMemTempWithoutCast(
2735 PtrTy, getContext().getTypeAlignInChars(PtrTy),
2736 D.getName() + ".indirect_addr");
2737 EmitStoreOfScalar(V, AllocaPtr, /* Volatile */ false, PtrTy);
2738 }
2739
2740 LangAS DestLangAS = Ty.getAddressSpace();
2741 unsigned DestAS = getContext().getTargetAddressSpace(DestLangAS);
2742 if (DeclPtr.getAddressSpace() != DestAS) {
2743 auto *T = llvm::PointerType::get(getLLVMContext(), DestAS);
2744 DeclPtr = DeclPtr.withPointer(performAddrSpaceCast(V, T),
2745 DeclPtr.isKnownNonNull());
2746 }
2747
2748 // Push a destructor cleanup for this parameter if the ABI requires it.
2749 // Don't push a cleanup in a thunk for a method that will also emit a
2750 // cleanup.
2751 if (Ty->isRecordType() && !CurFuncIsThunk &&
2753 if (QualType::DestructionKind DtorKind =
2755 assert((DtorKind == QualType::DK_cxx_destructor ||
2756 DtorKind == QualType::DK_nontrivial_c_struct) &&
2757 "unexpected destructor type");
2758 pushDestroy(DtorKind, DeclPtr, Ty);
2759 CalleeDestructedParamCleanups[cast<ParmVarDecl>(&D)] =
2760 EHStack.stable_begin();
2761 }
2762 }
2763 } else {
2764 // Check if the parameter address is controlled by OpenMP runtime.
2765 Address OpenMPLocalAddr =
2766 getLangOpts().OpenMP
2767 ? CGM.getOpenMPRuntime().getAddressOfLocalVariable(*this, &D)
2768 : Address::invalid();
2769 if (getLangOpts().OpenMP && OpenMPLocalAddr.isValid()) {
2770 DeclPtr = OpenMPLocalAddr;
2771 AllocaPtr = DeclPtr;
2772 } else {
2773 // Otherwise, create a casted temporary to hold the value.
2774 DeclPtr = CreateMemTemp(Ty, getContext().getDeclAlign(&D),
2775 D.getName() + ".addr", &AllocaPtr);
2776 }
2777 DoStore = true;
2778 }
2779
2780 llvm::Value *ArgVal = (DoStore ? Arg.getDirectValue() : nullptr);
2781
2782 LValue lv = MakeAddrLValue(DeclPtr, Ty);
2783 // If this is a thunk, don't bother with ARC lifetime management.
2784 // The true implementation will take care of that.
2785 if (IsScalar && !CurFuncIsThunk) {
2786 Qualifiers qs = Ty.getQualifiers();
2788 // We honor __attribute__((ns_consumed)) for types with lifetime.
2789 // For __strong, it's handled by just skipping the initial retain;
2790 // otherwise we have to balance out the initial +1 with an extra
2791 // cleanup to do the release at the end of the function.
2792 bool isConsumed = D.hasAttr<NSConsumedAttr>();
2793
2794 // If a parameter is pseudo-strong then we can omit the implicit retain.
2795 if (D.isARCPseudoStrong()) {
2796 assert(lt == Qualifiers::OCL_Strong &&
2797 "pseudo-strong variable isn't strong?");
2798 assert(qs.hasConst() && "pseudo-strong variable should be const!");
2800 }
2801
2802 // Load objects passed indirectly.
2803 if (Arg.isIndirect() && !ArgVal)
2804 ArgVal = Builder.CreateLoad(DeclPtr);
2805
2806 if (lt == Qualifiers::OCL_Strong) {
2807 if (!isConsumed) {
2808 if (CGM.getCodeGenOpts().OptimizationLevel == 0) {
2809 // use objc_storeStrong(&dest, value) for retaining the
2810 // object. But first, store a null into 'dest' because
2811 // objc_storeStrong attempts to release its old value.
2812 llvm::Value *Null = CGM.EmitNullConstant(D.getType());
2813 EmitStoreOfScalar(Null, lv, /* isInitialization */ true);
2814 EmitARCStoreStrongCall(lv.getAddress(), ArgVal, true);
2815 DoStore = false;
2816 }
2817 else
2818 // Don't use objc_retainBlock for block pointers, because we
2819 // don't want to Block_copy something just because we got it
2820 // as a parameter.
2821 ArgVal = EmitARCRetainNonBlock(ArgVal);
2822 }
2823 } else {
2824 // Push the cleanup for a consumed parameter.
2825 if (isConsumed) {
2826 ARCPreciseLifetime_t precise = (D.hasAttr<ObjCPreciseLifetimeAttr>()
2828 EHStack.pushCleanup<ConsumeARCParameter>(getARCCleanupKind(), ArgVal,
2829 precise);
2830 }
2831
2832 if (lt == Qualifiers::OCL_Weak) {
2833 EmitARCInitWeak(DeclPtr, ArgVal);
2834 DoStore = false; // The weak init is a store, no need to do two.
2835 }
2836 }
2837
2838 // Enter the cleanup scope.
2839 EmitAutoVarWithLifetime(*this, D, DeclPtr, lt);
2840 }
2841 }
2842
2843 // Store the initial value into the alloca.
2844 if (DoStore)
2845 EmitStoreOfScalar(ArgVal, lv, /* isInitialization */ true);
2846
2847 setAddrOfLocalVar(&D, DeclPtr);
2848
2849 // Push a FakeUse 'cleanup' object onto the EHStack for the parameter,
2850 // which may be the 'this' pointer. This causes the emission of a fake.use
2851 // call with the parameter as argument at the end of the function.
2852 if (CGM.getCodeGenOpts().getExtendVariableLiveness() ==
2854 (CGM.getCodeGenOpts().getExtendVariableLiveness() ==
2856 &D == CXXABIThisDecl)) {
2857 // We don't emit fake uses for coroutine parameters, other than `this`.
2858 if (auto *FnDecl = dyn_cast_or_null<FunctionDecl>(CurCodeDecl);
2859 &D == CXXABIThisDecl || !FnDecl ||
2860 FnDecl->getBody()->getStmtClass() != Stmt::CoroutineBodyStmtClass) {
2861 if (shouldExtendLifetime(getContext(), CurCodeDecl, D, CXXABIThisDecl))
2862 EHStack.pushCleanup<FakeUse>(NormalFakeUse, DeclPtr);
2863 }
2864 }
2865
2866 // Emit debug info for param declarations in non-thunk functions.
2867 if (CGDebugInfo *DI = getDebugInfo()) {
2868 if (CGM.getCodeGenOpts().hasReducedDebugInfo() && !CurFuncIsThunk &&
2869 !NoDebugInfo) {
2870 llvm::DILocalVariable *DILocalVar = DI->EmitDeclareOfArgVariable(
2871 &D, AllocaPtr.getPointer(), ArgNo, Builder, UseIndirectDebugAddress);
2872 if (const auto *Var = dyn_cast_or_null<ParmVarDecl>(&D))
2873 DI->getParamDbgMappings().insert({Var, DILocalVar});
2874 }
2875 }
2876
2877 if (D.hasAttr<AnnotateAttr>())
2878 EmitVarAnnotations(&D, DeclPtr.emitRawPointer(*this));
2879
2880 // We can only check return value nullability if all arguments to the
2881 // function satisfy their nullability preconditions. This makes it necessary
2882 // to emit null checks for args in the function body itself.
2883 if (requiresReturnValueNullabilityCheck()) {
2884 auto Nullability = Ty->getNullability();
2885 if (Nullability && *Nullability == NullabilityKind::NonNull) {
2886 SanitizerScope SanScope(this);
2887 RetValNullabilityPrecondition =
2888 Builder.CreateAnd(RetValNullabilityPrecondition,
2889 Builder.CreateIsNotNull(Arg.getAnyValue()));
2890 }
2891 }
2892}
2893
2895 CodeGenFunction *CGF) {
2896 if (!LangOpts.OpenMP || (!LangOpts.EmitAllDecls && !D->isUsed()))
2897 return;
2899}
2900
2902 CodeGenFunction *CGF) {
2903 if (!LangOpts.OpenMP || LangOpts.OpenMPSimd ||
2904 (!LangOpts.EmitAllDecls && !D->isUsed()))
2905 return;
2907}
2908
2910 CodeGenFunction *CGF) {
2911 // This is a no-op, we cna just ignore these declarations.
2912}
2913
2915 CodeGenFunction *CGF) {
2916 // This is a no-op, we cna just ignore these declarations.
2917}
2918
2922
2924 for (const Expr *E : D->varlist()) {
2925 const auto *DE = cast<DeclRefExpr>(E);
2926 const auto *VD = cast<VarDecl>(DE->getDecl());
2927
2928 // Skip all but globals.
2929 if (!VD->hasGlobalStorage())
2930 continue;
2931
2932 // Check if the global has been materialized yet or not. If not, we are done
2933 // as any later generation will utilize the OMPAllocateDeclAttr. However, if
2934 // we already emitted the global we might have done so before the
2935 // OMPAllocateDeclAttr was attached, leading to the wrong address space
2936 // (potentially). While not pretty, common practise is to remove the old IR
2937 // global and generate a new one, so we do that here too. Uses are replaced
2938 // properly.
2939 StringRef MangledName = getMangledName(VD);
2940 llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
2941 if (!Entry)
2942 continue;
2943
2944 // We can also keep the existing global if the address space is what we
2945 // expect it to be, if not, it is replaced.
2947 auto TargetAS = getContext().getTargetAddressSpace(GVAS);
2948 if (Entry->getType()->getAddressSpace() == TargetAS)
2949 continue;
2950
2951 llvm::PointerType *PTy = llvm::PointerType::get(getLLVMContext(), TargetAS);
2952
2953 // Replace all uses of the old global with a cast. Since we mutate the type
2954 // in place we neeed an intermediate that takes the spot of the old entry
2955 // until we can create the cast.
2956 llvm::GlobalVariable *DummyGV = new llvm::GlobalVariable(
2957 getModule(), Entry->getValueType(), false,
2958 llvm::GlobalValue::CommonLinkage, nullptr, "dummy", nullptr,
2959 llvm::GlobalVariable::NotThreadLocal, Entry->getAddressSpace());
2960 Entry->replaceAllUsesWith(DummyGV);
2961
2962 Entry->mutateType(PTy);
2963 llvm::Constant *NewPtrForOldDecl =
2964 llvm::ConstantExpr::getAddrSpaceCast(Entry, DummyGV->getType());
2965
2966 // Now we have a casted version of the changed global, the dummy can be
2967 // replaced and deleted.
2968 DummyGV->replaceAllUsesWith(NewPtrForOldDecl);
2969 DummyGV->eraseFromParent();
2970 }
2971}
2972
2973std::optional<CharUnits>
2975 if (const auto *AA = VD->getAttr<OMPAllocateDeclAttr>()) {
2976 if (Expr *Alignment = AA->getAlignment()) {
2977 unsigned UserAlign =
2978 Alignment->EvaluateKnownConstInt(getContext()).getExtValue();
2979 CharUnits NaturalAlign =
2981
2982 // OpenMP5.1 pg 185 lines 7-10
2983 // Each item in the align modifier list must be aligned to the maximum
2984 // of the specified alignment and the type's natural alignment.
2986 std::max<unsigned>(UserAlign, NaturalAlign.getQuantity()));
2987 }
2988 }
2989 return std::nullopt;
2990}
Defines the clang::ASTContext interface.
#define V(N, I)
static bool isCapturedBy(const VarDecl &, const Expr *)
Determines whether the given __block variable is potentially captured by the given expression.
Definition CGDecl.cpp:1781
static void emitPartialArrayDestroy(CodeGenFunction &CGF, llvm::Value *begin, llvm::Value *end, QualType type, CharUnits elementAlign, CodeGenFunction::Destroyer *destroyer)
Perform partial array destruction as if in an EH cleanup.
Definition CGDecl.cpp:2517
static bool canEmitInitWithFewStoresAfterBZero(llvm::Constant *Init, unsigned &NumStores)
Decide whether we can emit the non-zero parts of the specified initializer with equal or fewer than N...
Definition CGDecl.cpp:919
static llvm::Constant * patternOrZeroFor(CodeGenModule &CGM, IsPattern isPattern, llvm::Type *Ty)
Generate a constant filled with either a pattern or zeroes.
Definition CGDecl.cpp:1051
static llvm::Constant * constWithPadding(CodeGenModule &CGM, IsPattern isPattern, llvm::Constant *constant)
Replace all padding bytes in a given constant with either a pattern byte or 0x00.
Definition CGDecl.cpp:1103
static llvm::Value * shouldUseMemSetToInitialize(llvm::Constant *Init, uint64_t GlobalSize, const llvm::DataLayout &DL)
Decide whether we should use memset to initialize a local variable instead of using a memcpy from a c...
Definition CGDecl.cpp:1025
IsPattern
Definition CGDecl.cpp:1048
static bool shouldSplitConstantStore(CodeGenModule &CGM, uint64_t GlobalByteSize)
Decide whether we want to split a constant structure or array store into a sequence of its fields' st...
Definition CGDecl.cpp:1037
static llvm::Constant * replaceUndef(CodeGenModule &CGM, IsPattern isPattern, llvm::Constant *constant)
Definition CGDecl.cpp:1331
static bool shouldExtendLifetime(const ASTContext &Context, const Decl *FuncDecl, const VarDecl &D, ImplicitParamDecl *CXXABIThisDecl)
Definition CGDecl.cpp:1462
static bool tryEmitARCCopyWeakInit(CodeGenFunction &CGF, const LValue &destLV, const Expr *init)
Definition CGDecl.cpp:718
static bool shouldUseBZeroPlusStoresToInitialize(llvm::Constant *Init, uint64_t GlobalSize)
Decide whether we should use bzero plus some stores to initialize a local variable instead of using a...
Definition CGDecl.cpp:1004
static llvm::Constant * constStructWithPadding(CodeGenModule &CGM, IsPattern isPattern, llvm::StructType *STy, llvm::Constant *constant)
Helper function for constWithPadding() to deal with padding in structures.
Definition CGDecl.cpp:1063
static bool containsUndef(llvm::Constant *constant)
Definition CGDecl.cpp:1320
static uint64_t maxFakeUseAggregateSize(const ASTContext &C)
Return the maximum size of an aggregate for which we generate a fake use intrinsic when -fextend-vari...
Definition CGDecl.cpp:1456
static bool isAccessedBy(const VarDecl &var, const Stmt *s)
Definition CGDecl.cpp:686
static void EmitAutoVarWithLifetime(CodeGenFunction &CGF, const VarDecl &var, Address addr, Qualifiers::ObjCLifetime lifetime)
EmitAutoVarWithLifetime - Does the setup required for an automatic variable with lifetime.
Definition CGDecl.cpp:650
static Address createUnnamedGlobalForMemcpyFrom(CodeGenModule &CGM, const VarDecl &D, CGBuilderTy &Builder, llvm::Constant *Constant, CharUnits Align)
Definition CGDecl.cpp:1189
static void drillIntoBlockVariable(CodeGenFunction &CGF, LValue &lvalue, const VarDecl *var)
Definition CGDecl.cpp:767
static std::string getStaticDeclName(CIRGenModule &cgm, const VarDecl &d)
This file defines OpenACC nodes for declarative directives.
This file defines OpenMP nodes for declarative directives.
FormatToken * Next
The next token in the unwrapped line.
tooling::Replacements cleanup(const FormatStyle &Style, StringRef Code, ArrayRef< tooling::Range > Ranges, StringRef FileName="<stdin>")
Clean up any erroneous/redundant code in the given Ranges in Code.
*collection of selector each with an associated kind and an ordered *collection of selectors A selector has a kind
static const NamedDecl * getDefinition(const Decl *D)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:223
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
IdentifierTable & Idents
Definition ASTContext.h:808
const LangOptions & getLangOpts() const
Definition ASTContext.h:965
QualType getIntTypeForBitwidth(unsigned DestWidth, unsigned Signed) const
getIntTypeForBitwidth - sets integer QualTy according to specified details: bitwidth,...
CharUnits getDeclAlign(const Decl *D, bool ForAlignof=false) const
Return a conservative estimate of the alignment of the specified decl D.
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
const VariableArrayType * getAsVariableArrayType(QualType T) const
DiagnosticsEngine & getDiagnostics() const
unsigned getTargetAddressSpace(LangAS AS) const
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition TypeBase.h:3821
Attr - This represents one attribute.
Definition Attr.h:46
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4716
ArrayRef< Capture > captures() const
Definition Decl.h:4843
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Definition Expr.h:6684
Represents a call to a C++ constructor.
Definition ExprCXX.h:1552
Represents a C++ constructor within a class.
Definition DeclCXX.h:2633
A use of a default initializer in a constructor or in aggregate initialization.
Definition ExprCXX.h:1381
Represents a C++ destructor within a class.
Definition DeclCXX.h:2898
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
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
Definition CharUnits.h:185
static CharUnits One()
One - Construct a CharUnits quantity of one.
Definition CharUnits.h:58
CharUnits alignmentOfArrayElement(CharUnits elementSize) const
Given that this is the alignment of the first element of an array, return the minimum alignment of an...
Definition CharUnits.h:214
bool isOne() const
isOne - Test whether the quantity equals one.
Definition CharUnits.h:125
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
Definition CharUnits.h:63
ABIArgInfo - Helper class to encapsulate information about how a specific C type should be passed to ...
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
Definition Address.h:128
llvm::Value * getBasePointer() const
Definition Address.h:198
static Address invalid()
Definition Address.h:176
llvm::Value * emitRawPointer(CodeGenFunction &CGF) const
Return the pointer contained in this class after authenticating it and adding offset to it if necessa...
Definition Address.h:253
CharUnits getAlignment() const
Definition Address.h:194
llvm::Type * getElementType() const
Return the type of the values stored in this address.
Definition Address.h:209
Address withPointer(llvm::Value *NewPointer, KnownNonNull_t IsKnownNonNull) const
Return address with different pointer, but same element type and alignment.
Definition Address.h:261
Address withElementType(llvm::Type *ElemTy) const
Return address with different element type, but same pointer and alignment.
Definition Address.h:276
unsigned getAddressSpace() const
Return the address space that this address resides in.
Definition Address.h:215
KnownNonNull_t isKnownNonNull() const
Whether the pointer is known not to be null.
Definition Address.h:233
bool isValid() const
Definition Address.h:177
llvm::PointerType * getType() const
Return the type of the pointer value.
Definition Address.h:204
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:649
A scoped helper to set the current source atom group for CGDebugInfo::addInstToCurrentSourceAtom.
static ApplyDebugLocation CreateDefaultArtificial(CodeGenFunction &CGF, SourceLocation TemporaryLocation)
Apply TemporaryLocation if it is valid.
static ApplyDebugLocation CreateEmpty(CodeGenFunction &CGF)
Set the IRBuilder to not attach debug locations.
llvm::LoadInst * CreateLoad(Address Addr, const llvm::Twine &Name="")
Definition CGBuilder.h:118
llvm::LoadInst * CreateFlagLoad(llvm::Value *Addr, const llvm::Twine &Name="")
Emit a load from an i1 flag variable.
Definition CGBuilder.h:168
Address CreateInBoundsGEP(Address Addr, ArrayRef< llvm::Value * > IdxList, llvm::Type *ElementType, CharUnits Align, const Twine &Name="")
Definition CGBuilder.h:356
static CGCallee forDirect(llvm::Constant *functionPtr, const CGCalleeInfo &abstractInfo=CGCalleeInfo())
Definition CGCall.h:139
This class gathers all debug information during compilation and is responsible for emitting to llvm g...
Definition CGDebugInfo.h:59
void EmitGlobalVariable(llvm::GlobalVariable *GV, const VarDecl *Decl)
Emit information about a global variable.
llvm::DILocalVariable * EmitDeclareOfAutoVariable(const VarDecl *Decl, llvm::Value *AI, CGBuilderTy &Builder, const bool UsePointerValue=false)
Emit call to llvm.dbg.declare for an automatic variable declaration.
void setLocation(SourceLocation Loc)
Update the current source location.
void registerVLASizeExpression(QualType Ty, llvm::Metadata *SizeExpr)
Register VLA size expression debug node with the qualified type.
CGFunctionInfo - Class to encapsulate the information about a function definition.
const_arg_iterator arg_begin() const
Allows to disable automatic handling of functions used in target regions as those marked as omp decla...
virtual void getKmpcFreeShared(CodeGenFunction &CGF, const std::pair< llvm::Value *, llvm::Value * > &AddrSizePair)
Get call to __kmpc_free_shared.
void emitUserDefinedMapper(const OMPDeclareMapperDecl *D, CodeGenFunction *CGF=nullptr)
Emit the function for the user defined mapper construct.
virtual void processRequiresDirective(const OMPRequiresDecl *D)
Perform check on requires decl to ensure that target architecture supports unified addressing.
virtual void emitUserDefinedReduction(CodeGenFunction *CGF, const OMPDeclareReductionDecl *D)
Emit code for the specified user defined reduction construct.
void add(RValue rvalue, QualType type)
Definition CGCall.h:304
Address getAllocatedAddress() const
Returns the raw, allocated address, which is not necessarily the address of the object itself.
RawAddress getOriginalAllocatedAddress() const
Returns the address for the original alloca instruction.
Address getObjectAddress(CodeGenFunction &CGF) const
Returns the address of the object within this declaration.
Enters a new scope for capturing cleanups, all of which will be executed once the scope is exited.
RAII object to set/unset CodeGenFunction::IsSanitizerScope.
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
void emitArrayDestroy(llvm::Value *begin, llvm::Value *end, QualType elementType, CharUnits elementAlign, Destroyer *destroyer, bool checkZeroLength, bool useEHCleanup)
emitArrayDestroy - Destroys all the elements of the given array, beginning from last to first.
Definition CGDecl.cpp:2462
void EmitCXXGuardedInit(const VarDecl &D, llvm::GlobalVariable *DeclPtr, bool PerformInit)
Emit code in this function to perform a guarded variable initialization.
void EmitARCMoveWeak(Address dst, Address src)
void @objc_moveWeak(i8** dest, i8** src) Disregards the current value in dest.
Definition CGObjC.cpp:2724
void emitDestroy(Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray)
emitDestroy - Immediately perform the destruction of the given object.
Definition CGDecl.cpp:2422
AggValueSlot::Overlap_t getOverlapForFieldInit(const FieldDecl *FD)
Determine whether a field initialization may overlap some other object.
void emitByrefStructureInit(const AutoVarEmission &emission)
Initialize the structural components of a __block variable, i.e.
llvm::Value * performAddrSpaceCast(llvm::Value *Src, llvm::Type *DestTy)
llvm::Value * EmitARCUnsafeUnretainedScalarExpr(const Expr *expr)
EmitARCUnsafeUnretainedScalarExpr - Semantically equivalent to immediately releasing the resut of Emi...
Definition CGObjC.cpp:3650
SanitizerSet SanOpts
Sanitizers enabled for this function.
void pushStackRestore(CleanupKind kind, Address SPMem)
Definition CGDecl.cpp:2350
llvm::DenseMap< const VarDecl *, llvm::Value * > NRVOFlags
A mapping from NRVO variables to the flags used to indicate when the NRVO has been applied to this va...
void EmitARCInitWeak(Address addr, llvm::Value *value)
i8* @objc_initWeak(i8** addr, i8* value) Returns value.
Definition CGObjC.cpp:2695
static bool ContainsLabel(const Stmt *S, bool IgnoreCaseStmts=false)
ContainsLabel - Return true if the statement contains a label in it.
static bool hasScalarEvaluationKind(QualType T)
llvm::Type * ConvertType(QualType T)
void EmitFakeUse(Address Addr)
Definition CGDecl.cpp:1387
void pushEHDestroy(QualType::DestructionKind dtorKind, Address addr, QualType type)
pushEHDestroy - Push the standard destructor for the given type as an EH-only cleanup.
Definition CGDecl.cpp:2296
llvm::Value * EmitPointerAuthQualify(PointerAuthQualifier Qualifier, llvm::Value *Pointer, QualType ValueType, Address StorageAddress, bool IsKnownNonNull)
CleanupKind getARCCleanupKind()
Retrieves the default cleanup kind for an ARC cleanup.
llvm::Value * EmitARCRetainAutoreleaseScalarExpr(const Expr *expr)
Definition CGObjC.cpp:3540
bool CurFuncIsThunk
In C++, whether we are code generating a thunk.
void EmitAtomicInit(Expr *E, LValue lvalue)
void pushRegularPartialArrayCleanup(llvm::Value *arrayBegin, llvm::Value *arrayEnd, QualType elementType, CharUnits elementAlignment, Destroyer *destroyer)
pushRegularPartialArrayCleanup - Push an EH cleanup to destroy already-constructed elements of the gi...
Definition CGDecl.cpp:2622
void EmitAutoVarDecl(const VarDecl &D)
EmitAutoVarDecl - Emit an auto variable declaration.
Definition CGDecl.cpp:1356
llvm::Constant * EmitCheckSourceLocation(SourceLocation Loc)
Emit a description of a source location in a format suitable for passing to a runtime sanitizer handl...
Definition CGExpr.cpp:4063
void enterByrefCleanup(CleanupKind Kind, Address Addr, BlockFieldFlags Flags, bool LoadBlockVarAddr, bool CanThrow)
Enter a cleanup to destroy a __block variable.
void EmitAutoVarInit(const AutoVarEmission &emission)
Definition CGDecl.cpp:1952
llvm::SmallVector< DeferredDeactivateCleanup > DeferredDeactivationCleanupStack
llvm::BasicBlock * createBasicBlock(const Twine &name="", llvm::Function *parent=nullptr, llvm::BasicBlock *before=nullptr)
createBasicBlock - Create an LLVM basic block.
void addInstToCurrentSourceAtom(llvm::Instruction *KeyInstruction, llvm::Value *Backup)
See CGDebugInfo::addInstToCurrentSourceAtom.
const LangOptions & getLangOpts() const
RValue EmitReferenceBindingToExpr(const Expr *E)
Emits a reference binding to the passed in expression.
Definition CGExpr.cpp:700
AutoVarEmission EmitAutoVarAlloca(const VarDecl &var)
EmitAutoVarAlloca - Emit the alloca and debug information for a local variable.
Definition CGDecl.cpp:1490
void EmitVarAnnotations(const VarDecl *D, llvm::Value *V)
Emit local annotations for the local variable V, declared by D.
void pushDestroy(QualType::DestructionKind dtorKind, Address addr, QualType type)
pushDestroy - Push the standard destructor for the given type as at least a normal cleanup.
Definition CGDecl.cpp:2306
void EmitScalarInit(const Expr *init, const ValueDecl *D, LValue lvalue, bool capturedByInit)
Definition CGDecl.cpp:795
void EmitNullabilityCheck(LValue LHS, llvm::Value *RHS, SourceLocation Loc)
Given an assignment *LHS = RHS, emit a test that checks if RHS is nonnull, if LHS is marked _Nonnull.
Definition CGDecl.cpp:773
const CodeGen::CGBlockInfo * BlockInfo
@ TCK_NonnullAssign
Checking the value assigned to a _Nonnull pointer. Must not be null.
void EmitCXXDestructorCall(const CXXDestructorDecl *D, CXXDtorType Type, bool ForVirtualBase, bool Delegating, Address This, QualType ThisTy)
Definition CGClass.cpp:2659
const BlockByrefInfo & getBlockByrefInfo(const VarDecl *var)
BuildByrefInfo - This routine changes a __block variable declared as T x into:
void pushIrregularPartialArrayCleanup(llvm::Value *arrayBegin, Address arrayEndPointer, QualType elementType, CharUnits elementAlignment, Destroyer *destroyer)
pushIrregularPartialArrayCleanup - Push a NormalAndEHCleanup to destroy already-constructed elements ...
Definition CGDecl.cpp:2606
const Decl * CurCodeDecl
CurCodeDecl - This is the inner-most code context, which includes blocks.
Destroyer * getDestroyer(QualType::DestructionKind destructionKind)
Definition CGDecl.cpp:2279
void EmitARCRelease(llvm::Value *value, ARCPreciseLifetime_t precise)
Release the given object.
Definition CGObjC.cpp:2513
DominatingValue< T >::saved_type saveValueInCond(T value)
static bool cxxDestructorCanThrow(QualType T)
Check if T is a C++ class that has a destructor that can throw.
llvm::Constant * EmitCheckTypeDescriptor(QualType T)
Emit a description of a type in a format suitable for passing to a runtime sanitizer handler.
Definition CGExpr.cpp:3953
void initFullExprCleanupWithFlag(RawAddress ActiveFlag)
void pushCleanupAndDeferDeactivation(CleanupKind Kind, As... A)
RawAddress CreateDefaultAlignTempAlloca(llvm::Type *Ty, const Twine &Name="tmp")
CreateDefaultAlignedTempAlloca - This creates an alloca with the default ABI alignment of the given L...
Definition CGExpr.cpp:183
const TargetInfo & getTarget() const
void EmitStaticVarDecl(const VarDecl &D, llvm::GlobalValue::LinkageTypes Linkage)
Definition CGDecl.cpp:412
bool isInConditionalBranch() const
isInConditionalBranch - Return true if we're currently emitting one branch or the other of a conditio...
void pushKmpcAllocFree(CleanupKind Kind, std::pair< llvm::Value *, llvm::Value * > AddrSizePair)
Definition CGDecl.cpp:2354
void pushDestroyAndDeferDeactivation(QualType::DestructionKind dtorKind, Address addr, QualType type)
Definition CGDecl.cpp:2331
VlaSizePair getVLAElements1D(const VariableArrayType *vla)
Return the number of elements for a single dimension for the given array type.
void pushFullExprCleanup(CleanupKind kind, As... A)
pushFullExprCleanup - Push a cleanup to be run at the end of the current full-expression.
void EmitCheck(ArrayRef< std::pair< llvm::Value *, SanitizerKind::SanitizerOrdinal > > Checked, SanitizerHandler Check, ArrayRef< llvm::Constant * > StaticArgs, ArrayRef< llvm::Value * > DynamicArgs, const TrapReason *TR=nullptr)
Create a basic block that will either trap or call a handler function in the UBSan runtime with the p...
Definition CGExpr.cpp:4211
void EmitExtendGCLifetime(llvm::Value *object)
EmitExtendGCLifetime - Given a pointer to an Objective-C object, make sure it survives garbage collec...
Definition CGObjC.cpp:3748
LValue EmitDeclRefLValue(const DeclRefExpr *E)
Definition CGExpr.cpp:3620
llvm::Value * emitArrayLength(const ArrayType *arrayType, QualType &baseType, Address &addr)
emitArrayLength - Compute the length of an array, even if it's a VLA, and drill down to the base elem...
bool HaveInsertPoint() const
HaveInsertPoint - True if an insertion point is defined.
llvm::Value * EmitARCRetainScalarExpr(const Expr *expr)
EmitARCRetainScalarExpr - Semantically equivalent to EmitARCRetainObject(e->getType(),...
Definition CGObjC.cpp:3525
bool EmitLifetimeStart(llvm::Value *Addr)
Emit a lifetime.begin marker if some criteria are satisfied.
Definition CGDecl.cpp:1364
Address emitBlockByrefAddress(Address baseAddr, const VarDecl *V, bool followForward=true)
BuildBlockByrefAddress - Computes the location of the data in a variable which is declared as __block...
llvm::AllocaInst * CreateTempAlloca(llvm::Type *Ty, const Twine &Name="tmp", llvm::Value *ArraySize=nullptr)
CreateTempAlloca - This creates an alloca and inserts it into the entry block if ArraySize is nullptr...
Definition CGExpr.cpp:160
ComplexPairTy EmitComplexExpr(const Expr *E, bool IgnoreReal=false, bool IgnoreImag=false)
EmitComplexExpr - Emit the computation of the specified expression of complex type,...
RValue EmitCall(const CGFunctionInfo &CallInfo, const CGCallee &Callee, ReturnValueSlot ReturnValue, const CallArgList &Args, llvm::CallBase **CallOrInvoke, bool IsMustTail, SourceLocation Loc, bool IsVirtualFunctionPointerThunk=false)
EmitCall - Generate a call of the given function, expecting the given result type,...
Definition CGCall.cpp:5624
void EmitLifetimeEnd(llvm::Value *Addr)
Definition CGDecl.cpp:1376
RawAddress CreateMemTempWithoutCast(QualType T, const Twine &Name="tmp")
CreateMemTemp - Create a temporary memory object of the given type, with appropriate alignmen without...
Definition CGExpr.cpp:232
void pushCleanupAfterFullExprWithActiveFlag(CleanupKind Kind, RawAddress ActiveFlag, As... A)
VlaSizePair getVLASize(const VariableArrayType *vla)
Returns an LLVM value that corresponds to the size, in non-variably-sized elements,...
llvm::Value * EmitLoadOfScalar(Address Addr, bool Volatile, QualType Ty, SourceLocation Loc, AlignmentSource Source=AlignmentSource::Type, bool isNontemporal=false)
EmitLoadOfScalar - Load a scalar value from an address, taking care to appropriately convert from the...
void emitAutoVarTypeCleanup(const AutoVarEmission &emission, QualType::DestructionKind dtorKind)
Enter a destroy cleanup for the given local variable.
Definition CGDecl.cpp:2158
void Destroyer(CodeGenFunction &CGF, Address addr, QualType ty)
void EmitStoreOfComplex(ComplexPairTy V, LValue dest, bool isInit)
EmitStoreOfComplex - Store a complex number into the specified l-value.
const Decl * CurFuncDecl
CurFuncDecl - Holds the Decl for the current outermost non-closure context.
void EmitAutoVarCleanups(const AutoVarEmission &emission)
Definition CGDecl.cpp:2225
void EmitAndRegisterVariableArrayDimensions(CGDebugInfo *DI, const VarDecl &D, bool EmitDebugInfo)
Emits the alloca and debug information for the size expressions for each dimension of an array.
Definition CGDecl.cpp:1395
void EmitStoreThroughLValue(RValue Src, LValue Dst, bool isInit=false)
EmitStoreThroughLValue - Store the specified rvalue into the specified lvalue, where both are guarant...
Definition CGExpr.cpp:2793
void pushLifetimeExtendedDestroy(CleanupKind kind, Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray)
Definition CGDecl.cpp:2359
void EmitParmDecl(const VarDecl &D, ParamValue Arg, unsigned ArgNo)
EmitParmDecl - Emit a ParmVarDecl or an ImplicitParamDecl.
Definition CGDecl.cpp:2681
Address ReturnValuePointer
ReturnValuePointer - The temporary alloca to hold a pointer to sret.
bool needsEHCleanup(QualType::DestructionKind kind)
Determines whether an EH cleanup is required to destroy a type with the given destruction kind.
void EmitStmt(const Stmt *S, ArrayRef< const Attr * > Attrs={})
EmitStmt - Emit the code for the statement.
Definition CGStmt.cpp:58
llvm::GlobalVariable * AddInitializerToStaticVarDecl(const VarDecl &D, llvm::GlobalVariable *GV)
AddInitializerToStaticVarDecl - Add the initializer for 'D' to the global variable that has already b...
Definition CGDecl.cpp:361
CleanupKind getCleanupKind(QualType::DestructionKind kind)
llvm::Value * EmitARCRetainNonBlock(llvm::Value *value)
Retain the given object, with normal retain semantics.
Definition CGObjC.cpp:2369
llvm::Type * ConvertTypeForMem(QualType T)
static TypeEvaluationKind getEvaluationKind(QualType T)
getEvaluationKind - Return the TypeEvaluationKind of QualType T.
RawAddress CreateMemTemp(QualType T, const Twine &Name="tmp", RawAddress *Alloca=nullptr)
CreateMemTemp - Create a temporary memory object of the given type, with appropriate alignmen and cas...
Definition CGExpr.cpp:196
void setBlockContextParameter(const ImplicitParamDecl *D, unsigned argNum, llvm::Value *ptr)
void EmitVarDecl(const VarDecl &D)
EmitVarDecl - Emit a local variable declaration.
Definition CGDecl.cpp:211
void EmitAggExpr(const Expr *E, AggValueSlot AS)
EmitAggExpr - Emit the computation of the specified expression of aggregate type.
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)
llvm::Value * EmitARCStoreStrongCall(Address addr, llvm::Value *value, bool resultIgnored)
Store into a strong object.
Definition CGObjC.cpp:2556
const CGFunctionInfo * CurFnInfo
void EmitDecl(const Decl &D, bool EvaluateConditionDecl=false)
EmitDecl - Emit a declaration.
Definition CGDecl.cpp:52
std::pair< llvm::Value *, llvm::Value * > ComplexPairTy
Address ReturnValue
ReturnValue - The temporary alloca to hold the return value.
LValue EmitLValue(const Expr *E, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
EmitLValue - Emit code to compute a designator that specifies the location of the expression.
Definition CGExpr.cpp:1737
llvm::Value * EmitARCStoreWeak(Address addr, llvm::Value *value, bool ignored)
i8* @objc_storeWeak(i8** addr, i8* value) Returns value.
Definition CGObjC.cpp:2683
void EnsureInsertPoint()
EnsureInsertPoint - Ensure that an insertion point is defined so that emitted IR has a place to go.
llvm::LLVMContext & getLLVMContext()
void EmitARCCopyWeak(Address dst, Address src)
void @objc_copyWeak(i8** dest, i8** src) Disregards the current value in dest.
Definition CGObjC.cpp:2733
void EmitVariablyModifiedType(QualType Ty)
EmitVLASize - Capture all the sizes for the VLA expressions in the given variably-modified type and s...
void MaybeEmitDeferredVarDeclInit(const VarDecl *var)
Definition CGDecl.cpp:2097
bool isTrivialInitializer(const Expr *Init)
Determine whether the given initializer is trivial in the sense that it requires no code to be genera...
Definition CGDecl.cpp:1830
void PopCleanupBlock(bool FallThroughIsBranchThrough=false, bool ForDeactivation=false)
PopCleanupBlock - Will pop the cleanup entry on the stack and process all branch fixups.
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...
bool hasLabelBeenSeenInCurrentScope() const
Return true if a label was seen in the current scope.
void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false)
EmitBlock - Emit the given block.
Definition CGStmt.cpp:648
void EmitExprAsInit(const Expr *init, const ValueDecl *D, LValue lvalue, bool capturedByInit)
EmitExprAsInit - Emits the code necessary to initialize a location in memory with the given initializ...
Definition CGDecl.cpp:2115
This class organizes the cross-function state that is used while generating LLVM code.
StringRef getBlockMangledName(GlobalDecl GD, const BlockDecl *BD)
void setGVProperties(llvm::GlobalValue *GV, GlobalDecl GD) const
Set visibility, dllimport/dllexport and dso_local.
llvm::Module & getModule() const
llvm::Constant * performAddrSpaceCast(llvm::Constant *Src, llvm::Type *DestTy)
void setStaticLocalDeclAddress(const VarDecl *D, llvm::Constant *C)
llvm::Function * getLLVMLifetimeStartFn()
Lazily declare the @llvm.lifetime.start intrinsic.
Definition CGDecl.cpp:2634
Address createUnnamedGlobalFrom(const VarDecl &D, llvm::Constant *Constant, CharUnits Align)
Definition CGDecl.cpp:1139
void EmitOpenACCDeclare(const OpenACCDeclareDecl *D, CodeGenFunction *CGF=nullptr)
Definition CGDecl.cpp:2909
const LangOptions & getLangOpts() const
CharUnits getNaturalTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, bool forPointeeType=false)
llvm::Function * getLLVMFakeUseFn()
Lazily declare the @llvm.fake.use intrinsic.
Definition CGDecl.cpp:2652
void EmitOMPAllocateDecl(const OMPAllocateDecl *D)
Emit a code for the allocate directive.
Definition CGDecl.cpp:2923
const llvm::DataLayout & getDataLayout() const
CGOpenMPRuntime & getOpenMPRuntime()
Return a reference to the configured OpenMP runtime.
llvm::Constant * getOrCreateStaticVarDecl(const VarDecl &D, llvm::GlobalValue::LinkageTypes Linkage)
Definition CGDecl.cpp:264
llvm::Constant * GetAddrOfGlobal(GlobalDecl GD, ForDefinition_t IsForDefinition=NotForDefinition)
void setTLSMode(llvm::GlobalValue *GV, const VarDecl &D) const
Set the TLS mode for the given LLVM GlobalValue for the thread-local variable declaration D.
ASTContext & getContext() const
void EmitOMPDeclareMapper(const OMPDeclareMapperDecl *D, CodeGenFunction *CGF=nullptr)
Emit a code for declare mapper construct.
Definition CGDecl.cpp:2901
llvm::Function * getLLVMLifetimeEndFn()
Lazily declare the @llvm.lifetime.end intrinsic.
Definition CGDecl.cpp:2643
void EmitOMPRequiresDecl(const OMPRequiresDecl *D)
Emit a code for requires directive.
Definition CGDecl.cpp:2919
const TargetCodeGenInfo & getTargetCodeGenInfo()
const CodeGenOptions & getCodeGenOpts() const
StringRef getMangledName(GlobalDecl GD)
std::optional< CharUnits > getOMPAllocateAlignment(const VarDecl *VD)
Return the alignment specified in an allocate directive, if present.
Definition CGDecl.cpp:2974
llvm::LLVMContext & getLLVMContext()
llvm::GlobalValue * GetGlobalValue(StringRef Ref)
void EmitOMPDeclareReduction(const OMPDeclareReductionDecl *D, CodeGenFunction *CGF=nullptr)
Emit a code for declare reduction construct.
Definition CGDecl.cpp:2894
llvm::Constant * EmitNullConstant(QualType T)
Return the result of value-initializing the given type, i.e.
LangAS GetGlobalConstantAddressSpace() const
Return the AST address space of constant literal, which is used to emit the constant literal as globa...
LangAS GetGlobalVarAddressSpace(const VarDecl *D)
Return the AST address space of the underlying global variable for D, as determined by its declaratio...
void EmitOpenACCRoutine(const OpenACCRoutineDecl *D, CodeGenFunction *CGF=nullptr)
Definition CGDecl.cpp:2914
llvm::ConstantInt * getSize(CharUnits numChars)
Emit the given number of characters as a value of type size_t.
llvm::Type * ConvertTypeForMem(QualType T)
ConvertTypeForMem - Convert type T into a llvm::Type.
llvm::Constant * tryEmitForInitializer(const VarDecl &D)
Try to emit the initiaizer of the given declaration as an abstract constant.
void finalize(llvm::GlobalVariable *global)
llvm::Constant * tryEmitAbstractForInitializer(const VarDecl &D)
Try to emit the initializer of the given declaration as an abstract constant.
A cleanup scope which generates the cleanup blocks lazily.
Definition CGCleanup.h:250
ConditionalCleanup stores the saved form of its parameters, then restores them and performs the clean...
LValue - This represents an lvalue references.
Definition CGValue.h:183
llvm::Value * getPointer(CodeGenFunction &CGF) const
const Qualifiers & getQuals() const
Definition CGValue.h:350
Address getAddress() const
Definition CGValue.h:373
QualType getType() const
Definition CGValue.h:303
void setNonGC(bool Value)
Definition CGValue.h:316
void setAddress(Address address)
Definition CGValue.h:375
Qualifiers::ObjCLifetime getObjCLifetime() const
Definition CGValue.h:305
RValue - This trivial value class is used to represent the result of an expression that is evaluated.
Definition CGValue.h:42
static RValue get(llvm::Value *V)
Definition CGValue.h:99
An abstract representation of an aligned address.
Definition Address.h:42
llvm::Value * getPointer() const
Definition Address.h:66
static RawAddress invalid()
Definition Address.h:61
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:83
CompoundStmt - This represents a group of statements like { stmt stmt }.
Definition Stmt.h:1750
body_range body()
Definition Stmt.h:1813
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1466
A reference to a declared variable, function, enum, etc.
Definition Expr.h:1276
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
const DeclContext * getParentFunctionOrMethod(bool LexicalParent=false) const
If this decl is defined inside a function/method/block it returns the corresponding DeclContext,...
Definition DeclBase.cpp:344
T * getAttr() const
Definition DeclBase.h:581
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
Definition DeclBase.h:601
virtual Stmt * getBody() const
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
Definition DeclBase.h:1104
Decl * getNonClosureContext()
Find the innermost non-closure ancestor of this declaration, walking up through blocks,...
SourceLocation getLocation() const
Definition DeclBase.h:447
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
Definition DeclBase.cpp:579
DeclContext * getDeclContext()
Definition DeclBase.h:456
bool hasAttr() const
Definition DeclBase.h:585
Kind getKind() const
Definition DeclBase.h:450
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
This represents one expression.
Definition Expr.h:112
bool isXValue() const
Definition Expr.h:286
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
Definition Expr.cpp:3106
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
Definition Expr.cpp:3097
bool isConstantInitializer(ASTContext &Ctx, bool ForRef=false, const Expr **Culprit=nullptr) const
Returns true if this expression can be emitted to IR as a constant, and thus can be used as a constan...
Definition Expr.cpp:3358
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
Definition Expr.h:284
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition Expr.cpp:283
QualType getType() const
Definition Expr.h:144
Represents a function declaration or definition.
Definition Decl.h:2029
GlobalDecl - represents a global declaration.
Definition GlobalDecl.h:57
const Decl * getDecl() const
Definition GlobalDecl.h:106
One of these records is kept for each identifier that is lexed.
IdentifierInfo & getOwn(StringRef Name)
Gets an IdentifierInfo for the given name without consulting external sources.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Definition Decl.h:301
std::string getNameAsString() const
Get a human-readable name for the declaration, even if it is one of the special kinds of names (C++ c...
Definition Decl.h:317
bool isExternallyVisible() const
Definition Decl.h:433
This represents 'pragma omp allocate ...' directive.
Definition DeclOpenMP.h:536
varlist_range varlist()
Definition DeclOpenMP.h:578
This represents 'pragma omp declare mapper ...' directive.
Definition DeclOpenMP.h:349
This represents 'pragma omp declare reduction ...' directive.
Definition DeclOpenMP.h:239
This represents 'pragma omp requires...' directive.
Definition DeclOpenMP.h:479
Pointer-authentication qualifiers.
Definition TypeBase.h:153
A (possibly-)qualified type.
Definition TypeBase.h:938
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
Definition TypeBase.h:8573
@ PDIK_Struct
The type is a struct containing a field whose type is not PCK_Trivial.
Definition TypeBase.h:1494
LangAS getAddressSpace() const
Return the address space of this type.
Definition TypeBase.h:8615
bool isConstant(const ASTContext &Ctx) const
Definition TypeBase.h:1098
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Definition TypeBase.h:8529
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
Definition TypeBase.h:1454
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
Definition TypeBase.h:8674
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Definition TypeBase.h:8583
bool isObjCGCWeak() const
true when Type is objc's weak.
Definition TypeBase.h:1444
bool isConstantStorage(const ASTContext &Ctx, bool ExcludeCtor, bool ExcludeDtor)
Definition TypeBase.h:1037
bool isPODType(const ASTContext &Context) const
Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
Definition Type.cpp:2792
The collection of all-type qualifiers we support.
Definition TypeBase.h:332
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
Definition TypeBase.h:362
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
Definition TypeBase.h:355
@ OCL_None
There is no lifetime qualification on this type.
Definition TypeBase.h:351
@ OCL_Weak
Reading or writing from this object requires a barrier call.
Definition TypeBase.h:365
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
Definition TypeBase.h:368
bool hasConst() const
Definition TypeBase.h:458
void removePointerAuth()
Definition TypeBase.h:611
PointerAuthQualifier getPointerAuth() const
Definition TypeBase.h:604
ObjCLifetime getObjCLifetime() const
Definition TypeBase.h:546
bool isParamDestroyedInCallee() const
Definition Decl.h:4519
Scope - A scope is a transient data structure that is used while parsing the program.
Definition Scope.h:41
static const uint64_t MaximumAlignment
Definition Sema.h:1237
Encodes a location in the source.
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
Definition Expr.h:4601
Stmt - This represents one statement.
Definition Stmt.h:86
child_range children()
Definition Stmt.cpp:304
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
Definition Type.h:41
bool isConstantSizeType() const
Return true if this is not a variable sized type, according to the rules of C99 6....
Definition Type.cpp:2521
bool isArrayType() const
Definition TypeBase.h:8825
RecordDecl * castAsRecordDecl() const
Definition Type.h:48
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
Definition TypeBase.h:2865
bool isSamplerT() const
Definition TypeBase.h:8970
bool isRecordType() const
Definition TypeBase.h:8853
NullabilityKindOrNone getNullability() const
Determine the nullability of the given type.
Definition Type.cpp:5156
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:712
QualType getType() const
Definition Decl.h:723
Represents a variable declaration or definition.
Definition Decl.h:932
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
Definition Decl.cpp:2132
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
Definition Decl.h:1593
TLSKind getTLSKind() const
Definition Decl.cpp:2149
bool hasFlexibleArrayInit(const ASTContext &Ctx) const
Whether this variable has a flexible array member initialized with one or more elements.
Definition Decl.cpp:2825
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
Definition Decl.h:1247
CharUnits getFlexibleArrayInitChars(const ASTContext &Ctx) const
If hasFlexibleArrayInit is true, compute the number of additional bytes necessary to store those elem...
Definition Decl.cpp:2840
bool mightBeUsableInConstantExpressions(const ASTContext &C) const
Determine whether this variable's value might be usable in a constant expression, according to the re...
Definition Decl.cpp:2467
bool isNRVOVariable() const
Determine whether this local variable can be used with the named return value optimization (NRVO).
Definition Decl.h:1536
bool isExceptionVariable() const
Determine whether this variable is the exception variable in a C++ catch statememt or an Objective-C ...
Definition Decl.h:1518
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
Definition Decl.cpp:2814
const Expr * getInit() const
Definition Decl.h:1391
bool hasExternalStorage() const
Returns true if a variable has extern or private_extern storage.
Definition Decl.h:1238
bool isARCPseudoStrong() const
Determine whether this variable is an ARC pseudo-__strong variable.
Definition Decl.h:1571
bool hasLocalStorage() const
Returns true if a variable with function scope is a non-static local variable.
Definition Decl.h:1190
bool isLocalVarDecl() const
Returns true for local variable declarations other than parameters.
Definition Decl.h:1274
StorageDuration getStorageDuration() const
Get the storage duration of this variable, per C++ [basic.stc].
Definition Decl.h:1250
bool isEscapingByref() const
Indicates the capture is a __block variable that is captured by a block that can potentially escape (...
Definition Decl.cpp:2674
Defines the clang::TargetInfo interface.
@ BLOCK_FIELD_IS_BYREF
Definition CGBlocks.h:92
@ BLOCK_FIELD_IS_WEAK
Definition CGBlocks.h:94
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
Definition CGValue.h:146
llvm::Constant * initializationPatternFor(CodeGenModule &, llvm::Type *)
@ NormalCleanup
Denotes a cleanup that should run when a scope is exited using normal control flow (falling off the e...
@ EHCleanup
Denotes a cleanup that should run when a scope is exited using exceptional control flow (a throw stat...
ARCPreciseLifetime_t
Does an ARC strong l-value have precise lifetime?
Definition CGValue.h:136
@ ARCImpreciseLifetime
Definition CGValue.h:137
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< ArrayType > arrayType
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, CastExpr > castExpr
Matches any cast nodes of Clang's AST.
constexpr Variable var(Literal L)
Returns the variable of L.
Definition CNFFormula.h:64
@ Address
A pointer to a ValueDecl.
Definition Primitives.h:28
The JSON file list parser is used to communicate input to InstallAPI.
@ Ctor_Base
Base object ctor.
Definition ABI.h:26
bool isa(CodeGen::Address addr)
Definition Address.h:330
@ CPlusPlus
@ NonNull
Values of this type can never be null.
Definition Specifiers.h:351
@ SC_Auto
Definition Specifiers.h:257
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
Definition Linkage.h:24
@ SD_Automatic
Automatic storage duration (most local variables).
Definition Specifiers.h:342
const FunctionProtoType * T
@ Dtor_Base
Base object dtor.
Definition ABI.h:37
@ Dtor_Complete
Complete object dtor.
Definition ABI.h:36
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Definition Specifiers.h:140
U cast(CodeGen::Address addr)
Definition Address.h:327
@ ThreadPrivateVar
Parameter for Thread private variable.
Definition Decl.h:1771
unsigned long uint64_t
float __ovld __cnfn length(float)
Return the length of vector p, i.e., sqrt(p.x2 + p.y 2 + ...)
static Address getAddressOfLocalVariable(CodeGenFunction &CGF, const VarDecl *VD)
Gets the OpenMP-specific address of the local variable /p VD.
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64