clang 23.0.0git
CodeGenFunction.h
Go to the documentation of this file.
1//===-- CodeGenFunction.h - Per-Function state for LLVM CodeGen -*- C++ -*-===//
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 is the internal per-function state used for llvm translation.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_LIB_CODEGEN_CODEGENFUNCTION_H
14#define LLVM_CLANG_LIB_CODEGEN_CODEGENFUNCTION_H
15
16#include "CGBuilder.h"
17#include "CGLoopInfo.h"
18#include "CGValue.h"
19#include "CodeGenModule.h"
20#include "EHScopeStack.h"
21#include "SanitizerHandler.h"
22#include "VarBypassDetector.h"
23#include "clang/AST/CharUnits.h"
25#include "clang/AST/ExprCXX.h"
26#include "clang/AST/ExprObjC.h"
30#include "clang/AST/StmtSYCL.h"
31#include "clang/AST/Type.h"
32#include "clang/Basic/ABI.h"
37#include "llvm/ADT/ArrayRef.h"
38#include "llvm/ADT/DenseMap.h"
39#include "llvm/ADT/MapVector.h"
40#include "llvm/ADT/SmallVector.h"
41#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
42#include "llvm/IR/Instructions.h"
43#include "llvm/IR/ValueHandle.h"
44#include "llvm/Support/Debug.h"
45#include "llvm/Transforms/Utils/SanitizerStats.h"
46#include <optional>
47
48namespace llvm {
49class BasicBlock;
50class ConvergenceControlInst;
51class LLVMContext;
52class MDNode;
53class SwitchInst;
54class Twine;
55class Value;
56class CanonicalLoopInfo;
57} // namespace llvm
58
59namespace clang {
60class ASTContext;
62class CXXForRangeStmt;
63class CXXTryStmt;
64class Decl;
65class LabelDecl;
66class FunctionDecl;
68class LabelStmt;
71class ObjCIvarDecl;
72class ObjCMethodDecl;
75class TargetInfo;
76class VarDecl;
78class ObjCAtTryStmt;
79class ObjCAtThrowStmt;
82class OMPUseDevicePtrClause;
83class OMPUseDeviceAddrClause;
84class SVETypeFlags;
85class OMPExecutableDirective;
86
87namespace analyze_os_log {
89}
90
91namespace CodeGen {
92class CodeGenTypes;
93class CodeGenPGO;
94class CGCallee;
95class CGFunctionInfo;
96class CGBlockInfo;
97class CGCXXABI;
99class BlockByrefInfo;
100class BlockFieldFlags;
101class RegionCodeGenTy;
103struct OMPTaskDataTy;
104struct CGCoroData;
105
106// clang-format off
107/// The kind of evaluation to perform on values of a particular
108/// type. Basically, is the code in CGExprScalar, CGExprComplex, or
109/// CGExprAgg?
110///
111/// TODO: should vectors maybe be split out into their own thing?
117// clang-format on
118
119/// Helper class with most of the code for saving a value for a
120/// conditional expression cleanup.
122 typedef llvm::PointerIntPair<llvm::Value *, 1, bool> saved_type;
123
124 /// Answer whether the given value needs extra work to be saved.
125 static bool needsSaving(llvm::Value *value) {
126 if (!value)
127 return false;
128
129 // If it's not an instruction, we don't need to save.
130 if (!isa<llvm::Instruction>(value))
131 return false;
132
133 // If it's an instruction in the entry block, we don't need to save.
134 llvm::BasicBlock *block = cast<llvm::Instruction>(value)->getParent();
135 return (block != &block->getParent()->getEntryBlock());
136 }
137
138 static saved_type save(CodeGenFunction &CGF, llvm::Value *value);
139 static llvm::Value *restore(CodeGenFunction &CGF, saved_type value);
140};
141
142/// A partial specialization of DominatingValue for llvm::Values that
143/// might be llvm::Instructions.
144template <class T> struct DominatingPointer<T, true> : DominatingLLVMValue {
145 typedef T *type;
147 return static_cast<T *>(DominatingLLVMValue::restore(CGF, value));
148 }
149};
150
151/// A specialization of DominatingValue for Address.
152template <> struct DominatingValue<Address> {
153 typedef Address type;
154
162
163 static bool needsSaving(type value) {
166 return true;
167 return false;
168 }
169 static saved_type save(CodeGenFunction &CGF, type value) {
170 return {DominatingLLVMValue::save(CGF, value.getBasePointer()),
171 value.getElementType(), value.getAlignment(),
172 DominatingLLVMValue::save(CGF, value.getOffset()), value.getType()};
173 }
178 }
179};
180
181/// A specialization of DominatingValue for RValue.
182template <> struct DominatingValue<RValue> {
183 typedef RValue type;
184 class saved_type {
185 enum Kind {
186 ScalarLiteral,
187 ScalarAddress,
188 AggregateLiteral,
189 AggregateAddress,
190 ComplexAddress
191 };
192 union {
193 struct {
195 } Vals;
197 };
198 LLVM_PREFERRED_TYPE(Kind)
199 unsigned K : 3;
200
202 : Vals{Val1, DominatingLLVMValue::saved_type()}, K(K) {}
203
206 : Vals{Val1, Val2}, K(ComplexAddress) {}
207
208 saved_type(DominatingValue<Address>::saved_type AggregateAddr, unsigned K)
209 : AggregateAddr(AggregateAddr), K(K) {}
210
211 public:
212 static bool needsSaving(RValue value);
213 static saved_type save(CodeGenFunction &CGF, RValue value);
215
216 // implementations in CGCleanup.cpp
217 };
218
219 static bool needsSaving(type value) { return saved_type::needsSaving(value); }
220 static saved_type save(CodeGenFunction &CGF, type value) {
221 return saved_type::save(CGF, value);
222 }
224 return value.restore(CGF);
225 }
226};
227
228/// A scoped helper to set the current source atom group for
229/// CGDebugInfo::addInstToCurrentSourceAtom. A source atom is a source construct
230/// that is "interesting" for debug stepping purposes. We use an atom group
231/// number to track the instruction(s) that implement the functionality for the
232/// atom, plus backup instructions/source locations.
233class ApplyAtomGroup {
234 uint64_t OriginalAtom = 0;
235 CGDebugInfo *DI = nullptr;
236
237 ApplyAtomGroup(const ApplyAtomGroup &) = delete;
238 void operator=(const ApplyAtomGroup &) = delete;
239
240public:
241 ApplyAtomGroup(CGDebugInfo *DI);
243};
244
245/// CodeGenFunction - This class organizes the per-function state that is used
246/// while generating LLVM code.
247class CodeGenFunction : public CodeGenTypeCache {
248 CodeGenFunction(const CodeGenFunction &) = delete;
249 void operator=(const CodeGenFunction &) = delete;
250
251 friend class CGCXXABI;
252
253public:
254 /// A jump destination is an abstract label, branching to which may
255 /// require a jump out through normal cleanups.
256 struct JumpDest {
257 JumpDest() : Block(nullptr), Index(0) {}
258 JumpDest(llvm::BasicBlock *Block, EHScopeStack::stable_iterator Depth,
259 unsigned Index)
260 : Block(Block), ScopeDepth(Depth), Index(Index) {}
261
262 bool isValid() const { return Block != nullptr; }
263 llvm::BasicBlock *getBlock() const { return Block; }
264 EHScopeStack::stable_iterator getScopeDepth() const { return ScopeDepth; }
265 unsigned getDestIndex() const { return Index; }
266
267 // This should be used cautiously.
269 ScopeDepth = depth;
270 }
271
272 private:
273 llvm::BasicBlock *Block;
275 unsigned Index;
276 };
277
278 CodeGenModule &CGM; // Per-module state.
280
281 // For EH/SEH outlined funclets, this field points to parent's CGF
282 CodeGenFunction *ParentCGF = nullptr;
283
284 typedef std::pair<llvm::Value *, llvm::Value *> ComplexPairTy;
287
288 // Stores variables for which we can't generate correct lifetime markers
289 // because of jumps.
291
292 /// List of recently emitted OMPCanonicalLoops.
293 ///
294 /// Since OMPCanonicalLoops are nested inside other statements (in particular
295 /// CapturedStmt generated by OMPExecutableDirective and non-perfectly nested
296 /// loops), we cannot directly call OMPEmitOMPCanonicalLoop and receive its
297 /// llvm::CanonicalLoopInfo. Instead, we call EmitStmt and any
298 /// OMPEmitOMPCanonicalLoop called by it will add its CanonicalLoopInfo to
299 /// this stack when done. Entering a new loop requires clearing this list; it
300 /// either means we start parsing a new loop nest (in which case the previous
301 /// loop nest goes out of scope) or a second loop in the same level in which
302 /// case it would be ambiguous into which of the two (or more) loops the loop
303 /// nest would extend.
305
306 /// Stack to track the controlled convergence tokens.
308
309 /// Number of nested loop to be consumed by the last surrounding
310 /// loop-associated directive.
312
313 // CodeGen lambda for loops and support for ordered clause
314 typedef llvm::function_ref<void(CodeGenFunction &, const OMPLoopDirective &,
315 JumpDest)>
317 typedef llvm::function_ref<void(CodeGenFunction &, SourceLocation,
318 const unsigned, const bool)>
320
321 // Codegen lambda for loop bounds in worksharing loop constructs
322 typedef llvm::function_ref<std::pair<LValue, LValue>(
323 CodeGenFunction &, const OMPExecutableDirective &S)>
325
326 // Codegen lambda for loop bounds in dispatch-based loop implementation
327 typedef llvm::function_ref<std::pair<llvm::Value *, llvm::Value *>(
328 CodeGenFunction &, const OMPExecutableDirective &S, Address LB,
329 Address UB)>
331
332 /// CGBuilder insert helper. This function is called after an
333 /// instruction is created using Builder.
334 void InsertHelper(llvm::Instruction *I, const llvm::Twine &Name,
335 llvm::BasicBlock::iterator InsertPt) const;
336
337 /// CurFuncDecl - Holds the Decl for the current outermost
338 /// non-closure context.
339 const Decl *CurFuncDecl = nullptr;
340 /// CurCodeDecl - This is the inner-most code context, which includes blocks.
341 const Decl *CurCodeDecl = nullptr;
342 const CGFunctionInfo *CurFnInfo = nullptr;
344 llvm::Function *CurFn = nullptr;
345
346 /// If a cast expression is being visited, this holds the current cast's
347 /// expression.
348 const CastExpr *CurCast = nullptr;
349
350 /// Save Parameter Decl for coroutine.
352
353 // Holds coroutine data if the current function is a coroutine. We use a
354 // wrapper to manage its lifetime, so that we don't have to define CGCoroData
355 // in this header.
356 struct CGCoroInfo {
357 std::unique_ptr<CGCoroData> Data;
358 bool InSuspendBlock = false;
359 CGCoroInfo();
360 ~CGCoroInfo();
361 };
363
364 bool isCoroutine() const { return CurCoro.Data != nullptr; }
365
366 bool inSuspendBlock() const {
367 return isCoroutine() && CurCoro.InSuspendBlock;
368 }
369
370 // Holds FramePtr for await_suspend wrapper generation,
371 // so that __builtin_coro_frame call can be lowered
372 // directly to value of its second argument
374 llvm::Value *FramePtr = nullptr;
375 };
377
378 // Generates wrapper function for `llvm.coro.await.suspend.*` intrinisics.
379 // It encapsulates SuspendExpr in a function, to separate it's body
380 // from the main coroutine to avoid miscompilations. Intrinisic
381 // is lowered to this function call in CoroSplit pass
382 // Function signature is:
383 // <type> __await_suspend_wrapper_<name>(ptr %awaiter, ptr %hdl)
384 // where type is one of (void, i1, ptr)
385 llvm::Function *generateAwaitSuspendWrapper(Twine const &CoroName,
386 Twine const &SuspendPointName,
387 CoroutineSuspendExpr const &S);
388
389 /// CurGD - The GlobalDecl for the current function being compiled.
391
392 /// PrologueCleanupDepth - The cleanup depth enclosing all the
393 /// cleanups associated with the parameters.
395
396 /// ReturnBlock - Unified return block.
398
399 /// ReturnValue - The temporary alloca to hold the return
400 /// value. This is invalid iff the function has no return value.
402
403 /// ReturnValuePointer - The temporary alloca to hold a pointer to sret.
404 /// This is invalid if sret is not in use.
406
407 /// If a return statement is being visited, this holds the return statment's
408 /// result expression.
409 const Expr *RetExpr = nullptr;
410
411 /// Return true if a label was seen in the current scope.
413 if (CurLexicalScope)
414 return CurLexicalScope->hasLabels();
415 return !LabelMap.empty();
416 }
417
418 /// AllocaInsertPoint - This is an instruction in the entry block before which
419 /// we prefer to insert allocas.
420 llvm::AssertingVH<llvm::Instruction> AllocaInsertPt;
421
422private:
423 /// PostAllocaInsertPt - This is a place in the prologue where code can be
424 /// inserted that will be dominated by all the static allocas. This helps
425 /// achieve two things:
426 /// 1. Contiguity of all static allocas (within the prologue) is maintained.
427 /// 2. All other prologue code (which are dominated by static allocas) do
428 /// appear in the source order immediately after all static allocas.
429 ///
430 /// PostAllocaInsertPt will be lazily created when it is *really* required.
431 llvm::AssertingVH<llvm::Instruction> PostAllocaInsertPt = nullptr;
432
433public:
434 /// Return PostAllocaInsertPt. If it is not yet created, then insert it
435 /// immediately after AllocaInsertPt.
436 llvm::Instruction *getPostAllocaInsertPoint() {
437 if (!PostAllocaInsertPt) {
438 assert(AllocaInsertPt &&
439 "Expected static alloca insertion point at function prologue");
440 assert(AllocaInsertPt->getParent()->isEntryBlock() &&
441 "EBB should be entry block of the current code gen function");
442 PostAllocaInsertPt = AllocaInsertPt->clone();
443 PostAllocaInsertPt->setName("postallocapt");
444 PostAllocaInsertPt->insertAfter(AllocaInsertPt->getIterator());
445 }
446
447 return PostAllocaInsertPt;
448 }
449
450 // Try to preserve the source's name to make IR more readable.
451 llvm::Value *performAddrSpaceCast(llvm::Value *Src, llvm::Type *DestTy) {
452 return Builder.CreateAddrSpaceCast(
453 Src, DestTy, Src->hasName() ? Src->getName() + ".ascast" : "");
454 }
455
456 /// API for captured statement code generation.
458 public:
460 : Kind(K), ThisValue(nullptr), CXXThisFieldDecl(nullptr) {}
463 : Kind(K), ThisValue(nullptr), CXXThisFieldDecl(nullptr) {
464
466 S.getCapturedRecordDecl()->field_begin();
468 E = S.capture_end();
469 I != E; ++I, ++Field) {
470 if (I->capturesThis())
471 CXXThisFieldDecl = *Field;
472 else if (I->capturesVariable())
473 CaptureFields[I->getCapturedVar()->getCanonicalDecl()] = *Field;
474 else if (I->capturesVariableByCopy())
475 CaptureFields[I->getCapturedVar()->getCanonicalDecl()] = *Field;
476 }
477 }
478
479 virtual ~CGCapturedStmtInfo();
480
481 CapturedRegionKind getKind() const { return Kind; }
482
483 virtual void setContextValue(llvm::Value *V) { ThisValue = V; }
484 // Retrieve the value of the context parameter.
485 virtual llvm::Value *getContextValue() const { return ThisValue; }
486
487 /// Lookup the captured field decl for a variable.
488 virtual const FieldDecl *lookup(const VarDecl *VD) const {
489 return CaptureFields.lookup(VD->getCanonicalDecl());
490 }
491
492 bool isCXXThisExprCaptured() const { return getThisFieldDecl() != nullptr; }
493 virtual FieldDecl *getThisFieldDecl() const { return CXXThisFieldDecl; }
494
495 static bool classof(const CGCapturedStmtInfo *) { return true; }
496
497 /// Emit the captured statement body.
498 virtual void EmitBody(CodeGenFunction &CGF, const Stmt *S) {
500 CGF.EmitStmt(S);
501 }
502
503 /// Get the name of the capture helper.
504 virtual StringRef getHelperName() const { return "__captured_stmt"; }
505
506 /// Get the CaptureFields
507 llvm::SmallDenseMap<const VarDecl *, FieldDecl *> getCaptureFields() {
508 return CaptureFields;
509 }
510
511 private:
512 /// The kind of captured statement being generated.
514
515 /// Keep the map between VarDecl and FieldDecl.
516 llvm::SmallDenseMap<const VarDecl *, FieldDecl *> CaptureFields;
517
518 /// The base address of the captured record, passed in as the first
519 /// argument of the parallel region function.
520 llvm::Value *ThisValue;
521
522 /// Captured 'this' type.
523 FieldDecl *CXXThisFieldDecl;
524 };
526
527 /// RAII for correct setting/restoring of CapturedStmtInfo.
529 private:
530 CodeGenFunction &CGF;
531 CGCapturedStmtInfo *PrevCapturedStmtInfo;
532
533 public:
534 CGCapturedStmtRAII(CodeGenFunction &CGF,
535 CGCapturedStmtInfo *NewCapturedStmtInfo)
536 : CGF(CGF), PrevCapturedStmtInfo(CGF.CapturedStmtInfo) {
537 CGF.CapturedStmtInfo = NewCapturedStmtInfo;
538 }
539 ~CGCapturedStmtRAII() { CGF.CapturedStmtInfo = PrevCapturedStmtInfo; }
540 };
541
542 /// An abstract representation of regular/ObjC call/message targets.
544 /// The function declaration of the callee.
545 const Decl *CalleeDecl;
546
547 public:
548 AbstractCallee() : CalleeDecl(nullptr) {}
549 AbstractCallee(const FunctionDecl *FD) : CalleeDecl(FD) {}
550 AbstractCallee(const ObjCMethodDecl *OMD) : CalleeDecl(OMD) {}
551 bool hasFunctionDecl() const {
552 return isa_and_nonnull<FunctionDecl>(CalleeDecl);
553 }
554 const Decl *getDecl() const { return CalleeDecl; }
555 unsigned getNumParams() const {
556 if (const auto *FD = dyn_cast<FunctionDecl>(CalleeDecl))
557 return FD->getNumParams();
558 return cast<ObjCMethodDecl>(CalleeDecl)->param_size();
559 }
560 const ParmVarDecl *getParamDecl(unsigned I) const {
561 if (const auto *FD = dyn_cast<FunctionDecl>(CalleeDecl))
562 return FD->getParamDecl(I);
563 return *(cast<ObjCMethodDecl>(CalleeDecl)->param_begin() + I);
564 }
565 };
566
567 /// Sanitizers enabled for this function.
569
570 /// True if CodeGen currently emits code implementing sanitizer checks.
571 bool IsSanitizerScope = false;
572
573 /// RAII object to set/unset CodeGenFunction::IsSanitizerScope.
575 CodeGenFunction *CGF;
576
577 public:
578 SanitizerScope(CodeGenFunction *CGF);
580 };
581
582 /// In C++, whether we are code generating a thunk. This controls whether we
583 /// should emit cleanups.
584 bool CurFuncIsThunk = false;
585
586 /// In ARC, whether we should autorelease the return value.
587 bool AutoreleaseResult = false;
588
589 /// Whether we processed a Microsoft-style asm block during CodeGen. These can
590 /// potentially set the return value.
591 bool SawAsmBlock = false;
592
594
595 /// True if the current function is an outlined SEH helper. This can be a
596 /// finally block or filter expression.
598
599 /// True if CodeGen currently emits code inside presereved access index
600 /// region.
602
603 /// True if the current statement has nomerge attribute.
605
606 /// True if the current statement has noinline attribute.
608
609 /// True if the current statement has always_inline attribute.
611
612 /// True if the current statement has noconvergent attribute.
614
615 /// HLSL Branch attribute.
616 HLSLControlFlowHintAttr::Spelling HLSLControlFlowAttr =
617 HLSLControlFlowHintAttr::SpellingNotCalculated;
618
619 // The CallExpr within the current statement that the musttail attribute
620 // applies to. nullptr if there is no 'musttail' on the current statement.
621 const CallExpr *MustTailCall = nullptr;
622
623 /// Returns true if a function must make progress, which means the
624 /// mustprogress attribute can be added.
626 if (CGM.getCodeGenOpts().getFiniteLoops() ==
628 return false;
629
630 // C++11 and later guarantees that a thread eventually will do one of the
631 // following (C++11 [intro.multithread]p24 and C++17 [intro.progress]p1):
632 // - terminate,
633 // - make a call to a library I/O function,
634 // - perform an access through a volatile glvalue, or
635 // - perform a synchronization operation or an atomic operation.
636 //
637 // Hence each function is 'mustprogress' in C++11 or later.
638 return getLangOpts().CPlusPlus11;
639 }
640
641 /// Returns true if a loop must make progress, which means the mustprogress
642 /// attribute can be added. \p HasConstantCond indicates whether the branch
643 /// condition is a known constant.
644 bool checkIfLoopMustProgress(const Expr *, bool HasEmptyBody);
645
647 llvm::Value *BlockPointer = nullptr;
648
649 llvm::DenseMap<const ValueDecl *, FieldDecl *> LambdaCaptureFields;
651
652 /// A mapping from NRVO variables to the flags used to indicate
653 /// when the NRVO has been applied to this variable.
654 llvm::DenseMap<const VarDecl *, llvm::Value *> NRVOFlags;
655
658
659 // A stack of cleanups which were added to EHStack but have to be deactivated
660 // later before being popped or emitted. These are usually deactivated on
661 // exiting a `CleanupDeactivationScope` scope. For instance, after a
662 // full-expr.
663 //
664 // These are specially useful for correctly emitting cleanups while
665 // encountering branches out of expression (through stmt-expr or coroutine
666 // suspensions).
672
673 // Enters a new scope for capturing cleanups which are deferred to be
674 // deactivated, all of which will be deactivated once the scope is exited.
676 CodeGenFunction &CGF;
683
685 assert(!Deactivated && "Deactivating already deactivated scope");
686 auto &Stack = CGF.DeferredDeactivationCleanupStack;
687 for (size_t I = Stack.size(); I > OldDeactivateCleanupStackSize; I--) {
688 CGF.DeactivateCleanupBlock(Stack[I - 1].Cleanup,
689 Stack[I - 1].DominatingIP);
690 Stack[I - 1].DominatingIP->eraseFromParent();
691 }
692 Stack.resize(OldDeactivateCleanupStackSize);
693 Deactivated = true;
694 }
695
697 if (Deactivated)
698 return;
700 }
701 };
702
704
705 llvm::Instruction *CurrentFuncletPad = nullptr;
706
707 class CallLifetimeEnd final : public EHScopeStack::Cleanup {
708 bool isRedundantBeforeReturn() override { return true; }
709
710 llvm::Value *Addr;
711
712 public:
713 CallLifetimeEnd(RawAddress addr) : Addr(addr.getPointer()) {}
714
715 void Emit(CodeGenFunction &CGF, Flags flags) override {
716 CGF.EmitLifetimeEnd(Addr);
717 }
718 };
719
720 // We are using objects of this 'cleanup' class to emit fake.use calls
721 // for -fextend-variable-liveness. They are placed at the end of a variable's
722 // scope analogous to lifetime markers.
723 class FakeUse final : public EHScopeStack::Cleanup {
724 Address Addr;
725
726 public:
727 FakeUse(Address addr) : Addr(addr) {}
728
729 void Emit(CodeGenFunction &CGF, Flags flags) override {
730 CGF.EmitFakeUse(Addr);
731 }
732 };
733
734 /// Header for data within LifetimeExtendedCleanupStack.
735 struct alignas(uint64_t) LifetimeExtendedCleanupHeader {
736 /// The size of the following cleanup object.
737 unsigned Size;
738 /// The kind of cleanup to push.
739 LLVM_PREFERRED_TYPE(CleanupKind)
741 /// Whether this is a conditional cleanup.
742 LLVM_PREFERRED_TYPE(bool)
743 unsigned IsConditional : 1;
744
745 size_t getSize() const { return Size; }
746 CleanupKind getKind() const { return (CleanupKind)Kind; }
747 bool isConditional() const { return IsConditional; }
748 };
749
750 /// i32s containing the indexes of the cleanup destinations.
752
754
755 /// EHResumeBlock - Unified block containing a call to llvm.eh.resume.
756 llvm::BasicBlock *EHResumeBlock = nullptr;
757
758 /// The exception slot. All landing pads write the current exception pointer
759 /// into this alloca.
760 llvm::Value *ExceptionSlot = nullptr;
761
762 /// The selector slot. Under the MandatoryCleanup model, all landing pads
763 /// write the current selector value into this alloca.
764 llvm::AllocaInst *EHSelectorSlot = nullptr;
765
766 /// A stack of exception code slots. Entering an __except block pushes a slot
767 /// on the stack and leaving pops one. The __exception_code() intrinsic loads
768 /// a value from the top of the stack.
770
771 /// Value returned by __exception_info intrinsic.
772 llvm::Value *SEHInfo = nullptr;
773
774 /// Emits a landing pad for the current EH stack.
775 llvm::BasicBlock *EmitLandingPad();
776
777 llvm::BasicBlock *getInvokeDestImpl();
778
779 /// Parent loop-based directive for scan directive.
781 llvm::BasicBlock *OMPBeforeScanBlock = nullptr;
782 llvm::BasicBlock *OMPAfterScanBlock = nullptr;
783 llvm::BasicBlock *OMPScanExitBlock = nullptr;
784 llvm::BasicBlock *OMPScanDispatch = nullptr;
785 bool OMPFirstScanLoop = false;
786
787 /// Manages parent directive for scan directives.
789 CodeGenFunction &CGF;
790 const OMPExecutableDirective *ParentLoopDirectiveForScan;
791
792 public:
794 CodeGenFunction &CGF,
795 const OMPExecutableDirective &ParentLoopDirectiveForScan)
796 : CGF(CGF),
797 ParentLoopDirectiveForScan(CGF.OMPParentLoopDirectiveForScan) {
798 CGF.OMPParentLoopDirectiveForScan = &ParentLoopDirectiveForScan;
799 }
801 CGF.OMPParentLoopDirectiveForScan = ParentLoopDirectiveForScan;
802 }
803 };
804
805 template <class T>
807 return DominatingValue<T>::save(*this, value);
808 }
809
811 public:
812 CGFPOptionsRAII(CodeGenFunction &CGF, FPOptions FPFeatures);
813 CGFPOptionsRAII(CodeGenFunction &CGF, const Expr *E);
815
816 private:
817 void ConstructorHelper(FPOptions FPFeatures);
818 CodeGenFunction &CGF;
819 FPOptions OldFPFeatures;
820 llvm::fp::ExceptionBehavior OldExcept;
821 llvm::RoundingMode OldRounding;
822 std::optional<CGBuilderTy::FastMathFlagGuard> FMFGuard;
823 };
825
827 public:
829 : CGM(CGM_), SavedAtomicOpts(CGM.getAtomicOpts()) {
830 CGM.setAtomicOpts(AO);
831 }
832 CGAtomicOptionsRAII(CodeGenModule &CGM_, const AtomicAttr *AA)
833 : CGM(CGM_), SavedAtomicOpts(CGM.getAtomicOpts()) {
834 if (!AA)
835 return;
836 AtomicOptions AO = SavedAtomicOpts;
837 for (auto Option : AA->atomicOptions()) {
838 switch (Option) {
839 case AtomicAttr::remote_memory:
840 AO.remote_memory = true;
841 break;
842 case AtomicAttr::no_remote_memory:
843 AO.remote_memory = false;
844 break;
845 case AtomicAttr::fine_grained_memory:
846 AO.fine_grained_memory = true;
847 break;
848 case AtomicAttr::no_fine_grained_memory:
849 AO.fine_grained_memory = false;
850 break;
851 case AtomicAttr::ignore_denormal_mode:
852 AO.ignore_denormal_mode = true;
853 break;
854 case AtomicAttr::no_ignore_denormal_mode:
855 AO.ignore_denormal_mode = false;
856 break;
857 }
858 }
859 CGM.setAtomicOpts(AO);
860 }
861
864 ~CGAtomicOptionsRAII() { CGM.setAtomicOpts(SavedAtomicOpts); }
865
866 private:
868 AtomicOptions SavedAtomicOpts;
869 };
870
871public:
872 /// ObjCEHValueStack - Stack of Objective-C exception values, used for
873 /// rethrows.
875
876 /// A class controlling the emission of a finally block.
878 /// Where the catchall's edge through the cleanup should go.
879 JumpDest RethrowDest;
880
881 /// A function to call to enter the catch.
882 llvm::FunctionCallee BeginCatchFn;
883
884 /// An i1 variable indicating whether or not the @finally is
885 /// running for an exception.
886 llvm::AllocaInst *ForEHVar = nullptr;
887
888 /// An i8* variable into which the exception pointer to rethrow
889 /// has been saved.
890 llvm::AllocaInst *SavedExnVar = nullptr;
891
892 public:
893 void enter(CodeGenFunction &CGF, const Stmt *Finally,
894 llvm::FunctionCallee beginCatchFn,
895 llvm::FunctionCallee endCatchFn, llvm::FunctionCallee rethrowFn);
896 void exit(CodeGenFunction &CGF);
897 };
898
899 /// Returns true inside SEH __try blocks.
900 bool isSEHTryScope() const { return !SEHTryEpilogueStack.empty(); }
901
902 /// Returns true while emitting a cleanuppad.
906
907 /// pushFullExprCleanup - Push a cleanup to be run at the end of the
908 /// current full-expression. Safe against the possibility that
909 /// we're currently inside a conditionally-evaluated expression.
910 template <class T, class... As>
912 // If we're not in a conditional branch, or if none of the
913 // arguments requires saving, then use the unconditional cleanup.
915 return EHStack.pushCleanup<T>(kind, A...);
916
917 // Stash values in a tuple so we can guarantee the order of saves.
918 typedef std::tuple<typename DominatingValue<As>::saved_type...> SavedTuple;
919 SavedTuple Saved{saveValueInCond(A)...};
920
921 typedef EHScopeStack::ConditionalCleanup<T, As...> CleanupType;
922 EHStack.pushCleanupTuple<CleanupType>(kind, Saved);
924 }
925
926 /// Queue a cleanup to be pushed after finishing the current full-expression,
927 /// potentially with an active flag.
928 template <class T, class... As>
932 Kind, RawAddress::invalid(), A...);
933
934 RawAddress ActiveFlag = createCleanupActiveFlag();
935 assert(!DominatingValue<Address>::needsSaving(ActiveFlag) &&
936 "cleanup active flag should never need saving");
937
938 typedef std::tuple<typename DominatingValue<As>::saved_type...> SavedTuple;
939 SavedTuple Saved{saveValueInCond(A)...};
940
941 typedef EHScopeStack::ConditionalCleanup<T, As...> CleanupType;
943 Saved);
944 }
945
946 template <class T, class... As>
948 RawAddress ActiveFlag, As... A) {
949 LifetimeExtendedCleanupHeader Header = {sizeof(T), Kind,
950 ActiveFlag.isValid()};
951
952 size_t OldSize = LifetimeExtendedCleanupStack.size();
954 LifetimeExtendedCleanupStack.size() + sizeof(Header) + Header.Size +
955 (Header.IsConditional ? sizeof(ActiveFlag) : 0));
956
957 static_assert((alignof(LifetimeExtendedCleanupHeader) == alignof(T)) &&
958 (alignof(T) == alignof(RawAddress)),
959 "Cleanup will be allocated on misaligned address");
960 char *Buffer = &LifetimeExtendedCleanupStack[OldSize];
961 new (Buffer) LifetimeExtendedCleanupHeader(Header);
962 new (Buffer + sizeof(Header)) T(A...);
963 if (Header.IsConditional)
964 new (Buffer + sizeof(Header) + sizeof(T)) RawAddress(ActiveFlag);
965 }
966
967 // Push a cleanup onto EHStack and deactivate it later. It is usually
968 // deactivated when exiting a `CleanupDeactivationScope` (for example: after a
969 // full expression).
970 template <class T, class... As>
972 // Placeholder dominating IP for this cleanup.
973 llvm::Instruction *DominatingIP =
974 Builder.CreateFlagLoad(llvm::Constant::getNullValue(Int8PtrTy));
975 EHStack.pushCleanup<T>(Kind, A...);
977 {EHStack.stable_begin(), DominatingIP});
978 }
979
980 /// Set up the last cleanup that was pushed as a conditional
981 /// full-expression cleanup.
985
988
989 /// PushDestructorCleanup - Push a cleanup to call the
990 /// complete-object destructor of an object of the given type at the
991 /// given address. Does nothing if T is not a C++ class type with a
992 /// non-trivial destructor.
994
995 /// PushDestructorCleanup - Push a cleanup to call the
996 /// complete-object variant of the given destructor on the object at
997 /// the given address.
999 Address Addr);
1000
1001 /// PopCleanupBlock - Will pop the cleanup entry on the stack and
1002 /// process all branch fixups.
1003 void PopCleanupBlock(bool FallThroughIsBranchThrough = false,
1004 bool ForDeactivation = false);
1005
1006 /// DeactivateCleanupBlock - Deactivates the given cleanup block.
1007 /// The block cannot be reactivated. Pops it if it's the top of the
1008 /// stack.
1009 ///
1010 /// \param DominatingIP - An instruction which is known to
1011 /// dominate the current IP (if set) and which lies along
1012 /// all paths of execution between the current IP and the
1013 /// the point at which the cleanup comes into scope.
1015 llvm::Instruction *DominatingIP);
1016
1017 /// ActivateCleanupBlock - Activates an initially-inactive cleanup.
1018 /// Cannot be used to resurrect a deactivated cleanup.
1019 ///
1020 /// \param DominatingIP - An instruction which is known to
1021 /// dominate the current IP (if set) and which lies along
1022 /// all paths of execution between the current IP and the
1023 /// the point at which the cleanup comes into scope.
1025 llvm::Instruction *DominatingIP);
1026
1027 /// Enters a new scope for capturing cleanups, all of which
1028 /// will be executed once the scope is exited.
1029 class RunCleanupsScope {
1030 EHScopeStack::stable_iterator CleanupStackDepth, OldCleanupScopeDepth;
1031 size_t LifetimeExtendedCleanupStackSize;
1032 CleanupDeactivationScope DeactivateCleanups;
1033 bool OldDidCallStackSave;
1034
1035 protected:
1037
1038 private:
1039 RunCleanupsScope(const RunCleanupsScope &) = delete;
1040 void operator=(const RunCleanupsScope &) = delete;
1041
1042 protected:
1043 CodeGenFunction &CGF;
1044
1045 public:
1046 /// Enter a new cleanup scope.
1047 explicit RunCleanupsScope(CodeGenFunction &CGF)
1048 : DeactivateCleanups(CGF), PerformCleanup(true), CGF(CGF) {
1049 CleanupStackDepth = CGF.EHStack.stable_begin();
1050 LifetimeExtendedCleanupStackSize =
1051 CGF.LifetimeExtendedCleanupStack.size();
1052 OldDidCallStackSave = CGF.DidCallStackSave;
1053 CGF.DidCallStackSave = false;
1054 OldCleanupScopeDepth = CGF.CurrentCleanupScopeDepth;
1055 CGF.CurrentCleanupScopeDepth = CleanupStackDepth;
1056 }
1057
1058 /// Exit this cleanup scope, emitting any accumulated cleanups.
1060 if (PerformCleanup)
1061 ForceCleanup();
1062 }
1063
1064 /// Determine whether this scope requires any cleanups.
1065 bool requiresCleanups() const {
1066 return CGF.EHStack.stable_begin() != CleanupStackDepth;
1067 }
1068
1069 /// Force the emission of cleanups now, instead of waiting
1070 /// until this object is destroyed.
1071 /// \param ValuesToReload - A list of values that need to be available at
1072 /// the insertion point after cleanup emission. If cleanup emission created
1073 /// a shared cleanup block, these value pointers will be rewritten.
1074 /// Otherwise, they not will be modified.
1075 void
1076 ForceCleanup(std::initializer_list<llvm::Value **> ValuesToReload = {}) {
1077 assert(PerformCleanup && "Already forced cleanup");
1078 CGF.DidCallStackSave = OldDidCallStackSave;
1079 DeactivateCleanups.ForceDeactivate();
1080 CGF.PopCleanupBlocks(CleanupStackDepth, LifetimeExtendedCleanupStackSize,
1081 ValuesToReload);
1082 PerformCleanup = false;
1083 CGF.CurrentCleanupScopeDepth = OldCleanupScopeDepth;
1084 }
1085 };
1086
1087 // Cleanup stack depth of the RunCleanupsScope that was pushed most recently.
1090
1091 class LexicalScope : public RunCleanupsScope {
1092 SourceRange Range;
1094 LexicalScope *ParentScope;
1095
1096 LexicalScope(const LexicalScope &) = delete;
1097 void operator=(const LexicalScope &) = delete;
1098
1099 public:
1100 /// Enter a new cleanup scope.
1101 explicit LexicalScope(CodeGenFunction &CGF, SourceRange Range);
1102
1103 void addLabel(const LabelDecl *label) {
1104 assert(PerformCleanup && "adding label to dead scope?");
1105 Labels.push_back(label);
1106 }
1107
1108 /// Exit this cleanup scope, emitting any accumulated
1109 /// cleanups.
1110 ~LexicalScope();
1111
1112 /// Force the emission of cleanups now, instead of waiting
1113 /// until this object is destroyed.
1115 CGF.CurLexicalScope = ParentScope;
1117
1118 if (!Labels.empty())
1119 rescopeLabels();
1120 }
1121
1122 bool hasLabels() const { return !Labels.empty(); }
1123
1124 void rescopeLabels();
1125 };
1126
1127 typedef llvm::DenseMap<const Decl *, Address> DeclMapTy;
1128
1129 /// The class used to assign some variables some temporarily addresses.
1130 class OMPMapVars {
1131 DeclMapTy SavedLocals;
1132 DeclMapTy SavedTempAddresses;
1133 OMPMapVars(const OMPMapVars &) = delete;
1134 void operator=(const OMPMapVars &) = delete;
1135
1136 public:
1137 explicit OMPMapVars() = default;
1139 assert(SavedLocals.empty() && "Did not restored original addresses.");
1140 };
1141
1142 /// Sets the address of the variable \p LocalVD to be \p TempAddr in
1143 /// function \p CGF.
1144 /// \return true if at least one variable was set already, false otherwise.
1145 bool setVarAddr(CodeGenFunction &CGF, const VarDecl *LocalVD,
1146 Address TempAddr) {
1147 LocalVD = LocalVD->getCanonicalDecl();
1148 // Only save it once.
1149 if (SavedLocals.count(LocalVD))
1150 return false;
1151
1152 // Copy the existing local entry to SavedLocals.
1153 auto it = CGF.LocalDeclMap.find(LocalVD);
1154 if (it != CGF.LocalDeclMap.end())
1155 SavedLocals.try_emplace(LocalVD, it->second);
1156 else
1157 SavedLocals.try_emplace(LocalVD, Address::invalid());
1158
1159 // Generate the private entry.
1160 QualType VarTy = LocalVD->getType();
1161 if (VarTy->isReferenceType()) {
1162 Address Temp = CGF.CreateMemTemp(VarTy);
1163 CGF.Builder.CreateStore(TempAddr.emitRawPointer(CGF), Temp);
1164 TempAddr = Temp;
1165 }
1166 SavedTempAddresses.try_emplace(LocalVD, TempAddr);
1167
1168 return true;
1169 }
1170
1171 /// Applies new addresses to the list of the variables.
1172 /// \return true if at least one variable is using new address, false
1173 /// otherwise.
1174 bool apply(CodeGenFunction &CGF) {
1175 copyInto(SavedTempAddresses, CGF.LocalDeclMap);
1176 SavedTempAddresses.clear();
1177 return !SavedLocals.empty();
1178 }
1179
1180 /// Restores original addresses of the variables.
1181 void restore(CodeGenFunction &CGF) {
1182 if (!SavedLocals.empty()) {
1183 copyInto(SavedLocals, CGF.LocalDeclMap);
1184 SavedLocals.clear();
1185 }
1186 }
1187
1188 private:
1189 /// Copy all the entries in the source map over the corresponding
1190 /// entries in the destination, which must exist.
1191 static void copyInto(const DeclMapTy &Src, DeclMapTy &Dest) {
1192 for (auto &[Decl, Addr] : Src) {
1193 if (!Addr.isValid())
1194 Dest.erase(Decl);
1195 else
1196 Dest.insert_or_assign(Decl, Addr);
1197 }
1198 }
1199 };
1200
1201 /// The scope used to remap some variables as private in the OpenMP loop body
1202 /// (or other captured region emitted without outlining), and to restore old
1203 /// vars back on exit.
1204 class OMPPrivateScope : public RunCleanupsScope {
1205 OMPMapVars MappedVars;
1206 OMPPrivateScope(const OMPPrivateScope &) = delete;
1207 void operator=(const OMPPrivateScope &) = delete;
1208
1209 public:
1210 /// Enter a new OpenMP private scope.
1211 explicit OMPPrivateScope(CodeGenFunction &CGF) : RunCleanupsScope(CGF) {}
1212
1213 /// Registers \p LocalVD variable as a private with \p Addr as the address
1214 /// of the corresponding private variable. \p
1215 /// PrivateGen is the address of the generated private variable.
1216 /// \return true if the variable is registered as private, false if it has
1217 /// been privatized already.
1218 bool addPrivate(const VarDecl *LocalVD, Address Addr) {
1219 assert(PerformCleanup && "adding private to dead scope");
1220 return MappedVars.setVarAddr(CGF, LocalVD, Addr);
1221 }
1222
1223 /// Privatizes local variables previously registered as private.
1224 /// Registration is separate from the actual privatization to allow
1225 /// initializers use values of the original variables, not the private one.
1226 /// This is important, for example, if the private variable is a class
1227 /// variable initialized by a constructor that references other private
1228 /// variables. But at initialization original variables must be used, not
1229 /// private copies.
1230 /// \return true if at least one variable was privatized, false otherwise.
1231 bool Privatize() { return MappedVars.apply(CGF); }
1232
1237
1238 /// Exit scope - all the mapped variables are restored.
1240 if (PerformCleanup)
1241 ForceCleanup();
1242 }
1243
1244 /// Checks if the global variable is captured in current function.
1245 bool isGlobalVarCaptured(const VarDecl *VD) const {
1246 VD = VD->getCanonicalDecl();
1247 return !VD->isLocalVarDeclOrParm() && CGF.LocalDeclMap.count(VD) > 0;
1248 }
1249
1250 /// Restore all mapped variables w/o clean up. This is usefully when we want
1251 /// to reference the original variables but don't want the clean up because
1252 /// that could emit lifetime end too early, causing backend issue #56913.
1253 void restoreMap() { MappedVars.restore(CGF); }
1254 };
1255
1256 /// Save/restore original map of previously emitted local vars in case when we
1257 /// need to duplicate emission of the same code several times in the same
1258 /// function for OpenMP code.
1260 CodeGenFunction &CGF;
1261 DeclMapTy SavedMap;
1262
1263 public:
1264 OMPLocalDeclMapRAII(CodeGenFunction &CGF)
1265 : CGF(CGF), SavedMap(CGF.LocalDeclMap) {}
1266 ~OMPLocalDeclMapRAII() { SavedMap.swap(CGF.LocalDeclMap); }
1267 };
1268
1269 /// Takes the old cleanup stack size and emits the cleanup blocks
1270 /// that have been added.
1271 void
1273 std::initializer_list<llvm::Value **> ValuesToReload = {});
1274
1275 /// Takes the old cleanup stack size and emits the cleanup blocks
1276 /// that have been added, then adds all lifetime-extended cleanups from
1277 /// the given position to the stack.
1278 void
1279 PopCleanupBlocks(EHScopeStack::stable_iterator OldCleanupStackSize,
1280 size_t OldLifetimeExtendedStackSize,
1281 std::initializer_list<llvm::Value **> ValuesToReload = {});
1282
1283 void ResolveBranchFixups(llvm::BasicBlock *Target);
1284
1285 /// The given basic block lies in the current EH scope, but may be a
1286 /// target of a potentially scope-crossing jump; get a stable handle
1287 /// to which we can perform this jump later.
1289 return JumpDest(Target, EHStack.getInnermostNormalCleanup(),
1291 }
1292
1293 /// The given basic block lies in the current EH scope, but may be a
1294 /// target of a potentially scope-crossing jump; get a stable handle
1295 /// to which we can perform this jump later.
1296 JumpDest getJumpDestInCurrentScope(StringRef Name = StringRef()) {
1298 }
1299
1300 /// EmitBranchThroughCleanup - Emit a branch from the current insert
1301 /// block through the normal cleanup handling code (if any) and then
1302 /// on to \arg Dest.
1303 void EmitBranchThroughCleanup(JumpDest Dest);
1304
1305 /// isObviouslyBranchWithoutCleanups - Return true if a branch to the
1306 /// specified destination obviously has no cleanups to run. 'false' is always
1307 /// a conservatively correct answer for this method.
1308 bool isObviouslyBranchWithoutCleanups(JumpDest Dest) const;
1309
1310 /// popCatchScope - Pops the catch scope at the top of the EHScope
1311 /// stack, emitting any required code (other than the catch handlers
1312 /// themselves).
1313 void popCatchScope();
1314
1315 llvm::BasicBlock *getEHResumeBlock(bool isCleanup);
1316 llvm::BasicBlock *getEHDispatchBlock(EHScopeStack::stable_iterator scope);
1317 llvm::BasicBlock *
1319
1320 /// An object to manage conditionally-evaluated expressions.
1322 llvm::BasicBlock *StartBB;
1323
1324 public:
1325 ConditionalEvaluation(CodeGenFunction &CGF)
1326 : StartBB(CGF.Builder.GetInsertBlock()) {}
1327
1328 void begin(CodeGenFunction &CGF) {
1329 assert(CGF.OutermostConditional != this);
1330 if (!CGF.OutermostConditional)
1331 CGF.OutermostConditional = this;
1332 }
1333
1334 void end(CodeGenFunction &CGF) {
1335 assert(CGF.OutermostConditional != nullptr);
1336 if (CGF.OutermostConditional == this)
1337 CGF.OutermostConditional = nullptr;
1338 }
1339
1340 /// Returns a block which will be executed prior to each
1341 /// evaluation of the conditional code.
1342 llvm::BasicBlock *getStartingBlock() const { return StartBB; }
1343 };
1344
1345 /// isInConditionalBranch - Return true if we're currently emitting
1346 /// one branch or the other of a conditional expression.
1347 bool isInConditionalBranch() const { return OutermostConditional != nullptr; }
1348
1349 void setBeforeOutermostConditional(llvm::Value *value, Address addr,
1350 CodeGenFunction &CGF) {
1351 assert(isInConditionalBranch());
1352 llvm::BasicBlock *block = OutermostConditional->getStartingBlock();
1353 auto store = new llvm::StoreInst(value, addr.emitRawPointer(CGF),
1354 block->back().getIterator());
1355 store->setAlignment(addr.getAlignment().getAsAlign());
1356 }
1357
1358 /// An RAII object to record that we're evaluating a statement
1359 /// expression.
1361 CodeGenFunction &CGF;
1362
1363 /// We have to save the outermost conditional: cleanups in a
1364 /// statement expression aren't conditional just because the
1365 /// StmtExpr is.
1366 ConditionalEvaluation *SavedOutermostConditional;
1367
1368 public:
1369 StmtExprEvaluation(CodeGenFunction &CGF)
1370 : CGF(CGF), SavedOutermostConditional(CGF.OutermostConditional) {
1371 CGF.OutermostConditional = nullptr;
1372 }
1373
1375 CGF.OutermostConditional = SavedOutermostConditional;
1376 CGF.EnsureInsertPoint();
1377 }
1378 };
1379
1380 /// An object which temporarily prevents a value from being
1381 /// destroyed by aggressive peephole optimizations that assume that
1382 /// all uses of a value have been realized in the IR.
1384 llvm::Instruction *Inst = nullptr;
1385 friend class CodeGenFunction;
1386
1387 public:
1389 };
1390
1391 /// A non-RAII class containing all the information about a bound
1392 /// opaque value. OpaqueValueMapping, below, is a RAII wrapper for
1393 /// this which makes individual mappings very simple; using this
1394 /// class directly is useful when you have a variable number of
1395 /// opaque values or don't want the RAII functionality for some
1396 /// reason.
1397 class OpaqueValueMappingData {
1398 const OpaqueValueExpr *OpaqueValue;
1399 bool BoundLValue;
1401
1402 OpaqueValueMappingData(const OpaqueValueExpr *ov, bool boundLValue)
1403 : OpaqueValue(ov), BoundLValue(boundLValue) {}
1404
1405 public:
1407
1408 static bool shouldBindAsLValue(const Expr *expr) {
1409 // gl-values should be bound as l-values for obvious reasons.
1410 // Records should be bound as l-values because IR generation
1411 // always keeps them in memory. Expressions of function type
1412 // act exactly like l-values but are formally required to be
1413 // r-values in C.
1414 return expr->isGLValue() || expr->getType()->isFunctionType() ||
1415 hasAggregateEvaluationKind(expr->getType());
1416 }
1417
1419 bind(CodeGenFunction &CGF, const OpaqueValueExpr *ov, const Expr *e) {
1420 if (shouldBindAsLValue(ov))
1421 return bind(CGF, ov, CGF.EmitLValue(e));
1422 return bind(CGF, ov, CGF.EmitAnyExpr(e));
1423 }
1424
1426 bind(CodeGenFunction &CGF, const OpaqueValueExpr *ov, const LValue &lv) {
1427 assert(shouldBindAsLValue(ov));
1428 CGF.OpaqueLValues.insert(std::make_pair(ov, lv));
1429 return OpaqueValueMappingData(ov, true);
1430 }
1431
1433 bind(CodeGenFunction &CGF, const OpaqueValueExpr *ov, const RValue &rv) {
1434 assert(!shouldBindAsLValue(ov));
1435 CGF.OpaqueRValues.insert(std::make_pair(ov, rv));
1436
1437 OpaqueValueMappingData data(ov, false);
1438
1439 // Work around an extremely aggressive peephole optimization in
1440 // EmitScalarConversion which assumes that all other uses of a
1441 // value are extant.
1442 data.Protection = CGF.protectFromPeepholes(rv);
1443
1444 return data;
1445 }
1446
1447 bool isValid() const { return OpaqueValue != nullptr; }
1448 void clear() { OpaqueValue = nullptr; }
1449
1450 void unbind(CodeGenFunction &CGF) {
1451 assert(OpaqueValue && "no data to unbind!");
1452
1453 if (BoundLValue) {
1454 CGF.OpaqueLValues.erase(OpaqueValue);
1455 } else {
1456 CGF.OpaqueRValues.erase(OpaqueValue);
1457 CGF.unprotectFromPeepholes(Protection);
1458 }
1459 }
1460 };
1461
1462 /// An RAII object to set (and then clear) a mapping for an OpaqueValueExpr.
1464 CodeGenFunction &CGF;
1466
1467 public:
1471
1472 /// Build the opaque value mapping for the given conditional
1473 /// operator if it's the GNU ?: extension. This is a common
1474 /// enough pattern that the convenience operator is really
1475 /// helpful.
1476 ///
1477 OpaqueValueMapping(CodeGenFunction &CGF,
1479 : CGF(CGF) {
1481 // Leave Data empty.
1482 return;
1483
1486 e->getCommon());
1487 }
1488
1489 /// Build the opaque value mapping for an OpaqueValueExpr whose source
1490 /// expression is set to the expression the OVE represents.
1491 OpaqueValueMapping(CodeGenFunction &CGF, const OpaqueValueExpr *OV)
1492 : CGF(CGF) {
1493 if (OV) {
1494 assert(OV->getSourceExpr() && "wrong form of OpaqueValueMapping used "
1495 "for OVE with no source expression");
1496 Data = OpaqueValueMappingData::bind(CGF, OV, OV->getSourceExpr());
1497 }
1498 }
1499
1500 OpaqueValueMapping(CodeGenFunction &CGF, const OpaqueValueExpr *opaqueValue,
1501 LValue lvalue)
1502 : CGF(CGF),
1503 Data(OpaqueValueMappingData::bind(CGF, opaqueValue, lvalue)) {}
1504
1505 OpaqueValueMapping(CodeGenFunction &CGF, const OpaqueValueExpr *opaqueValue,
1506 RValue rvalue)
1507 : CGF(CGF),
1508 Data(OpaqueValueMappingData::bind(CGF, opaqueValue, rvalue)) {}
1509
1510 void pop() {
1511 Data.unbind(CGF);
1512 Data.clear();
1513 }
1514
1516 if (Data.isValid())
1517 Data.unbind(CGF);
1518 }
1519 };
1520
1521private:
1522 CGDebugInfo *DebugInfo;
1523 /// Used to create unique names for artificial VLA size debug info variables.
1524 unsigned VLAExprCounter = 0;
1525 bool DisableDebugInfo = false;
1526
1527 /// DidCallStackSave - Whether llvm.stacksave has been called. Used to avoid
1528 /// calling llvm.stacksave for multiple VLAs in the same scope.
1529 bool DidCallStackSave = false;
1530
1531 /// IndirectBranch - The first time an indirect goto is seen we create a block
1532 /// with an indirect branch. Every time we see the address of a label taken,
1533 /// we add the label to the indirect goto. Every subsequent indirect goto is
1534 /// codegen'd as a jump to the IndirectBranch's basic block.
1535 llvm::IndirectBrInst *IndirectBranch = nullptr;
1536
1537 /// LocalDeclMap - This keeps track of the LLVM allocas or globals for local C
1538 /// decls.
1539 DeclMapTy LocalDeclMap;
1540
1541 // Keep track of the cleanups for callee-destructed parameters pushed to the
1542 // cleanup stack so that they can be deactivated later.
1543 llvm::DenseMap<const ParmVarDecl *, EHScopeStack::stable_iterator>
1544 CalleeDestructedParamCleanups;
1545
1546 /// SizeArguments - If a ParmVarDecl had the pass_object_size attribute, this
1547 /// will contain a mapping from said ParmVarDecl to its implicit "object_size"
1548 /// parameter.
1549 llvm::SmallDenseMap<const ParmVarDecl *, const ImplicitParamDecl *, 2>
1550 SizeArguments;
1551
1552 /// Track escaped local variables with auto storage. Used during SEH
1553 /// outlining to produce a call to llvm.localescape.
1554 llvm::DenseMap<llvm::AllocaInst *, int> EscapedLocals;
1555
1556 /// LabelMap - This keeps track of the LLVM basic block for each C label.
1557 llvm::DenseMap<const LabelDecl *, JumpDest> LabelMap;
1558
1559 // BreakContinueStack - This keeps track of where break and continue
1560 // statements should jump to.
1561 struct BreakContinue {
1562 BreakContinue(const Stmt &LoopOrSwitch, JumpDest Break, JumpDest Continue)
1563 : LoopOrSwitch(&LoopOrSwitch), BreakBlock(Break),
1564 ContinueBlock(Continue) {}
1565
1566 const Stmt *LoopOrSwitch;
1567 JumpDest BreakBlock;
1568 JumpDest ContinueBlock;
1569 };
1570 SmallVector<BreakContinue, 8> BreakContinueStack;
1571
1572 /// Handles cancellation exit points in OpenMP-related constructs.
1573 class OpenMPCancelExitStack {
1574 /// Tracks cancellation exit point and join point for cancel-related exit
1575 /// and normal exit.
1576 struct CancelExit {
1577 CancelExit() = default;
1578 CancelExit(OpenMPDirectiveKind Kind, JumpDest ExitBlock,
1579 JumpDest ContBlock)
1580 : Kind(Kind), ExitBlock(ExitBlock), ContBlock(ContBlock) {}
1581 OpenMPDirectiveKind Kind = llvm::omp::OMPD_unknown;
1582 /// true if the exit block has been emitted already by the special
1583 /// emitExit() call, false if the default codegen is used.
1584 bool HasBeenEmitted = false;
1585 JumpDest ExitBlock;
1586 JumpDest ContBlock;
1587 };
1588
1589 SmallVector<CancelExit, 8> Stack;
1590
1591 public:
1592 OpenMPCancelExitStack() : Stack(1) {}
1593 ~OpenMPCancelExitStack() = default;
1594 /// Fetches the exit block for the current OpenMP construct.
1595 JumpDest getExitBlock() const { return Stack.back().ExitBlock; }
1596 /// Emits exit block with special codegen procedure specific for the related
1597 /// OpenMP construct + emits code for normal construct cleanup.
1598 void emitExit(CodeGenFunction &CGF, OpenMPDirectiveKind Kind,
1599 const llvm::function_ref<void(CodeGenFunction &)> CodeGen) {
1600 if (Stack.back().Kind == Kind && getExitBlock().isValid()) {
1601 assert(CGF.getOMPCancelDestination(Kind).isValid());
1602 assert(CGF.HaveInsertPoint());
1603 assert(!Stack.back().HasBeenEmitted);
1604 auto IP = CGF.Builder.saveAndClearIP();
1605 CGF.EmitBlock(Stack.back().ExitBlock.getBlock());
1606 CodeGen(CGF);
1607 CGF.EmitBranch(Stack.back().ContBlock.getBlock());
1608 CGF.Builder.restoreIP(IP);
1609 Stack.back().HasBeenEmitted = true;
1610 }
1611 CodeGen(CGF);
1612 }
1613 /// Enter the cancel supporting \a Kind construct.
1614 /// \param Kind OpenMP directive that supports cancel constructs.
1615 /// \param HasCancel true, if the construct has inner cancel directive,
1616 /// false otherwise.
1617 void enter(CodeGenFunction &CGF, OpenMPDirectiveKind Kind, bool HasCancel) {
1618 Stack.push_back({Kind,
1619 HasCancel ? CGF.getJumpDestInCurrentScope("cancel.exit")
1620 : JumpDest(),
1621 HasCancel ? CGF.getJumpDestInCurrentScope("cancel.cont")
1622 : JumpDest()});
1623 }
1624 /// Emits default exit point for the cancel construct (if the special one
1625 /// has not be used) + join point for cancel/normal exits.
1626 void exit(CodeGenFunction &CGF) {
1627 if (getExitBlock().isValid()) {
1628 assert(CGF.getOMPCancelDestination(Stack.back().Kind).isValid());
1629 bool HaveIP = CGF.HaveInsertPoint();
1630 if (!Stack.back().HasBeenEmitted) {
1631 if (HaveIP)
1632 CGF.EmitBranchThroughCleanup(Stack.back().ContBlock);
1633 CGF.EmitBlock(Stack.back().ExitBlock.getBlock());
1634 CGF.EmitBranchThroughCleanup(Stack.back().ContBlock);
1635 }
1636 CGF.EmitBlock(Stack.back().ContBlock.getBlock());
1637 if (!HaveIP) {
1638 CGF.Builder.CreateUnreachable();
1639 CGF.Builder.ClearInsertionPoint();
1640 }
1641 }
1642 Stack.pop_back();
1643 }
1644 };
1645 OpenMPCancelExitStack OMPCancelStack;
1646
1647 /// Lower the Likelihood knowledge about the \p Cond via llvm.expect intrin.
1648 llvm::Value *emitCondLikelihoodViaExpectIntrinsic(llvm::Value *Cond,
1649 Stmt::Likelihood LH);
1650
1651 std::unique_ptr<CodeGenPGO> PGO;
1652
1653 /// Calculate branch weights appropriate for PGO data
1654 llvm::MDNode *createProfileWeights(uint64_t TrueCount,
1655 uint64_t FalseCount) const;
1656 llvm::MDNode *createProfileWeights(ArrayRef<uint64_t> Weights) const;
1657 llvm::MDNode *createProfileWeightsForLoop(const Stmt *Cond,
1658 uint64_t LoopCount) const;
1659
1660public:
1661 bool hasSkipCounter(const Stmt *S) const;
1662
1663 void markStmtAsUsed(bool Skipped, const Stmt *S);
1664 void markStmtMaybeUsed(const Stmt *S);
1665
1666 /// Used to specify which counter in a pair shall be incremented.
1667 /// For non-binary counters, a skip counter is derived as (Parent - Exec).
1668 /// In contrast for binary counters, a skip counter cannot be computed from
1669 /// the Parent counter. In such cases, dedicated SkipPath counters must be
1670 /// allocated and marked (incremented as binary counters). (Parent can be
1671 /// synthesized with (Exec + Skip) in simple cases)
1673 UseExecPath = 0, ///< Exec (true)
1674 UseSkipPath, ///< Skip (false)
1675 };
1676
1677 /// Increment the profiler's counter for the given statement by \p StepV.
1678 /// If \p StepV is null, the default increment is 1.
1679 void incrementProfileCounter(const Stmt *S, llvm::Value *StepV = nullptr) {
1680 incrementProfileCounter(UseExecPath, S, false, StepV);
1681 }
1682
1683 /// Emit increment of Counter.
1684 /// \param ExecSkip Use `Skipped` Counter if UseSkipPath is specified.
1685 /// \param S The Stmt that Counter is associated.
1686 /// \param UseBoth Mark both Exec/Skip as used. (for verification)
1687 /// \param StepV The offset Value for adding to Counter.
1688 void incrementProfileCounter(CounterForIncrement ExecSkip, const Stmt *S,
1689 bool UseBoth = false,
1690 llvm::Value *StepV = nullptr);
1691
1693 return (CGM.getCodeGenOpts().hasProfileClangInstr() &&
1694 CGM.getCodeGenOpts().MCDCCoverage &&
1695 !CurFn->hasFnAttribute(llvm::Attribute::NoProfile));
1696 }
1697
1698 /// Allocate a temp value on the stack that MCDC can use to track condition
1699 /// results.
1701
1702 bool isBinaryLogicalOp(const Expr *E) const {
1703 const BinaryOperator *BOp = dyn_cast<BinaryOperator>(E->IgnoreParens());
1704 return (BOp && BOp->isLogicalOp());
1705 }
1706
1707 bool isMCDCDecisionExpr(const Expr *E) const;
1708 bool isMCDCBranchExpr(const Expr *E) const;
1709
1710 /// Zero-init the MCDC temp value.
1711 void maybeResetMCDCCondBitmap(const Expr *E);
1712
1713 /// Increment the profiler's counter for the given expression by \p StepV.
1714 /// If \p StepV is null, the default increment is 1.
1716
1717 /// Update the MCDC temp value with the condition's evaluated result.
1718 void maybeUpdateMCDCCondBitmap(const Expr *E, llvm::Value *Val);
1719
1720 /// Get the profiler's count for the given statement.
1721 uint64_t getProfileCount(const Stmt *S);
1722
1723 /// Set the profiler's current count.
1724 void setCurrentProfileCount(uint64_t Count);
1725
1726 /// Get the profiler's current count. This is generally the count for the most
1727 /// recently incremented counter.
1728 uint64_t getCurrentProfileCount();
1729
1730 /// See CGDebugInfo::addInstToCurrentSourceAtom.
1731 void addInstToCurrentSourceAtom(llvm::Instruction *KeyInstruction,
1732 llvm::Value *Backup);
1733
1734 /// See CGDebugInfo::addInstToSpecificSourceAtom.
1735 void addInstToSpecificSourceAtom(llvm::Instruction *KeyInstruction,
1736 llvm::Value *Backup, uint64_t Atom);
1737
1738 /// Add \p KeyInstruction and an optional \p Backup instruction to a new atom
1739 /// group (See ApplyAtomGroup for more info).
1740 void addInstToNewSourceAtom(llvm::Instruction *KeyInstruction,
1741 llvm::Value *Backup);
1742
1743 /// Copy all PFP fields from SrcPtr to DestPtr while updating signatures,
1744 /// assuming that DestPtr was already memcpy'd from SrcPtr.
1745 void emitPFPPostCopyUpdates(Address DestPtr, Address SrcPtr, QualType Ty);
1746
1747private:
1748 /// SwitchInsn - This is nearest current switch instruction. It is null if
1749 /// current context is not in a switch.
1750 llvm::SwitchInst *SwitchInsn = nullptr;
1751 /// The branch weights of SwitchInsn when doing instrumentation based PGO.
1752 SmallVector<uint64_t, 16> *SwitchWeights = nullptr;
1753
1754 /// The likelihood attributes of the SwitchCase.
1755 SmallVector<Stmt::Likelihood, 16> *SwitchLikelihood = nullptr;
1756
1757 /// CaseRangeBlock - This block holds if condition check for last case
1758 /// statement range in current switch instruction.
1759 llvm::BasicBlock *CaseRangeBlock = nullptr;
1760
1761 /// OpaqueLValues - Keeps track of the current set of opaque value
1762 /// expressions.
1763 llvm::DenseMap<const OpaqueValueExpr *, LValue> OpaqueLValues;
1764 llvm::DenseMap<const OpaqueValueExpr *, RValue> OpaqueRValues;
1765
1766 // VLASizeMap - This keeps track of the associated size for each VLA type.
1767 // We track this by the size expression rather than the type itself because
1768 // in certain situations, like a const qualifier applied to an VLA typedef,
1769 // multiple VLA types can share the same size expression.
1770 // FIXME: Maybe this could be a stack of maps that is pushed/popped as we
1771 // enter/leave scopes.
1772 llvm::DenseMap<const Expr *, llvm::Value *> VLASizeMap;
1773
1774 /// A block containing a single 'unreachable' instruction. Created
1775 /// lazily by getUnreachableBlock().
1776 llvm::BasicBlock *UnreachableBlock = nullptr;
1777
1778 /// Counts of the number return expressions in the function.
1779 unsigned NumReturnExprs = 0;
1780
1781 /// Count the number of simple (constant) return expressions in the function.
1782 unsigned NumSimpleReturnExprs = 0;
1783
1784 /// The last regular (non-return) debug location (breakpoint) in the function.
1785 SourceLocation LastStopPoint;
1786
1787public:
1788 /// Source location information about the default argument or member
1789 /// initializer expression we're evaluating, if any.
1793
1794 /// A scope within which we are constructing the fields of an object which
1795 /// might use a CXXDefaultInitExpr. This stashes away a 'this' value to use
1796 /// if we need to evaluate a CXXDefaultInitExpr within the evaluation.
1798 public:
1799 FieldConstructionScope(CodeGenFunction &CGF, Address This)
1800 : CGF(CGF), OldCXXDefaultInitExprThis(CGF.CXXDefaultInitExprThis) {
1801 CGF.CXXDefaultInitExprThis = This;
1802 }
1804 CGF.CXXDefaultInitExprThis = OldCXXDefaultInitExprThis;
1805 }
1806
1807 private:
1808 CodeGenFunction &CGF;
1809 Address OldCXXDefaultInitExprThis;
1810 };
1811
1812 /// The scope of a CXXDefaultInitExpr. Within this scope, the value of 'this'
1813 /// is overridden to be the object under construction.
1815 public:
1817 : CGF(CGF), OldCXXThisValue(CGF.CXXThisValue),
1818 OldCXXThisAlignment(CGF.CXXThisAlignment),
1820 CGF.CXXThisValue = CGF.CXXDefaultInitExprThis.getBasePointer();
1821 CGF.CXXThisAlignment = CGF.CXXDefaultInitExprThis.getAlignment();
1822 }
1824 CGF.CXXThisValue = OldCXXThisValue;
1825 CGF.CXXThisAlignment = OldCXXThisAlignment;
1826 }
1827
1828 public:
1829 CodeGenFunction &CGF;
1830 llvm::Value *OldCXXThisValue;
1833 };
1834
1839
1840 /// The scope of an ArrayInitLoopExpr. Within this scope, the value of the
1841 /// current loop index is overridden.
1843 public:
1844 ArrayInitLoopExprScope(CodeGenFunction &CGF, llvm::Value *Index)
1845 : CGF(CGF), OldArrayInitIndex(CGF.ArrayInitIndex) {
1846 CGF.ArrayInitIndex = Index;
1847 }
1848 ~ArrayInitLoopExprScope() { CGF.ArrayInitIndex = OldArrayInitIndex; }
1849
1850 private:
1851 CodeGenFunction &CGF;
1852 llvm::Value *OldArrayInitIndex;
1853 };
1854
1856 public:
1858 : CGF(CGF), OldCurGD(CGF.CurGD), OldCurFuncDecl(CGF.CurFuncDecl),
1859 OldCurCodeDecl(CGF.CurCodeDecl),
1860 OldCXXABIThisDecl(CGF.CXXABIThisDecl),
1861 OldCXXABIThisValue(CGF.CXXABIThisValue),
1862 OldCXXThisValue(CGF.CXXThisValue),
1863 OldCXXABIThisAlignment(CGF.CXXABIThisAlignment),
1864 OldCXXThisAlignment(CGF.CXXThisAlignment),
1865 OldReturnValue(CGF.ReturnValue), OldFnRetTy(CGF.FnRetTy),
1866 OldCXXInheritedCtorInitExprArgs(
1867 std::move(CGF.CXXInheritedCtorInitExprArgs)) {
1868 CGF.CurGD = GD;
1869 CGF.CurFuncDecl = CGF.CurCodeDecl =
1871 CGF.CXXABIThisDecl = nullptr;
1872 CGF.CXXABIThisValue = nullptr;
1873 CGF.CXXThisValue = nullptr;
1874 CGF.CXXABIThisAlignment = CharUnits();
1875 CGF.CXXThisAlignment = CharUnits();
1876 CGF.ReturnValue = Address::invalid();
1877 CGF.FnRetTy = QualType();
1878 CGF.CXXInheritedCtorInitExprArgs.clear();
1879 }
1881 CGF.CurGD = OldCurGD;
1882 CGF.CurFuncDecl = OldCurFuncDecl;
1883 CGF.CurCodeDecl = OldCurCodeDecl;
1884 CGF.CXXABIThisDecl = OldCXXABIThisDecl;
1885 CGF.CXXABIThisValue = OldCXXABIThisValue;
1886 CGF.CXXThisValue = OldCXXThisValue;
1887 CGF.CXXABIThisAlignment = OldCXXABIThisAlignment;
1888 CGF.CXXThisAlignment = OldCXXThisAlignment;
1889 CGF.ReturnValue = OldReturnValue;
1890 CGF.FnRetTy = OldFnRetTy;
1891 CGF.CXXInheritedCtorInitExprArgs =
1892 std::move(OldCXXInheritedCtorInitExprArgs);
1893 }
1894
1895 private:
1896 CodeGenFunction &CGF;
1897 GlobalDecl OldCurGD;
1898 const Decl *OldCurFuncDecl;
1899 const Decl *OldCurCodeDecl;
1900 ImplicitParamDecl *OldCXXABIThisDecl;
1901 llvm::Value *OldCXXABIThisValue;
1902 llvm::Value *OldCXXThisValue;
1903 CharUnits OldCXXABIThisAlignment;
1904 CharUnits OldCXXThisAlignment;
1905 Address OldReturnValue;
1906 QualType OldFnRetTy;
1907 CallArgList OldCXXInheritedCtorInitExprArgs;
1908 };
1909
1910 // Helper class for the OpenMP IR Builder. Allows reusability of code used for
1911 // region body, and finalization codegen callbacks. This will class will also
1912 // contain privatization functions used by the privatization call backs
1913 //
1914 // TODO: this is temporary class for things that are being moved out of
1915 // CGOpenMPRuntime, new versions of current CodeGenFunction methods, or
1916 // utility function for use with the OMPBuilder. Once that move to use the
1917 // OMPBuilder is done, everything here will either become part of CodeGenFunc.
1918 // directly, or a new helper class that will contain functions used by both
1919 // this and the OMPBuilder
1920
1922
1926
1927 using InsertPointTy = llvm::OpenMPIRBuilder::InsertPointTy;
1928
1929 /// Cleanup action for allocate support.
1930 class OMPAllocateCleanupTy final : public EHScopeStack::Cleanup {
1931
1932 private:
1933 llvm::CallInst *RTLFnCI;
1934
1935 public:
1936 OMPAllocateCleanupTy(llvm::CallInst *RLFnCI) : RTLFnCI(RLFnCI) {
1937 RLFnCI->removeFromParent();
1938 }
1939
1940 void Emit(CodeGenFunction &CGF, Flags /*flags*/) override {
1941 if (!CGF.HaveInsertPoint())
1942 return;
1943 CGF.Builder.Insert(RTLFnCI);
1944 }
1945 };
1946
1947 /// Returns address of the threadprivate variable for the current
1948 /// thread. This Also create any necessary OMP runtime calls.
1949 ///
1950 /// \param VD VarDecl for Threadprivate variable.
1951 /// \param VDAddr Address of the Vardecl
1952 /// \param Loc The location where the barrier directive was encountered
1953 static Address getAddrOfThreadPrivate(CodeGenFunction &CGF,
1954 const VarDecl *VD, Address VDAddr,
1955 SourceLocation Loc);
1956
1957 /// Gets the OpenMP-specific address of the local variable /p VD.
1958 static Address getAddressOfLocalVariable(CodeGenFunction &CGF,
1959 const VarDecl *VD);
1960 /// Get the platform-specific name separator.
1961 /// \param Parts different parts of the final name that needs separation
1962 /// \param FirstSeparator First separator used between the initial two
1963 /// parts of the name.
1964 /// \param Separator separator used between all of the rest consecutinve
1965 /// parts of the name
1966 static std::string getNameWithSeparators(ArrayRef<StringRef> Parts,
1967 StringRef FirstSeparator = ".",
1968 StringRef Separator = ".");
1969 /// Emit the Finalization for an OMP region
1970 /// \param CGF The Codegen function this belongs to
1971 /// \param IP Insertion point for generating the finalization code.
1972 static void FinalizeOMPRegion(CodeGenFunction &CGF, InsertPointTy IP) {
1973 CGBuilderTy::InsertPointGuard IPG(CGF.Builder);
1974 assert(IP.getBlock()->end() != IP.getPoint() &&
1975 "OpenMP IR Builder should cause terminated block!");
1976
1977 llvm::BasicBlock *IPBB = IP.getBlock();
1978 llvm::BasicBlock *DestBB = IPBB->getUniqueSuccessor();
1979 assert(DestBB && "Finalization block should have one successor!");
1980
1981 // erase and replace with cleanup branch.
1982 IPBB->getTerminator()->eraseFromParent();
1983 CGF.Builder.SetInsertPoint(IPBB);
1985 CGF.EmitBranchThroughCleanup(Dest);
1986 }
1987
1988 /// Emit the body of an OMP region
1989 /// \param CGF The Codegen function this belongs to
1990 /// \param RegionBodyStmt The body statement for the OpenMP region being
1991 /// generated
1992 /// \param AllocaIP Where to insert alloca instructions
1993 /// \param CodeGenIP Where to insert the region code
1994 /// \param RegionName Name to be used for new blocks
1995 static void EmitOMPInlinedRegionBody(CodeGenFunction &CGF,
1996 const Stmt *RegionBodyStmt,
1997 InsertPointTy AllocaIP,
1998 InsertPointTy CodeGenIP,
1999 Twine RegionName);
2000
2001 static void EmitCaptureStmt(CodeGenFunction &CGF, InsertPointTy CodeGenIP,
2002 llvm::BasicBlock &FiniBB, llvm::Function *Fn,
2004 llvm::BasicBlock *CodeGenIPBB = CodeGenIP.getBlock();
2005 if (llvm::Instruction *CodeGenIPBBTI = CodeGenIPBB->getTerminator())
2006 CodeGenIPBBTI->eraseFromParent();
2007
2008 CGF.Builder.SetInsertPoint(CodeGenIPBB);
2009
2010 if (Fn->doesNotThrow())
2011 CGF.EmitNounwindRuntimeCall(Fn, Args);
2012 else
2013 CGF.EmitRuntimeCall(Fn, Args);
2014
2015 if (CGF.Builder.saveIP().isSet())
2016 CGF.Builder.CreateBr(&FiniBB);
2017 }
2018
2019 /// Emit the body of an OMP region that will be outlined in
2020 /// OpenMPIRBuilder::finalize().
2021 /// \param CGF The Codegen function this belongs to
2022 /// \param RegionBodyStmt The body statement for the OpenMP region being
2023 /// generated
2024 /// \param AllocaIP Where to insert alloca instructions
2025 /// \param CodeGenIP Where to insert the region code
2026 /// \param RegionName Name to be used for new blocks
2027 static void EmitOMPOutlinedRegionBody(CodeGenFunction &CGF,
2028 const Stmt *RegionBodyStmt,
2029 InsertPointTy AllocaIP,
2030 InsertPointTy CodeGenIP,
2031 Twine RegionName);
2032
2033 /// RAII for preserving necessary info during Outlined region body codegen.
2035
2036 llvm::AssertingVH<llvm::Instruction> OldAllocaIP;
2037 CodeGenFunction::JumpDest OldReturnBlock;
2038 CodeGenFunction &CGF;
2039
2040 public:
2041 OutlinedRegionBodyRAII(CodeGenFunction &cgf, InsertPointTy &AllocaIP,
2042 llvm::BasicBlock &RetBB)
2043 : CGF(cgf) {
2044 assert(AllocaIP.isSet() &&
2045 "Must specify Insertion point for allocas of outlined function");
2046 OldAllocaIP = CGF.AllocaInsertPt;
2047 CGF.AllocaInsertPt = &*AllocaIP.getPoint();
2048
2049 OldReturnBlock = CGF.ReturnBlock;
2050 CGF.ReturnBlock = CGF.getJumpDestInCurrentScope(&RetBB);
2051 }
2052
2054 CGF.AllocaInsertPt = OldAllocaIP;
2055 CGF.ReturnBlock = OldReturnBlock;
2056 }
2057 };
2058
2059 /// RAII for preserving necessary info during inlined region body codegen.
2061
2062 llvm::AssertingVH<llvm::Instruction> OldAllocaIP;
2063 CodeGenFunction &CGF;
2064
2065 public:
2066 InlinedRegionBodyRAII(CodeGenFunction &cgf, InsertPointTy &AllocaIP,
2067 llvm::BasicBlock &FiniBB)
2068 : CGF(cgf) {
2069 // Alloca insertion block should be in the entry block of the containing
2070 // function so it expects an empty AllocaIP in which case will reuse the
2071 // old alloca insertion point, or a new AllocaIP in the same block as
2072 // the old one
2073 assert((!AllocaIP.isSet() ||
2074 CGF.AllocaInsertPt->getParent() == AllocaIP.getBlock()) &&
2075 "Insertion point should be in the entry block of containing "
2076 "function!");
2077 OldAllocaIP = CGF.AllocaInsertPt;
2078 if (AllocaIP.isSet())
2079 CGF.AllocaInsertPt = &*AllocaIP.getPoint();
2080
2081 // TODO: Remove the call, after making sure the counter is not used by
2082 // the EHStack.
2083 // Since this is an inlined region, it should not modify the
2084 // ReturnBlock, and should reuse the one for the enclosing outlined
2085 // region. So, the JumpDest being return by the function is discarded
2086 (void)CGF.getJumpDestInCurrentScope(&FiniBB);
2087 }
2088
2089 ~InlinedRegionBodyRAII() { CGF.AllocaInsertPt = OldAllocaIP; }
2090 };
2091 };
2092
2093private:
2094 /// CXXThisDecl - When generating code for a C++ member function,
2095 /// this will hold the implicit 'this' declaration.
2096 ImplicitParamDecl *CXXABIThisDecl = nullptr;
2097 llvm::Value *CXXABIThisValue = nullptr;
2098 llvm::Value *CXXThisValue = nullptr;
2099 CharUnits CXXABIThisAlignment;
2100 CharUnits CXXThisAlignment;
2101
2102 /// The value of 'this' to use when evaluating CXXDefaultInitExprs within
2103 /// this expression.
2104 Address CXXDefaultInitExprThis = Address::invalid();
2105
2106 /// The current array initialization index when evaluating an
2107 /// ArrayInitIndexExpr within an ArrayInitLoopExpr.
2108 llvm::Value *ArrayInitIndex = nullptr;
2109
2110 /// The values of function arguments to use when evaluating
2111 /// CXXInheritedCtorInitExprs within this context.
2112 CallArgList CXXInheritedCtorInitExprArgs;
2113
2114 /// CXXStructorImplicitParamDecl - When generating code for a constructor or
2115 /// destructor, this will hold the implicit argument (e.g. VTT).
2116 ImplicitParamDecl *CXXStructorImplicitParamDecl = nullptr;
2117 llvm::Value *CXXStructorImplicitParamValue = nullptr;
2118
2119 /// OutermostConditional - Points to the outermost active
2120 /// conditional control. This is used so that we know if a
2121 /// temporary should be destroyed conditionally.
2122 ConditionalEvaluation *OutermostConditional = nullptr;
2123
2124 /// The current lexical scope.
2125 LexicalScope *CurLexicalScope = nullptr;
2126
2127 /// The current source location that should be used for exception
2128 /// handling code.
2129 SourceLocation CurEHLocation;
2130
2131 /// BlockByrefInfos - For each __block variable, contains
2132 /// information about the layout of the variable.
2133 llvm::DenseMap<const ValueDecl *, BlockByrefInfo> BlockByrefInfos;
2134
2135 /// Used by -fsanitize=nullability-return to determine whether the return
2136 /// value can be checked.
2137 llvm::Value *RetValNullabilityPrecondition = nullptr;
2138
2139 /// Check if -fsanitize=nullability-return instrumentation is required for
2140 /// this function.
2141 bool requiresReturnValueNullabilityCheck() const {
2142 return RetValNullabilityPrecondition;
2143 }
2144
2145 /// Used to store precise source locations for return statements by the
2146 /// runtime return value checks.
2147 Address ReturnLocation = Address::invalid();
2148
2149 /// Check if the return value of this function requires sanitization.
2150 bool requiresReturnValueCheck() const;
2151
2152 bool isInAllocaArgument(CGCXXABI &ABI, QualType Ty);
2153 bool hasInAllocaArg(const CXXMethodDecl *MD);
2154
2155 llvm::BasicBlock *TerminateLandingPad = nullptr;
2156 llvm::BasicBlock *TerminateHandler = nullptr;
2158
2159 /// Terminate funclets keyed by parent funclet pad.
2160 llvm::MapVector<llvm::Value *, llvm::BasicBlock *> TerminateFunclets;
2161
2162 /// Largest vector width used in ths function. Will be used to create a
2163 /// function attribute.
2164 unsigned LargestVectorWidth = 0;
2165
2166 /// True if we need emit the life-time markers. This is initially set in
2167 /// the constructor, but could be overwritten to true if this is a coroutine.
2168 bool ShouldEmitLifetimeMarkers;
2169
2170 /// Add OpenCL kernel arg metadata and the kernel attribute metadata to
2171 /// the function metadata.
2172 void EmitKernelMetadata(const FunctionDecl *FD, llvm::Function *Fn);
2173
2174public:
2175 CodeGenFunction(CodeGenModule &cgm, bool suppressNewContext = false);
2177
2178 CodeGenTypes &getTypes() const { return CGM.getTypes(); }
2179 ASTContext &getContext() const { return CGM.getContext(); }
2181 if (DisableDebugInfo)
2182 return nullptr;
2183 return DebugInfo;
2184 }
2185 void disableDebugInfo() { DisableDebugInfo = true; }
2186 void enableDebugInfo() { DisableDebugInfo = false; }
2187
2189 return CGM.getCodeGenOpts().OptimizationLevel == 0;
2190 }
2191
2192 const LangOptions &getLangOpts() const { return CGM.getLangOpts(); }
2193
2194 /// Returns a pointer to the function's exception object and selector slot,
2195 /// which is assigned in every landing pad.
2198
2199 /// Returns the contents of the function's exception object and selector
2200 /// slots.
2201 llvm::Value *getExceptionFromSlot();
2202 llvm::Value *getSelectorFromSlot();
2203
2205
2206 llvm::BasicBlock *getUnreachableBlock() {
2207 if (!UnreachableBlock) {
2208 UnreachableBlock = createBasicBlock("unreachable");
2209 new llvm::UnreachableInst(getLLVMContext(), UnreachableBlock);
2210 }
2211 return UnreachableBlock;
2212 }
2213
2214 llvm::BasicBlock *getInvokeDest() {
2215 if (!EHStack.requiresLandingPad())
2216 return nullptr;
2217 return getInvokeDestImpl();
2218 }
2219
2220 bool currentFunctionUsesSEHTry() const { return !!CurSEHParent; }
2221
2222 const TargetInfo &getTarget() const { return Target; }
2223 llvm::LLVMContext &getLLVMContext() { return CGM.getLLVMContext(); }
2225 return CGM.getTargetCodeGenInfo();
2226 }
2227
2228 //===--------------------------------------------------------------------===//
2229 // Cleanups
2230 //===--------------------------------------------------------------------===//
2231
2232 typedef void Destroyer(CodeGenFunction &CGF, Address addr, QualType ty);
2233
2234 void pushIrregularPartialArrayCleanup(llvm::Value *arrayBegin,
2235 Address arrayEndPointer,
2236 QualType elementType,
2237 CharUnits elementAlignment,
2238 Destroyer *destroyer);
2239 void pushRegularPartialArrayCleanup(llvm::Value *arrayBegin,
2240 llvm::Value *arrayEnd,
2241 QualType elementType,
2242 CharUnits elementAlignment,
2243 Destroyer *destroyer);
2244
2245 void pushDestroy(QualType::DestructionKind dtorKind, Address addr,
2246 QualType type);
2248 QualType type);
2250 Destroyer *destroyer, bool useEHCleanupForArray);
2252 Address addr, QualType type);
2254 QualType type, Destroyer *destroyer,
2255 bool useEHCleanupForArray);
2257 QualType type, Destroyer *destroyer,
2258 bool useEHCleanupForArray);
2260 Address addr, QualType type);
2261 void pushCallObjectDeleteCleanup(const FunctionDecl *OperatorDelete,
2262 llvm::Value *CompletePtr,
2263 QualType ElementType);
2266 std::pair<llvm::Value *, llvm::Value *> AddrSizePair);
2267 void emitDestroy(Address addr, QualType type, Destroyer *destroyer,
2268 bool useEHCleanupForArray);
2269 llvm::Function *generateDestroyHelper(Address addr, QualType type,
2270 Destroyer *destroyer,
2271 bool useEHCleanupForArray,
2272 const VarDecl *VD);
2273 void emitArrayDestroy(llvm::Value *begin, llvm::Value *end,
2274 QualType elementType, CharUnits elementAlign,
2275 Destroyer *destroyer, bool checkZeroLength,
2276 bool useEHCleanup);
2277
2279
2280 /// Determines whether an EH cleanup is required to destroy a type
2281 /// with the given destruction kind.
2283 switch (kind) {
2284 case QualType::DK_none:
2285 return false;
2289 return getLangOpts().Exceptions;
2291 return getLangOpts().Exceptions &&
2292 CGM.getCodeGenOpts().ObjCAutoRefCountExceptions;
2293 }
2294 llvm_unreachable("bad destruction kind");
2295 }
2296
2300
2301 //===--------------------------------------------------------------------===//
2302 // Objective-C
2303 //===--------------------------------------------------------------------===//
2304
2305 void GenerateObjCMethod(const ObjCMethodDecl *OMD);
2306
2307 void StartObjCMethod(const ObjCMethodDecl *MD, const ObjCContainerDecl *CD);
2308
2309 /// GenerateObjCGetter - Synthesize an Objective-C property getter function.
2311 const ObjCPropertyImplDecl *PID);
2312 void generateObjCGetterBody(const ObjCImplementationDecl *classImpl,
2313 const ObjCPropertyImplDecl *propImpl,
2314 const ObjCMethodDecl *GetterMothodDecl,
2315 llvm::Constant *AtomicHelperFn);
2316
2318 ObjCMethodDecl *MD, bool ctor);
2319
2320 /// GenerateObjCSetter - Synthesize an Objective-C property setter function
2321 /// for the given property.
2323 const ObjCPropertyImplDecl *PID);
2324 void generateObjCSetterBody(const ObjCImplementationDecl *classImpl,
2325 const ObjCPropertyImplDecl *propImpl,
2326 llvm::Constant *AtomicHelperFn);
2327
2328 //===--------------------------------------------------------------------===//
2329 // Block Bits
2330 //===--------------------------------------------------------------------===//
2331
2332 /// Emit block literal.
2333 /// \return an LLVM value which is a pointer to a struct which contains
2334 /// information about the block, including the block invoke function, the
2335 /// captured variables, etc.
2336 llvm::Value *EmitBlockLiteral(const BlockExpr *);
2337
2338 llvm::Function *GenerateBlockFunction(GlobalDecl GD, const CGBlockInfo &Info,
2339 const DeclMapTy &ldm,
2340 bool IsLambdaConversionToBlock,
2341 bool BuildGlobalBlock);
2342
2343 /// Check if \p T is a C++ class that has a destructor that can throw.
2344 static bool cxxDestructorCanThrow(QualType T);
2345
2346 llvm::Constant *GenerateCopyHelperFunction(const CGBlockInfo &blockInfo);
2347 llvm::Constant *GenerateDestroyHelperFunction(const CGBlockInfo &blockInfo);
2348 llvm::Constant *
2350 llvm::Constant *
2352 llvm::Value *EmitBlockCopyAndAutorelease(llvm::Value *Block, QualType Ty);
2353
2354 void BuildBlockRelease(llvm::Value *DeclPtr, BlockFieldFlags flags,
2355 bool CanThrow);
2356
2357 class AutoVarEmission;
2358
2359 void emitByrefStructureInit(const AutoVarEmission &emission);
2360
2361 /// Enter a cleanup to destroy a __block variable. Note that this
2362 /// cleanup should be a no-op if the variable hasn't left the stack
2363 /// yet; if a cleanup is required for the variable itself, that needs
2364 /// to be done externally.
2365 ///
2366 /// \param Kind Cleanup kind.
2367 ///
2368 /// \param Addr When \p LoadBlockVarAddr is false, the address of the __block
2369 /// structure that will be passed to _Block_object_dispose. When
2370 /// \p LoadBlockVarAddr is true, the address of the field of the block
2371 /// structure that holds the address of the __block structure.
2372 ///
2373 /// \param Flags The flag that will be passed to _Block_object_dispose.
2374 ///
2375 /// \param LoadBlockVarAddr Indicates whether we need to emit a load from
2376 /// \p Addr to get the address of the __block structure.
2378 bool LoadBlockVarAddr, bool CanThrow);
2379
2380 void setBlockContextParameter(const ImplicitParamDecl *D, unsigned argNum,
2381 llvm::Value *ptr);
2382
2385
2386 /// BuildBlockByrefAddress - Computes the location of the
2387 /// data in a variable which is declared as __block.
2389 bool followForward = true);
2391 bool followForward, const llvm::Twine &name);
2392
2393 const BlockByrefInfo &getBlockByrefInfo(const VarDecl *var);
2394
2396
2397 void GenerateCode(GlobalDecl GD, llvm::Function *Fn,
2398 const CGFunctionInfo &FnInfo);
2399
2400 /// Annotate the function with an attribute that disables TSan checking at
2401 /// runtime.
2402 void markAsIgnoreThreadCheckingAtRuntime(llvm::Function *Fn);
2403
2404 /// Emit code for the start of a function.
2405 /// \param Loc The location to be associated with the function.
2406 /// \param StartLoc The location of the function body.
2407 void StartFunction(GlobalDecl GD, QualType RetTy, llvm::Function *Fn,
2408 const CGFunctionInfo &FnInfo, const FunctionArgList &Args,
2410 SourceLocation StartLoc = SourceLocation());
2411
2412 static bool IsConstructorDelegationValid(const CXXConstructorDecl *Ctor);
2413
2417 void EmitFunctionBody(const Stmt *Body);
2418 void EmitBlockWithFallThrough(llvm::BasicBlock *BB, const Stmt *S);
2419
2420 void EmitForwardingCallToLambda(const CXXMethodDecl *LambdaCallOperator,
2421 CallArgList &CallArgs,
2422 const CGFunctionInfo *CallOpFnInfo = nullptr,
2423 llvm::Constant *CallOpFn = nullptr);
2427 CallArgList &CallArgs);
2428 void EmitLambdaInAllocaImplFn(const CXXMethodDecl *CallOp,
2429 const CGFunctionInfo **ImplFnInfo,
2430 llvm::Function **ImplFn);
2433 EmitStoreThroughLValue(RValue::get(VLASizeMap[VAT->getSizeExpr()]), LV);
2434 }
2435 void EmitAsanPrologueOrEpilogue(bool Prologue);
2436
2437 /// Emit the unified return block, trying to avoid its emission when
2438 /// possible.
2439 /// \return The debug location of the user written return statement if the
2440 /// return block is avoided.
2441 llvm::DebugLoc EmitReturnBlock();
2442
2443 /// FinishFunction - Complete IR generation of the current function. It is
2444 /// legal to call this function even if there is no current insertion point.
2446
2447 void StartThunk(llvm::Function *Fn, GlobalDecl GD,
2448 const CGFunctionInfo &FnInfo, bool IsUnprototyped);
2449
2450 void EmitCallAndReturnForThunk(llvm::FunctionCallee Callee,
2451 const ThunkInfo *Thunk, bool IsUnprototyped);
2452
2453 void FinishThunk();
2454
2455 /// Emit a musttail call for a thunk with a potentially adjusted this pointer.
2456 void EmitMustTailThunk(GlobalDecl GD, llvm::Value *AdjustedThisPtr,
2457 llvm::FunctionCallee Callee);
2458
2459 /// Generate a thunk for the given method.
2460 void generateThunk(llvm::Function *Fn, const CGFunctionInfo &FnInfo,
2461 GlobalDecl GD, const ThunkInfo &Thunk,
2462 bool IsUnprototyped);
2463
2464 llvm::Function *GenerateVarArgsThunk(llvm::Function *Fn,
2465 const CGFunctionInfo &FnInfo,
2466 GlobalDecl GD, const ThunkInfo &Thunk);
2467
2469 FunctionArgList &Args);
2470
2471 void EmitInitializerForField(FieldDecl *Field, LValue LHS, Expr *Init);
2472
2473 /// Struct with all information about dynamic [sub]class needed to set vptr.
2480
2481 /// Initialize the vtable pointer of the given subobject.
2482 void InitializeVTablePointer(const VPtr &vptr);
2483
2485
2487 VPtrsVector getVTablePointers(const CXXRecordDecl *VTableClass);
2488
2489 void getVTablePointers(BaseSubobject Base, const CXXRecordDecl *NearestVBase,
2490 CharUnits OffsetFromNearestVBase,
2491 bool BaseIsNonVirtualPrimaryBase,
2492 const CXXRecordDecl *VTableClass,
2493 VisitedVirtualBasesSetTy &VBases, VPtrsVector &vptrs);
2494
2495 void InitializeVTablePointers(const CXXRecordDecl *ClassDecl);
2496
2497 // VTableTrapMode - whether we guarantee that loading the
2498 // vtable is guaranteed to trap on authentication failure,
2499 // even if the resulting vtable pointer is unused.
2500 enum class VTableAuthMode {
2503 UnsafeUbsanStrip // Should only be used for Vptr UBSan check
2504 };
2505 /// GetVTablePtr - Return the Value of the vtable pointer member pointed
2506 /// to by This.
2507 llvm::Value *
2508 GetVTablePtr(Address This, llvm::Type *VTableTy,
2509 const CXXRecordDecl *VTableClass,
2511
2521
2522 /// Derived is the presumed address of an object of type T after a
2523 /// cast. If T is a polymorphic class type, emit a check that the virtual
2524 /// table for Derived belongs to a class derived from T.
2525 void EmitVTablePtrCheckForCast(QualType T, Address Derived, bool MayBeNull,
2527
2528 /// EmitVTablePtrCheckForCall - Virtual method MD is being called via VTable.
2529 /// If vptr CFI is enabled, emit a check that VTable is valid.
2530 void EmitVTablePtrCheckForCall(const CXXRecordDecl *RD, llvm::Value *VTable,
2532
2533 /// EmitVTablePtrCheck - Emit a check that VTable is a valid virtual table for
2534 /// RD using llvm.type.test.
2535 void EmitVTablePtrCheck(const CXXRecordDecl *RD, llvm::Value *VTable,
2537
2538 /// If whole-program virtual table optimization is enabled, emit an assumption
2539 /// that VTable is a member of RD's type identifier. Or, if vptr CFI is
2540 /// enabled, emit a check that VTable is a member of RD's type identifier.
2542 llvm::Value *VTable, SourceLocation Loc);
2543
2544 /// Returns whether we should perform a type checked load when loading a
2545 /// virtual function for virtual calls to members of RD. This is generally
2546 /// true when both vcall CFI and whole-program-vtables are enabled.
2548
2549 /// Emit a type checked load from the given vtable.
2550 llvm::Value *EmitVTableTypeCheckedLoad(const CXXRecordDecl *RD,
2551 llvm::Value *VTable,
2552 llvm::Type *VTableTy,
2553 uint64_t VTableByteOffset);
2554
2555 /// EnterDtorCleanups - Enter the cleanups necessary to complete the
2556 /// given phase of destruction for a destructor. The end result
2557 /// should call destructors on members and base classes in reverse
2558 /// order of their construction.
2560
2561 /// ShouldInstrumentFunction - Return true if the current function should be
2562 /// instrumented with __cyg_profile_func_* calls
2564
2565 /// ShouldSkipSanitizerInstrumentation - Return true if the current function
2566 /// should not be instrumented with sanitizers.
2568
2569 /// ShouldXRayInstrument - Return true if the current function should be
2570 /// instrumented with XRay nop sleds.
2571 bool ShouldXRayInstrumentFunction() const;
2572
2573 /// AlwaysEmitXRayCustomEvents - Return true if we must unconditionally emit
2574 /// XRay custom event handling calls.
2575 bool AlwaysEmitXRayCustomEvents() const;
2576
2577 /// AlwaysEmitXRayTypedEvents - Return true if clang must unconditionally emit
2578 /// XRay typed event handling calls.
2579 bool AlwaysEmitXRayTypedEvents() const;
2580
2581 /// Return a type hash constant for a function instrumented by
2582 /// -fsanitize=function.
2583 llvm::ConstantInt *getUBSanFunctionTypeHash(QualType T) const;
2584
2585 /// EmitFunctionProlog - Emit the target specific LLVM code to load the
2586 /// arguments for the given function. This is also responsible for naming the
2587 /// LLVM function arguments.
2588 void EmitFunctionProlog(const CGFunctionInfo &FI, llvm::Function *Fn,
2589 const FunctionArgList &Args);
2590
2591 /// EmitFunctionEpilog - Emit the target specific LLVM code to return the
2592 /// given temporary. Specify the source location atom group (Key Instructions
2593 /// debug info feature) for the `ret` using \p RetKeyInstructionsSourceAtom.
2594 /// If it's 0, the `ret` will get added to a new source atom group.
2595 void EmitFunctionEpilog(const CGFunctionInfo &FI, bool EmitRetDbgLoc,
2596 SourceLocation EndLoc,
2597 uint64_t RetKeyInstructionsSourceAtom);
2598
2599 /// Emit a test that checks if the return value \p RV is nonnull.
2600 void EmitReturnValueCheck(llvm::Value *RV);
2601
2602 /// EmitStartEHSpec - Emit the start of the exception spec.
2603 void EmitStartEHSpec(const Decl *D);
2604
2605 /// EmitEndEHSpec - Emit the end of the exception spec.
2606 void EmitEndEHSpec(const Decl *D);
2607
2608 /// getTerminateLandingPad - Return a landing pad that just calls terminate.
2609 llvm::BasicBlock *getTerminateLandingPad();
2610
2611 /// getTerminateLandingPad - Return a cleanup funclet that just calls
2612 /// terminate.
2613 llvm::BasicBlock *getTerminateFunclet();
2614
2615 /// getTerminateHandler - Return a handler (not a landing pad, just
2616 /// a catch handler) that just calls terminate. This is used when
2617 /// a terminate scope encloses a try.
2618 llvm::BasicBlock *getTerminateHandler();
2619
2620 llvm::Type *ConvertTypeForMem(QualType T);
2621 llvm::Type *ConvertType(QualType T);
2622 llvm::Type *convertTypeForLoadStore(QualType ASTTy,
2623 llvm::Type *LLVMTy = nullptr);
2624 llvm::Type *ConvertType(const TypeDecl *T) {
2625 return ConvertType(getContext().getTypeDeclType(T));
2626 }
2627
2628 /// LoadObjCSelf - Load the value of self. This function is only valid while
2629 /// generating code for an Objective-C method.
2630 llvm::Value *LoadObjCSelf();
2631
2632 /// TypeOfSelfObject - Return type of object that this self represents.
2634
2635 /// getEvaluationKind - Return the TypeEvaluationKind of QualType \c T.
2637
2639 return getEvaluationKind(T) == TEK_Scalar;
2640 }
2641
2643 return getEvaluationKind(T) == TEK_Aggregate;
2644 }
2645
2646 /// createBasicBlock - Create an LLVM basic block.
2647 llvm::BasicBlock *createBasicBlock(const Twine &name = "",
2648 llvm::Function *parent = nullptr,
2649 llvm::BasicBlock *before = nullptr) {
2650 return llvm::BasicBlock::Create(getLLVMContext(), name, parent, before);
2651 }
2652
2653 /// getBasicBlockForLabel - Return the LLVM basicblock that the specified
2654 /// label maps to.
2655 JumpDest getJumpDestForLabel(const LabelDecl *S);
2656
2657 /// SimplifyForwardingBlocks - If the given basic block is only a branch to
2658 /// another basic block, simplify it. This assumes that no other code could
2659 /// potentially reference the basic block.
2660 void SimplifyForwardingBlocks(llvm::BasicBlock *BB);
2661
2662 /// EmitBlock - Emit the given block \arg BB and set it as the insert point,
2663 /// adding a fall-through branch from the current insert block if
2664 /// necessary. It is legal to call this function even if there is no current
2665 /// insertion point.
2666 ///
2667 /// IsFinished - If true, indicates that the caller has finished emitting
2668 /// branches to the given block and does not expect to emit code into it. This
2669 /// means the block can be ignored if it is unreachable.
2670 void EmitBlock(llvm::BasicBlock *BB, bool IsFinished = false);
2671
2672 /// EmitBlockAfterUses - Emit the given block somewhere hopefully
2673 /// near its uses, and leave the insertion point in it.
2674 void EmitBlockAfterUses(llvm::BasicBlock *BB);
2675
2676 /// EmitBranch - Emit a branch to the specified basic block from the current
2677 /// insert block, taking care to avoid creation of branches from dummy
2678 /// blocks. It is legal to call this function even if there is no current
2679 /// insertion point.
2680 ///
2681 /// This function clears the current insertion point. The caller should follow
2682 /// calls to this function with calls to Emit*Block prior to generation new
2683 /// code.
2684 void EmitBranch(llvm::BasicBlock *Block);
2685
2686 /// HaveInsertPoint - True if an insertion point is defined. If not, this
2687 /// indicates that the current code being emitted is unreachable.
2688 bool HaveInsertPoint() const { return Builder.GetInsertBlock() != nullptr; }
2689
2690 /// EnsureInsertPoint - Ensure that an insertion point is defined so that
2691 /// emitted IR has a place to go. Note that by definition, if this function
2692 /// creates a block then that block is unreachable; callers may do better to
2693 /// detect when no insertion point is defined and simply skip IR generation.
2695 if (!HaveInsertPoint())
2697 }
2698
2699 /// ErrorUnsupported - Print out an error that codegen doesn't support the
2700 /// specified stmt yet.
2701 void ErrorUnsupported(const Stmt *S, const char *Type);
2702
2703 //===--------------------------------------------------------------------===//
2704 // Helpers
2705 //===--------------------------------------------------------------------===//
2706
2708 llvm::BasicBlock *LHSBlock,
2709 llvm::BasicBlock *RHSBlock,
2710 llvm::BasicBlock *MergeBlock,
2711 QualType MergedType) {
2712 Builder.SetInsertPoint(MergeBlock);
2713 llvm::PHINode *PtrPhi = Builder.CreatePHI(LHS.getType(), 2, "cond");
2714 PtrPhi->addIncoming(LHS.getBasePointer(), LHSBlock);
2715 PtrPhi->addIncoming(RHS.getBasePointer(), RHSBlock);
2716 LHS.replaceBasePointer(PtrPhi);
2717 LHS.setAlignment(std::min(LHS.getAlignment(), RHS.getAlignment()));
2718 return LHS;
2719 }
2720
2721 /// Construct an address with the natural alignment of T. If a pointer to T
2722 /// is expected to be signed, the pointer passed to this function must have
2723 /// been signed, and the returned Address will have the pointer authentication
2724 /// information needed to authenticate the signed pointer.
2726 llvm::Value *Ptr, QualType T, CharUnits Alignment = CharUnits::Zero(),
2727 bool ForPointeeType = false, LValueBaseInfo *BaseInfo = nullptr,
2728 TBAAAccessInfo *TBAAInfo = nullptr,
2729 KnownNonNull_t IsKnownNonNull = NotKnownNonNull) {
2730 if (Alignment.isZero())
2731 Alignment =
2732 CGM.getNaturalTypeAlignment(T, BaseInfo, TBAAInfo, ForPointeeType);
2733 return Address(Ptr, ConvertTypeForMem(T), Alignment,
2734 CGM.getPointerAuthInfoForPointeeType(T), /*Offset=*/nullptr,
2735 IsKnownNonNull);
2736 }
2737
2740 return MakeAddrLValue(Addr, T, LValueBaseInfo(Source),
2741 CGM.getTBAAAccessInfo(T));
2742 }
2743
2745 TBAAAccessInfo TBAAInfo) {
2746 return LValue::MakeAddr(Addr, T, getContext(), BaseInfo, TBAAInfo);
2747 }
2748
2749 LValue MakeAddrLValue(llvm::Value *V, QualType T, CharUnits Alignment,
2751 return MakeAddrLValue(makeNaturalAddressForPointer(V, T, Alignment), T,
2752 LValueBaseInfo(Source), CGM.getTBAAAccessInfo(T));
2753 }
2754
2755 /// Same as MakeAddrLValue above except that the pointer is known to be
2756 /// unsigned.
2757 LValue MakeRawAddrLValue(llvm::Value *V, QualType T, CharUnits Alignment,
2759 Address Addr(V, ConvertTypeForMem(T), Alignment);
2760 return LValue::MakeAddr(Addr, T, getContext(), LValueBaseInfo(Source),
2761 CGM.getTBAAAccessInfo(T));
2762 }
2763
2764 LValue
2770
2771 /// Given a value of type T* that may not be to a complete object, construct
2772 /// an l-value with the natural pointee alignment of T.
2774
2775 LValue
2776 MakeNaturalAlignAddrLValue(llvm::Value *V, QualType T,
2777 KnownNonNull_t IsKnownNonNull = NotKnownNonNull);
2778
2779 /// Same as MakeNaturalAlignPointeeAddrLValue except that the pointer is known
2780 /// to be unsigned.
2782
2784
2786 LValueBaseInfo *PointeeBaseInfo = nullptr,
2787 TBAAAccessInfo *PointeeTBAAInfo = nullptr);
2789 LValue
2792 LValue RefLVal = MakeAddrLValue(RefAddr, RefTy, LValueBaseInfo(Source),
2793 CGM.getTBAAAccessInfo(RefTy));
2794 return EmitLoadOfReferenceLValue(RefLVal);
2795 }
2796
2797 /// Load a pointer with type \p PtrTy stored at address \p Ptr.
2798 /// Note that \p PtrTy is the type of the loaded pointer, not the addresses
2799 /// it is loaded from.
2800 Address EmitLoadOfPointer(Address Ptr, const PointerType *PtrTy,
2801 LValueBaseInfo *BaseInfo = nullptr,
2802 TBAAAccessInfo *TBAAInfo = nullptr);
2804
2805private:
2806 struct AllocaTracker {
2807 void Add(llvm::AllocaInst *I) { Allocas.push_back(I); }
2808 llvm::SmallVector<llvm::AllocaInst *> Take() { return std::move(Allocas); }
2809
2810 private:
2812 };
2813 AllocaTracker *Allocas = nullptr;
2814
2815 /// CGDecl helper.
2816 void emitStoresForConstant(const VarDecl &D, Address Loc, bool isVolatile,
2817 llvm::Constant *constant, bool IsAutoInit);
2818 /// CGDecl helper.
2819 void emitStoresForZeroInit(const VarDecl &D, Address Loc, bool isVolatile);
2820 /// CGDecl helper.
2821 void emitStoresForPatternInit(const VarDecl &D, Address Loc, bool isVolatile);
2822 /// CGDecl helper.
2823 void emitStoresForInitAfterBZero(llvm::Constant *Init, Address Loc,
2824 bool isVolatile, bool IsAutoInit);
2825
2826public:
2827 // Captures all the allocas created during the scope of its RAII object.
2829 AllocaTrackerRAII(CodeGenFunction &CGF)
2830 : CGF(CGF), OldTracker(CGF.Allocas) {
2831 CGF.Allocas = &Tracker;
2832 }
2833 ~AllocaTrackerRAII() { CGF.Allocas = OldTracker; }
2834
2835 llvm::SmallVector<llvm::AllocaInst *> Take() { return Tracker.Take(); }
2836
2837 private:
2838 CodeGenFunction &CGF;
2839 AllocaTracker *OldTracker;
2840 AllocaTracker Tracker;
2841 };
2842
2843private:
2844 /// If \p Alloca is not in the same address space as \p DestLangAS, insert an
2845 /// address space cast and return a new RawAddress based on this value.
2846 RawAddress MaybeCastStackAddressSpace(RawAddress Alloca, LangAS DestLangAS,
2847 llvm::Value *ArraySize = nullptr);
2848
2849public:
2850 /// CreateTempAlloca - This creates an alloca and inserts it into the entry
2851 /// block if \p ArraySize is nullptr, otherwise inserts it at the current
2852 /// insertion point of the builder. The caller is responsible for setting an
2853 /// appropriate alignment on
2854 /// the alloca.
2855 ///
2856 /// \p ArraySize is the number of array elements to be allocated if it
2857 /// is not nullptr.
2858 ///
2859 /// LangAS::Default is the address space of pointers to local variables and
2860 /// temporaries, as exposed in the source language. In certain
2861 /// configurations, this is not the same as the alloca address space, and a
2862 /// cast is needed to lift the pointer from the alloca AS into
2863 /// LangAS::Default. This can happen when the target uses a restricted
2864 /// address space for the stack but the source language requires
2865 /// LangAS::Default to be a generic address space. The latter condition is
2866 /// common for most programming languages; OpenCL is an exception in that
2867 /// LangAS::Default is the private address space, which naturally maps
2868 /// to the stack.
2869 ///
2870 /// Because the address of a temporary is often exposed to the program in
2871 /// various ways, this function will perform the cast. The original alloca
2872 /// instruction is returned through \p Alloca if it is not nullptr.
2873 ///
2874 /// The cast is not performaed in CreateTempAllocaWithoutCast. This is
2875 /// more efficient if the caller knows that the address will not be exposed.
2876 llvm::AllocaInst *CreateTempAlloca(llvm::Type *Ty, const Twine &Name = "tmp",
2877 llvm::Value *ArraySize = nullptr);
2878
2879 /// CreateTempAlloca - This creates a alloca and inserts it into the entry
2880 /// block. The alloca is casted to the address space of \p UseAddrSpace if
2881 /// necessary.
2882 RawAddress CreateTempAlloca(llvm::Type *Ty, LangAS UseAddrSpace,
2883 CharUnits align, const Twine &Name = "tmp",
2884 llvm::Value *ArraySize = nullptr,
2885 RawAddress *Alloca = nullptr);
2886
2887 /// CreateTempAlloca - This creates a alloca and inserts it into the entry
2888 /// block. The alloca is casted to default address space if necessary.
2889 ///
2890 /// FIXME: This version should be removed, and context should provide the
2891 /// context use address space used instead of default.
2893 const Twine &Name = "tmp",
2894 llvm::Value *ArraySize = nullptr,
2895 RawAddress *Alloca = nullptr) {
2896 return CreateTempAlloca(Ty, LangAS::Default, align, Name, ArraySize,
2897 Alloca);
2898 }
2899
2900 RawAddress CreateTempAllocaWithoutCast(llvm::Type *Ty, CharUnits align,
2901 const Twine &Name = "tmp",
2902 llvm::Value *ArraySize = nullptr);
2903
2904 /// CreateDefaultAlignedTempAlloca - This creates an alloca with the
2905 /// default ABI alignment of the given LLVM type.
2906 ///
2907 /// IMPORTANT NOTE: This is *not* generally the right alignment for
2908 /// any given AST type that happens to have been lowered to the
2909 /// given IR type. This should only ever be used for function-local,
2910 /// IR-driven manipulations like saving and restoring a value. Do
2911 /// not hand this address off to arbitrary IRGen routines, and especially
2912 /// do not pass it as an argument to a function that might expect a
2913 /// properly ABI-aligned value.
2915 const Twine &Name = "tmp");
2916
2917 /// CreateIRTempWithoutCast - Create a temporary IR object of the given type,
2918 /// with appropriate alignment. This routine should only be used when an
2919 /// temporary value needs to be stored into an alloca (for example, to avoid
2920 /// explicit PHI construction), but the type is the IR type, not the type
2921 /// appropriate for storing in memory.
2922 ///
2923 /// That is, this is exactly equivalent to CreateMemTemp, but calling
2924 /// ConvertType instead of ConvertTypeForMem.
2925 RawAddress CreateIRTempWithoutCast(QualType T, const Twine &Name = "tmp");
2926
2927 /// CreateMemTemp - Create a temporary memory object of the given type, with
2928 /// appropriate alignmen and cast it to the default address space. Returns
2929 /// the original alloca instruction by \p Alloca if it is not nullptr.
2930 RawAddress CreateMemTemp(QualType T, const Twine &Name = "tmp",
2931 RawAddress *Alloca = nullptr);
2933 const Twine &Name = "tmp",
2934 RawAddress *Alloca = nullptr);
2935
2936 /// CreateMemTemp - Create a temporary memory object of the given type, with
2937 /// appropriate alignmen without casting it to the default address space.
2938 RawAddress CreateMemTempWithoutCast(QualType T, const Twine &Name = "tmp");
2940 const Twine &Name = "tmp");
2941
2942 /// CreateAggTemp - Create a temporary memory object for the given
2943 /// aggregate type.
2944 AggValueSlot CreateAggTemp(QualType T, const Twine &Name = "tmp",
2945 RawAddress *Alloca = nullptr) {
2946 return AggValueSlot::forAddr(
2947 CreateMemTemp(T, Name, Alloca), T.getQualifiers(),
2950 }
2951
2952 /// EvaluateExprAsBool - Perform the usual unary conversions on the specified
2953 /// expression and compare the result against zero, returning an Int1Ty value.
2954 llvm::Value *EvaluateExprAsBool(const Expr *E);
2955
2956 /// Retrieve the implicit cast expression of the rhs in a binary operator
2957 /// expression by passing pointers to Value and QualType
2958 /// This is used for implicit bitfield conversion checks, which
2959 /// must compare with the value before potential truncation.
2961 llvm::Value **Previous,
2962 QualType *SrcType);
2963
2964 /// Emit a check that an [implicit] conversion of a bitfield. It is not UB,
2965 /// so we use the value after conversion.
2966 void EmitBitfieldConversionCheck(llvm::Value *Src, QualType SrcType,
2967 llvm::Value *Dst, QualType DstType,
2968 const CGBitFieldInfo &Info,
2969 SourceLocation Loc);
2970
2971 /// EmitIgnoredExpr - Emit an expression in a context which ignores the
2972 /// result.
2973 void EmitIgnoredExpr(const Expr *E);
2974
2975 /// EmitAnyExpr - Emit code to compute the specified expression which can have
2976 /// any type. The result is returned as an RValue struct. If this is an
2977 /// aggregate expression, the aggloc/agglocvolatile arguments indicate where
2978 /// the result should be returned.
2979 ///
2980 /// \param ignoreResult True if the resulting value isn't used.
2981 RValue EmitAnyExpr(const Expr *E,
2983 bool ignoreResult = false);
2984
2985 // EmitVAListRef - Emit a "reference" to a va_list; this is either the address
2986 // or the value of the expression, depending on how va_list is defined.
2987 Address EmitVAListRef(const Expr *E);
2988
2989 /// Emit a "reference" to a __builtin_ms_va_list; this is
2990 /// always the value of the expression, because a __builtin_ms_va_list is a
2991 /// pointer to a char.
2992 Address EmitMSVAListRef(const Expr *E);
2993
2994 /// EmitAnyExprToTemp - Similarly to EmitAnyExpr(), however, the result will
2995 /// always be accessible even if no aggregate location is provided.
2996 RValue EmitAnyExprToTemp(const Expr *E);
2997
2998 /// EmitAnyExprToMem - Emits the code necessary to evaluate an
2999 /// arbitrary expression into the given memory location.
3000 void EmitAnyExprToMem(const Expr *E, Address Location, Qualifiers Quals,
3001 bool IsInitializer);
3002
3003 void EmitAnyExprToExn(const Expr *E, Address Addr);
3004
3005 /// EmitInitializationToLValue - Emit an initializer to an LValue.
3007 const Expr *E, LValue LV,
3009
3010 /// EmitExprAsInit - Emits the code necessary to initialize a
3011 /// location in memory with the given initializer.
3012 void EmitExprAsInit(const Expr *init, const ValueDecl *D, LValue lvalue,
3013 bool capturedByInit);
3014
3015 /// hasVolatileMember - returns true if aggregate type has a volatile
3016 /// member.
3018 if (const auto *RD = T->getAsRecordDecl())
3019 return RD->hasVolatileMember();
3020 return false;
3021 }
3022
3023 /// Determine whether a return value slot may overlap some other object.
3025 // FIXME: Assuming no overlap here breaks guaranteed copy elision for base
3026 // class subobjects. These cases may need to be revisited depending on the
3027 // resolution of the relevant core issue.
3029 }
3030
3031 /// Determine whether a field initialization may overlap some other object.
3033
3034 /// Determine whether a base class initialization may overlap some other
3035 /// object.
3037 const CXXRecordDecl *BaseRD,
3038 bool IsVirtual);
3039
3040 /// Emit an aggregate assignment.
3043 bool IsVolatile = hasVolatileMember(EltTy);
3044 EmitAggregateCopy(Dest, Src, EltTy, AggValueSlot::MayOverlap, IsVolatile);
3045 }
3046
3048 AggValueSlot::Overlap_t MayOverlap) {
3049 EmitAggregateCopy(Dest, Src, Src.getType(), MayOverlap);
3050 }
3051
3052 /// EmitAggregateCopy - Emit an aggregate copy.
3053 ///
3054 /// \param isVolatile \c true iff either the source or the destination is
3055 /// volatile.
3056 /// \param MayOverlap Whether the tail padding of the destination might be
3057 /// occupied by some other object. More efficient code can often be
3058 /// generated if not.
3059 void EmitAggregateCopy(LValue Dest, LValue Src, QualType EltTy,
3060 AggValueSlot::Overlap_t MayOverlap,
3061 bool isVolatile = false);
3062
3063 /// GetAddrOfLocalVar - Return the address of a local variable.
3065 auto it = LocalDeclMap.find(VD);
3066 assert(it != LocalDeclMap.end() &&
3067 "Invalid argument to GetAddrOfLocalVar(), no decl!");
3068 return it->second;
3069 }
3070
3071 /// Given an opaque value expression, return its LValue mapping if it exists,
3072 /// otherwise create one.
3074
3075 /// Given an opaque value expression, return its RValue mapping if it exists,
3076 /// otherwise create one.
3078
3079 /// isOpaqueValueEmitted - Return true if the opaque value expression has
3080 /// already been emitted.
3082
3083 /// Get the index of the current ArrayInitLoopExpr, if any.
3084 llvm::Value *getArrayInitIndex() { return ArrayInitIndex; }
3085
3086 /// getAccessedFieldNo - Given an encoded value and a result number, return
3087 /// the input field number being accessed.
3088 static unsigned getAccessedFieldNo(unsigned Idx, const llvm::Constant *Elts);
3089
3090 llvm::BlockAddress *GetAddrOfLabel(const LabelDecl *L);
3091 llvm::BasicBlock *GetIndirectGotoBlock();
3092
3093 /// Check if \p E is a C++ "this" pointer wrapped in value-preserving casts.
3094 static bool IsWrappedCXXThis(const Expr *E);
3095
3096 /// EmitNullInitialization - Generate code to set a value of the given type to
3097 /// null, If the type contains data member pointers, they will be initialized
3098 /// to -1 in accordance with the Itanium C++ ABI.
3099 void EmitNullInitialization(Address DestPtr, QualType Ty);
3100
3101 /// Emits a call to an LLVM variable-argument intrinsic, either
3102 /// \c llvm.va_start or \c llvm.va_end.
3103 /// \param ArgValue A reference to the \c va_list as emitted by either
3104 /// \c EmitVAListRef or \c EmitMSVAListRef.
3105 /// \param IsStart If \c true, emits a call to \c llvm.va_start; otherwise,
3106 /// calls \c llvm.va_end.
3107 llvm::Value *EmitVAStartEnd(llvm::Value *ArgValue, bool IsStart);
3108
3109 /// Generate code to get an argument from the passed in pointer
3110 /// and update it accordingly.
3111 /// \param VE The \c VAArgExpr for which to generate code.
3112 /// \param VAListAddr Receives a reference to the \c va_list as emitted by
3113 /// either \c EmitVAListRef or \c EmitMSVAListRef.
3114 /// \returns A pointer to the argument.
3115 // FIXME: We should be able to get rid of this method and use the va_arg
3116 // instruction in LLVM instead once it works well enough.
3117 RValue EmitVAArg(VAArgExpr *VE, Address &VAListAddr,
3119
3120 /// emitArrayLength - Compute the length of an array, even if it's a
3121 /// VLA, and drill down to the base element type.
3122 llvm::Value *emitArrayLength(const ArrayType *arrayType, QualType &baseType,
3123 Address &addr);
3124
3125 /// EmitVLASize - Capture all the sizes for the VLA expressions in
3126 /// the given variably-modified type and store them in the VLASizeMap.
3127 ///
3128 /// This function can be called with a null (unreachable) insert point.
3130
3132 llvm::Value *NumElts;
3134
3135 VlaSizePair(llvm::Value *NE, QualType T) : NumElts(NE), Type(T) {}
3136 };
3137
3138 /// Return the number of elements for a single dimension
3139 /// for the given array type.
3140 VlaSizePair getVLAElements1D(const VariableArrayType *vla);
3141 VlaSizePair getVLAElements1D(QualType vla);
3142
3143 /// Returns an LLVM value that corresponds to the size,
3144 /// in non-variably-sized elements, of a variable length array type,
3145 /// plus that largest non-variably-sized element type. Assumes that
3146 /// the type has already been emitted with EmitVariablyModifiedType.
3147 VlaSizePair getVLASize(const VariableArrayType *vla);
3148 VlaSizePair getVLASize(QualType vla);
3149
3150 /// LoadCXXThis - Load the value of 'this'. This function is only valid while
3151 /// generating code for an C++ member function.
3152 llvm::Value *LoadCXXThis() {
3153 assert(CXXThisValue && "no 'this' value for this function");
3154 return CXXThisValue;
3155 }
3157
3158 /// LoadCXXVTT - Load the VTT parameter to base constructors/destructors have
3159 /// virtual bases.
3160 // FIXME: Every place that calls LoadCXXVTT is something
3161 // that needs to be abstracted properly.
3162 llvm::Value *LoadCXXVTT() {
3163 assert(CXXStructorImplicitParamValue && "no VTT value for this function");
3164 return CXXStructorImplicitParamValue;
3165 }
3166
3167 /// GetAddressOfBaseOfCompleteClass - Convert the given pointer to a
3168 /// complete class to the given direct base.
3170 const CXXRecordDecl *Derived,
3171 const CXXRecordDecl *Base,
3172 bool BaseIsVirtual);
3173
3174 static bool ShouldNullCheckClassCastValue(const CastExpr *Cast);
3175
3176 /// GetAddressOfBaseClass - This function will add the necessary delta to the
3177 /// load of 'this' and returns address of the base class.
3181 bool NullCheckValue, SourceLocation Loc);
3182
3186 bool NullCheckValue);
3187
3188 /// GetVTTParameter - Return the VTT parameter that should be passed to a
3189 /// base constructor/destructor with virtual bases.
3190 /// FIXME: VTTs are Itanium ABI-specific, so the definition should move
3191 /// to ItaniumCXXABI.cpp together with all the references to VTT.
3192 llvm::Value *GetVTTParameter(GlobalDecl GD, bool ForVirtualBase,
3193 bool Delegating);
3194
3196 CXXCtorType CtorType,
3197 const FunctionArgList &Args,
3198 SourceLocation Loc);
3199 // It's important not to confuse this and the previous function. Delegating
3200 // constructors are the C++0x feature. The constructor delegate optimization
3201 // is used to reduce duplication in the base and complete consturctors where
3202 // they are substantially the same.
3204 const FunctionArgList &Args);
3205
3206 /// Emit a call to an inheriting constructor (that is, one that invokes a
3207 /// constructor inherited from a base class) by inlining its definition. This
3208 /// is necessary if the ABI does not support forwarding the arguments to the
3209 /// base class constructor (because they're variadic or similar).
3211 CXXCtorType CtorType,
3212 bool ForVirtualBase,
3213 bool Delegating,
3214 CallArgList &Args);
3215
3216 /// Emit a call to a constructor inherited from a base class, passing the
3217 /// current constructor's arguments along unmodified (without even making
3218 /// a copy).
3220 bool ForVirtualBase, Address This,
3221 bool InheritedFromVBase,
3222 const CXXInheritedCtorInitExpr *E);
3223
3225 bool ForVirtualBase, bool Delegating,
3226 AggValueSlot ThisAVS, const CXXConstructExpr *E);
3227
3229 bool ForVirtualBase, bool Delegating,
3230 Address This, CallArgList &Args,
3232 SourceLocation Loc, bool NewPointerIsChecked,
3233 llvm::CallBase **CallOrInvoke = nullptr);
3234
3235 /// Emit assumption load for all bases. Requires to be called only on
3236 /// most-derived class and not under construction of the object.
3237 void EmitVTableAssumptionLoads(const CXXRecordDecl *ClassDecl, Address This);
3238
3239 /// Emit assumption that vptr load == global vtable.
3240 void EmitVTableAssumptionLoad(const VPtr &vptr, Address This);
3241
3243 Address Src, const CXXConstructExpr *E);
3244
3246 const ArrayType *ArrayTy, Address ArrayPtr,
3247 const CXXConstructExpr *E,
3248 bool NewPointerIsChecked,
3249 bool ZeroInitialization = false);
3250
3252 llvm::Value *NumElements, Address ArrayPtr,
3253 const CXXConstructExpr *E,
3254 bool NewPointerIsChecked,
3255 bool ZeroInitialization = false);
3256
3258
3260 bool ForVirtualBase, bool Delegating, Address This,
3261 QualType ThisTy);
3262
3263 void EmitNewArrayInitializer(const CXXNewExpr *E, QualType elementType,
3264 llvm::Type *ElementTy, Address NewPtr,
3265 llvm::Value *NumElements,
3266 llvm::Value *AllocSizeWithoutCookie);
3267
3268 void EmitCXXTemporary(const CXXTemporary *Temporary, QualType TempType,
3269 Address Ptr);
3270
3271 void EmitSehCppScopeBegin();
3272 void EmitSehCppScopeEnd();
3273 void EmitSehTryScopeBegin();
3274 void EmitSehTryScopeEnd();
3275
3276 bool EmitLifetimeStart(llvm::Value *Addr);
3277 void EmitLifetimeEnd(llvm::Value *Addr);
3278
3279 llvm::Value *EmitCXXNewExpr(const CXXNewExpr *E);
3280 void EmitCXXDeleteExpr(const CXXDeleteExpr *E);
3281
3282 void EmitDeleteCall(const FunctionDecl *DeleteFD, llvm::Value *Ptr,
3283 QualType DeleteTy, llvm::Value *NumElements = nullptr,
3284 CharUnits CookieSize = CharUnits());
3285
3287 const CallExpr *TheCallExpr, bool IsDelete);
3288
3289 llvm::Value *EmitCXXTypeidExpr(const CXXTypeidExpr *E);
3290 llvm::Value *EmitDynamicCast(Address V, const CXXDynamicCastExpr *DCE);
3292
3293 /// Situations in which we might emit a check for the suitability of a
3294 /// pointer or glvalue. Needs to be kept in sync with ubsan_handlers.cpp in
3295 /// compiler-rt.
3297 /// Checking the operand of a load. Must be suitably sized and aligned.
3299 /// Checking the destination of a store. Must be suitably sized and aligned.
3301 /// Checking the bound value in a reference binding. Must be suitably sized
3302 /// and aligned, but is not required to refer to an object (until the
3303 /// reference is used), per core issue 453.
3305 /// Checking the object expression in a non-static data member access. Must
3306 /// be an object within its lifetime.
3308 /// Checking the 'this' pointer for a call to a non-static member function.
3309 /// Must be an object within its lifetime.
3311 /// Checking the 'this' pointer for a constructor call.
3313 /// Checking the operand of a static_cast to a derived pointer type. Must be
3314 /// null or an object within its lifetime.
3316 /// Checking the operand of a static_cast to a derived reference type. Must
3317 /// be an object within its lifetime.
3319 /// Checking the operand of a cast to a base object. Must be suitably sized
3320 /// and aligned.
3322 /// Checking the operand of a cast to a virtual base object. Must be an
3323 /// object within its lifetime.
3325 /// Checking the value assigned to a _Nonnull pointer. Must not be null.
3327 /// Checking the operand of a dynamic_cast or a typeid expression. Must be
3328 /// null or an object within its lifetime.
3330 };
3331
3332 /// Determine whether the pointer type check \p TCK permits null pointers.
3333 static bool isNullPointerAllowed(TypeCheckKind TCK);
3334
3335 /// Determine whether the pointer type check \p TCK requires a vptr check.
3336 static bool isVptrCheckRequired(TypeCheckKind TCK, QualType Ty);
3337
3338 /// Whether any type-checking sanitizers are enabled. If \c false,
3339 /// calls to EmitTypeCheck can be skipped.
3340 bool sanitizePerformTypeCheck() const;
3341
3343 QualType Type, SanitizerSet SkippedChecks = SanitizerSet(),
3344 llvm::Value *ArraySize = nullptr) {
3346 return;
3347 EmitTypeCheck(TCK, Loc, LV.emitRawPointer(*this), Type, LV.getAlignment(),
3348 SkippedChecks, ArraySize);
3349 }
3350
3352 QualType Type, CharUnits Alignment = CharUnits::Zero(),
3353 SanitizerSet SkippedChecks = SanitizerSet(),
3354 llvm::Value *ArraySize = nullptr) {
3356 return;
3357 EmitTypeCheck(TCK, Loc, Addr.emitRawPointer(*this), Type, Alignment,
3358 SkippedChecks, ArraySize);
3359 }
3360
3361 /// Emit a check that \p V is the address of storage of the
3362 /// appropriate size and alignment for an object of type \p Type
3363 /// (or if ArraySize is provided, for an array of that bound).
3364 void EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc, llvm::Value *V,
3365 QualType Type, CharUnits Alignment = CharUnits::Zero(),
3366 SanitizerSet SkippedChecks = SanitizerSet(),
3367 llvm::Value *ArraySize = nullptr);
3368
3369 /// Emit a check that \p Base points into an array object, which
3370 /// we can access at index \p Index. \p Accessed should be \c false if we
3371 /// this expression is used as an lvalue, for instance in "&Arr[Idx]".
3372 void EmitBoundsCheck(const Expr *ArrayExpr, const Expr *ArrayExprBase,
3373 llvm::Value *Index, QualType IndexType, bool Accessed);
3374 void EmitBoundsCheckImpl(const Expr *ArrayExpr, QualType ArrayBaseType,
3375 llvm::Value *IndexVal, QualType IndexType,
3376 llvm::Value *BoundsVal, QualType BoundsType,
3377 bool Accessed);
3378
3379 /// Returns debug info, with additional annotation if
3380 /// CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo[Ordinal] is enabled for
3381 /// any of the ordinals.
3382 llvm::DILocation *
3384 SanitizerHandler Handler);
3385
3386 /// Build metadata used by the AllocToken instrumentation.
3387 llvm::MDNode *buildAllocToken(QualType AllocType);
3388 /// Emit and set additional metadata used by the AllocToken instrumentation.
3389 void EmitAllocToken(llvm::CallBase *CB, QualType AllocType);
3390 /// Build additional metadata used by the AllocToken instrumentation,
3391 /// inferring the type from an allocation call expression.
3392 llvm::MDNode *buildAllocToken(const CallExpr *E);
3393 /// Emit and set additional metadata used by the AllocToken instrumentation,
3394 /// inferring the type from an allocation call expression.
3395 void EmitAllocToken(llvm::CallBase *CB, const CallExpr *E);
3396
3397 llvm::Value *GetCountedByFieldExprGEP(const Expr *Base, const FieldDecl *FD,
3398 const FieldDecl *CountDecl);
3399
3400 /// Build an expression accessing the "counted_by" field.
3401 llvm::Value *EmitLoadOfCountedByField(const Expr *Base, const FieldDecl *FD,
3402 const FieldDecl *CountDecl);
3403
3404 // Emit bounds checking for flexible array and pointer members with the
3405 // counted_by attribute.
3406 void EmitCountedByBoundsChecking(const Expr *ArrayExpr, QualType ArrayType,
3407 Address ArrayInst, QualType IndexType,
3408 llvm::Value *IndexVal, bool Accessed,
3409 bool FlexibleArray);
3410
3411 llvm::Value *EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
3412 bool isInc, bool isPre);
3414 bool isInc, bool isPre);
3415
3416 /// Converts Location to a DebugLoc, if debug information is enabled.
3417 llvm::DebugLoc SourceLocToDebugLoc(SourceLocation Location);
3418
3419 /// Get the record field index as represented in debug info.
3420 unsigned getDebugInfoFIndex(const RecordDecl *Rec, unsigned FieldIndex);
3421
3422 //===--------------------------------------------------------------------===//
3423 // Declaration Emission
3424 //===--------------------------------------------------------------------===//
3425
3426 /// EmitDecl - Emit a declaration.
3427 ///
3428 /// This function can be called with a null (unreachable) insert point.
3429 void EmitDecl(const Decl &D, bool EvaluateConditionDecl = false);
3430
3431 /// EmitVarDecl - Emit a local variable declaration.
3432 ///
3433 /// This function can be called with a null (unreachable) insert point.
3434 void EmitVarDecl(const VarDecl &D);
3435
3436 void EmitScalarInit(const Expr *init, const ValueDecl *D, LValue lvalue,
3437 bool capturedByInit);
3438
3439 typedef void SpecialInitFn(CodeGenFunction &Init, const VarDecl &D,
3440 llvm::Value *Address);
3441
3442 /// Determine whether the given initializer is trivial in the sense
3443 /// that it requires no code to be generated.
3444 bool isTrivialInitializer(const Expr *Init);
3445
3446 /// EmitAutoVarDecl - Emit an auto variable declaration.
3447 ///
3448 /// This function can be called with a null (unreachable) insert point.
3449 void EmitAutoVarDecl(const VarDecl &D);
3450
3451 class AutoVarEmission {
3452 friend class CodeGenFunction;
3453
3454 const VarDecl *Variable;
3455
3456 /// The address of the alloca for languages with explicit address space
3457 /// (e.g. OpenCL) or alloca casted to generic pointer for address space
3458 /// agnostic languages (e.g. C++). Invalid if the variable was emitted
3459 /// as a global constant.
3460 Address Addr;
3461
3462 llvm::Value *NRVOFlag;
3463
3464 /// True if the variable is a __block variable that is captured by an
3465 /// escaping block.
3466 bool IsEscapingByRef;
3467
3468 /// True if the variable is of aggregate type and has a constant
3469 /// initializer.
3470 bool IsConstantAggregate;
3471
3472 /// True if lifetime markers should be used.
3473 bool UseLifetimeMarkers;
3474
3475 /// Address with original alloca instruction. Invalid if the variable was
3476 /// emitted as a global constant.
3477 RawAddress AllocaAddr;
3478
3479 struct Invalid {};
3481 : Variable(nullptr), Addr(Address::invalid()),
3482 AllocaAddr(RawAddress::invalid()) {}
3483
3484 AutoVarEmission(const VarDecl &variable)
3485 : Variable(&variable), Addr(Address::invalid()), NRVOFlag(nullptr),
3486 IsEscapingByRef(false), IsConstantAggregate(false),
3487 UseLifetimeMarkers(false), AllocaAddr(RawAddress::invalid()) {}
3488
3489 bool wasEmittedAsGlobal() const { return !Addr.isValid(); }
3490
3491 public:
3492 static AutoVarEmission invalid() { return AutoVarEmission(Invalid()); }
3493
3494 bool useLifetimeMarkers() const { return UseLifetimeMarkers; }
3495
3496 /// Returns the raw, allocated address, which is not necessarily
3497 /// the address of the object itself. It is casted to default
3498 /// address space for address space agnostic languages.
3499 Address getAllocatedAddress() const { return Addr; }
3500
3501 /// Returns the address for the original alloca instruction.
3502 RawAddress getOriginalAllocatedAddress() const { return AllocaAddr; }
3503
3504 /// Returns the address of the object within this declaration.
3505 /// Note that this does not chase the forwarding pointer for
3506 /// __block decls.
3508 if (!IsEscapingByRef)
3509 return Addr;
3510
3511 return CGF.emitBlockByrefAddress(Addr, Variable, /*forward*/ false);
3512 }
3513 };
3514 AutoVarEmission EmitAutoVarAlloca(const VarDecl &var);
3515 void EmitAutoVarInit(const AutoVarEmission &emission);
3516 void EmitAutoVarCleanups(const AutoVarEmission &emission);
3517 void emitAutoVarTypeCleanup(const AutoVarEmission &emission,
3518 QualType::DestructionKind dtorKind);
3519
3520 void MaybeEmitDeferredVarDeclInit(const VarDecl *var);
3521
3522 /// Emits the alloca and debug information for the size expressions for each
3523 /// dimension of an array. It registers the association of its (1-dimensional)
3524 /// QualTypes and size expression's debug node, so that CGDebugInfo can
3525 /// reference this node when creating the DISubrange object to describe the
3526 /// array types.
3528 bool EmitDebugInfo);
3529
3530 void EmitStaticVarDecl(const VarDecl &D,
3531 llvm::GlobalValue::LinkageTypes Linkage);
3532
3533 class ParamValue {
3534 union {
3536 llvm::Value *Value;
3537 };
3538
3539 bool IsIndirect;
3540
3541 ParamValue(llvm::Value *V) : Value(V), IsIndirect(false) {}
3542 ParamValue(Address A) : Addr(A), IsIndirect(true) {}
3543
3544 public:
3545 static ParamValue forDirect(llvm::Value *value) {
3546 return ParamValue(value);
3547 }
3548 static ParamValue forIndirect(Address addr) {
3549 assert(!addr.getAlignment().isZero());
3550 return ParamValue(addr);
3551 }
3552
3553 bool isIndirect() const { return IsIndirect; }
3554 llvm::Value *getAnyValue() const {
3555 if (!isIndirect())
3556 return Value;
3557 assert(!Addr.hasOffset() && "unexpected offset");
3558 return Addr.getBasePointer();
3559 }
3560
3561 llvm::Value *getDirectValue() const {
3562 assert(!isIndirect());
3563 return Value;
3564 }
3565
3567 assert(isIndirect());
3568 return Addr;
3569 }
3570 };
3571
3572 /// EmitParmDecl - Emit a ParmVarDecl or an ImplicitParamDecl.
3573 void EmitParmDecl(const VarDecl &D, ParamValue Arg, unsigned ArgNo);
3574
3575 /// protectFromPeepholes - Protect a value that we're intending to
3576 /// store to the side, but which will probably be used later, from
3577 /// aggressive peepholing optimizations that might delete it.
3578 ///
3579 /// Pass the result to unprotectFromPeepholes to declare that
3580 /// protection is no longer required.
3581 ///
3582 /// There's no particular reason why this shouldn't apply to
3583 /// l-values, it's just that no existing peepholes work on pointers.
3584 PeepholeProtection protectFromPeepholes(RValue rvalue);
3585 void unprotectFromPeepholes(PeepholeProtection protection);
3586
3587 void emitAlignmentAssumptionCheck(llvm::Value *Ptr, QualType Ty,
3588 SourceLocation Loc,
3589 SourceLocation AssumptionLoc,
3590 llvm::Value *Alignment,
3591 llvm::Value *OffsetValue,
3592 llvm::Value *TheCheck,
3593 llvm::Instruction *Assumption);
3594
3595 void emitAlignmentAssumption(llvm::Value *PtrValue, QualType Ty,
3596 SourceLocation Loc, SourceLocation AssumptionLoc,
3597 llvm::Value *Alignment,
3598 llvm::Value *OffsetValue = nullptr);
3599
3600 void emitAlignmentAssumption(llvm::Value *PtrValue, const Expr *E,
3601 SourceLocation AssumptionLoc,
3602 llvm::Value *Alignment,
3603 llvm::Value *OffsetValue = nullptr);
3604
3605 //===--------------------------------------------------------------------===//
3606 // Statement Emission
3607 //===--------------------------------------------------------------------===//
3608
3609 /// EmitStopPoint - Emit a debug stoppoint if we are emitting debug info.
3610 void EmitStopPoint(const Stmt *S);
3611
3612 /// EmitStmt - Emit the code for the statement \arg S. It is legal to call
3613 /// this function even if there is no current insertion point.
3614 ///
3615 /// This function may clear the current insertion point; callers should use
3616 /// EnsureInsertPoint if they wish to subsequently generate code without first
3617 /// calling EmitBlock, EmitBranch, or EmitStmt.
3618 void EmitStmt(const Stmt *S, ArrayRef<const Attr *> Attrs = {});
3619
3620 /// EmitSimpleStmt - Try to emit a "simple" statement which does not
3621 /// necessarily require an insertion point or debug information; typically
3622 /// because the statement amounts to a jump or a container of other
3623 /// statements.
3624 ///
3625 /// \return True if the statement was handled.
3626 bool EmitSimpleStmt(const Stmt *S, ArrayRef<const Attr *> Attrs);
3627
3628 Address EmitCompoundStmt(const CompoundStmt &S, bool GetLast = false,
3629 AggValueSlot AVS = AggValueSlot::ignored());
3630 Address
3631 EmitCompoundStmtWithoutScope(const CompoundStmt &S, bool GetLast = false,
3632 AggValueSlot AVS = AggValueSlot::ignored());
3633
3634 /// EmitLabel - Emit the block for the given label. It is legal to call this
3635 /// function even if there is no current insertion point.
3636 void EmitLabel(const LabelDecl *D); // helper for EmitLabelStmt.
3637
3638 void EmitLabelStmt(const LabelStmt &S);
3639 void EmitAttributedStmt(const AttributedStmt &S);
3640 void EmitGotoStmt(const GotoStmt &S);
3642 void EmitIfStmt(const IfStmt &S);
3643
3644 void EmitWhileStmt(const WhileStmt &S, ArrayRef<const Attr *> Attrs = {});
3645 void EmitDoStmt(const DoStmt &S, ArrayRef<const Attr *> Attrs = {});
3646 void EmitForStmt(const ForStmt &S, ArrayRef<const Attr *> Attrs = {});
3647 void EmitReturnStmt(const ReturnStmt &S);
3648 void EmitDeclStmt(const DeclStmt &S);
3649 void EmitBreakStmt(const BreakStmt &S);
3650 void EmitContinueStmt(const ContinueStmt &S);
3651 void EmitSwitchStmt(const SwitchStmt &S);
3652 void EmitDefaultStmt(const DefaultStmt &S, ArrayRef<const Attr *> Attrs);
3653 void EmitCaseStmt(const CaseStmt &S, ArrayRef<const Attr *> Attrs);
3654 void EmitCaseStmtRange(const CaseStmt &S, ArrayRef<const Attr *> Attrs);
3655 void EmitDeferStmt(const DeferStmt &S);
3656 void EmitAsmStmt(const AsmStmt &S);
3657
3658 const BreakContinue *GetDestForLoopControlStmt(const LoopControlStmt &S);
3659
3660 void EmitObjCForCollectionStmt(const ObjCForCollectionStmt &S);
3661 void EmitObjCAtTryStmt(const ObjCAtTryStmt &S);
3662 void EmitObjCAtThrowStmt(const ObjCAtThrowStmt &S);
3663 void EmitObjCAtSynchronizedStmt(const ObjCAtSynchronizedStmt &S);
3664 void EmitObjCAutoreleasePoolStmt(const ObjCAutoreleasePoolStmt &S);
3665
3666 void EmitCoroutineBody(const CoroutineBodyStmt &S);
3667 void EmitCoreturnStmt(const CoreturnStmt &S);
3668 RValue EmitCoawaitExpr(const CoawaitExpr &E,
3669 AggValueSlot aggSlot = AggValueSlot::ignored(),
3670 bool ignoreResult = false);
3671 LValue EmitCoawaitLValue(const CoawaitExpr *E);
3672 RValue EmitCoyieldExpr(const CoyieldExpr &E,
3673 AggValueSlot aggSlot = AggValueSlot::ignored(),
3674 bool ignoreResult = false);
3675 LValue EmitCoyieldLValue(const CoyieldExpr *E);
3676 RValue EmitCoroutineIntrinsic(const CallExpr *E, unsigned int IID);
3677
3678 void EmitSYCLKernelCallStmt(const SYCLKernelCallStmt &S);
3679
3680 void EnterCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock = false);
3681 void ExitCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock = false);
3682
3683 void EmitCXXTryStmt(const CXXTryStmt &S);
3684 void EmitSEHTryStmt(const SEHTryStmt &S);
3685 void EmitSEHLeaveStmt(const SEHLeaveStmt &S);
3686 void EnterSEHTryStmt(const SEHTryStmt &S);
3687 void ExitSEHTryStmt(const SEHTryStmt &S);
3688 void VolatilizeTryBlocks(llvm::BasicBlock *BB,
3689 llvm::SmallPtrSet<llvm::BasicBlock *, 10> &V);
3690
3691 void pushSEHCleanup(CleanupKind kind, llvm::Function *FinallyFunc);
3692 void startOutlinedSEHHelper(CodeGenFunction &ParentCGF, bool IsFilter,
3693 const Stmt *OutlinedStmt);
3694
3695 llvm::Function *GenerateSEHFilterFunction(CodeGenFunction &ParentCGF,
3696 const SEHExceptStmt &Except);
3697
3698 llvm::Function *GenerateSEHFinallyFunction(CodeGenFunction &ParentCGF,
3699 const SEHFinallyStmt &Finally);
3700
3701 void EmitSEHExceptionCodeSave(CodeGenFunction &ParentCGF,
3702 llvm::Value *ParentFP, llvm::Value *EntryEBP);
3703 llvm::Value *EmitSEHExceptionCode();
3704 llvm::Value *EmitSEHExceptionInfo();
3705 llvm::Value *EmitSEHAbnormalTermination();
3706
3707 /// Emit simple code for OpenMP directives in Simd-only mode.
3708 void EmitSimpleOMPExecutableDirective(const OMPExecutableDirective &D);
3709
3710 /// Scan the outlined statement for captures from the parent function. For
3711 /// each capture, mark the capture as escaped and emit a call to
3712 /// llvm.localrecover. Insert the localrecover result into the LocalDeclMap.
3713 void EmitCapturedLocals(CodeGenFunction &ParentCGF, const Stmt *OutlinedStmt,
3714 bool IsFilter);
3715
3716 /// Recovers the address of a local in a parent function. ParentVar is the
3717 /// address of the variable used in the immediate parent function. It can
3718 /// either be an alloca or a call to llvm.localrecover if there are nested
3719 /// outlined functions. ParentFP is the frame pointer of the outermost parent
3720 /// frame.
3721 Address recoverAddrOfEscapedLocal(CodeGenFunction &ParentCGF,
3722 Address ParentVar, llvm::Value *ParentFP);
3723
3724 void EmitCXXForRangeStmt(const CXXForRangeStmt &S,
3725 ArrayRef<const Attr *> Attrs = {});
3726
3727 /// Controls insertion of cancellation exit blocks in worksharing constructs.
3729 CodeGenFunction &CGF;
3730
3731 public:
3732 OMPCancelStackRAII(CodeGenFunction &CGF, OpenMPDirectiveKind Kind,
3733 bool HasCancel)
3734 : CGF(CGF) {
3735 CGF.OMPCancelStack.enter(CGF, Kind, HasCancel);
3736 }
3737 ~OMPCancelStackRAII() { CGF.OMPCancelStack.exit(CGF); }
3738 };
3739
3740 /// Returns calculated size of the specified type.
3741 llvm::Value *getTypeSize(QualType Ty);
3743 llvm::Function *EmitCapturedStmt(const CapturedStmt &S, CapturedRegionKind K);
3744 llvm::Function *GenerateCapturedStmtFunction(const CapturedStmt &S);
3746 llvm::Function *
3748 const OMPExecutableDirective &D);
3750 SmallVectorImpl<llvm::Value *> &CapturedVars);
3751 void emitOMPSimpleStore(LValue LVal, RValue RVal, QualType RValTy,
3752 SourceLocation Loc);
3753 /// Perform element by element copying of arrays with type \a
3754 /// OriginalType from \a SrcAddr to \a DestAddr using copying procedure
3755 /// generated by \a CopyGen.
3756 ///
3757 /// \param DestAddr Address of the destination array.
3758 /// \param SrcAddr Address of the source array.
3759 /// \param OriginalType Type of destination and source arrays.
3760 /// \param CopyGen Copying procedure that copies value of single array element
3761 /// to another single array element.
3763 Address DestAddr, Address SrcAddr, QualType OriginalType,
3764 const llvm::function_ref<void(Address, Address)> CopyGen);
3765 /// Emit proper copying of data from one variable to another.
3766 ///
3767 /// \param OriginalType Original type of the copied variables.
3768 /// \param DestAddr Destination address.
3769 /// \param SrcAddr Source address.
3770 /// \param DestVD Destination variable used in \a CopyExpr (for arrays, has
3771 /// type of the base array element).
3772 /// \param SrcVD Source variable used in \a CopyExpr (for arrays, has type of
3773 /// the base array element).
3774 /// \param Copy Actual copygin expression for copying data from \a SrcVD to \a
3775 /// DestVD.
3776 void EmitOMPCopy(QualType OriginalType, Address DestAddr, Address SrcAddr,
3777 const VarDecl *DestVD, const VarDecl *SrcVD,
3778 const Expr *Copy);
3779 /// Emit atomic update code for constructs: \a X = \a X \a BO \a E or
3780 /// \a X = \a E \a BO \a E.
3781 ///
3782 /// \param X Value to be updated.
3783 /// \param E Update value.
3784 /// \param BO Binary operation for update operation.
3785 /// \param IsXLHSInRHSPart true if \a X is LHS in RHS part of the update
3786 /// expression, false otherwise.
3787 /// \param AO Atomic ordering of the generated atomic instructions.
3788 /// \param CommonGen Code generator for complex expressions that cannot be
3789 /// expressed through atomicrmw instruction.
3790 /// \returns <true, OldAtomicValue> if simple 'atomicrmw' instruction was
3791 /// generated, <false, RValue::get(nullptr)> otherwise.
3792 std::pair<bool, RValue> EmitOMPAtomicSimpleUpdateExpr(
3794 llvm::AtomicOrdering AO, SourceLocation Loc,
3795 const llvm::function_ref<RValue(RValue)> CommonGen);
3797 OMPPrivateScope &PrivateScope);
3799 OMPPrivateScope &PrivateScope);
3801 const OMPUseDevicePtrClause &C, OMPPrivateScope &PrivateScope,
3802 const llvm::DenseMap<const ValueDecl *, llvm::Value *>
3803 CaptureDeviceAddrMap);
3805 const OMPUseDeviceAddrClause &C, OMPPrivateScope &PrivateScope,
3806 const llvm::DenseMap<const ValueDecl *, llvm::Value *>
3807 CaptureDeviceAddrMap);
3808 /// Emit code for copyin clause in \a D directive. The next code is
3809 /// generated at the start of outlined functions for directives:
3810 /// \code
3811 /// threadprivate_var1 = master_threadprivate_var1;
3812 /// operator=(threadprivate_var2, master_threadprivate_var2);
3813 /// ...
3814 /// __kmpc_barrier(&loc, global_tid);
3815 /// \endcode
3816 ///
3817 /// \param D OpenMP directive possibly with 'copyin' clause(s).
3818 /// \returns true if at least one copyin variable is found, false otherwise.
3820 /// Emit initial code for lastprivate variables. If some variable is
3821 /// not also firstprivate, then the default initialization is used. Otherwise
3822 /// initialization of this variable is performed by EmitOMPFirstprivateClause
3823 /// method.
3824 ///
3825 /// \param D Directive that may have 'lastprivate' directives.
3826 /// \param PrivateScope Private scope for capturing lastprivate variables for
3827 /// proper codegen in internal captured statement.
3828 ///
3829 /// \returns true if there is at least one lastprivate variable, false
3830 /// otherwise.
3832 OMPPrivateScope &PrivateScope);
3833 /// Emit final copying of lastprivate values to original variables at
3834 /// the end of the worksharing or simd directive.
3835 ///
3836 /// \param D Directive that has at least one 'lastprivate' directives.
3837 /// \param IsLastIterCond Boolean condition that must be set to 'i1 true' if
3838 /// it is the last iteration of the loop code in associated directive, or to
3839 /// 'i1 false' otherwise. If this item is nullptr, no final check is required.
3841 bool NoFinals,
3842 llvm::Value *IsLastIterCond = nullptr);
3843 /// Emit initial code for linear clauses.
3845 CodeGenFunction::OMPPrivateScope &PrivateScope);
3846 /// Emit final code for linear clauses.
3847 /// \param CondGen Optional conditional code for final part of codegen for
3848 /// linear clause.
3850 const OMPLoopDirective &D,
3851 const llvm::function_ref<llvm::Value *(CodeGenFunction &)> CondGen);
3852 /// Emit initial code for reduction variables. Creates reduction copies
3853 /// and initializes them with the values according to OpenMP standard.
3854 ///
3855 /// \param D Directive (possibly) with the 'reduction' clause.
3856 /// \param PrivateScope Private scope for capturing reduction variables for
3857 /// proper codegen in internal captured statement.
3858 ///
3860 OMPPrivateScope &PrivateScope,
3861 bool ForInscan = false);
3862 /// Emit final update of reduction values to original variables at
3863 /// the end of the directive.
3864 ///
3865 /// \param D Directive that has at least one 'reduction' directives.
3866 /// \param ReductionKind The kind of reduction to perform.
3868 const OpenMPDirectiveKind ReductionKind);
3869 /// Emit initial code for linear variables. Creates private copies
3870 /// and initializes them with the values according to OpenMP standard.
3871 ///
3872 /// \param D Directive (possibly) with the 'linear' clause.
3873 /// \return true if at least one linear variable is found that should be
3874 /// initialized with the value of the original variable, false otherwise.
3876
3877 typedef const llvm::function_ref<void(CodeGenFunction & /*CGF*/,
3878 llvm::Function * /*OutlinedFn*/,
3879 const OMPTaskDataTy & /*Data*/)>
3882 const OpenMPDirectiveKind CapturedRegion,
3883 const RegionCodeGenTy &BodyGen,
3884 const TaskGenTy &TaskGen, OMPTaskDataTy &Data);
3900 const RegionCodeGenTy &BodyGen,
3901 OMPTargetDataInfo &InputInfo);
3903 CodeGenFunction &CGF, const CapturedStmt *CS,
3904 OMPPrivateScope &Scope);
3906 void EmitOMPParallelDirective(const OMPParallelDirective &S);
3907 void EmitOMPSimdDirective(const OMPSimdDirective &S);
3914 void EmitOMPForDirective(const OMPForDirective &S);
3915 void EmitOMPForSimdDirective(const OMPForSimdDirective &S);
3916 void EmitOMPScopeDirective(const OMPScopeDirective &S);
3917 void EmitOMPSectionsDirective(const OMPSectionsDirective &S);
3918 void EmitOMPSectionDirective(const OMPSectionDirective &S);
3919 void EmitOMPSingleDirective(const OMPSingleDirective &S);
3920 void EmitOMPMasterDirective(const OMPMasterDirective &S);
3922 void EmitOMPCriticalDirective(const OMPCriticalDirective &S);
3923 void EmitOMPParallelForDirective(const OMPParallelForDirective &S);
3924 void EmitOMPParallelForSimdDirective(const OMPParallelForSimdDirective &S);
3925 void EmitOMPParallelSectionsDirective(const OMPParallelSectionsDirective &S);
3926 void EmitOMPParallelMasterDirective(const OMPParallelMasterDirective &S);
3927 void EmitOMPTaskDirective(const OMPTaskDirective &S);
3928 void EmitOMPTaskyieldDirective(const OMPTaskyieldDirective &S);
3930 void EmitOMPBarrierDirective(const OMPBarrierDirective &S);
3931 void EmitOMPTaskwaitDirective(const OMPTaskwaitDirective &S);
3932 void EmitOMPTaskgroupDirective(const OMPTaskgroupDirective &S);
3933 void EmitOMPFlushDirective(const OMPFlushDirective &S);
3934 void EmitOMPDepobjDirective(const OMPDepobjDirective &S);
3936 void EmitOMPOrderedDirective(const OMPOrderedDirective &S);
3937 void EmitOMPAtomicDirective(const OMPAtomicDirective &S);
3944 void
3947 void
3955 void
3957 void
3977 void
4000 void EmitOMPParallelMaskedDirective(const OMPParallelMaskedDirective &S);
4002
4003 /// Emit device code for the target directive.
4005 StringRef ParentName,
4006 const OMPTargetDirective &S);
4007 static void
4010 /// Emit device code for the target parallel for directive.
4012 CodeGenModule &CGM, StringRef ParentName,
4014 /// Emit device code for the target parallel for simd directive.
4016 CodeGenModule &CGM, StringRef ParentName,
4018 /// Emit device code for the target teams directive.
4019 static void
4020 EmitOMPTargetTeamsDeviceFunction(CodeGenModule &CGM, StringRef ParentName,
4021 const OMPTargetTeamsDirective &S);
4022 /// Emit device code for the target teams distribute directive.
4024 CodeGenModule &CGM, StringRef ParentName,
4026 /// Emit device code for the target teams distribute simd directive.
4028 CodeGenModule &CGM, StringRef ParentName,
4030 /// Emit device code for the target simd directive.
4032 StringRef ParentName,
4033 const OMPTargetSimdDirective &S);
4034 /// Emit device code for the target teams distribute parallel for simd
4035 /// directive.
4037 CodeGenModule &CGM, StringRef ParentName,
4039
4040 /// Emit device code for the target teams loop directive.
4042 CodeGenModule &CGM, StringRef ParentName,
4044
4045 /// Emit device code for the target parallel loop directive.
4047 CodeGenModule &CGM, StringRef ParentName,
4049
4051 CodeGenModule &CGM, StringRef ParentName,
4053
4054 /// Emit the Stmt \p S and return its topmost canonical loop, if any.
4055 /// TODO: The \p Depth paramter is not yet implemented and must be 1. In the
4056 /// future it is meant to be the number of loops expected in the loop nests
4057 /// (usually specified by the "collapse" clause) that are collapsed to a
4058 /// single loop by this function.
4059 llvm::CanonicalLoopInfo *EmitOMPCollapsedCanonicalLoopNest(const Stmt *S,
4060 int Depth);
4061
4062 /// Emit an OMPCanonicalLoop using the OpenMPIRBuilder.
4063 void EmitOMPCanonicalLoop(const OMPCanonicalLoop *S);
4064
4065 /// Emit inner loop of the worksharing/simd construct.
4066 ///
4067 /// \param S Directive, for which the inner loop must be emitted.
4068 /// \param RequiresCleanup true, if directive has some associated private
4069 /// variables.
4070 /// \param LoopCond Bollean condition for loop continuation.
4071 /// \param IncExpr Increment expression for loop control variable.
4072 /// \param BodyGen Generator for the inner body of the inner loop.
4073 /// \param PostIncGen Genrator for post-increment code (required for ordered
4074 /// loop directvies).
4075 void EmitOMPInnerLoop(
4076 const OMPExecutableDirective &S, bool RequiresCleanup,
4077 const Expr *LoopCond, const Expr *IncExpr,
4078 const llvm::function_ref<void(CodeGenFunction &)> BodyGen,
4079 const llvm::function_ref<void(CodeGenFunction &)> PostIncGen);
4080
4082 /// Emit initial code for loop counters of loop-based directives.
4084 OMPPrivateScope &LoopScope);
4085
4086 /// Helper for the OpenMP loop directives.
4087 void EmitOMPLoopBody(const OMPLoopDirective &D, JumpDest LoopExit);
4088
4089 /// Emit code for the worksharing loop-based directive.
4090 /// \return true, if this construct has any lastprivate clause, false -
4091 /// otherwise.
4092 bool EmitOMPWorksharingLoop(const OMPLoopDirective &S, Expr *EUB,
4093 const CodeGenLoopBoundsTy &CodeGenLoopBounds,
4094 const CodeGenDispatchBoundsTy &CGDispatchBounds);
4095
4096 /// Emit code for the distribute loop-based directive.
4098 const CodeGenLoopTy &CodeGenLoop, Expr *IncExpr);
4099
4100 /// Helpers for the OpenMP loop directives.
4101 void EmitOMPSimdInit(const OMPLoopDirective &D);
4102 void EmitOMPSimdFinal(
4103 const OMPLoopDirective &D,
4104 const llvm::function_ref<llvm::Value *(CodeGenFunction &)> CondGen);
4105
4106 /// Emits the lvalue for the expression with possibly captured variable.
4108
4109private:
4110 /// Helpers for blocks.
4111 llvm::Value *EmitBlockLiteral(const CGBlockInfo &Info);
4112
4113 /// struct with the values to be passed to the OpenMP loop-related functions
4114 struct OMPLoopArguments {
4115 /// loop lower bound
4117 /// loop upper bound
4119 /// loop stride
4121 /// isLastIteration argument for runtime functions
4123 /// Chunk value generated by sema
4124 llvm::Value *Chunk = nullptr;
4125 /// EnsureUpperBound
4126 Expr *EUB = nullptr;
4127 /// IncrementExpression
4128 Expr *IncExpr = nullptr;
4129 /// Loop initialization
4130 Expr *Init = nullptr;
4131 /// Loop exit condition
4132 Expr *Cond = nullptr;
4133 /// Update of LB after a whole chunk has been executed
4134 Expr *NextLB = nullptr;
4135 /// Update of UB after a whole chunk has been executed
4136 Expr *NextUB = nullptr;
4137 /// Distinguish between the for distribute and sections
4138 OpenMPDirectiveKind DKind = llvm::omp::OMPD_unknown;
4139 OMPLoopArguments() = default;
4140 OMPLoopArguments(Address LB, Address UB, Address ST, Address IL,
4141 llvm::Value *Chunk = nullptr, Expr *EUB = nullptr,
4142 Expr *IncExpr = nullptr, Expr *Init = nullptr,
4143 Expr *Cond = nullptr, Expr *NextLB = nullptr,
4144 Expr *NextUB = nullptr)
4145 : LB(LB), UB(UB), ST(ST), IL(IL), Chunk(Chunk), EUB(EUB),
4146 IncExpr(IncExpr), Init(Init), Cond(Cond), NextLB(NextLB),
4147 NextUB(NextUB) {}
4148 };
4149 void EmitOMPOuterLoop(bool DynamicOrOrdered, bool IsMonotonic,
4150 const OMPLoopDirective &S, OMPPrivateScope &LoopScope,
4151 const OMPLoopArguments &LoopArgs,
4152 const CodeGenLoopTy &CodeGenLoop,
4153 const CodeGenOrderedTy &CodeGenOrdered);
4154 void EmitOMPForOuterLoop(const OpenMPScheduleTy &ScheduleKind,
4155 bool IsMonotonic, const OMPLoopDirective &S,
4156 OMPPrivateScope &LoopScope, bool Ordered,
4157 const OMPLoopArguments &LoopArgs,
4158 const CodeGenDispatchBoundsTy &CGDispatchBounds);
4159 void EmitOMPDistributeOuterLoop(OpenMPDistScheduleClauseKind ScheduleKind,
4160 const OMPLoopDirective &S,
4161 OMPPrivateScope &LoopScope,
4162 const OMPLoopArguments &LoopArgs,
4163 const CodeGenLoopTy &CodeGenLoopContent);
4164 /// Emit code for sections directive.
4165 void EmitSections(const OMPExecutableDirective &S);
4166
4167public:
4168 //===--------------------------------------------------------------------===//
4169 // OpenACC Emission
4170 //===--------------------------------------------------------------------===//
4172 // TODO OpenACC: Implement this. It is currently implemented as a 'no-op',
4173 // simply emitting its structured block, but in the future we will implement
4174 // some sort of IR.
4175 EmitStmt(S.getStructuredBlock());
4176 }
4177
4179 // TODO OpenACC: Implement this. It is currently implemented as a 'no-op',
4180 // simply emitting its loop, but in the future we will implement
4181 // some sort of IR.
4182 EmitStmt(S.getLoop());
4183 }
4184
4186 // TODO OpenACC: Implement this. It is currently implemented as a 'no-op',
4187 // simply emitting its loop, but in the future we will implement
4188 // some sort of IR.
4189 EmitStmt(S.getLoop());
4190 }
4191
4193 // TODO OpenACC: Implement this. It is currently implemented as a 'no-op',
4194 // simply emitting its structured block, but in the future we will implement
4195 // some sort of IR.
4197 }
4198
4200 // TODO OpenACC: Implement this. It is currently implemented as a 'no-op',
4201 // but in the future we will implement some sort of IR.
4202 }
4203
4205 // TODO OpenACC: Implement this. It is currently implemented as a 'no-op',
4206 // but in the future we will implement some sort of IR.
4207 }
4208
4210 // TODO OpenACC: Implement this. It is currently implemented as a 'no-op',
4211 // simply emitting its structured block, but in the future we will implement
4212 // some sort of IR.
4214 }
4215
4217 // TODO OpenACC: Implement this. It is currently implemented as a 'no-op',
4218 // but in the future we will implement some sort of IR.
4219 }
4220
4222 // TODO OpenACC: Implement this. It is currently implemented as a 'no-op',
4223 // but in the future we will implement some sort of IR.
4224 }
4225
4227 // TODO OpenACC: Implement this. It is currently implemented as a 'no-op',
4228 // but in the future we will implement some sort of IR.
4229 }
4230
4232 // TODO OpenACC: Implement this. It is currently implemented as a 'no-op',
4233 // but in the future we will implement some sort of IR.
4234 }
4235
4237 // TODO OpenACC: Implement this. It is currently implemented as a 'no-op',
4238 // but in the future we will implement some sort of IR.
4239 }
4240
4242 // TODO OpenACC: Implement this. It is currently implemented as a 'no-op',
4243 // simply emitting its associated stmt, but in the future we will implement
4244 // some sort of IR.
4246 }
4248 // TODO OpenACC: Implement this. It is currently implemented as a 'no-op',
4249 // but in the future we will implement some sort of IR.
4250 }
4251
4252 //===--------------------------------------------------------------------===//
4253 // LValue Expression Emission
4254 //===--------------------------------------------------------------------===//
4255
4256 /// Create a check that a scalar RValue is non-null.
4257 llvm::Value *EmitNonNullRValueCheck(RValue RV, QualType T);
4258
4259 /// GetUndefRValue - Get an appropriate 'undef' rvalue for the given type.
4261
4262 /// EmitUnsupportedRValue - Emit a dummy r-value using the type of E
4263 /// and issue an ErrorUnsupported style diagnostic (using the
4264 /// provided Name).
4265 RValue EmitUnsupportedRValue(const Expr *E, const char *Name);
4266
4267 /// EmitUnsupportedLValue - Emit a dummy l-value using the type of E and issue
4268 /// an ErrorUnsupported style diagnostic (using the provided Name).
4269 LValue EmitUnsupportedLValue(const Expr *E, const char *Name);
4270
4271 /// EmitLValue - Emit code to compute a designator that specifies the location
4272 /// of the expression.
4273 ///
4274 /// This can return one of two things: a simple address or a bitfield
4275 /// reference. In either case, the LLVM Value* in the LValue structure is
4276 /// guaranteed to be an LLVM pointer type.
4277 ///
4278 /// If this returns a bitfield reference, nothing about the pointee type of
4279 /// the LLVM value is known: For example, it may not be a pointer to an
4280 /// integer.
4281 ///
4282 /// If this returns a normal address, and if the lvalue's C type is fixed
4283 /// size, this method guarantees that the returned pointer type will point to
4284 /// an LLVM type of the same size of the lvalue's type. If the lvalue has a
4285 /// variable length type, this is not possible.
4286 ///
4287 LValue EmitLValue(const Expr *E,
4288 KnownNonNull_t IsKnownNonNull = NotKnownNonNull);
4289
4290private:
4291 LValue EmitLValueHelper(const Expr *E, KnownNonNull_t IsKnownNonNull);
4292
4293public:
4294 /// Same as EmitLValue but additionally we generate checking code to
4295 /// guard against undefined behavior. This is only suitable when we know
4296 /// that the address will be used to access the object.
4298
4300
4301 void EmitAtomicInit(Expr *E, LValue lvalue);
4302
4304
4307
4309 llvm::AtomicOrdering AO, bool IsVolatile = false,
4311
4312 void EmitAtomicStore(RValue rvalue, LValue lvalue, bool isInit);
4313
4314 void EmitAtomicStore(RValue rvalue, LValue lvalue, llvm::AtomicOrdering AO,
4315 bool IsVolatile, bool isInit);
4316
4317 std::pair<RValue, llvm::Value *> EmitAtomicCompareExchange(
4318 LValue Obj, RValue Expected, RValue Desired, SourceLocation Loc,
4319 llvm::AtomicOrdering Success =
4320 llvm::AtomicOrdering::SequentiallyConsistent,
4321 llvm::AtomicOrdering Failure =
4322 llvm::AtomicOrdering::SequentiallyConsistent,
4323 bool IsWeak = false, AggValueSlot Slot = AggValueSlot::ignored());
4324
4325 /// Emit an atomicrmw instruction, and applying relevant metadata when
4326 /// applicable.
4327 llvm::AtomicRMWInst *emitAtomicRMWInst(
4328 llvm::AtomicRMWInst::BinOp Op, Address Addr, llvm::Value *Val,
4329 llvm::AtomicOrdering Order = llvm::AtomicOrdering::SequentiallyConsistent,
4330 llvm::SyncScope::ID SSID = llvm::SyncScope::System,
4331 const AtomicExpr *AE = nullptr);
4332
4333 void EmitAtomicUpdate(LValue LVal, llvm::AtomicOrdering AO,
4334 const llvm::function_ref<RValue(RValue)> &UpdateOp,
4335 bool IsVolatile);
4336
4337 /// EmitToMemory - Change a scalar value from its value
4338 /// representation to its in-memory representation.
4339 llvm::Value *EmitToMemory(llvm::Value *Value, QualType Ty);
4340
4341 /// EmitFromMemory - Change a scalar value from its memory
4342 /// representation to its value representation.
4343 llvm::Value *EmitFromMemory(llvm::Value *Value, QualType Ty);
4344
4345 /// Check if the scalar \p Value is within the valid range for the given
4346 /// type \p Ty.
4347 ///
4348 /// Returns true if a check is needed (even if the range is unknown).
4349 bool EmitScalarRangeCheck(llvm::Value *Value, QualType Ty,
4350 SourceLocation Loc);
4351
4352 /// EmitLoadOfScalar - Load a scalar value from an address, taking
4353 /// care to appropriately convert from the memory representation to
4354 /// the LLVM value representation.
4355 llvm::Value *EmitLoadOfScalar(Address Addr, bool Volatile, QualType Ty,
4356 SourceLocation Loc,
4358 bool isNontemporal = false) {
4359 return EmitLoadOfScalar(Addr, Volatile, Ty, Loc, LValueBaseInfo(Source),
4360 CGM.getTBAAAccessInfo(Ty), isNontemporal);
4361 }
4362
4363 llvm::Value *EmitLoadOfScalar(Address Addr, bool Volatile, QualType Ty,
4364 SourceLocation Loc, LValueBaseInfo BaseInfo,
4365 TBAAAccessInfo TBAAInfo,
4366 bool isNontemporal = false);
4367
4368 /// EmitLoadOfScalar - Load a scalar value from an address, taking
4369 /// care to appropriately convert from the memory representation to
4370 /// the LLVM value representation. The l-value must be a simple
4371 /// l-value.
4372 llvm::Value *EmitLoadOfScalar(LValue lvalue, SourceLocation Loc);
4373
4374 /// EmitStoreOfScalar - Store a scalar value to an address, taking
4375 /// care to appropriately convert from the memory representation to
4376 /// the LLVM value representation.
4377 void EmitStoreOfScalar(llvm::Value *Value, Address Addr, bool Volatile,
4378 QualType Ty,
4380 bool isInit = false, bool isNontemporal = false) {
4381 EmitStoreOfScalar(Value, Addr, Volatile, Ty, LValueBaseInfo(Source),
4382 CGM.getTBAAAccessInfo(Ty), isInit, isNontemporal);
4383 }
4384
4385 void EmitStoreOfScalar(llvm::Value *Value, Address Addr, bool Volatile,
4386 QualType Ty, LValueBaseInfo BaseInfo,
4387 TBAAAccessInfo TBAAInfo, bool isInit = false,
4388 bool isNontemporal = false);
4389
4390 /// EmitStoreOfScalar - Store a scalar value to an address, taking
4391 /// care to appropriately convert from the memory representation to
4392 /// the LLVM value representation. The l-value must be a simple
4393 /// l-value. The isInit flag indicates whether this is an initialization.
4394 /// If so, atomic qualifiers are ignored and the store is always non-atomic.
4395 void EmitStoreOfScalar(llvm::Value *value, LValue lvalue,
4396 bool isInit = false);
4397
4398 /// EmitLoadOfLValue - Given an expression that represents a value lvalue,
4399 /// this method emits the address of the lvalue, then loads the result as an
4400 /// rvalue, returning the rvalue.
4405
4406 /// Like EmitLoadOfLValue but also handles complex and aggregate types.
4409 SourceLocation Loc = {});
4410
4411 /// EmitStoreThroughLValue - Store the specified rvalue into the specified
4412 /// lvalue, where both are guaranteed to the have the same type, and that type
4413 /// is 'Ty'.
4414 void EmitStoreThroughLValue(RValue Src, LValue Dst, bool isInit = false);
4415 void EmitStoreThroughExtVectorComponentLValue(RValue Src, LValue Dst);
4416 void EmitStoreThroughGlobalRegLValue(RValue Src, LValue Dst);
4417
4418 /// EmitStoreThroughBitfieldLValue - Store Src into Dst with same constraints
4419 /// as EmitStoreThroughLValue.
4420 ///
4421 /// \param Result [out] - If non-null, this will be set to a Value* for the
4422 /// bit-field contents after the store, appropriate for use as the result of
4423 /// an assignment to the bit-field.
4424 void EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst,
4425 llvm::Value **Result = nullptr);
4426
4427 /// Emit an l-value for an assignment (simple or compound) of complex type.
4431 llvm::Value *&Result);
4432
4433 // Note: only available for agg return types
4436 // Note: only available for agg return types
4437 LValue EmitCallExprLValue(const CallExpr *E,
4438 llvm::CallBase **CallOrInvoke = nullptr);
4439 // Note: only available for agg return types
4440 LValue EmitVAArgExprLValue(const VAArgExpr *E);
4441 LValue EmitDeclRefLValue(const DeclRefExpr *E);
4442 LValue EmitStringLiteralLValue(const StringLiteral *E);
4444 LValue EmitPredefinedLValue(const PredefinedExpr *E);
4445 LValue EmitUnaryOpLValue(const UnaryOperator *E);
4447 bool Accessed = false);
4448 llvm::Value *EmitMatrixIndexExpr(const Expr *E);
4451 LValue EmitArraySectionExpr(const ArraySectionExpr *E,
4452 bool IsLowerBound = true);
4455 LValue EmitMemberExpr(const MemberExpr *E);
4456 LValue EmitObjCIsaExpr(const ObjCIsaExpr *E);
4458 LValue EmitInitListLValue(const InitListExpr *E);
4461 LValue EmitCastLValue(const CastExpr *E);
4463 LValue EmitOpaqueValueLValue(const OpaqueValueExpr *e);
4465
4466 std::pair<LValue, LValue> EmitHLSLOutArgLValues(const HLSLOutArgExpr *E,
4467 QualType Ty);
4468 LValue EmitHLSLOutArgExpr(const HLSLOutArgExpr *E, CallArgList &Args,
4469 QualType Ty);
4470
4471 Address EmitExtVectorElementLValue(LValue V);
4472
4473 RValue EmitRValueForField(LValue LV, const FieldDecl *FD, SourceLocation Loc);
4474
4475 Address EmitArrayToPointerDecay(const Expr *Array,
4476 LValueBaseInfo *BaseInfo = nullptr,
4477 TBAAAccessInfo *TBAAInfo = nullptr);
4478
4479 class ConstantEmission {
4480 llvm::PointerIntPair<llvm::Constant *, 1, bool> ValueAndIsReference;
4481 ConstantEmission(llvm::Constant *C, bool isReference)
4482 : ValueAndIsReference(C, isReference) {}
4483
4484 public:
4486 static ConstantEmission forReference(llvm::Constant *C) {
4487 return ConstantEmission(C, true);
4488 }
4489 static ConstantEmission forValue(llvm::Constant *C) {
4490 return ConstantEmission(C, false);
4491 }
4492
4493 explicit operator bool() const {
4494 return ValueAndIsReference.getOpaqueValue() != nullptr;
4495 }
4496
4497 bool isReference() const { return ValueAndIsReference.getInt(); }
4498 LValue getReferenceLValue(CodeGenFunction &CGF, const Expr *RefExpr) const {
4499 assert(isReference());
4500 return CGF.MakeNaturalAlignAddrLValue(ValueAndIsReference.getPointer(),
4501 RefExpr->getType());
4502 }
4503
4504 llvm::Constant *getValue() const {
4505 assert(!isReference());
4506 return ValueAndIsReference.getPointer();
4507 }
4508 };
4509
4510 ConstantEmission tryEmitAsConstant(const DeclRefExpr *RefExpr);
4511 ConstantEmission tryEmitAsConstant(const MemberExpr *ME);
4512 llvm::Value *emitScalarConstant(const ConstantEmission &Constant, Expr *E);
4513
4517
4519 SmallVectorImpl<LValue> &AccessList);
4520
4521 llvm::Value *EmitIvarOffset(const ObjCInterfaceDecl *Interface,
4522 const ObjCIvarDecl *Ivar);
4524 const ObjCIvarDecl *Ivar);
4526 bool IsInBounds = true);
4529 llvm::Value *ThisValue);
4530
4531 /// EmitLValueForFieldInitialization - Like EmitLValueForField, except that
4532 /// if the Field is a reference, this will return the address of the reference
4533 /// and not the address of the value stored in the reference.
4535
4536 LValue EmitLValueForIvar(QualType ObjectTy, llvm::Value *Base,
4537 const ObjCIvarDecl *Ivar, unsigned CVRQualifiers);
4538
4543
4549 void EmitDeclRefExprDbgValue(const DeclRefExpr *E, const APValue &Init);
4550
4551 //===--------------------------------------------------------------------===//
4552 // Scalar Expression Emission
4553 //===--------------------------------------------------------------------===//
4554
4555 /// EmitCall - Generate a call of the given function, expecting the given
4556 /// result type, and using the given argument list which specifies both the
4557 /// LLVM arguments and the types they were derived from.
4558 RValue EmitCall(const CGFunctionInfo &CallInfo, const CGCallee &Callee,
4560 llvm::CallBase **CallOrInvoke, bool IsMustTail,
4561 SourceLocation Loc,
4562 bool IsVirtualFunctionPointerThunk = false);
4563 RValue EmitCall(const CGFunctionInfo &CallInfo, const CGCallee &Callee,
4565 llvm::CallBase **CallOrInvoke = nullptr,
4566 bool IsMustTail = false) {
4567 return EmitCall(CallInfo, Callee, ReturnValue, Args, CallOrInvoke,
4568 IsMustTail, SourceLocation());
4569 }
4570 RValue EmitCall(QualType FnType, const CGCallee &Callee, const CallExpr *E,
4571 ReturnValueSlot ReturnValue, llvm::Value *Chain = nullptr,
4572 llvm::CallBase **CallOrInvoke = nullptr,
4573 CGFunctionInfo const **ResolvedFnInfo = nullptr);
4574
4575 // If a Call or Invoke instruction was emitted for this CallExpr, this method
4576 // writes the pointer to `CallOrInvoke` if it's not null.
4577 RValue EmitCallExpr(const CallExpr *E,
4579 llvm::CallBase **CallOrInvoke = nullptr);
4581 llvm::CallBase **CallOrInvoke = nullptr);
4582 CGCallee EmitCallee(const Expr *E);
4583
4584 void checkTargetFeatures(const CallExpr *E, const FunctionDecl *TargetDecl);
4585 void checkTargetFeatures(SourceLocation Loc, const FunctionDecl *TargetDecl);
4586
4587 llvm::CallInst *EmitRuntimeCall(llvm::FunctionCallee callee,
4588 const Twine &name = "");
4589 llvm::CallInst *EmitRuntimeCall(llvm::FunctionCallee callee,
4591 const Twine &name = "");
4592 llvm::CallInst *EmitNounwindRuntimeCall(llvm::FunctionCallee callee,
4593 const Twine &name = "");
4594 llvm::CallInst *EmitNounwindRuntimeCall(llvm::FunctionCallee callee,
4595 ArrayRef<Address> args,
4596 const Twine &name = "");
4597 llvm::CallInst *EmitNounwindRuntimeCall(llvm::FunctionCallee callee,
4599 const Twine &name = "");
4600
4602 getBundlesForFunclet(llvm::Value *Callee);
4603
4604 llvm::CallBase *EmitCallOrInvoke(llvm::FunctionCallee Callee,
4606 const Twine &Name = "");
4607 llvm::CallBase *EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee,
4609 const Twine &name = "");
4610 llvm::CallBase *EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee,
4611 const Twine &name = "");
4612 void EmitNoreturnRuntimeCallOrInvoke(llvm::FunctionCallee callee,
4614
4616 NestedNameSpecifier Qual, llvm::Type *Ty);
4617
4620 const CXXRecordDecl *RD);
4621
4622 bool isPointerKnownNonNull(const Expr *E);
4623 /// Check whether the underlying base pointer is a constant null.
4625
4626 /// Create the discriminator from the storage address and the entity hash.
4627 llvm::Value *EmitPointerAuthBlendDiscriminator(llvm::Value *StorageAddress,
4628 llvm::Value *Discriminator);
4630 llvm::Value *StorageAddress,
4631 GlobalDecl SchemaDecl,
4632 QualType SchemaType);
4633
4634 llvm::Value *EmitPointerAuthSign(const CGPointerAuthInfo &Info,
4635 llvm::Value *Pointer);
4636
4637 llvm::Value *EmitPointerAuthAuth(const CGPointerAuthInfo &Info,
4638 llvm::Value *Pointer);
4639
4640 llvm::Value *emitPointerAuthResign(llvm::Value *Pointer, QualType PointerType,
4641 const CGPointerAuthInfo &CurAuthInfo,
4642 const CGPointerAuthInfo &NewAuthInfo,
4643 bool IsKnownNonNull);
4644 llvm::Value *emitPointerAuthResignCall(llvm::Value *Pointer,
4645 const CGPointerAuthInfo &CurInfo,
4646 const CGPointerAuthInfo &NewInfo);
4647
4649 const CGPointerAuthInfo &Info,
4651
4653 Address StorageAddress);
4654 llvm::Value *EmitPointerAuthQualify(PointerAuthQualifier Qualifier,
4655 llvm::Value *Pointer, QualType ValueType,
4656 Address StorageAddress,
4657 bool IsKnownNonNull);
4658 llvm::Value *EmitPointerAuthQualify(PointerAuthQualifier Qualifier,
4659 const Expr *PointerExpr,
4660 Address StorageAddress);
4661 llvm::Value *EmitPointerAuthUnqualify(PointerAuthQualifier Qualifier,
4662 llvm::Value *Pointer,
4664 Address StorageAddress,
4665 bool IsKnownNonNull);
4667 Address DestField, Address SrcField);
4668
4669 std::pair<llvm::Value *, CGPointerAuthInfo>
4670 EmitOrigPointerRValue(const Expr *E);
4671
4672 llvm::Value *authPointerToPointerCast(llvm::Value *ResultPtr,
4673 QualType SourceType, QualType DestType);
4675 QualType DestType);
4676
4678
4679 llvm::Value *getAsNaturalPointerTo(Address Addr, QualType PointeeType) {
4680 return getAsNaturalAddressOf(Addr, PointeeType).getBasePointer();
4681 }
4682
4683 // Return the copy constructor name with the prefix "__copy_constructor_"
4684 // removed.
4685 static std::string getNonTrivialCopyConstructorStr(QualType QT,
4686 CharUnits Alignment,
4687 bool IsVolatile,
4688 ASTContext &Ctx);
4689
4690 // Return the destructor name with the prefix "__destructor_" removed.
4691 static std::string getNonTrivialDestructorStr(QualType QT,
4692 CharUnits Alignment,
4693 bool IsVolatile,
4694 ASTContext &Ctx);
4695
4696 // These functions emit calls to the special functions of non-trivial C
4697 // structs.
4700 void callCStructDestructor(LValue Dst);
4705
4707 const CXXMethodDecl *Method, const CGCallee &Callee,
4708 ReturnValueSlot ReturnValue, llvm::Value *This,
4709 llvm::Value *ImplicitParam, QualType ImplicitParamTy, const CallExpr *E,
4710 CallArgList *RtlArgs, llvm::CallBase **CallOrInvoke);
4711 RValue EmitCXXDestructorCall(GlobalDecl Dtor, const CGCallee &Callee,
4712 llvm::Value *This, QualType ThisTy,
4713 llvm::Value *ImplicitParam,
4714 QualType ImplicitParamTy, const CallExpr *E,
4715 llvm::CallBase **CallOrInvoke = nullptr);
4718 llvm::CallBase **CallOrInvoke = nullptr);
4720 const CallExpr *CE, const CXXMethodDecl *MD, ReturnValueSlot ReturnValue,
4721 bool HasQualifier, NestedNameSpecifier Qualifier, bool IsArrow,
4722 const Expr *Base, llvm::CallBase **CallOrInvoke);
4723 // Compute the object pointer.
4725 const Expr *E, Address base, llvm::Value *memberPtr,
4726 const MemberPointerType *memberPtrType, bool IsInBounds,
4727 LValueBaseInfo *BaseInfo = nullptr, TBAAAccessInfo *TBAAInfo = nullptr);
4730 llvm::CallBase **CallOrInvoke);
4731
4733 const CXXMethodDecl *MD,
4735 llvm::CallBase **CallOrInvoke);
4737
4740 llvm::CallBase **CallOrInvoke);
4741
4744
4745 RValue EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
4747
4748 RValue emitRotate(const CallExpr *E, bool IsRotateRight);
4749
4750 /// Emit IR for __builtin_os_log_format.
4752
4753 /// Emit IR for __builtin_is_aligned.
4755 /// Emit IR for __builtin_align_up/__builtin_align_down.
4756 RValue EmitBuiltinAlignTo(const CallExpr *E, bool AlignUp);
4757
4758 llvm::Function *generateBuiltinOSLogHelperFunction(
4760 CharUnits BufferAlignment);
4761
4763 llvm::CallBase **CallOrInvoke);
4764
4765 /// EmitTargetBuiltinExpr - Emit the given builtin call. Returns 0 if the call
4766 /// is unhandled by the current target.
4767 llvm::Value *EmitTargetBuiltinExpr(unsigned BuiltinID, const CallExpr *E,
4769
4770 llvm::Value *
4771 EmitAArch64CompareBuiltinExpr(llvm::Value *Op, llvm::Type *Ty,
4772 const llvm::CmpInst::Predicate Pred,
4773 const llvm::Twine &Name = "");
4774 llvm::Value *EmitARMBuiltinExpr(unsigned BuiltinID, const CallExpr *E,
4776 llvm::Triple::ArchType Arch);
4777 llvm::Value *EmitARMMVEBuiltinExpr(unsigned BuiltinID, const CallExpr *E,
4779 llvm::Triple::ArchType Arch);
4780 llvm::Value *EmitARMCDEBuiltinExpr(unsigned BuiltinID, const CallExpr *E,
4782 llvm::Triple::ArchType Arch);
4783 llvm::Value *EmitCMSEClearRecord(llvm::Value *V, llvm::IntegerType *ITy,
4784 QualType RTy);
4785 llvm::Value *EmitCMSEClearRecord(llvm::Value *V, llvm::ArrayType *ATy,
4786 QualType RTy);
4787
4788 llvm::Value *
4789 EmitCommonNeonBuiltinExpr(unsigned BuiltinID, unsigned LLVMIntrinsic,
4790 unsigned AltLLVMIntrinsic, const char *NameHint,
4791 unsigned Modifier, const CallExpr *E,
4793 Address PtrOp1, llvm::Triple::ArchType Arch);
4794
4795 llvm::Function *LookupNeonLLVMIntrinsic(unsigned IntrinsicID,
4796 unsigned Modifier, llvm::Type *ArgTy,
4797 const CallExpr *E);
4798 llvm::Value *EmitNeonCall(llvm::Function *F,
4799 SmallVectorImpl<llvm::Value *> &O, const char *name,
4800 unsigned shift = 0, bool rightshift = false);
4801 llvm::Value *EmitFP8NeonCall(unsigned IID, ArrayRef<llvm::Type *> Tys,
4803 const CallExpr *E, const char *name);
4804 llvm::Value *EmitFP8NeonCvtCall(unsigned IID, llvm::Type *Ty0,
4805 llvm::Type *Ty1, bool Extract,
4807 const CallExpr *E, const char *name);
4808 llvm::Value *EmitFP8NeonFDOTCall(unsigned IID, bool ExtendLaneArg,
4809 llvm::Type *RetTy,
4811 const CallExpr *E, const char *name);
4812 llvm::Value *EmitFP8NeonFMLACall(unsigned IID, bool ExtendLaneArg,
4813 llvm::Type *RetTy,
4815 const CallExpr *E, const char *name);
4816 llvm::Value *EmitNeonSplat(llvm::Value *V, llvm::Constant *Idx,
4817 const llvm::ElementCount &Count);
4818 llvm::Value *EmitNeonSplat(llvm::Value *V, llvm::Constant *Idx);
4819 llvm::Value *EmitNeonShiftVector(llvm::Value *V, llvm::Type *Ty,
4820 bool negateForRightShift);
4821 llvm::Value *EmitNeonRShiftImm(llvm::Value *Vec, llvm::Value *Amt,
4822 llvm::Type *Ty, bool usgn, const char *name);
4823 llvm::Value *vectorWrapScalar16(llvm::Value *Op);
4824 /// SVEBuiltinMemEltTy - Returns the memory element type for this memory
4825 /// access builtin. Only required if it can't be inferred from the base
4826 /// pointer operand.
4827 llvm::Type *SVEBuiltinMemEltTy(const SVETypeFlags &TypeFlags);
4828
4830 getSVEOverloadTypes(const SVETypeFlags &TypeFlags, llvm::Type *ReturnType,
4832 llvm::Type *getEltType(const SVETypeFlags &TypeFlags);
4833 llvm::ScalableVectorType *getSVEType(const SVETypeFlags &TypeFlags);
4834 llvm::ScalableVectorType *getSVEPredType(const SVETypeFlags &TypeFlags);
4835 llvm::Value *EmitSVETupleSetOrGet(const SVETypeFlags &TypeFlags,
4837 llvm::Value *EmitSVETupleCreate(const SVETypeFlags &TypeFlags,
4838 llvm::Type *ReturnType,
4840 llvm::Value *EmitSVEAllTruePred(const SVETypeFlags &TypeFlags);
4841 llvm::Value *EmitSVEDupX(llvm::Value *Scalar);
4842 llvm::Value *EmitSVEDupX(llvm::Value *Scalar, llvm::Type *Ty);
4843 llvm::Value *EmitSVEReinterpret(llvm::Value *Val, llvm::Type *Ty);
4844 llvm::Value *EmitSVEPMull(const SVETypeFlags &TypeFlags,
4846 unsigned BuiltinID);
4847 llvm::Value *EmitSVEMovl(const SVETypeFlags &TypeFlags,
4849 unsigned BuiltinID);
4850 llvm::Value *EmitSVEPredicateCast(llvm::Value *Pred,
4851 llvm::ScalableVectorType *VTy);
4852 llvm::Value *EmitSVEPredicateTupleCast(llvm::Value *PredTuple,
4853 llvm::StructType *Ty);
4854 llvm::Value *EmitSVEGatherLoad(const SVETypeFlags &TypeFlags,
4856 unsigned IntID);
4857 llvm::Value *EmitSVEScatterStore(const SVETypeFlags &TypeFlags,
4859 unsigned IntID);
4860 llvm::Value *EmitSVEMaskedLoad(const CallExpr *, llvm::Type *ReturnTy,
4862 unsigned BuiltinID, bool IsZExtReturn);
4863 llvm::Value *EmitSVEMaskedStore(const CallExpr *,
4865 unsigned BuiltinID);
4866 llvm::Value *EmitSVEPrefetchLoad(const SVETypeFlags &TypeFlags,
4868 unsigned BuiltinID);
4869 llvm::Value *EmitSVEGatherPrefetch(const SVETypeFlags &TypeFlags,
4871 unsigned IntID);
4872 llvm::Value *EmitSVEStructLoad(const SVETypeFlags &TypeFlags,
4874 unsigned IntID);
4875 llvm::Value *EmitSVEStructStore(const SVETypeFlags &TypeFlags,
4877 unsigned IntID);
4878 llvm::Value *EmitAArch64SVEBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4879
4880 llvm::Value *EmitSMELd1St1(const SVETypeFlags &TypeFlags,
4882 unsigned IntID);
4883 llvm::Value *EmitSMEReadWrite(const SVETypeFlags &TypeFlags,
4885 unsigned IntID);
4886 llvm::Value *EmitSMEZero(const SVETypeFlags &TypeFlags,
4888 unsigned IntID);
4889 llvm::Value *EmitSMELdrStr(const SVETypeFlags &TypeFlags,
4891 unsigned IntID);
4892
4893 void GetAArch64SVEProcessedOperands(unsigned BuiltinID, const CallExpr *E,
4895 SVETypeFlags TypeFlags);
4896
4897 llvm::Value *EmitAArch64SMEBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4898
4899 llvm::Value *EmitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E,
4900 llvm::Triple::ArchType Arch);
4901 llvm::Value *EmitBPFBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4902
4903 llvm::Value *BuildVector(ArrayRef<llvm::Value *> Ops);
4904 llvm::Value *EmitX86BuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4905 llvm::Value *EmitPPCBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4906 llvm::Value *EmitAMDGPUBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4907 llvm::Value *EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E,
4909
4910 // Returns a builtin function that the SPIR-V backend will expand into a spec
4911 // constant.
4912 llvm::Function *
4913 getSpecConstantFunction(const clang::QualType &SpecConstantType);
4914
4915 llvm::Value *EmitDirectXBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4916 llvm::Value *EmitSPIRVBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4917 llvm::Value *EmitScalarOrConstFoldImmArg(unsigned ICEArguments, unsigned Idx,
4918 const CallExpr *E);
4919 llvm::Value *EmitSystemZBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4920 llvm::Value *EmitNVPTXBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4921 llvm::Value *EmitWebAssemblyBuiltinExpr(unsigned BuiltinID,
4922 const CallExpr *E);
4923 llvm::Value *EmitHexagonBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4924 llvm::Value *EmitRISCVBuiltinExpr(unsigned BuiltinID, const CallExpr *E,
4926
4927 llvm::Value *EmitRISCVCpuSupports(const CallExpr *E);
4928 llvm::Value *EmitRISCVCpuSupports(ArrayRef<StringRef> FeaturesStrs);
4929 llvm::Value *EmitRISCVCpuInit();
4930 llvm::Value *EmitRISCVCpuIs(const CallExpr *E);
4931 llvm::Value *EmitRISCVCpuIs(StringRef CPUStr);
4932
4933 void AddAMDGPUFenceAddressSpaceMMRA(llvm::Instruction *Inst,
4934 const CallExpr *E);
4935 void ProcessOrderScopeAMDGCN(llvm::Value *Order, llvm::Value *Scope,
4936 llvm::AtomicOrdering &AO,
4937 llvm::SyncScope::ID &SSID);
4938
4939 enum class MSVCIntrin;
4940 llvm::Value *EmitMSVCBuiltinExpr(MSVCIntrin BuiltinID, const CallExpr *E);
4941
4942 llvm::Value *EmitBuiltinAvailable(const VersionTuple &Version);
4943
4944 llvm::Value *EmitObjCProtocolExpr(const ObjCProtocolExpr *E);
4945 llvm::Value *EmitObjCStringLiteral(const ObjCStringLiteral *E);
4946 llvm::Value *EmitObjCBoxedExpr(const ObjCBoxedExpr *E);
4947 llvm::Value *EmitObjCArrayLiteral(const ObjCArrayLiteral *E);
4948 llvm::Value *EmitObjCDictionaryLiteral(const ObjCDictionaryLiteral *E);
4949 llvm::Value *
4951 const ObjCMethodDecl *MethodWithObjects);
4952 llvm::Value *EmitObjCSelectorExpr(const ObjCSelectorExpr *E);
4954 ReturnValueSlot Return = ReturnValueSlot());
4955
4956 /// Retrieves the default cleanup kind for an ARC cleanup.
4957 /// Except under -fobjc-arc-eh, ARC cleanups are normal-only.
4959 return CGM.getCodeGenOpts().ObjCAutoRefCountExceptions ? NormalAndEHCleanup
4960 : NormalCleanup;
4961 }
4962
4963 // ARC primitives.
4964 void EmitARCInitWeak(Address addr, llvm::Value *value);
4965 void EmitARCDestroyWeak(Address addr);
4966 llvm::Value *EmitARCLoadWeak(Address addr);
4967 llvm::Value *EmitARCLoadWeakRetained(Address addr);
4968 llvm::Value *EmitARCStoreWeak(Address addr, llvm::Value *value, bool ignored);
4969 void emitARCCopyAssignWeak(QualType Ty, Address DstAddr, Address SrcAddr);
4970 void emitARCMoveAssignWeak(QualType Ty, Address DstAddr, Address SrcAddr);
4971 void EmitARCCopyWeak(Address dst, Address src);
4972 void EmitARCMoveWeak(Address dst, Address src);
4973 llvm::Value *EmitARCRetainAutorelease(QualType type, llvm::Value *value);
4974 llvm::Value *EmitARCRetainAutoreleaseNonBlock(llvm::Value *value);
4975 llvm::Value *EmitARCStoreStrong(LValue lvalue, llvm::Value *value,
4976 bool resultIgnored);
4977 llvm::Value *EmitARCStoreStrongCall(Address addr, llvm::Value *value,
4978 bool resultIgnored);
4979 llvm::Value *EmitARCRetain(QualType type, llvm::Value *value);
4980 llvm::Value *EmitARCRetainNonBlock(llvm::Value *value);
4981 llvm::Value *EmitARCRetainBlock(llvm::Value *value, bool mandatory);
4983 void EmitARCRelease(llvm::Value *value, ARCPreciseLifetime_t precise);
4984 llvm::Value *EmitARCAutorelease(llvm::Value *value);
4985 llvm::Value *EmitARCAutoreleaseReturnValue(llvm::Value *value);
4986 llvm::Value *EmitARCRetainAutoreleaseReturnValue(llvm::Value *value);
4987 llvm::Value *EmitARCRetainAutoreleasedReturnValue(llvm::Value *value);
4988 llvm::Value *EmitARCUnsafeClaimAutoreleasedReturnValue(llvm::Value *value);
4989
4990 llvm::Value *EmitObjCAutorelease(llvm::Value *value, llvm::Type *returnType);
4991 llvm::Value *EmitObjCRetainNonBlock(llvm::Value *value,
4992 llvm::Type *returnType);
4993 void EmitObjCRelease(llvm::Value *value, ARCPreciseLifetime_t precise);
4994
4995 std::pair<LValue, llvm::Value *>
4997 std::pair<LValue, llvm::Value *> EmitARCStoreStrong(const BinaryOperator *e,
4998 bool ignored);
4999 std::pair<LValue, llvm::Value *>
5000 EmitARCStoreUnsafeUnretained(const BinaryOperator *e, bool ignored);
5001
5002 llvm::Value *EmitObjCAlloc(llvm::Value *value, llvm::Type *returnType);
5003 llvm::Value *EmitObjCAllocWithZone(llvm::Value *value,
5004 llvm::Type *returnType);
5005 llvm::Value *EmitObjCAllocInit(llvm::Value *value, llvm::Type *resultType);
5006
5007 llvm::Value *EmitObjCThrowOperand(const Expr *expr);
5008 llvm::Value *EmitObjCConsumeObject(QualType T, llvm::Value *Ptr);
5009 llvm::Value *EmitObjCExtendObjectLifetime(QualType T, llvm::Value *Ptr);
5010
5011 llvm::Value *EmitARCExtendBlockObject(const Expr *expr);
5012 llvm::Value *EmitARCReclaimReturnedObject(const Expr *e,
5013 bool allowUnsafeClaim);
5014 llvm::Value *EmitARCRetainScalarExpr(const Expr *expr);
5015 llvm::Value *EmitARCRetainAutoreleaseScalarExpr(const Expr *expr);
5016 llvm::Value *EmitARCUnsafeUnretainedScalarExpr(const Expr *expr);
5017
5019
5021
5027
5028 void EmitObjCAutoreleasePoolPop(llvm::Value *Ptr);
5029 llvm::Value *EmitObjCAutoreleasePoolPush();
5030 llvm::Value *EmitObjCMRRAutoreleasePoolPush();
5031 void EmitObjCAutoreleasePoolCleanup(llvm::Value *Ptr);
5032 void EmitObjCMRRAutoreleasePoolPop(llvm::Value *Ptr);
5033
5034 /// Emits a reference binding to the passed in expression.
5036
5037 //===--------------------------------------------------------------------===//
5038 // Expression Emission
5039 //===--------------------------------------------------------------------===//
5040
5041 // Expressions are broken into three classes: scalar, complex, aggregate.
5042
5043 /// EmitScalarExpr - Emit the computation of the specified expression of LLVM
5044 /// scalar type, returning the result.
5045 llvm::Value *EmitScalarExpr(const Expr *E, bool IgnoreResultAssign = false);
5046
5047 /// Emit a conversion from the specified type to the specified destination
5048 /// type, both of which are LLVM scalar types.
5049 llvm::Value *EmitScalarConversion(llvm::Value *Src, QualType SrcTy,
5050 QualType DstTy, SourceLocation Loc);
5051
5052 /// Emit a conversion from the specified complex type to the specified
5053 /// destination type, where the destination type is an LLVM scalar type.
5055 QualType DstTy,
5056 SourceLocation Loc);
5057
5058 /// EmitAggExpr - Emit the computation of the specified expression
5059 /// of aggregate type. The result is computed into the given slot,
5060 /// which may be null to indicate that the value is not needed.
5061 void EmitAggExpr(const Expr *E, AggValueSlot AS);
5062
5063 /// EmitAggExprToLValue - Emit the computation of the specified expression of
5064 /// aggregate type into a temporary LValue.
5066
5068
5069 /// EmitAggFinalDestCopy - Emit copy of the specified aggregate into
5070 /// destination address.
5071 void EmitAggFinalDestCopy(QualType Type, AggValueSlot Dest, const LValue &Src,
5072 ExprValueKind SrcKind);
5073
5074 /// Create a store to \arg DstPtr from \arg Src, truncating the stored value
5075 /// to at most \arg DstSize bytes.
5076 void CreateCoercedStore(llvm::Value *Src, QualType SrcFETy, Address Dst,
5077 llvm::TypeSize DstSize, bool DstIsVolatile);
5078
5079 /// EmitExtendGCLifetime - Given a pointer to an Objective-C object,
5080 /// make sure it survives garbage collection until this point.
5081 void EmitExtendGCLifetime(llvm::Value *object);
5082
5083 /// EmitComplexExpr - Emit the computation of the specified expression of
5084 /// complex type, returning the result.
5085 ComplexPairTy EmitComplexExpr(const Expr *E, bool IgnoreReal = false,
5086 bool IgnoreImag = false);
5087
5088 /// EmitComplexExprIntoLValue - Emit the given expression of complex
5089 /// type and place its result into the specified l-value.
5090 void EmitComplexExprIntoLValue(const Expr *E, LValue dest, bool isInit);
5091
5092 /// EmitStoreOfComplex - Store a complex number into the specified l-value.
5093 void EmitStoreOfComplex(ComplexPairTy V, LValue dest, bool isInit);
5094
5095 /// EmitLoadOfComplex - Load a complex number from the specified l-value.
5097
5098 ComplexPairTy EmitPromotedComplexExpr(const Expr *E, QualType PromotionType);
5099 llvm::Value *EmitPromotedScalarExpr(const Expr *E, QualType PromotionType);
5102 QualType PromotionType);
5103
5106
5107 /// AddInitializerToStaticVarDecl - Add the initializer for 'D' to the
5108 /// global variable that has already been created for it. If the initializer
5109 /// has a different type than GV does, this may free GV and return a different
5110 /// one. Otherwise it just returns GV.
5111 llvm::GlobalVariable *AddInitializerToStaticVarDecl(const VarDecl &D,
5112 llvm::GlobalVariable *GV);
5113
5114 // Emit an @llvm.invariant.start call for the given memory region.
5115 void EmitInvariantStart(llvm::Constant *Addr, CharUnits Size);
5116
5117 /// EmitCXXGlobalVarDeclInit - Create the initializer for a C++
5118 /// variable with global storage.
5119 void EmitCXXGlobalVarDeclInit(const VarDecl &D, llvm::GlobalVariable *GV,
5120 bool PerformInit);
5121
5122 llvm::Constant *createAtExitStub(const VarDecl &VD, llvm::FunctionCallee Dtor,
5123 llvm::Constant *Addr);
5124
5125 llvm::Function *createTLSAtExitStub(const VarDecl &VD,
5126 llvm::FunctionCallee Dtor,
5127 llvm::Constant *Addr,
5128 llvm::FunctionCallee &AtExit);
5129
5130 /// Call atexit() with a function that passes the given argument to
5131 /// the given function.
5132 void registerGlobalDtorWithAtExit(const VarDecl &D, llvm::FunctionCallee fn,
5133 llvm::Constant *addr);
5134
5135 /// Registers the dtor using 'llvm.global_dtors' for platforms that do not
5136 /// support an 'atexit()' function.
5137 void registerGlobalDtorWithLLVM(const VarDecl &D, llvm::FunctionCallee fn,
5138 llvm::Constant *addr);
5139
5140 /// Call atexit() with function dtorStub.
5141 void registerGlobalDtorWithAtExit(llvm::Constant *dtorStub);
5142
5143 /// Call unatexit() with function dtorStub.
5144 llvm::Value *unregisterGlobalDtorWithUnAtExit(llvm::Constant *dtorStub);
5145
5146 /// Emit code in this function to perform a guarded variable
5147 /// initialization. Guarded initializations are used when it's not
5148 /// possible to prove that an initialization will be done exactly
5149 /// once, e.g. with a static local variable or a static data member
5150 /// of a class template.
5151 void EmitCXXGuardedInit(const VarDecl &D, llvm::GlobalVariable *DeclPtr,
5152 bool PerformInit);
5153
5155
5156 /// Emit a branch to select whether or not to perform guarded initialization.
5157 void EmitCXXGuardedInitBranch(llvm::Value *NeedsInit,
5158 llvm::BasicBlock *InitBlock,
5159 llvm::BasicBlock *NoInitBlock, GuardKind Kind,
5160 const VarDecl *D);
5161
5162 /// GenerateCXXGlobalInitFunc - Generates code for initializing global
5163 /// variables.
5164 void
5165 GenerateCXXGlobalInitFunc(llvm::Function *Fn,
5166 ArrayRef<llvm::Function *> CXXThreadLocals,
5168
5169 /// GenerateCXXGlobalCleanUpFunc - Generates code for cleaning up global
5170 /// variables.
5172 llvm::Function *Fn,
5173 ArrayRef<std::tuple<llvm::FunctionType *, llvm::WeakTrackingVH,
5174 llvm::Constant *>>
5175 DtorsOrStermFinalizers);
5176
5177 void GenerateCXXGlobalVarDeclInitFunc(llvm::Function *Fn, const VarDecl *D,
5178 llvm::GlobalVariable *Addr,
5179 bool PerformInit);
5180
5182
5183 void EmitSynthesizedCXXCopyCtor(Address Dest, Address Src, const Expr *Exp);
5184
5185 void EmitCXXThrowExpr(const CXXThrowExpr *E, bool KeepInsertionPoint = true);
5186
5188
5189 void EmitFakeUse(Address Addr);
5190
5191 //===--------------------------------------------------------------------===//
5192 // Annotations Emission
5193 //===--------------------------------------------------------------------===//
5194
5195 /// Emit an annotation call (intrinsic).
5196 llvm::Value *EmitAnnotationCall(llvm::Function *AnnotationFn,
5197 llvm::Value *AnnotatedVal,
5198 StringRef AnnotationStr,
5199 SourceLocation Location,
5200 const AnnotateAttr *Attr);
5201
5202 /// Emit local annotations for the local variable V, declared by D.
5203 void EmitVarAnnotations(const VarDecl *D, llvm::Value *V);
5204
5205 /// Emit field annotations for the given field & value. Returns the
5206 /// annotation result.
5208
5209 //===--------------------------------------------------------------------===//
5210 // Internal Helpers
5211 //===--------------------------------------------------------------------===//
5212
5213 /// ContainsLabel - Return true if the statement contains a label in it. If
5214 /// this statement is not executed normally, it not containing a label means
5215 /// that we can just remove the code.
5216 static bool ContainsLabel(const Stmt *S, bool IgnoreCaseStmts = false);
5217
5218 /// containsBreak - Return true if the statement contains a break out of it.
5219 /// If the statement (recursively) contains a switch or loop with a break
5220 /// inside of it, this is fine.
5221 static bool containsBreak(const Stmt *S);
5222
5223 /// Determine if the given statement might introduce a declaration into the
5224 /// current scope, by being a (possibly-labelled) DeclStmt.
5225 static bool mightAddDeclToScope(const Stmt *S);
5226
5227 /// ConstantFoldsToSimpleInteger - If the specified expression does not fold
5228 /// to a constant, or if it does but contains a label, return false. If it
5229 /// constant folds return true and set the boolean result in Result.
5230 bool ConstantFoldsToSimpleInteger(const Expr *Cond, bool &Result,
5231 bool AllowLabels = false);
5232
5233 /// ConstantFoldsToSimpleInteger - If the specified expression does not fold
5234 /// to a constant, or if it does but contains a label, return false. If it
5235 /// constant folds return true and set the folded value.
5236 bool ConstantFoldsToSimpleInteger(const Expr *Cond, llvm::APSInt &Result,
5237 bool AllowLabels = false);
5238
5239 /// Ignore parentheses and logical-NOT to track conditions consistently.
5240 static const Expr *stripCond(const Expr *C);
5241
5242 /// isInstrumentedCondition - Determine whether the given condition is an
5243 /// instrumentable condition (i.e. no "&&" or "||").
5244 static bool isInstrumentedCondition(const Expr *C);
5245
5246 /// EmitBranchToCounterBlock - Emit a conditional branch to a new block that
5247 /// increments a profile counter based on the semantics of the given logical
5248 /// operator opcode. This is used to instrument branch condition coverage
5249 /// for logical operators.
5251 llvm::BasicBlock *TrueBlock,
5252 llvm::BasicBlock *FalseBlock,
5253 uint64_t TrueCount = 0,
5255 const Expr *CntrIdx = nullptr);
5256
5257 /// EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g. for an
5258 /// if statement) to the specified blocks. Based on the condition, this might
5259 /// try to simplify the codegen of the conditional based on the branch.
5260 /// TrueCount should be the number of times we expect the condition to
5261 /// evaluate to true based on PGO data.
5262 void EmitBranchOnBoolExpr(const Expr *Cond, llvm::BasicBlock *TrueBlock,
5263 llvm::BasicBlock *FalseBlock, uint64_t TrueCount,
5265 const Expr *ConditionalOp = nullptr,
5266 const VarDecl *ConditionalDecl = nullptr);
5267
5268 /// Given an assignment `*LHS = RHS`, emit a test that checks if \p RHS is
5269 /// nonnull, if \p LHS is marked _Nonnull.
5270 void EmitNullabilityCheck(LValue LHS, llvm::Value *RHS, SourceLocation Loc);
5271
5272 /// An enumeration which makes it easier to specify whether or not an
5273 /// operation is a subtraction.
5274 enum { NotSubtraction = false, IsSubtraction = true };
5275
5276 /// Emit pointer + index arithmetic.
5277 llvm::Value *EmitPointerArithmetic(const BinaryOperator *BO,
5278 Expr *pointerOperand, llvm::Value *pointer,
5279 Expr *indexOperand, llvm::Value *index,
5280 bool isSubtraction);
5281
5282 /// Same as IRBuilder::CreateInBoundsGEP, but additionally emits a check to
5283 /// detect undefined behavior when the pointer overflow sanitizer is enabled.
5284 /// \p SignedIndices indicates whether any of the GEP indices are signed.
5285 /// \p IsSubtraction indicates whether the expression used to form the GEP
5286 /// is a subtraction.
5287 llvm::Value *EmitCheckedInBoundsGEP(llvm::Type *ElemTy, llvm::Value *Ptr,
5289 bool SignedIndices, bool IsSubtraction,
5290 SourceLocation Loc,
5291 const Twine &Name = "");
5292
5294 llvm::Type *elementType, bool SignedIndices,
5295 bool IsSubtraction, SourceLocation Loc,
5296 CharUnits Align, const Twine &Name = "");
5297
5298 /// Specifies which type of sanitizer check to apply when handling a
5299 /// particular builtin.
5305
5306 /// Emits an argument for a call to a builtin. If the builtin sanitizer is
5307 /// enabled, a runtime check specified by \p Kind is also emitted.
5308 llvm::Value *EmitCheckedArgForBuiltin(const Expr *E, BuiltinCheckKind Kind);
5309
5310 /// Emits an argument for a call to a `__builtin_assume`. If the builtin
5311 /// sanitizer is enabled, a runtime check is also emitted.
5312 llvm::Value *EmitCheckedArgForAssume(const Expr *E);
5313
5314 /// Emit a description of a type in a format suitable for passing to
5315 /// a runtime sanitizer handler.
5316 llvm::Constant *EmitCheckTypeDescriptor(QualType T);
5317
5318 /// Convert a value into a format suitable for passing to a runtime
5319 /// sanitizer handler.
5320 llvm::Value *EmitCheckValue(llvm::Value *V);
5321
5322 /// Emit a description of a source location in a format suitable for
5323 /// passing to a runtime sanitizer handler.
5324 llvm::Constant *EmitCheckSourceLocation(SourceLocation Loc);
5325
5326 void EmitKCFIOperandBundle(const CGCallee &Callee,
5328
5329 /// Create a basic block that will either trap or call a handler function in
5330 /// the UBSan runtime with the provided arguments, and create a conditional
5331 /// branch to it.
5332 void
5333 EmitCheck(ArrayRef<std::pair<llvm::Value *, SanitizerKind::SanitizerOrdinal>>
5334 Checked,
5336 ArrayRef<llvm::Value *> DynamicArgs,
5337 const TrapReason *TR = nullptr);
5338
5339 /// Emit a slow path cross-DSO CFI check which calls __cfi_slowpath
5340 /// if Cond if false.
5342 llvm::Value *Cond, llvm::ConstantInt *TypeId,
5343 llvm::Value *Ptr,
5344 ArrayRef<llvm::Constant *> StaticArgs);
5345
5346 /// Emit a reached-unreachable diagnostic if \p Loc is valid and runtime
5347 /// checking is enabled. Otherwise, just emit an unreachable instruction.
5349
5350 /// Create a basic block that will call the trap intrinsic, and emit a
5351 /// conditional branch to it, for the -ftrapv checks.
5352 void EmitTrapCheck(llvm::Value *Checked, SanitizerHandler CheckHandlerID,
5353 bool NoMerge = false, const TrapReason *TR = nullptr);
5354
5355 /// Emit a call to trap or debugtrap and attach function attribute
5356 /// "trap-func-name" if specified.
5357 llvm::CallInst *EmitTrapCall(llvm::Intrinsic::ID IntrID);
5358
5359 /// Emit a stub for the cross-DSO CFI check function.
5360 void EmitCfiCheckStub();
5361
5362 /// Emit a cross-DSO CFI failure handling function.
5363 void EmitCfiCheckFail();
5364
5365 /// Create a check for a function parameter that may potentially be
5366 /// declared as non-null.
5367 void EmitNonNullArgCheck(RValue RV, QualType ArgType, SourceLocation ArgLoc,
5368 AbstractCallee AC, unsigned ParmNum);
5369
5371 SourceLocation ArgLoc, AbstractCallee AC,
5372 unsigned ParmNum);
5373
5374 /// EmitWriteback - Emit callbacks for function.
5375 void EmitWritebacks(const CallArgList &Args);
5376
5377 /// EmitCallArg - Emit a single call argument.
5378 void EmitCallArg(CallArgList &args, const Expr *E, QualType ArgType);
5379
5380 /// EmitDelegateCallArg - We are performing a delegate call; that
5381 /// is, the current function is delegating to another one. Produce
5382 /// a r-value suitable for passing the given parameter.
5383 void EmitDelegateCallArg(CallArgList &args, const VarDecl *param,
5384 SourceLocation loc);
5385
5386 /// SetFPAccuracy - Set the minimum required accuracy of the given floating
5387 /// point operation, expressed as the maximum relative error in ulp.
5388 void SetFPAccuracy(llvm::Value *Val, float Accuracy);
5389
5390 /// Set the minimum required accuracy of the given sqrt operation
5391 /// based on CodeGenOpts.
5392 void SetSqrtFPAccuracy(llvm::Value *Val);
5393
5394 /// Set the minimum required accuracy of the given sqrt operation based on
5395 /// CodeGenOpts.
5396 void SetDivFPAccuracy(llvm::Value *Val);
5397
5398 /// Set the codegen fast-math flags.
5399 void SetFastMathFlags(FPOptions FPFeatures);
5400
5401 // Truncate or extend a boolean vector to the requested number of elements.
5402 llvm::Value *emitBoolVecConversion(llvm::Value *SrcVec,
5403 unsigned NumElementsDst,
5404 const llvm::Twine &Name = "");
5405
5406 void maybeAttachRangeForLoad(llvm::LoadInst *Load, QualType Ty,
5407 SourceLocation Loc);
5408
5409private:
5410 // Emits a convergence_loop instruction for the given |BB|, with |ParentToken|
5411 // as it's parent convergence instr.
5412 llvm::ConvergenceControlInst *emitConvergenceLoopToken(llvm::BasicBlock *BB);
5413
5414 // Adds a convergence_ctrl token with |ParentToken| as parent convergence
5415 // instr to the call |Input|.
5416 llvm::CallBase *addConvergenceControlToken(llvm::CallBase *Input);
5417
5418 // Find the convergence_entry instruction |F|, or emits ones if none exists.
5419 // Returns the convergence instruction.
5420 llvm::ConvergenceControlInst *
5421 getOrEmitConvergenceEntryToken(llvm::Function *F);
5422
5423private:
5424 llvm::MDNode *getRangeForLoadFromType(QualType Ty);
5425 void EmitReturnOfRValue(RValue RV, QualType Ty);
5426
5427 void deferPlaceholderReplacement(llvm::Instruction *Old, llvm::Value *New);
5428
5430 DeferredReplacements;
5431
5432 /// Set the address of a local variable.
5433 void setAddrOfLocalVar(const VarDecl *VD, Address Addr) {
5434 assert(!LocalDeclMap.count(VD) && "Decl already exists in LocalDeclMap!");
5435 LocalDeclMap.insert({VD, Addr});
5436 }
5437
5438 /// ExpandTypeFromArgs - Reconstruct a structure of type \arg Ty
5439 /// from function arguments into \arg Dst. See ABIArgInfo::Expand.
5440 ///
5441 /// \param AI - The first function argument of the expansion.
5442 void ExpandTypeFromArgs(QualType Ty, LValue Dst,
5443 llvm::Function::arg_iterator &AI);
5444
5445 /// ExpandTypeToArgs - Expand an CallArg \arg Arg, with the LLVM type for \arg
5446 /// Ty, into individual arguments on the provided vector \arg IRCallArgs,
5447 /// starting at index \arg IRCallArgPos. See ABIArgInfo::Expand.
5448 void ExpandTypeToArgs(QualType Ty, CallArg Arg, llvm::FunctionType *IRFuncTy,
5449 SmallVectorImpl<llvm::Value *> &IRCallArgs,
5450 unsigned &IRCallArgPos);
5451
5452 std::pair<llvm::Value *, llvm::Type *>
5453 EmitAsmInput(const TargetInfo::ConstraintInfo &Info, const Expr *InputExpr,
5454 std::string &ConstraintStr);
5455
5456 std::pair<llvm::Value *, llvm::Type *>
5457 EmitAsmInputLValue(const TargetInfo::ConstraintInfo &Info, LValue InputValue,
5458 QualType InputType, std::string &ConstraintStr,
5459 SourceLocation Loc);
5460
5461 /// Attempts to statically evaluate the object size of E. If that
5462 /// fails, emits code to figure the size of E out for us. This is
5463 /// pass_object_size aware.
5464 ///
5465 /// If EmittedExpr is non-null, this will use that instead of re-emitting E.
5466 llvm::Value *evaluateOrEmitBuiltinObjectSize(const Expr *E, unsigned Type,
5467 llvm::IntegerType *ResType,
5468 llvm::Value *EmittedE,
5469 bool IsDynamic);
5470
5471 /// Emits the size of E, as required by __builtin_object_size. This
5472 /// function is aware of pass_object_size parameters, and will act accordingly
5473 /// if E is a parameter with the pass_object_size attribute.
5474 llvm::Value *emitBuiltinObjectSize(const Expr *E, unsigned Type,
5475 llvm::IntegerType *ResType,
5476 llvm::Value *EmittedE, bool IsDynamic);
5477
5478 llvm::Value *emitCountedBySize(const Expr *E, llvm::Value *EmittedE,
5479 unsigned Type, llvm::IntegerType *ResType);
5480
5481 llvm::Value *emitCountedByMemberSize(const MemberExpr *E, const Expr *Idx,
5482 llvm::Value *EmittedE,
5483 QualType CastedArrayElementTy,
5484 unsigned Type,
5485 llvm::IntegerType *ResType);
5486
5487 llvm::Value *emitCountedByPointerSize(const ImplicitCastExpr *E,
5488 const Expr *Idx, llvm::Value *EmittedE,
5489 QualType CastedArrayElementTy,
5490 unsigned Type,
5491 llvm::IntegerType *ResType);
5492
5493 void emitZeroOrPatternForAutoVarInit(QualType type, const VarDecl &D,
5494 Address Loc);
5495
5496public:
5497 enum class EvaluationOrder {
5498 ///! No language constraints on evaluation order.
5500 ///! Language semantics require left-to-right evaluation.
5502 ///! Language semantics require right-to-left evaluation.
5504 };
5505
5506 // Wrapper for function prototype sources. Wraps either a FunctionProtoType or
5507 // an ObjCMethodDecl.
5509 llvm::PointerUnion<const FunctionProtoType *, const ObjCMethodDecl *> P;
5510
5513 };
5514
5515 void EmitCallArgs(CallArgList &Args, PrototypeWrapper Prototype,
5516 llvm::iterator_range<CallExpr::const_arg_iterator> ArgRange,
5517 AbstractCallee AC = AbstractCallee(),
5518 unsigned ParamsToSkip = 0,
5520
5521 /// EmitPointerWithAlignment - Given an expression with a pointer type,
5522 /// emit the value and compute our best estimate of the alignment of the
5523 /// pointee.
5524 ///
5525 /// \param BaseInfo - If non-null, this will be initialized with
5526 /// information about the source of the alignment and the may-alias
5527 /// attribute. Note that this function will conservatively fall back on
5528 /// the type when it doesn't recognize the expression and may-alias will
5529 /// be set to false.
5530 ///
5531 /// One reasonable way to use this information is when there's a language
5532 /// guarantee that the pointer must be aligned to some stricter value, and
5533 /// we're simply trying to ensure that sufficiently obvious uses of under-
5534 /// aligned objects don't get miscompiled; for example, a placement new
5535 /// into the address of a local variable. In such a case, it's quite
5536 /// reasonable to just ignore the returned alignment when it isn't from an
5537 /// explicit source.
5538 Address
5539 EmitPointerWithAlignment(const Expr *Addr, LValueBaseInfo *BaseInfo = nullptr,
5540 TBAAAccessInfo *TBAAInfo = nullptr,
5541 KnownNonNull_t IsKnownNonNull = NotKnownNonNull);
5542
5543 /// If \p E references a parameter with pass_object_size info or a constant
5544 /// array size modifier, emit the object size divided by the size of \p EltTy.
5545 /// Otherwise return null.
5546 llvm::Value *LoadPassedObjectSize(const Expr *E, QualType EltTy);
5547
5548 void EmitSanitizerStatReport(llvm::SanitizerStatKind SSK);
5549
5551 llvm::Function *Function;
5553 std::optional<StringRef> Architecture;
5554
5555 FMVResolverOption(llvm::Function *F, ArrayRef<StringRef> Feats,
5556 std::optional<StringRef> Arch = std::nullopt)
5557 : Function(F), Features(Feats), Architecture(Arch) {}
5558 };
5559
5560 // Emits the body of a multiversion function's resolver. Assumes that the
5561 // options are already sorted in the proper order, with the 'default' option
5562 // last (if it exists).
5563 void EmitMultiVersionResolver(llvm::Function *Resolver,
5565 void EmitX86MultiVersionResolver(llvm::Function *Resolver,
5567 void EmitAArch64MultiVersionResolver(llvm::Function *Resolver,
5569 void EmitRISCVMultiVersionResolver(llvm::Function *Resolver,
5571
5572 Address EmitAddressOfPFPField(Address RecordPtr, const PFPField &Field);
5573 Address EmitAddressOfPFPField(Address RecordPtr, Address FieldPtr,
5574 const FieldDecl *Field);
5575
5576private:
5577 QualType getVarArgType(const Expr *Arg);
5578
5579 void EmitDeclMetadata();
5580
5581 BlockByrefHelpers *buildByrefHelpers(llvm::StructType &byrefType,
5582 const AutoVarEmission &emission);
5583
5584 void AddObjCARCExceptionMetadata(llvm::Instruction *Inst);
5585
5586 llvm::Value *GetValueForARMHint(unsigned BuiltinID);
5587 llvm::Value *EmitX86CpuIs(const CallExpr *E);
5588 llvm::Value *EmitX86CpuIs(StringRef CPUStr);
5589 llvm::Value *EmitX86CpuSupports(const CallExpr *E);
5590 llvm::Value *EmitX86CpuSupports(ArrayRef<StringRef> FeatureStrs);
5591 llvm::Value *EmitX86CpuSupports(std::array<uint32_t, 4> FeatureMask);
5592 llvm::Value *EmitX86CpuInit();
5593 llvm::Value *FormX86ResolverCondition(const FMVResolverOption &RO);
5594 llvm::Value *EmitAArch64CpuInit();
5595 llvm::Value *FormAArch64ResolverCondition(const FMVResolverOption &RO);
5596 llvm::Value *EmitAArch64CpuSupports(const CallExpr *E);
5597 llvm::Value *EmitAArch64CpuSupports(ArrayRef<StringRef> FeatureStrs);
5598};
5599
5602 if (!needsSaving(value))
5603 return saved_type(value, false);
5604
5605 // Otherwise, we need an alloca.
5606 auto align = CharUnits::fromQuantity(
5607 CGF.CGM.getDataLayout().getPrefTypeAlign(value->getType()));
5608 Address alloca =
5609 CGF.CreateTempAlloca(value->getType(), align, "cond-cleanup.save");
5610 CGF.Builder.CreateStore(value, alloca);
5611
5612 return saved_type(alloca.emitRawPointer(CGF), true);
5613}
5614
5616 saved_type value) {
5617 // If the value says it wasn't saved, trust that it's still dominating.
5618 if (!value.getInt())
5619 return value.getPointer();
5620
5621 // Otherwise, it should be an alloca instruction, as set up in save().
5622 auto alloca = cast<llvm::AllocaInst>(value.getPointer());
5623 return CGF.Builder.CreateAlignedLoad(alloca->getAllocatedType(), alloca,
5624 alloca->getAlign());
5625}
5626
5627} // end namespace CodeGen
5628
5629// Map the LangOption for floating point exception behavior into
5630// the corresponding enum in the IR.
5631llvm::fp::ExceptionBehavior
5633} // end namespace clang
5634
5635#endif
Enums/classes describing ABI related information about constructors, destructors and thunks.
#define V(N, I)
static bool CanThrow(Expr *E, ASTContext &Ctx)
Definition CFG.cpp:2839
static T * buildByrefHelpers(CodeGenModule &CGM, const BlockByrefInfo &byrefInfo, T &&generator)
Lazily build the copy and dispose helpers for a __block variable with the given information.
static bool isInAllocaArgument(CGCXXABI &ABI, QualType type)
Definition CGCall.cpp:4369
@ ForDeactivation
CodeGenFunction::ComplexPairTy ComplexPairTy
Defines the clang::Expr interface and subclasses for C++ expressions.
FormatToken * Previous
The previous token in the unwrapped line.
#define X(type, name)
Definition Value.h:97
llvm::MachO::Target Target
Definition MachO.h:51
*collection of selector each with an associated kind and an ordered *collection of selectors A selector has a kind
Defines some OpenMP-specific enums and functions.
SanitizerHandler
This file defines OpenACC AST classes for statement-level contructs.
This file defines OpenMP AST classes for executable directives and clauses.
This file defines SYCL AST classes used to represent calls to SYCL kernels.
C Language Family Type Representation.
This represents 'pragma omp cancel' directive.
This represents 'pragma omp cancellation point' directive.
This represents 'pragma omp distribute' directive.
This represents 'pragma omp distribute parallel for' composite directive.
This represents 'pragma omp distribute parallel for simd' composite directive.
This represents 'pragma omp distribute simd' composite directive.
This represents 'pragma omp error' directive.
Represents the 'pragma omp fuse' loop transformation directive.
This represents 'pragma omp loop' directive.
Represents the 'pragma omp interchange' loop transformation directive.
This represents 'pragma omp interop' directive.
This represents 'pragma omp masked' directive.
This represents 'pragma omp masked taskloop' directive.
This represents 'pragma omp masked taskloop simd' directive.
This represents 'pragma omp master taskloop' directive.
This represents 'pragma omp master taskloop simd' directive.
This represents 'pragma omp metadirective' directive.
This represents 'pragma omp parallel masked taskloop' directive.
This represents 'pragma omp parallel masked taskloop simd' directive.
This represents 'pragma omp parallel master taskloop' directive.
This represents 'pragma omp parallel master taskloop simd' directive.
Represents the 'pragma omp reverse' loop transformation directive.
This represents 'pragma omp scan' directive.
This represents the 'pragma omp stripe' loop transformation directive.
This represents 'pragma omp target data' directive.
This represents 'pragma omp target' directive.
This represents 'pragma omp target enter data' directive.
This represents 'pragma omp target exit data' directive.
This represents 'pragma omp target parallel' directive.
This represents 'pragma omp target parallel for' directive.
This represents 'pragma omp target parallel for simd' directive.
This represents 'pragma omp target parallel loop' directive.
This represents 'pragma omp target simd' directive.
This represents 'pragma omp target teams' directive.
This represents 'pragma omp target teams distribute' combined directive.
This represents 'pragma omp target teams distribute parallel for' combined directive.
This represents 'pragma omp target teams distribute parallel for simd' combined directive.
This represents 'pragma omp target teams distribute simd' combined directive.
This represents 'pragma omp target teams loop' directive.
This represents 'pragma omp target update' directive.
This represents 'pragma omp taskloop' directive.
This represents 'pragma omp taskloop simd' directive.
This represents 'pragma omp teams' directive.
This represents 'pragma omp teams distribute' directive.
This represents 'pragma omp teams distribute parallel for' composite directive.
This represents 'pragma omp teams distribute parallel for simd' composite directive.
This represents 'pragma omp teams distribute simd' combined directive.
This represents 'pragma omp teams loop' directive.
This represents the 'pragma omp tile' loop transformation directive.
This represents the 'pragma omp unroll' loop transformation directive.
This represents clause 'use_device_addr' in the 'pragma omp ...' directives.
This represents clause 'use_device_ptr' in the 'pragma omp ...' directives.
const Stmt * getAssociatedStmt() const
Stmt * getStructuredBlock()
This class represents a 'loop' construct. The 'loop' construct applies to a 'for' loop (or range-for ...
a trap message and trap category.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Definition APValue.h:122
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:226
AbstractConditionalOperator - An abstract base class for ConditionalOperator and BinaryConditionalOpe...
Definition Expr.h:4356
This class represents BOTH the OpenMP Array Section and OpenACC 'subarray', with a boolean differenti...
Definition Expr.h:7218
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
Definition Expr.h:2724
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition TypeBase.h:3730
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
Definition Expr.h:6927
Attr - This represents one attribute.
Definition Attr.h:46
Represents an attribute applied to a statement.
Definition Stmt.h:2195
BinaryConditionalOperator - The GNU extension to the conditional operator which allows the middle ope...
Definition Expr.h:4456
OpaqueValueExpr * getOpaqueValue() const
getOpaqueValue - Return the opaque value placeholder.
Definition Expr.h:4494
Expr * getCommon() const
getCommon - Return the common expression, written to the left of the condition.
Definition Expr.h:4491
A builtin binary operation expression such as "x + y" or "x <= y".
Definition Expr.h:4041
static bool isLogicalOp(Opcode Opc)
Definition Expr.h:4174
BinaryOperatorKind Opcode
Definition Expr.h:4046
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Definition Expr.h:6671
Represents a call to a CUDA kernel function.
Definition ExprCXX.h:235
Represents binding an expression to a temporary.
Definition ExprCXX.h:1494
Represents a call to a C++ constructor.
Definition ExprCXX.h:1549
Represents a C++ constructor within a class.
Definition DeclCXX.h:2611
A default argument (C++ [dcl.fct.default]).
Definition ExprCXX.h:1271
A use of a default initializer in a constructor or in aggregate initialization.
Definition ExprCXX.h:1378
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition ExprCXX.h:2627
Represents a C++ destructor within a class.
Definition DeclCXX.h:2876
A C++ dynamic_cast expression (C++ [expr.dynamic.cast]).
Definition ExprCXX.h:482
CXXForRangeStmt - This represents C++0x [stmt.ranged]'s ranged for statement, represented as 'for (ra...
Definition StmtCXX.h:135
Represents a call to an inherited base class constructor from an inheriting constructor.
Definition ExprCXX.h:1752
Represents a call to a member function that may be written either with member call syntax (e....
Definition ExprCXX.h:180
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2136
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Definition ExprCXX.h:2356
A call to an overloaded operator written using operator syntax.
Definition ExprCXX.h:85
Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
Definition ExprCXX.h:2746
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
Represents a C++ temporary.
Definition ExprCXX.h:1460
A C++ throw-expression (C++ [except.throw]).
Definition ExprCXX.h:1209
CXXTryStmt - A C++ try block, including all handlers.
Definition StmtCXX.h:69
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
Definition ExprCXX.h:849
A Microsoft C++ __uuidof expression, which gets the _GUID that corresponds to the supplied type or ex...
Definition ExprCXX.h:1069
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition Expr.h:2946
This captures a statement into a function.
Definition Stmt.h:3929
const Capture * const_capture_iterator
Definition Stmt.h:4063
capture_iterator capture_end() const
Retrieve an iterator pointing past the end of the sequence of captures.
Definition Stmt.h:4080
const RecordDecl * getCapturedRecordDecl() const
Retrieve the record declaration for captured variables.
Definition Stmt.h:4050
capture_iterator capture_begin()
Retrieve an iterator pointing to the first capture.
Definition Stmt.h:4075
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition Expr.h:3679
const CXXBaseSpecifier *const * path_const_iterator
Definition Expr.h:3746
CharUnits - This is an opaque type for sizes expressed in character units.
Definition CharUnits.h:38
bool isZero() const
isZero - Test whether the quantity equals zero.
Definition CharUnits.h:122
llvm::Align getAsAlign() const
getAsAlign - Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit b...
Definition CharUnits.h:189
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
Definition CharUnits.h:63
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
Definition CharUnits.h:53
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
void setAlignment(CharUnits Value)
Definition Address.h:196
llvm::Value * getOffset() const
Definition Address.h:246
void replaceBasePointer(llvm::Value *P)
This function is used in situations where the caller is doing some sort of opaque "laundering" of the...
Definition Address.h:186
llvm::PointerType * getType() const
Return the type of the pointer value.
Definition Address.h:204
An aggregate value slot.
Definition CGValue.h:551
static AggValueSlot ignored()
ignored - Returns an aggregate value slot indicating that the aggregate value is being ignored.
Definition CGValue.h:619
static AggValueSlot forAddr(Address addr, Qualifiers quals, IsDestructed_t isDestructed, NeedsGCBarriers_t needsGC, IsAliased_t isAliased, Overlap_t mayOverlap, IsZeroed_t isZeroed=IsNotZeroed, IsSanitizerChecked_t isChecked=IsNotSanitizerChecked)
forAddr - Make a slot for an aggregate value.
Definition CGValue.h:634
A scoped helper to set the current source atom group for CGDebugInfo::addInstToCurrentSourceAtom.
A pair of helper functions for a __block variable.
Information about the layout of a __block variable.
Definition CGBlocks.h:136
CGBlockInfo - Information to generate a block literal.
Definition CGBlocks.h:157
llvm::StoreInst * CreateStore(llvm::Value *Val, Address Addr, bool IsVolatile=false)
Definition CGBuilder.h:146
llvm::LoadInst * CreateAlignedLoad(llvm::Type *Ty, llvm::Value *Addr, CharUnits Align, const llvm::Twine &Name="")
Definition CGBuilder.h:138
Implements C++ ABI-specific code generation functions.
Definition CGCXXABI.h:43
All available information about a concrete callee.
Definition CGCall.h:63
This class gathers all debug information during compilation and is responsible for emitting to llvm g...
Definition CGDebugInfo.h:59
CGFunctionInfo - Class to encapsulate the information about a function definition.
CallArgList - Type for representing both the value and type of arguments in a call.
Definition CGCall.h:274
const ParmVarDecl * getParamDecl(unsigned I) const
ArrayInitLoopExprScope(CodeGenFunction &CGF, llvm::Value *Index)
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.
CGAtomicOptionsRAII(CodeGenModule &CGM_, AtomicOptions AO)
CGAtomicOptionsRAII(CodeGenModule &CGM_, const AtomicAttr *AA)
CGAtomicOptionsRAII(const CGAtomicOptionsRAII &)=delete
CGAtomicOptionsRAII & operator=(const CGAtomicOptionsRAII &)=delete
API for captured statement code generation.
static bool classof(const CGCapturedStmtInfo *)
llvm::SmallDenseMap< const VarDecl *, FieldDecl * > getCaptureFields()
Get the CaptureFields.
CGCapturedStmtInfo(CapturedRegionKind K=CR_Default)
virtual void EmitBody(CodeGenFunction &CGF, const Stmt *S)
Emit the captured statement body.
virtual StringRef getHelperName() const
Get the name of the capture helper.
CGCapturedStmtInfo(const CapturedStmt &S, CapturedRegionKind K=CR_Default)
virtual const FieldDecl * lookup(const VarDecl *VD) const
Lookup the captured field decl for a variable.
CGCapturedStmtRAII(CodeGenFunction &CGF, CGCapturedStmtInfo *NewCapturedStmtInfo)
CGFPOptionsRAII(CodeGenFunction &CGF, FPOptions FPFeatures)
CXXDefaultInitExprScope(CodeGenFunction &CGF, const CXXDefaultInitExpr *E)
void Emit(CodeGenFunction &CGF, Flags flags) override
An object to manage conditionally-evaluated expressions.
llvm::BasicBlock * getStartingBlock() const
Returns a block which will be executed prior to each evaluation of the conditional code.
static ConstantEmission forValue(llvm::Constant *C)
static ConstantEmission forReference(llvm::Constant *C)
LValue getReferenceLValue(CodeGenFunction &CGF, const Expr *RefExpr) const
void Emit(CodeGenFunction &CGF, Flags flags) override
FieldConstructionScope(CodeGenFunction &CGF, Address This)
A class controlling the emission of a finally block.
void enter(CodeGenFunction &CGF, const Stmt *Finally, llvm::FunctionCallee beginCatchFn, llvm::FunctionCallee endCatchFn, llvm::FunctionCallee rethrowFn)
Enters a finally block for an implementation using zero-cost exceptions.
void rescopeLabels()
Change the cleanup scope of the labels in this lexical scope to match the scope of the enclosing cont...
Definition CGStmt.cpp:742
~LexicalScope()
Exit this cleanup scope, emitting any accumulated cleanups.
void ForceCleanup()
Force the emission of cleanups now, instead of waiting until this object is destroyed.
InlinedRegionBodyRAII(CodeGenFunction &cgf, InsertPointTy &AllocaIP, llvm::BasicBlock &FiniBB)
OutlinedRegionBodyRAII(CodeGenFunction &cgf, InsertPointTy &AllocaIP, llvm::BasicBlock &RetBB)
OMPCancelStackRAII(CodeGenFunction &CGF, OpenMPDirectiveKind Kind, bool HasCancel)
The class used to assign some variables some temporarily addresses.
bool apply(CodeGenFunction &CGF)
Applies new addresses to the list of the variables.
void restore(CodeGenFunction &CGF)
Restores original addresses of the variables.
bool setVarAddr(CodeGenFunction &CGF, const VarDecl *LocalVD, Address TempAddr)
Sets the address of the variable LocalVD to be TempAddr in function CGF.
The scope used to remap some variables as private in the OpenMP loop body (or other captured region e...
void restoreMap()
Restore all mapped variables w/o clean up.
bool Privatize()
Privatizes local variables previously registered as private.
bool isGlobalVarCaptured(const VarDecl *VD) const
Checks if the global variable is captured in current function.
OMPPrivateScope(CodeGenFunction &CGF)
Enter a new OpenMP private scope.
~OMPPrivateScope()
Exit scope - all the mapped variables are restored.
bool addPrivate(const VarDecl *LocalVD, Address Addr)
Registers LocalVD variable as a private with Addr as the address of the corresponding private variabl...
A non-RAII class containing all the information about a bound opaque value.
static OpaqueValueMappingData bind(CodeGenFunction &CGF, const OpaqueValueExpr *ov, const LValue &lv)
static OpaqueValueMappingData bind(CodeGenFunction &CGF, const OpaqueValueExpr *ov, const RValue &rv)
static OpaqueValueMappingData bind(CodeGenFunction &CGF, const OpaqueValueExpr *ov, const Expr *e)
OpaqueValueMapping(CodeGenFunction &CGF, const OpaqueValueExpr *OV)
Build the opaque value mapping for an OpaqueValueExpr whose source expression is set to the expressio...
OpaqueValueMapping(CodeGenFunction &CGF, const AbstractConditionalOperator *op)
Build the opaque value mapping for the given conditional operator if it's the GNU ?
OpaqueValueMapping(CodeGenFunction &CGF, const OpaqueValueExpr *opaqueValue, RValue rvalue)
OpaqueValueMapping(CodeGenFunction &CGF, const OpaqueValueExpr *opaqueValue, LValue lvalue)
static ParamValue forIndirect(Address addr)
static ParamValue forDirect(llvm::Value *value)
ParentLoopDirectiveForScanRegion(CodeGenFunction &CGF, const OMPExecutableDirective &ParentLoopDirectiveForScan)
An object which temporarily prevents a value from being destroyed by aggressive peephole optimization...
RunCleanupsScope(CodeGenFunction &CGF)
Enter a new cleanup scope.
~RunCleanupsScope()
Exit this cleanup scope, emitting any accumulated cleanups.
void ForceCleanup(std::initializer_list< llvm::Value ** > ValuesToReload={})
Force the emission of cleanups now, instead of waiting until this object is destroyed.
bool requiresCleanups() const
Determine whether this scope requires any cleanups.
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
EHScopeStack::stable_iterator CurrentCleanupScopeDepth
RValue EmitAMDGPUDevicePrintfCallExpr(const CallExpr *E)
LValue EmitMatrixSubscriptExpr(const MatrixSubscriptExpr *E)
Definition CGExpr.cpp:5143
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:2456
LValue EmitCoawaitLValue(const CoawaitExpr *E)
llvm::Value * GetVTablePtr(Address This, llvm::Type *VTableTy, const CXXRecordDecl *VTableClass, VTableAuthMode AuthMode=VTableAuthMode::Authenticate)
GetVTablePtr - Return the Value of the vtable pointer member pointed to by This.
Definition CGClass.cpp:2838
void EmitOMPParallelMaskedTaskLoopDirective(const OMPParallelMaskedTaskLoopDirective &S)
RValue EmitNVPTXDevicePrintfCallExpr(const CallExpr *E)
llvm::Value * EmitSVEPredicateCast(llvm::Value *Pred, llvm::ScalableVectorType *VTy)
Definition ARM.cpp:4003
llvm::Value * EmitObjCConsumeObject(QualType T, llvm::Value *Ptr)
Produce the code for a CK_ARCConsumeObject.
Definition CGObjC.cpp:2152
llvm::Value * EmitFP8NeonFMLACall(unsigned IID, bool ExtendLaneArg, llvm::Type *RetTy, SmallVectorImpl< llvm::Value * > &Ops, const CallExpr *E, const char *name)
Definition ARM.cpp:470
void EmitCXXGuardedInit(const VarDecl &D, llvm::GlobalVariable *DeclPtr, bool PerformInit)
Emit code in this function to perform a guarded variable initialization.
void EmitBoundsCheckImpl(const Expr *ArrayExpr, QualType ArrayBaseType, llvm::Value *IndexVal, QualType IndexType, llvm::Value *BoundsVal, QualType BoundsType, bool Accessed)
Definition CGExpr.cpp:1271
void EmitRISCVMultiVersionResolver(llvm::Function *Resolver, ArrayRef< FMVResolverOption > Options)
void EmitOMPParallelMaskedDirective(const OMPParallelMaskedDirective &S)
void EmitOMPTaskyieldDirective(const OMPTaskyieldDirective &S)
LValue EmitLoadOfReferenceLValue(LValue RefLVal)
Definition CGExpr.cpp:3355
void EmitCXXTryStmt(const CXXTryStmt &S)
GlobalDecl CurGD
CurGD - The GlobalDecl for the current function being compiled.
void EmitBranchOnBoolExpr(const Expr *Cond, llvm::BasicBlock *TrueBlock, llvm::BasicBlock *FalseBlock, uint64_t TrueCount, Stmt::Likelihood LH=Stmt::LH_None, const Expr *ConditionalOp=nullptr, const VarDecl *ConditionalDecl=nullptr)
EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g.
void setCurrentProfileCount(uint64_t Count)
Set the profiler's current count.
llvm::Constant * createAtExitStub(const VarDecl &VD, llvm::FunctionCallee Dtor, llvm::Constant *Addr)
Create a stub function, suitable for being passed to atexit, which passes the given address to the gi...
llvm::Value * EmitObjCAutorelease(llvm::Value *value, llvm::Type *returnType)
Autorelease the given object.
Definition CGObjC.cpp:2848
RValue EmitObjCMessageExpr(const ObjCMessageExpr *E, ReturnValueSlot Return=ReturnValueSlot())
Definition CGObjC.cpp:573
llvm::Value * emitBoolVecConversion(llvm::Value *SrcVec, unsigned NumElementsDst, const llvm::Twine &Name="")
void EmitOMPLastprivateClauseFinal(const OMPExecutableDirective &D, bool NoFinals, llvm::Value *IsLastIterCond=nullptr)
Emit final copying of lastprivate values to original variables at the end of the worksharing or simd ...
void EmitCXXConstructExpr(const CXXConstructExpr *E, AggValueSlot Dest)
CurrentSourceLocExprScope CurSourceLocExprScope
Source location information about the default argument or member initializer expression we're evaluat...
void EmitARCMoveWeak(Address dst, Address src)
void @objc_moveWeak(i8** dest, i8** src) Disregards the current value in dest.
Definition CGObjC.cpp:2692
llvm::BasicBlock * getFuncletEHDispatchBlock(EHScopeStack::stable_iterator scope)
void EmitAArch64MultiVersionResolver(llvm::Function *Resolver, ArrayRef< FMVResolverOption > Options)
void EmitDelegatingCXXConstructorCall(const CXXConstructorDecl *Ctor, const FunctionArgList &Args)
Definition CGClass.cpp:2636
void processInReduction(const OMPExecutableDirective &S, OMPTaskDataTy &Data, CodeGenFunction &CGF, const CapturedStmt *CS, OMPPrivateScope &Scope)
llvm::Value * EmitARCRetainAutoreleaseReturnValue(llvm::Value *value)
Do a fused retain/autorelease of the given object.
Definition CGObjC.cpp:2599
void emitDestroy(Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray)
emitDestroy - Immediately perform the destruction of the given object.
Definition CGDecl.cpp:2416
LValue EmitCXXConstructLValue(const CXXConstructExpr *E)
Definition CGExpr.cpp:6720
void EmitMustTailThunk(GlobalDecl GD, llvm::Value *AdjustedThisPtr, llvm::FunctionCallee Callee)
Emit a musttail call for a thunk with a potentially adjusted this pointer.
AggValueSlot::Overlap_t getOverlapForFieldInit(const FieldDecl *FD)
Determine whether a field initialization may overlap some other object.
RValue EmitCoroutineIntrinsic(const CallExpr *E, unsigned int IID)
bool isBinaryLogicalOp(const Expr *E) const
llvm::Value * BuildVector(ArrayRef< llvm::Value * > Ops)
Definition ARM.cpp:7962
void EmitDelegateCXXConstructorCall(const CXXConstructorDecl *Ctor, CXXCtorType CtorType, const FunctionArgList &Args, SourceLocation Loc)
Definition CGClass.cpp:2579
void ActivateCleanupBlock(EHScopeStack::stable_iterator Cleanup, llvm::Instruction *DominatingIP)
ActivateCleanupBlock - Activates an initially-inactive cleanup.
void emitByrefStructureInit(const AutoVarEmission &emission)
Initialize the structural components of a __block variable, i.e.
llvm::Value * performAddrSpaceCast(llvm::Value *Src, llvm::Type *DestTy)
JumpDest getJumpDestInCurrentScope(llvm::BasicBlock *Target)
The given basic block lies in the current EH scope, but may be a target of a potentially scope-crossi...
LValue EmitConditionalOperatorLValue(const AbstractConditionalOperator *E)
Definition CGExpr.cpp:6028
llvm::Value * EmitARCReclaimReturnedObject(const Expr *e, bool allowUnsafeClaim)
Definition CGObjC.cpp:3089
std::pair< LValue, llvm::Value * > EmitARCStoreAutoreleasing(const BinaryOperator *e)
Definition CGObjC.cpp:3679
void EmitOMPTaskLoopBasedDirective(const OMPLoopDirective &S)
ComplexPairTy EmitComplexPrePostIncDec(const UnaryOperator *E, LValue LV, bool isInc, bool isPre)
Definition CGExpr.cpp:1352
void SetDivFPAccuracy(llvm::Value *Val)
Set the minimum required accuracy of the given sqrt operation based on CodeGenOpts.
Definition CGExpr.cpp:7153
llvm::Value * EmitARCUnsafeUnretainedScalarExpr(const Expr *expr)
EmitARCUnsafeUnretainedScalarExpr - Semantically equivalent to immediately releasing the resut of Emi...
Definition CGObjC.cpp:3618
llvm::Value * EmitObjCSelectorExpr(const ObjCSelectorExpr *E)
Emit a selector.
Definition CGObjC.cpp:257
llvm::Value * EmitScalarOrConstFoldImmArg(unsigned ICEArguments, unsigned Idx, const CallExpr *E)
void BuildBlockRelease(llvm::Value *DeclPtr, BlockFieldFlags flags, bool CanThrow)
llvm::Function * createTLSAtExitStub(const VarDecl &VD, llvm::FunctionCallee Dtor, llvm::Constant *Addr, llvm::FunctionCallee &AtExit)
Create a stub function, suitable for being passed to __pt_atexit_np, which passes the given address t...
SanitizerSet SanOpts
Sanitizers enabled for this function.
void emitOMPSimpleStore(LValue LVal, RValue RVal, QualType RValTy, SourceLocation Loc)
static void EmitOMPTargetParallelDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetParallelDirective &S)
void EmitAsanPrologueOrEpilogue(bool Prologue)
Definition CGClass.cpp:764
CounterForIncrement
Used to specify which counter in a pair shall be incremented.
void callCStructMoveConstructor(LValue Dst, LValue Src)
void EmitInlinedInheritingCXXConstructorCall(const CXXConstructorDecl *Ctor, CXXCtorType CtorType, bool ForVirtualBase, bool Delegating, CallArgList &Args)
Emit a call to an inheriting constructor (that is, one that invokes a constructor inherited from a ba...
Definition CGClass.cpp:2478
void pushStackRestore(CleanupKind kind, Address SPMem)
Definition CGDecl.cpp:2344
LValue EmitInitListLValue(const InitListExpr *E)
Definition CGExpr.cpp:5910
bool isUnderlyingBasePointerConstantNull(const Expr *E)
Check whether the underlying base pointer is a constant null.
Definition CGExpr.cpp:5463
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 EmitNullInitialization(Address DestPtr, QualType Ty)
EmitNullInitialization - Generate code to set a value of the given type to null, If the type contains...
bool IsOutlinedSEHHelper
True if the current function is an outlined SEH helper.
void EmitARCInitWeak(Address addr, llvm::Value *value)
i8* @objc_initWeak(i8** addr, i8* value) Returns value.
Definition CGObjC.cpp:2663
void EmitOMPCanonicalLoop(const OMPCanonicalLoop *S)
Emit an OMPCanonicalLoop using the OpenMPIRBuilder.
llvm::Value * getExceptionFromSlot()
Returns the contents of the function's exception object and selector slots.
void checkTargetFeatures(const CallExpr *E, const FunctionDecl *TargetDecl)
LValue EmitArraySubscriptExpr(const ArraySubscriptExpr *E, bool Accessed=false)
Definition CGExpr.cpp:4914
llvm::Value * EmitSVEStructLoad(const SVETypeFlags &TypeFlags, SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
Definition ARM.cpp:4198
static bool ContainsLabel(const Stmt *S, bool IgnoreCaseStmts=false)
ContainsLabel - Return true if the statement contains a label in it.
llvm::Value * EmitSVEMaskedLoad(const CallExpr *, llvm::Type *ReturnTy, SmallVectorImpl< llvm::Value * > &Ops, unsigned BuiltinID, bool IsZExtReturn)
Definition ARM.cpp:4306
llvm::CallInst * EmitRuntimeCall(llvm::FunctionCallee callee, ArrayRef< llvm::Value * > args, const Twine &name="")
bool ShouldSkipSanitizerInstrumentation()
ShouldSkipSanitizerInstrumentation - Return true if the current function should not be instrumented w...
llvm::Value * EmitObjCDictionaryLiteral(const ObjCDictionaryLiteral *E)
Definition CGObjC.cpp:251
void EmitCXXForRangeStmt(const CXXForRangeStmt &S, ArrayRef< const Attr * > Attrs={})
Definition CGStmt.cpp:1406
void EmitOMPGenericLoopDirective(const OMPGenericLoopDirective &S)
SmallVector< Address, 1 > SEHCodeSlotStack
A stack of exception code slots.
JumpDest getJumpDestInCurrentScope(StringRef Name=StringRef())
The given basic block lies in the current EH scope, but may be a target of a potentially scope-crossi...
llvm::Value * EmitFP8NeonCall(unsigned IID, ArrayRef< llvm::Type * > Tys, SmallVectorImpl< llvm::Value * > &O, const CallExpr *E, const char *name)
Definition ARM.cpp:445
LValue EmitObjCMessageExprLValue(const ObjCMessageExpr *E)
Definition CGExpr.cpp:6752
llvm::Value * GetCountedByFieldExprGEP(const Expr *Base, const FieldDecl *FD, const FieldDecl *CountDecl)
Definition CGExpr.cpp:1193
llvm::BlockAddress * GetAddrOfLabel(const LabelDecl *L)
void VolatilizeTryBlocks(llvm::BasicBlock *BB, llvm::SmallPtrSet< llvm::BasicBlock *, 10 > &V)
LValue MakeAddrLValue(llvm::Value *V, QualType T, CharUnits Alignment, AlignmentSource Source=AlignmentSource::Type)
llvm::Value * EmitRISCVCpuSupports(const CallExpr *E)
Definition RISCV.cpp:970
void EmitOMPScanDirective(const OMPScanDirective &S)
void EmitComplexExprIntoLValue(const Expr *E, LValue dest, bool isInit)
EmitComplexExprIntoLValue - Emit the given expression of complex type and place its result into the s...
llvm::BasicBlock * getInvokeDestImpl()
llvm::Value * EmitRISCVCpuInit()
Definition RISCV.cpp:960
const CastExpr * CurCast
If a cast expression is being visited, this holds the current cast's expression.
static bool hasScalarEvaluationKind(QualType T)
llvm::Type * ConvertType(QualType T)
bool isCleanupPadScope() const
Returns true while emitting a cleanuppad.
llvm::Value * EmitNeonSplat(llvm::Value *V, llvm::Constant *Idx)
void EmitOpenACCExitDataConstruct(const OpenACCExitDataConstruct &S)
void GenerateCode(GlobalDecl GD, llvm::Function *Fn, const CGFunctionInfo &FnInfo)
Address EmitCXXUuidofExpr(const CXXUuidofExpr *E)
Definition CGExpr.cpp:6733
AwaitSuspendWrapperInfo CurAwaitSuspendWrapper
void EmitFakeUse(Address Addr)
Definition CGDecl.cpp:1379
llvm::function_ref< std::pair< llvm::Value *, llvm::Value * >(CodeGenFunction &, const OMPExecutableDirective &S, Address LB, Address UB)> CodeGenDispatchBoundsTy
void EmitSanitizerStatReport(llvm::SanitizerStatKind SSK)
LValue InitCapturedStruct(const CapturedStmt &S)
Definition CGStmt.cpp:3260
void addInstToNewSourceAtom(llvm::Instruction *KeyInstruction, llvm::Value *Backup)
Add KeyInstruction and an optional Backup instruction to a new atom group (See ApplyAtomGroup for mor...
CGCapturedStmtInfo * CapturedStmtInfo
void EmitOMPDistributeDirective(const OMPDistributeDirective &S)
BuiltinCheckKind
Specifies which type of sanitizer check to apply when handling a particular builtin.
Address recoverAddrOfEscapedLocal(CodeGenFunction &ParentCGF, Address ParentVar, llvm::Value *ParentFP)
Recovers the address of a local in a parent function.
RValue EmitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *E)
llvm::Value * EmitSVEGatherPrefetch(const SVETypeFlags &TypeFlags, SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
Definition ARM.cpp:4165
llvm::Value * EmitObjCProtocolExpr(const ObjCProtocolExpr *E)
Definition CGObjC.cpp:265
void EmitOMPParallelForDirective(const OMPParallelForDirective &S)
llvm::CallBase * EmitCallOrInvoke(llvm::FunctionCallee Callee, ArrayRef< llvm::Value * > Args, const Twine &Name="")
Emits a call or invoke instruction to the given function, depending on the current state of the EH st...
Definition CGCall.cpp:5196
llvm::Value * EmitSystemZBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
Definition SystemZ.cpp:39
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:2290
void EmitNoreturnRuntimeCallOrInvoke(llvm::FunctionCallee callee, ArrayRef< llvm::Value * > args)
Emits a call or invoke to the given noreturn runtime function.
Definition CGCall.cpp:5159
llvm::CallBase * EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee, ArrayRef< llvm::Value * > args, const Twine &name="")
Emits a call or invoke instruction to the given runtime function.
Definition CGCall.cpp:5186
RValue EmitCXXMemberOrOperatorMemberCallExpr(const CallExpr *CE, const CXXMethodDecl *MD, ReturnValueSlot ReturnValue, bool HasQualifier, NestedNameSpecifier Qualifier, bool IsArrow, const Expr *Base, llvm::CallBase **CallOrInvoke)
PeepholeProtection protectFromPeepholes(RValue rvalue)
protectFromPeepholes - Protect a value that we're intending to store to the side, but which will prob...
ComplexPairTy EmitLoadOfComplex(LValue src, SourceLocation loc)
EmitLoadOfComplex - Load a complex number from the specified l-value.
void EmitOMPMasterDirective(const OMPMasterDirective &S)
llvm::Value * EmitSEHAbnormalTermination()
void EmitOMPParallelMasterTaskLoopSimdDirective(const OMPParallelMasterTaskLoopSimdDirective &S)
llvm::Value * EmitARCAutoreleaseReturnValue(llvm::Value *value)
Autorelease the given object.
Definition CGObjC.cpp:2589
llvm::Value * EmitARCRetain(QualType type, llvm::Value *value)
Produce the code to do a retain.
Definition CGObjC.cpp:2328
llvm::Value * EmitPointerAuthQualify(PointerAuthQualifier Qualifier, llvm::Value *Pointer, QualType ValueType, Address StorageAddress, bool IsKnownNonNull)
void EmitVTablePtrCheckForCall(const CXXRecordDecl *RD, llvm::Value *VTable, CFITypeCheckKind TCK, SourceLocation Loc)
EmitVTablePtrCheckForCall - Virtual method MD is being called via VTable.
Definition CGClass.cpp:2965
void EmitLambdaStaticInvokeBody(const CXXMethodDecl *MD)
Definition CGClass.cpp:3203
CleanupKind getARCCleanupKind()
Retrieves the default cleanup kind for an ARC cleanup.
llvm::Value * EmitARCAutorelease(llvm::Value *value)
Autorelease the given object.
Definition CGObjC.cpp:2580
void EmitOMPSimdInit(const OMPLoopDirective &D)
Helpers for the OpenMP loop directives.
llvm::Value * EmitARCRetainAutoreleaseScalarExpr(const Expr *expr)
Definition CGObjC.cpp:3508
llvm::Value * EmitSMEReadWrite(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
Definition ARM.cpp:4453
llvm::Type * SVEBuiltinMemEltTy(const SVETypeFlags &TypeFlags)
SVEBuiltinMemEltTy - Returns the memory element type for this memory access builtin.
Definition ARM.cpp:3862
const OMPExecutableDirective * OMPParentLoopDirectiveForScan
Parent loop-based directive for scan directive.
llvm::Value * EmitSVEScatterStore(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
Definition ARM.cpp:4108
void EmitOpenACCInitConstruct(const OpenACCInitConstruct &S)
bool CurFuncIsThunk
In C++, whether we are code generating a thunk.
void EmitAtomicInit(Expr *E, LValue lvalue)
void EmitLambdaDelegatingInvokeBody(const CXXMethodDecl *MD, CallArgList &CallArgs)
Definition CGClass.cpp:3225
void EmitAggFinalDestCopy(QualType Type, AggValueSlot Dest, const LValue &Src, ExprValueKind SrcKind)
EmitAggFinalDestCopy - Emit copy of the specified aggregate into destination address.
void EmitARCDestroyWeak(Address addr)
void @objc_destroyWeak(i8** addr) Essentially objc_storeWeak(addr, nil).
Definition CGObjC.cpp:2681
Address GetAddressOfBaseClass(Address Value, const CXXRecordDecl *Derived, CastExpr::path_const_iterator PathBegin, CastExpr::path_const_iterator PathEnd, bool NullCheckValue, SourceLocation Loc)
GetAddressOfBaseClass - This function will add the necessary delta to the load of 'this' and returns ...
Definition CGClass.cpp:281
LValue MakeNaturalAlignPointeeAddrLValue(llvm::Value *V, QualType T)
Given a value of type T* that may not be to a complete object, construct an l-value with the natural ...
void EmitOMPFlushDirective(const OMPFlushDirective &S)
void EmitStoreThroughExtVectorComponentLValue(RValue Src, LValue Dst)
Definition CGExpr.cpp:3054
llvm::Value * EmitVAStartEnd(llvm::Value *ArgValue, bool IsStart)
Emits a call to an LLVM variable-argument intrinsic, either llvm.va_start or llvm....
RValue EmitBlockCallExpr(const CallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke)
static void EmitOMPTargetDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetDirective &S)
Emit device code for the target directive.
llvm::Value * EmitSVEMaskedStore(const CallExpr *, SmallVectorImpl< llvm::Value * > &Ops, unsigned BuiltinID)
Definition ARM.cpp:4363
LValue EmitObjCEncodeExprLValue(const ObjCEncodeExpr *E)
Definition CGExpr.cpp:3821
bool EmitOMPFirstprivateClause(const OMPExecutableDirective &D, OMPPrivateScope &PrivateScope)
void EmitObjCRelease(llvm::Value *value, ARCPreciseLifetime_t precise)
Release the given object.
Definition CGObjC.cpp:2867
void EmitOMPTaskgroupDirective(const OMPTaskgroupDirective &S)
JumpDest getJumpDestForLabel(const LabelDecl *S)
getBasicBlockForLabel - Return the LLVM basicblock that the specified label maps to.
Definition CGStmt.cpp:694
void EmitCoreturnStmt(const CoreturnStmt &S)
void EmitOMPTargetTeamsDistributeParallelForSimdDirective(const OMPTargetTeamsDistributeParallelForSimdDirective &S)
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:2616
void EmitCXXThrowExpr(const CXXThrowExpr *E, bool KeepInsertionPoint=true)
SmallVector< llvm::ConvergenceControlInst *, 4 > ConvergenceTokenStack
Stack to track the controlled convergence tokens.
static void EmitOMPTargetTeamsDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetTeamsDirective &S)
Emit device code for the target teams directive.
llvm::Value * EmitAMDGPUBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
Definition AMDGPU.cpp:510
LValue EmitCompoundLiteralLValue(const CompoundLiteralExpr *E)
Definition CGExpr.cpp:5883
bool isSEHTryScope() const
Returns true inside SEH __try blocks.
void registerGlobalDtorWithAtExit(const VarDecl &D, llvm::FunctionCallee fn, llvm::Constant *addr)
Call atexit() with a function that passes the given argument to the given function.
llvm::Value * EmitObjCAllocInit(llvm::Value *value, llvm::Type *resultType)
Definition CGObjC.cpp:2805
void unprotectFromPeepholes(PeepholeProtection protection)
void EmitOMPReductionClauseInit(const OMPExecutableDirective &D, OMPPrivateScope &PrivateScope, bool ForInscan=false)
Emit initial code for reduction variables.
void EmitObjCAtThrowStmt(const ObjCAtThrowStmt &S)
Definition CGObjC.cpp:2129
void EmitOMPDistributeSimdDirective(const OMPDistributeSimdDirective &S)
void EmitSynthesizedCXXCopyCtor(Address Dest, Address Src, const Expr *Exp)
RValue convertTempToRValue(Address addr, QualType type, SourceLocation Loc)
Given the address of a temporary variable, produce an r-value of its type.
Definition CGExpr.cpp:7105
LValue EmitObjCIsaExpr(const ObjCIsaExpr *E)
void EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst, llvm::Value **Result=nullptr)
EmitStoreThroughBitfieldLValue - Store Src into Dst with same constraints as EmitStoreThroughLValue.
Definition CGExpr.cpp:2975
llvm::Value * EmitAArch64SMEBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
Definition ARM.cpp:5023
void EmitAutoVarDecl(const VarDecl &D)
EmitAutoVarDecl - Emit an auto variable declaration.
Definition CGDecl.cpp:1348
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:3973
void EmitObjCAutoreleasePoolCleanup(llvm::Value *Ptr)
Definition CGObjC.cpp:2916
LValue EmitCXXUuidofLValue(const CXXUuidofExpr *E)
Definition CGExpr.cpp:6738
bool hasVolatileMember(QualType T)
hasVolatileMember - returns true if aggregate type has a volatile member.
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:1944
llvm::Value * EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV, bool isInc, bool isPre)
void SetSqrtFPAccuracy(llvm::Value *Val)
Set the minimum required accuracy of the given sqrt operation based on CodeGenOpts.
Definition CGExpr.cpp:7131
static void EmitOMPTargetTeamsDistributeDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetTeamsDistributeDirective &S)
Emit device code for the target teams distribute directive.
RValue EmitSimpleCallExpr(const CallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke=nullptr)
Emit a CallExpr without considering whether it might be a subclass.
Definition CGExpr.cpp:6417
llvm::SmallVector< DeferredDeactivateCleanup > DeferredDeactivationCleanupStack
RValue EmitVAArg(VAArgExpr *VE, Address &VAListAddr, AggValueSlot Slot=AggValueSlot::ignored())
Generate code to get an argument from the passed in pointer and update it accordingly.
Definition CGCall.cpp:6444
static bool isNullPointerAllowed(TypeCheckKind TCK)
Determine whether the pointer type check TCK permits null pointers.
Definition CGExpr.cpp:729
void EmitForwardingCallToLambda(const CXXMethodDecl *LambdaCallOperator, CallArgList &CallArgs, const CGFunctionInfo *CallOpFnInfo=nullptr, llvm::Constant *CallOpFn=nullptr)
Definition CGClass.cpp:3130
void EmitReturnValueCheck(llvm::Value *RV)
Emit a test that checks if the return value RV is nonnull.
Definition CGCall.cpp:4305
llvm::Value * getAsNaturalPointerTo(Address Addr, QualType PointeeType)
bool EmitSimpleStmt(const Stmt *S, ArrayRef< const Attr * > Attrs)
EmitSimpleStmt - Try to emit a "simple" statement which does not necessarily require an insertion poi...
Definition CGStmt.cpp:507
RValue emitBuiltinOSLogFormat(const CallExpr &E)
Emit IR for __builtin_os_log_format.
llvm::Value * emitPointerAuthResignCall(llvm::Value *Pointer, const CGPointerAuthInfo &CurInfo, const CGPointerAuthInfo &NewInfo)
void EmitOMPTaskwaitDirective(const OMPTaskwaitDirective &S)
RValue EmitPseudoObjectRValue(const PseudoObjectExpr *e, AggValueSlot slot=AggValueSlot::ignored())
Definition CGExpr.cpp:7254
void EmitDelegateCallArg(CallArgList &args, const VarDecl *param, SourceLocation loc)
EmitDelegateCallArg - We are performing a delegate call; that is, the current function is delegating ...
Definition CGCall.cpp:4392
llvm::BasicBlock * createBasicBlock(const Twine &name="", llvm::Function *parent=nullptr, llvm::BasicBlock *before=nullptr)
createBasicBlock - Create an LLVM basic block.
void EmitOMPTargetParallelForDirective(const OMPTargetParallelForDirective &S)
void maybeUpdateMCDCTestVectorBitmap(const Expr *E)
Increment the profiler's counter for the given expression by StepV.
void addInstToCurrentSourceAtom(llvm::Instruction *KeyInstruction, llvm::Value *Backup)
See CGDebugInfo::addInstToCurrentSourceAtom.
unsigned getDebugInfoFIndex(const RecordDecl *Rec, unsigned FieldIndex)
Get the record field index as represented in debug info.
Definition CGExpr.cpp:5578
AggValueSlot::Overlap_t getOverlapForBaseInit(const CXXRecordDecl *RD, const CXXRecordDecl *BaseRD, bool IsVirtual)
Determine whether a base class initialization may overlap some other object.
void EmitCXXDeleteExpr(const CXXDeleteExpr *E)
llvm::Value * EmitObjCArrayLiteral(const ObjCArrayLiteral *E)
Definition CGObjC.cpp:247
llvm::Function * generateBuiltinOSLogHelperFunction(const analyze_os_log::OSLogBufferLayout &Layout, CharUnits BufferAlignment)
llvm::Value * EmitPromotedScalarExpr(const Expr *E, QualType PromotionType)
const LangOptions & getLangOpts() const
void addInstToSpecificSourceAtom(llvm::Instruction *KeyInstruction, llvm::Value *Backup, uint64_t Atom)
See CGDebugInfo::addInstToSpecificSourceAtom.
void EmitCfiCheckFail()
Emit a cross-DSO CFI failure handling function.
Definition CGExpr.cpp:4342
RValue EmitReferenceBindingToExpr(const Expr *E)
Emits a reference binding to the passed in expression.
Definition CGExpr.cpp:692
llvm::Value * EmitARCRetainAutorelease(QualType type, llvm::Value *value)
Do a fused retain/autorelease of the given object.
Definition CGObjC.cpp:2611
llvm::Value * EmitARCStoreStrong(LValue lvalue, llvm::Value *value, bool resultIgnored)
Store into a strong object.
Definition CGObjC.cpp:2545
llvm::Value * EmitARCRetainAutoreleasedReturnValue(llvm::Value *value)
Retain the given object which is the result of a function call.
Definition CGObjC.cpp:2463
bool isPointerKnownNonNull(const Expr *E)
void StartObjCMethod(const ObjCMethodDecl *MD, const ObjCContainerDecl *CD)
StartObjCMethod - Begin emission of an ObjCMethod.
Definition CGObjC.cpp:752
LValue MakeNaturalAlignAddrLValue(llvm::Value *V, QualType T, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
AutoVarEmission EmitAutoVarAlloca(const VarDecl &var)
EmitAutoVarAlloca - Emit the alloca and debug information for a local variable.
Definition CGDecl.cpp:1482
LValue EmitPointerToDataMemberBinaryExpr(const BinaryOperator *E)
Definition CGExpr.cpp:7082
llvm::Value * EmitARCUnsafeClaimAutoreleasedReturnValue(llvm::Value *value)
Claim a possibly-autoreleased return value at +0.
Definition CGObjC.cpp:2475
llvm::Value * EmitObjCMRRAutoreleasePoolPush()
Produce the code to do an MRR version objc_autoreleasepool_push.
Definition CGObjC.cpp:2764
void EmitVarAnnotations(const VarDecl *D, llvm::Value *V)
Emit local annotations for the local variable V, declared by D.
llvm::BasicBlock * EHResumeBlock
EHResumeBlock - Unified block containing a call to llvm.eh.resume.
void EmitOpenACCShutdownConstruct(const OpenACCShutdownConstruct &S)
LValue EmitLValueForIvar(QualType ObjectTy, llvm::Value *Base, const ObjCIvarDecl *Ivar, unsigned CVRQualifiers)
Definition CGExpr.cpp:6786
void EmitAtomicUpdate(LValue LVal, llvm::AtomicOrdering AO, const llvm::function_ref< RValue(RValue)> &UpdateOp, bool IsVolatile)
bool InNoConvergentAttributedStmt
True if the current statement has noconvergent attribute.
static bool IsConstructorDelegationValid(const CXXConstructorDecl *Ctor)
Checks whether the given constructor is a valid subject for the complete-to-base constructor delegati...
Definition CGClass.cpp:716
void GenerateObjCCtorDtorMethod(ObjCImplementationDecl *IMP, ObjCMethodDecl *MD, bool ctor)
Definition CGObjC.cpp:1752
void EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc, Address Addr, QualType Type, CharUnits Alignment=CharUnits::Zero(), SanitizerSet SkippedChecks=SanitizerSet(), llvm::Value *ArraySize=nullptr)
Address GetAddressOfDerivedClass(Address Value, const CXXRecordDecl *Derived, CastExpr::path_const_iterator PathBegin, CastExpr::path_const_iterator PathEnd, bool NullCheckValue)
Definition CGClass.cpp:388
llvm::Value * EmitObjCAllocWithZone(llvm::Value *value, llvm::Type *returnType)
Allocate the given objc object.
Definition CGObjC.cpp:2798
void EmitIgnoredConditionalOperator(const AbstractConditionalOperator *E)
Definition CGExpr.cpp:6010
void GetAArch64SVEProcessedOperands(unsigned BuiltinID, const CallExpr *E, SmallVectorImpl< llvm::Value * > &Ops, SVETypeFlags TypeFlags)
Definition ARM.cpp:4590
void EmitVTablePtrCheck(const CXXRecordDecl *RD, llvm::Value *VTable, CFITypeCheckKind TCK, SourceLocation Loc)
EmitVTablePtrCheck - Emit a check that VTable is a valid virtual table for RD using llvm....
Definition CGClass.cpp:3026
llvm::Value * EmitSVEGatherLoad(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
Definition ARM.cpp:4054
llvm::Function * GenerateBlockFunction(GlobalDecl GD, const CGBlockInfo &Info, const DeclMapTy &ldm, bool IsLambdaConversionToBlock, bool BuildGlobalBlock)
void EmitCountedByBoundsChecking(const Expr *ArrayExpr, QualType ArrayType, Address ArrayInst, QualType IndexType, llvm::Value *IndexVal, bool Accessed, bool FlexibleArray)
EmitCountedByBoundsChecking - If the array being accessed has a "counted_by" attribute,...
Definition CGExpr.cpp:4864
Address EmitFieldAnnotations(const FieldDecl *D, Address V)
Emit field annotations for the given field & value.
llvm::Function * LookupNeonLLVMIntrinsic(unsigned IntrinsicID, unsigned Modifier, llvm::Type *ArgTy, const CallExpr *E)
Definition ARM.cpp:1690
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:2300
void EmitScalarInit(const Expr *init, const ValueDecl *D, LValue lvalue, bool capturedByInit)
Definition CGDecl.cpp:787
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:765
void EmitConstructorBody(FunctionArgList &Args)
EmitConstructorBody - Emits the body of the current constructor.
Definition CGClass.cpp:827
const CodeGen::CGBlockInfo * BlockInfo
void EmitKCFIOperandBundle(const CGCallee &Callee, SmallVectorImpl< llvm::OperandBundleDef > &Bundles)
llvm::Value * EmitPointerAuthUnqualify(PointerAuthQualifier Qualifier, llvm::Value *Pointer, QualType PointerType, Address StorageAddress, bool IsKnownNonNull)
void EmitAggregateCopyCtor(LValue Dest, LValue Src, AggValueSlot::Overlap_t MayOverlap)
void EmitDeclRefExprDbgValue(const DeclRefExpr *E, const APValue &Init)
Address makeNaturalAddressForPointer(llvm::Value *Ptr, QualType T, CharUnits Alignment=CharUnits::Zero(), bool ForPointeeType=false, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
Construct an address with the natural alignment of T.
void EmitOpenACCWaitConstruct(const OpenACCWaitConstruct &S)
llvm::AllocaInst * EHSelectorSlot
The selector slot.
Address EmitLoadOfPointer(Address Ptr, const PointerType *PtrTy, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
Load a pointer with type PtrTy stored at address Ptr.
Definition CGExpr.cpp:3364
LValue MakeNaturalAlignPointeeRawAddrLValue(llvm::Value *V, QualType T)
Same as MakeNaturalAlignPointeeAddrLValue except that the pointer is known to be unsigned.
llvm::BasicBlock * EmitLandingPad()
Emits a landing pad for the current EH stack.
void EmitLambdaInAllocaImplFn(const CXXMethodDecl *CallOp, const CGFunctionInfo **ImplFnInfo, llvm::Function **ImplFn)
Definition CGClass.cpp:3279
llvm::Constant * GenerateCopyHelperFunction(const CGBlockInfo &blockInfo)
Generate the copy-helper function for a block closure object: static void block_copy_helper(block_t *...
void EmitCXXAggrConstructorCall(const CXXConstructorDecl *D, const ArrayType *ArrayTy, Address ArrayPtr, const CXXConstructExpr *E, bool NewPointerIsChecked, bool ZeroInitialization=false)
EmitCXXAggrConstructorCall - Emit a loop to call a particular constructor for each of several members...
Definition CGClass.cpp:2146
std::pair< RValue, llvm::Value * > EmitAtomicCompareExchange(LValue Obj, RValue Expected, RValue Desired, SourceLocation Loc, llvm::AtomicOrdering Success=llvm::AtomicOrdering::SequentiallyConsistent, llvm::AtomicOrdering Failure=llvm::AtomicOrdering::SequentiallyConsistent, bool IsWeak=false, AggValueSlot Slot=AggValueSlot::ignored())
Emit a compare-and-exchange op for atomic type.
CurrentSourceLocExprScope::SourceLocExprScopeGuard SourceLocExprScopeGuard
void EmitBlockAfterUses(llvm::BasicBlock *BB)
EmitBlockAfterUses - Emit the given block somewhere hopefully near its uses, and leave the insertion ...
Definition CGStmt.cpp:677
RValue EmitLoadOfGlobalRegLValue(LValue LV)
Load of global named registers are always calls to intrinsics.
Definition CGExpr.cpp:2689
VPtrsVector getVTablePointers(const CXXRecordDecl *VTableClass)
Definition CGClass.cpp:2758
void EmitVTablePtrCheckForCast(QualType T, Address Derived, bool MayBeNull, CFITypeCheckKind TCK, SourceLocation Loc)
Derived is the presumed address of an object of type T after a cast.
Definition CGClass.cpp:2979
TypeCheckKind
Situations in which we might emit a check for the suitability of a pointer or glvalue.
@ TCK_DowncastPointer
Checking the operand of a static_cast to a derived pointer type.
@ TCK_DowncastReference
Checking the operand of a static_cast to a derived reference type.
@ TCK_MemberAccess
Checking the object expression in a non-static data member access.
@ TCK_ConstructorCall
Checking the 'this' pointer for a constructor call.
@ TCK_Store
Checking the destination of a store. Must be suitably sized and aligned.
@ TCK_NonnullAssign
Checking the value assigned to a _Nonnull pointer. Must not be null.
@ TCK_UpcastToVirtualBase
Checking the operand of a cast to a virtual base object.
@ TCK_MemberCall
Checking the 'this' pointer for a call to a non-static member function.
@ TCK_DynamicOperation
Checking the operand of a dynamic_cast or a typeid expression.
@ TCK_ReferenceBinding
Checking the bound value in a reference binding.
@ TCK_Load
Checking the operand of a load. Must be suitably sized and aligned.
@ TCK_Upcast
Checking the operand of a cast to a base object.
llvm::Type * getEltType(const SVETypeFlags &TypeFlags)
Definition ARM.cpp:3878
void SimplifyForwardingBlocks(llvm::BasicBlock *BB)
SimplifyForwardingBlocks - If the given basic block is only a branch to another basic block,...
Definition CGStmt.cpp:618
static std::string getNonTrivialDestructorStr(QualType QT, CharUnits Alignment, bool IsVolatile, ASTContext &Ctx)
llvm::Value * EmitCXXNewExpr(const CXXNewExpr *E)
llvm::Value * EmitObjCThrowOperand(const Expr *expr)
Definition CGObjC.cpp:3542
void EmitCXXDestructorCall(const CXXDestructorDecl *D, CXXDtorType Type, bool ForVirtualBase, bool Delegating, Address This, QualType ThisTy)
Definition CGClass.cpp:2661
LValue MakeAddrLValue(Address Addr, QualType T, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
const BlockByrefInfo & getBlockByrefInfo(const VarDecl *var)
BuildByrefInfo - This routine changes a __block variable declared as T x into:
void EmitBranchThroughCleanup(JumpDest Dest)
EmitBranchThroughCleanup - Emit a branch from the current insert block through the normal cleanup han...
void EmitOMPReductionClauseFinal(const OMPExecutableDirective &D, const OpenMPDirectiveKind ReductionKind)
Emit final update of reduction values to original variables at the end of the directive.
llvm::Value * EmitCommonNeonBuiltinExpr(unsigned BuiltinID, unsigned LLVMIntrinsic, unsigned AltLLVMIntrinsic, const char *NameHint, unsigned Modifier, const CallExpr *E, SmallVectorImpl< llvm::Value * > &Ops, Address PtrOp0, Address PtrOp1, llvm::Triple::ArchType Arch)
Definition ARM.cpp:1794
llvm::Value * EmitRISCVBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue)
Definition RISCV.cpp:1073
LValue EmitBinaryOperatorLValue(const BinaryOperator *E)
Definition CGExpr.cpp:6568
bool InNoMergeAttributedStmt
True if the current statement has nomerge attribute.
llvm::Value * EmitNeonSplat(llvm::Value *V, llvm::Constant *Idx, const llvm::ElementCount &Count)
LValue EmitComplexCompoundAssignmentLValue(const CompoundAssignOperator *E)
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:2600
llvm::Value * EmitCheckedArgForBuiltin(const Expr *E, BuiltinCheckKind Kind)
Emits an argument for a call to a builtin.
void EmitOMPLoopBody(const OMPLoopDirective &D, JumpDest LoopExit)
Helper for the OpenMP loop directives.
Address EmitCheckedInBoundsGEP(Address Addr, ArrayRef< llvm::Value * > IdxList, llvm::Type *elementType, bool SignedIndices, bool IsSubtraction, SourceLocation Loc, CharUnits Align, const Twine &Name="")
void EmitOMPScopeDirective(const OMPScopeDirective &S)
const Decl * CurCodeDecl
CurCodeDecl - This is the inner-most code context, which includes blocks.
LValue MakeAddrLValueWithoutTBAA(Address Addr, QualType T, AlignmentSource Source=AlignmentSource::Type)
bool hasSkipCounter(const Stmt *S) const
llvm::BasicBlock * getUnreachableBlock()
Destroyer * getDestroyer(QualType::DestructionKind destructionKind)
Definition CGDecl.cpp:2273
llvm::AssertingVH< llvm::Instruction > AllocaInsertPt
AllocaInsertPoint - This is an instruction in the entry block before which we prefer to insert alloca...
void EmitAggregateAssign(LValue Dest, LValue Src, QualType EltTy)
Emit an aggregate assignment.
void EmitARCRelease(llvm::Value *value, ARCPreciseLifetime_t precise)
Release the given object.
Definition CGObjC.cpp:2481
void maybeAttachRangeForLoad(llvm::LoadInst *Load, QualType Ty, SourceLocation Loc)
Definition CGExpr.cpp:2082
void EmitCXXGlobalVarDeclInit(const VarDecl &D, llvm::GlobalVariable *GV, bool PerformInit)
EmitCXXGlobalVarDeclInit - Create the initializer for a C++ variable with global storage.
void EmitBitfieldConversionCheck(llvm::Value *Src, QualType SrcType, llvm::Value *Dst, QualType DstType, const CGBitFieldInfo &Info, SourceLocation Loc)
Emit a check that an [implicit] conversion of a bitfield.
void PushDestructorCleanup(QualType T, Address Addr)
PushDestructorCleanup - Push a cleanup to call the complete-object destructor of an object of the giv...
Definition CGClass.cpp:2692
llvm::SmallVector< const JumpDest *, 2 > SEHTryEpilogueStack
void pushCallObjectDeleteCleanup(const FunctionDecl *OperatorDelete, llvm::Value *CompletePtr, QualType ElementType)
void EmitFunctionBody(const Stmt *Body)
JumpDest ReturnBlock
ReturnBlock - Unified return block.
void EmitOMPTargetTeamsDistributeSimdDirective(const OMPTargetTeamsDistributeSimdDirective &S)
RValue EmitCXXMemberOrOperatorCall(const CXXMethodDecl *Method, const CGCallee &Callee, ReturnValueSlot ReturnValue, llvm::Value *This, llvm::Value *ImplicitParam, QualType ImplicitParamTy, const CallExpr *E, CallArgList *RtlArgs, llvm::CallBase **CallOrInvoke)
Definition CGExprCXX.cpp:85
DominatingValue< T >::saved_type saveValueInCond(T value)
void EmitSEHExceptionCodeSave(CodeGenFunction &ParentCGF, llvm::Value *ParentFP, llvm::Value *EntryEBP)
const llvm::function_ref< void(CodeGenFunction &, llvm::Function *, const OMPTaskDataTy &)> TaskGenTy
std::pair< LValue, llvm::Value * > EmitARCStoreUnsafeUnretained(const BinaryOperator *e, bool ignored)
Definition CGObjC.cpp:3629
llvm::DebugLoc SourceLocToDebugLoc(SourceLocation Location)
Converts Location to a DebugLoc, if debug information is enabled.
static bool cxxDestructorCanThrow(QualType T)
Check if T is a C++ class that has a destructor that can throw.
llvm::Value * ExceptionSlot
The exception slot.
LValue EmitPseudoObjectLValue(const PseudoObjectExpr *e)
Definition CGExpr.cpp:7259
ComplexPairTy EmitPromotedComplexExpr(const Expr *E, QualType PromotionType)
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:3863
void CreateCoercedStore(llvm::Value *Src, QualType SrcFETy, Address Dst, llvm::TypeSize DstSize, bool DstIsVolatile)
Create a store to.
Definition CGCall.cpp:1495
void EmitCallAndReturnForThunk(llvm::FunctionCallee Callee, const ThunkInfo *Thunk, bool IsUnprototyped)
bool EmitOMPCopyinClause(const OMPExecutableDirective &D)
Emit code for copyin clause in D directive.
llvm::Value * EmitSVEDupX(llvm::Value *Scalar)
LValue EmitOpaqueValueLValue(const OpaqueValueExpr *e)
Definition CGExpr.cpp:6266
void EmitOMPLinearClause(const OMPLoopDirective &D, CodeGenFunction::OMPPrivateScope &PrivateScope)
Emit initial code for linear clauses.
llvm::Value * LoadPassedObjectSize(const Expr *E, QualType EltTy)
If E references a parameter with pass_object_size info or a constant array size modifier,...
Definition CGExpr.cpp:971
void EmitAnyExprToExn(const Expr *E, Address Addr)
@ ForceLeftToRight
! Language semantics require left-to-right evaluation.
@ Default
! No language constraints on evaluation order.
@ ForceRightToLeft
! Language semantics require right-to-left evaluation.
LValue EmitScalarCompoundAssignWithComplex(const CompoundAssignOperator *E, llvm::Value *&Result)
llvm::BasicBlock * OMPBeforeScanBlock
void EmitOMPInterchangeDirective(const OMPInterchangeDirective &S)
void EmitOMPPrivateLoopCounters(const OMPLoopDirective &S, OMPPrivateScope &LoopScope)
Emit initial code for loop counters of loop-based directives.
llvm::SmallPtrSet< const CXXRecordDecl *, 4 > VisitedVirtualBasesSetTy
void GenerateObjCGetter(ObjCImplementationDecl *IMP, const ObjCPropertyImplDecl *PID)
GenerateObjCGetter - Synthesize an Objective-C property getter function.
Definition CGObjC.cpp:1049
llvm::Value * EmitIvarOffsetAsPointerDiff(const ObjCInterfaceDecl *Interface, const ObjCIvarDecl *Ivar)
Definition CGExpr.cpp:6778
void initFullExprCleanupWithFlag(RawAddress ActiveFlag)
RValue EmitCUDAKernelCallExpr(const CUDAKernelCallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke)
void pushCleanupAndDeferDeactivation(CleanupKind Kind, As... A)
llvm::DebugLoc EmitReturnBlock()
Emit the unified return block, trying to avoid its emission when possible.
void EmitNonNullArgCheck(RValue RV, QualType ArgType, SourceLocation ArgLoc, AbstractCallee AC, unsigned ParmNum)
Create a check for a function parameter that may potentially be declared as non-null.
Definition CGCall.cpp:4682
RValue EmitLoadOfAnyValue(LValue V, AggValueSlot Slot=AggValueSlot::ignored(), SourceLocation Loc={})
Like EmitLoadOfLValue but also handles complex and aggregate types.
Definition CGExpr.cpp:2454
llvm::BasicBlock * getEHResumeBlock(bool isCleanup)
void EmitAggregateCopy(LValue Dest, LValue Src, QualType EltTy, AggValueSlot::Overlap_t MayOverlap, bool isVolatile=false)
EmitAggregateCopy - Emit an aggregate copy.
llvm::DenseMap< const Decl *, Address > DeclMapTy
LValue EmitLValueForField(LValue Base, const FieldDecl *Field, bool IsInBounds=true)
Definition CGExpr.cpp:5684
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:176
const TargetInfo & getTarget() const
RValue emitRotate(const CallExpr *E, bool IsRotateRight)
void initFullExprCleanup()
Set up the last cleanup that was pushed as a conditional full-expression cleanup.
llvm::Value * EmitAArch64SVEBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
Definition ARM.cpp:4633
llvm::Function * getSpecConstantFunction(const clang::QualType &SpecConstantType)
LValue EmitCompoundAssignmentLValue(const CompoundAssignOperator *E)
llvm::Value * EmitAnnotationCall(llvm::Function *AnnotationFn, llvm::Value *AnnotatedVal, StringRef AnnotationStr, SourceLocation Location, const AnnotateAttr *Attr)
Emit an annotation call (intrinsic).
void EmitStaticVarDecl(const VarDecl &D, llvm::GlobalValue::LinkageTypes Linkage)
Definition CGDecl.cpp:404
bool isInConditionalBranch() const
isInConditionalBranch - Return true if we're currently emitting one branch or the other of a conditio...
llvm::Value * EmitFP8NeonCvtCall(unsigned IID, llvm::Type *Ty0, llvm::Type *Ty1, bool Extract, SmallVectorImpl< llvm::Value * > &Ops, const CallExpr *E, const char *name)
Definition ARM.cpp:491
Address EmitCompoundStmtWithoutScope(const CompoundStmt &S, bool GetLast=false, AggValueSlot AVS=AggValueSlot::ignored())
Definition CGStmt.cpp:569
void pushKmpcAllocFree(CleanupKind Kind, std::pair< llvm::Value *, llvm::Value * > AddrSizePair)
Definition CGDecl.cpp:2348
void GenerateOpenMPCapturedVars(const CapturedStmt &S, SmallVectorImpl< llvm::Value * > &CapturedVars)
llvm::Value * EmitBlockCopyAndAutorelease(llvm::Value *Block, QualType Ty)
Definition CGObjC.cpp:3953
Address EmitCXXMemberDataPointerAddress(const Expr *E, Address base, llvm::Value *memberPtr, const MemberPointerType *memberPtrType, bool IsInBounds, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
Emit the address of a field using a member data pointer.
Definition CGClass.cpp:150
void EmitGotoStmt(const GotoStmt &S)
Definition CGStmt.cpp:830
llvm::BasicBlock * getTerminateHandler()
getTerminateHandler - Return a handler (not a landing pad, just a catch handler) that just calls term...
void PopCleanupBlocks(EHScopeStack::stable_iterator OldCleanupStackSize, std::initializer_list< llvm::Value ** > ValuesToReload={})
Takes the old cleanup stack size and emits the cleanup blocks that have been added.
void EmitOMPDepobjDirective(const OMPDepobjDirective &S)
void maybeCreateMCDCCondBitmap()
Allocate a temp value on the stack that MCDC can use to track condition results.
void EmitOMPMetaDirective(const OMPMetaDirective &S)
llvm::Value * EmitARMBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Triple::ArchType Arch)
Definition ARM.cpp:2758
LValue EmitHLSLOutArgExpr(const HLSLOutArgExpr *E, CallArgList &Args, QualType Ty)
Definition CGExpr.cpp:6289
static bool isVptrCheckRequired(TypeCheckKind TCK, QualType Ty)
Determine whether the pointer type check TCK requires a vptr check.
Definition CGExpr.cpp:734
CGCallee EmitCallee(const Expr *E)
Definition CGExpr.cpp:6493
void EmitWritebacks(const CallArgList &Args)
EmitWriteback - Emit callbacks for function.
Definition CGCall.cpp:4976
void EmitOMPCriticalDirective(const OMPCriticalDirective &S)
void EmitIgnoredExpr(const Expr *E)
EmitIgnoredExpr - Emit an expression in a context which ignores the result.
Definition CGExpr.cpp:251
void EnterSEHTryStmt(const SEHTryStmt &S)
llvm::Value * EmitRISCVCpuIs(const CallExpr *E)
Definition RISCV.cpp:1032
RValue EmitCallExpr(const CallExpr *E, ReturnValueSlot ReturnValue=ReturnValueSlot(), llvm::CallBase **CallOrInvoke=nullptr)
Definition CGExpr.cpp:6367
llvm::ScalableVectorType * getSVEType(const SVETypeFlags &TypeFlags)
Definition ARM.cpp:3951
void EmitOMPTaskLoopDirective(const OMPTaskLoopDirective &S)
RValue EmitLoadOfLValue(LValue V, SourceLocation Loc)
EmitLoadOfLValue - Given an expression that represents a value lvalue, this method emits the address ...
Definition CGExpr.cpp:2472
void EmitOMPCancelDirective(const OMPCancelDirective &S)
void pushDestroyAndDeferDeactivation(QualType::DestructionKind dtorKind, Address addr, QualType type)
Definition CGDecl.cpp:2325
LValue EmitMatrixSingleSubscriptExpr(const MatrixSingleSubscriptExpr *E)
Definition CGExpr.cpp:5134
LValue EmitArraySectionExpr(const ArraySectionExpr *E, bool IsLowerBound=true)
Definition CGExpr.cpp:5205
const Expr * RetExpr
If a return statement is being visited, this holds the return statment's result expression.
Address GetAddrOfBlockDecl(const VarDecl *var)
void EmitOMPBarrierDirective(const OMPBarrierDirective &S)
llvm::Value * EmitComplexToScalarConversion(ComplexPairTy Src, QualType SrcTy, QualType DstTy, SourceLocation Loc)
Emit a conversion from the specified complex type to the specified destination type,...
static bool isInstrumentedCondition(const Expr *C)
isInstrumentedCondition - Determine whether the given condition is an instrumentable condition (i....
void EmitOMPOrderedDirective(const OMPOrderedDirective &S)
void EmitARCDestroyStrong(Address addr, ARCPreciseLifetime_t precise)
Destroy a __strong variable.
Definition CGObjC.cpp:2510
void pushCleanupAfterFullExpr(CleanupKind Kind, As... A)
Queue a cleanup to be pushed after finishing the current full-expression, potentially with an active ...
void DeactivateCleanupBlock(EHScopeStack::stable_iterator Cleanup, llvm::Instruction *DominatingIP)
DeactivateCleanupBlock - Deactivates the given cleanup block.
void EmitCfiCheckStub()
Emit a stub for the cross-DSO CFI check function.
Definition CGExpr.cpp:4303
void callCStructCopyAssignmentOperator(LValue Dst, LValue Src)
VlaSizePair getVLAElements1D(const VariableArrayType *vla)
Return the number of elements for a single dimension for the given array type.
llvm::Value * EmitBPFBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
Definition ARM.cpp:7853
RawAddress CreateIRTempWithoutCast(QualType T, const Twine &Name="tmp")
CreateIRTempWithoutCast - Create a temporary IR object of the given type, with appropriate alignment.
Definition CGExpr.cpp:183
bool EmitOMPWorksharingLoop(const OMPLoopDirective &S, Expr *EUB, const CodeGenLoopBoundsTy &CodeGenLoopBounds, const CodeGenDispatchBoundsTy &CGDispatchBounds)
Emit code for the worksharing loop-based directive.
void EmitForStmt(const ForStmt &S, ArrayRef< const Attr * > Attrs={})
Definition CGStmt.cpp:1261
CGCallee BuildAppleKextVirtualDestructorCall(const CXXDestructorDecl *DD, CXXDtorType Type, const CXXRecordDecl *RD)
BuildVirtualCall - This routine makes indirect vtable call for call to virtual destructors.
Definition CGCXX.cpp:328
void pushFullExprCleanup(CleanupKind kind, As... A)
pushFullExprCleanup - Push a cleanup to be run at the end of the current full-expression.
bool AlwaysEmitXRayCustomEvents() const
AlwaysEmitXRayCustomEvents - Return true if we must unconditionally emit XRay custom event handling c...
void EnterDtorCleanups(const CXXDestructorDecl *Dtor, CXXDtorType Type)
EnterDtorCleanups - Enter the cleanups necessary to complete the given phase of destruction for a des...
Definition CGClass.cpp:2010
llvm::Value * EmitSMELdrStr(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
Definition ARM.cpp:4475
LValue EmitOMPSharedLValue(const Expr *E)
Emits the lvalue for the expression with possibly captured variable.
QualType TypeOfSelfObject()
TypeOfSelfObject - Return type of object that this self represents.
Definition CGObjC.cpp:1796
llvm::CanonicalLoopInfo * EmitOMPCollapsedCanonicalLoopNest(const Stmt *S, int Depth)
Emit the Stmt S and return its topmost canonical loop, if any.
void EmitOMPSectionsDirective(const OMPSectionsDirective &S)
void EmitObjCAutoreleasePoolStmt(const ObjCAutoreleasePoolStmt &S)
Definition CGObjC.cpp:3688
void StartFunction(GlobalDecl GD, QualType RetTy, llvm::Function *Fn, const CGFunctionInfo &FnInfo, const FunctionArgList &Args, SourceLocation Loc=SourceLocation(), SourceLocation StartLoc=SourceLocation())
Emit code for the start of a function.
LValue EmitAggExprToLValue(const Expr *E)
EmitAggExprToLValue - Emit the computation of the specified expression of aggregate type into a tempo...
void EmitOMPInteropDirective(const OMPInteropDirective &S)
void SetFPAccuracy(llvm::Value *Val, float Accuracy)
SetFPAccuracy - Set the minimum required accuracy of the given floating point operation,...
Definition CGExpr.cpp:7120
Address mergeAddressesInConditionalExpr(Address LHS, Address RHS, llvm::BasicBlock *LHSBlock, llvm::BasicBlock *RHSBlock, llvm::BasicBlock *MergeBlock, QualType MergedType)
Address emitAddrOfImagComponent(Address complex, QualType complexType)
llvm::Value * EmitPointerAuthSign(const CGPointerAuthInfo &Info, llvm::Value *Pointer)
llvm::Value * EmitSVETupleCreate(const SVETypeFlags &TypeFlags, llvm::Type *ReturnType, ArrayRef< llvm::Value * > Ops)
Definition ARM.cpp:4578
void EmitOMPParallelSectionsDirective(const OMPParallelSectionsDirective &S)
void EmitCXXConstructorCall(const CXXConstructorDecl *D, CXXCtorType Type, bool ForVirtualBase, bool Delegating, AggValueSlot ThisAVS, const CXXConstructExpr *E)
Definition CGClass.cpp:2284
llvm::Value * EmitSVEPMull(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned BuiltinID)
Definition ARM.cpp:4261
llvm::Value * EmitObjCBoxedExpr(const ObjCBoxedExpr *E)
EmitObjCBoxedExpr - This routine generates code to call the appropriate expression boxing method.
Definition CGObjC.cpp:64
void EmitOMPTargetParallelDirective(const OMPTargetParallelDirective &S)
void EmitBoundsCheck(const Expr *ArrayExpr, const Expr *ArrayExprBase, llvm::Value *Index, QualType IndexType, bool Accessed)
Emit a check that Base points into an array object, which we can access at index Index.
Definition CGExpr.cpp:1255
void EmitOMPCopy(QualType OriginalType, Address DestAddr, Address SrcAddr, const VarDecl *DestVD, const VarDecl *SrcVD, const Expr *Copy)
Emit proper copying of data from one variable to another.
void markAsIgnoreThreadCheckingAtRuntime(llvm::Function *Fn)
Annotate the function with an attribute that disables TSan checking at runtime.
llvm::Value * EvaluateExprAsBool(const Expr *E)
EvaluateExprAsBool - Perform the usual unary conversions on the specified expression and compare the ...
Definition CGExpr.cpp:232
void EmitCallArg(CallArgList &args, const Expr *E, QualType ArgType)
EmitCallArg - Emit a single call argument.
Definition CGCall.cpp:4981
void maybeResetMCDCCondBitmap(const Expr *E)
Zero-init the MCDC temp value.
RValue EmitCoyieldExpr(const CoyieldExpr &E, AggValueSlot aggSlot=AggValueSlot::ignored(), bool ignoreResult=false)
void EmitWhileStmt(const WhileStmt &S, ArrayRef< const Attr * > Attrs={})
Definition CGStmt.cpp:1059
JumpDest getOMPCancelDestination(OpenMPDirectiveKind Kind)
void generateObjCSetterBody(const ObjCImplementationDecl *classImpl, const ObjCPropertyImplDecl *propImpl, llvm::Constant *AtomicHelperFn)
Definition CGObjC.cpp:1468
void GenerateCXXGlobalInitFunc(llvm::Function *Fn, ArrayRef< llvm::Function * > CXXThreadLocals, ConstantAddress Guard=ConstantAddress::invalid())
GenerateCXXGlobalInitFunc - Generates code for initializing global variables.
llvm::Value * EmitPPCBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
Definition PPC.cpp:73
LValue EmitPredefinedLValue(const PredefinedExpr *E)
Definition CGExpr.cpp:3826
void EmitPointerAuthOperandBundle(const CGPointerAuthInfo &Info, SmallVectorImpl< llvm::OperandBundleDef > &Bundles)
void EmitOMPTargetParallelForSimdDirective(const OMPTargetParallelForSimdDirective &S)
void EmitOMPTargetParallelGenericLoopDirective(const OMPTargetParallelGenericLoopDirective &S)
Emit combined directive 'target parallel loop' as if its constituent constructs are 'target',...
void EmitOpenACCCombinedConstruct(const OpenACCCombinedConstruct &S)
void EmitOMPUseDeviceAddrClause(const OMPUseDeviceAddrClause &C, OMPPrivateScope &PrivateScope, const llvm::DenseMap< const ValueDecl *, llvm::Value * > CaptureDeviceAddrMap)
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:4121
void GenerateCXXGlobalVarDeclInitFunc(llvm::Function *Fn, const VarDecl *D, llvm::GlobalVariable *Addr, bool PerformInit)
Emit the code necessary to initialize the given global variable.
llvm::Value * EmitSVEDupX(llvm::Value *Scalar, llvm::Type *Ty)
void EmitExtendGCLifetime(llvm::Value *object)
EmitExtendGCLifetime - Given a pointer to an Objective-C object, make sure it survives garbage collec...
Definition CGObjC.cpp:3716
void ResolveBranchFixups(llvm::BasicBlock *Target)
LValue EmitDeclRefLValue(const DeclRefExpr *E)
Definition CGExpr.cpp:3530
void InsertHelper(llvm::Instruction *I, const llvm::Twine &Name, llvm::BasicBlock::iterator InsertPt) const
CGBuilder insert helper.
void EmitOMPTeamsDistributeParallelForSimdDirective(const OMPTeamsDistributeParallelForSimdDirective &S)
LValue EmitStringLiteralLValue(const StringLiteral *E)
Definition CGExpr.cpp:3816
llvm::Value * EmitARMMVEBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Triple::ArchType Arch)
Definition ARM.cpp:3595
void EmitOMPMaskedDirective(const OMPMaskedDirective &S)
Address getAsNaturalAddressOf(Address Addr, QualType PointeeTy)
AggValueSlot CreateAggTemp(QualType T, const Twine &Name="tmp", RawAddress *Alloca=nullptr)
CreateAggTemp - Create a temporary memory object for the given aggregate type.
bool checkIfLoopMustProgress(const Expr *, bool HasEmptyBody)
Returns true if a loop must make progress, which means the mustprogress attribute can be added.
Definition CGStmt.cpp:996
RValue getOrCreateOpaqueRValueMapping(const OpaqueValueExpr *e)
Given an opaque value expression, return its RValue mapping if it exists, otherwise create one.
Definition CGExpr.cpp:6320
RValue EmitCall(const CGFunctionInfo &CallInfo, const CGCallee &Callee, ReturnValueSlot ReturnValue, const CallArgList &Args, llvm::CallBase **CallOrInvoke=nullptr, bool IsMustTail=false)
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...
void callCStructCopyConstructor(LValue Dst, LValue Src)
void EmitOMPAggregateAssign(Address DestAddr, Address SrcAddr, QualType OriginalType, const llvm::function_ref< void(Address, Address)> CopyGen)
Perform element by element copying of arrays with type OriginalType from SrcAddr to DestAddr using co...
Address getExceptionSlot()
Returns a pointer to the function's exception object and selector slot, which is assigned in every la...
void EmitCXXGuardedInitBranch(llvm::Value *NeedsInit, llvm::BasicBlock *InitBlock, llvm::BasicBlock *NoInitBlock, GuardKind Kind, const VarDecl *D)
Emit a branch to select whether or not to perform guarded initialization.
bool HaveInsertPoint() const
HaveInsertPoint - True if an insertion point is defined.
void EmitOMPTeamsDistributeSimdDirective(const OMPTeamsDistributeSimdDirective &S)
llvm::Function * GenerateVarArgsThunk(llvm::Function *Fn, const CGFunctionInfo &FnInfo, GlobalDecl GD, const ThunkInfo &Thunk)
RValue EmitAtomicLoad(LValue LV, SourceLocation SL, AggValueSlot Slot=AggValueSlot::ignored())
bool AlwaysEmitXRayTypedEvents() const
AlwaysEmitXRayTypedEvents - Return true if clang must unconditionally emit XRay typed event handling ...
void EmitVTableAssumptionLoads(const CXXRecordDecl *ClassDecl, Address This)
Emit assumption load for all bases.
Definition CGClass.cpp:2544
llvm::Value * EmitARCRetainBlock(llvm::Value *value, bool mandatory)
Retain the given block, with _Block_copy semantics.
Definition CGObjC.cpp:2349
llvm::Value * EmitObjCCollectionLiteral(const Expr *E, const ObjCMethodDecl *MethodWithObjects)
Definition CGObjC.cpp:123
llvm::BasicBlock * getTerminateFunclet()
getTerminateLandingPad - Return a cleanup funclet that just calls terminate.
void EmitInvariantStart(llvm::Constant *Addr, CharUnits Size)
llvm::Value * EmitNeonRShiftImm(llvm::Value *Vec, llvm::Value *Amt, llvm::Type *Ty, bool usgn, const char *name)
Definition ARM.cpp:507
llvm::BasicBlock * getTerminateLandingPad()
getTerminateLandingPad - Return a landing pad that just calls terminate.
void EmitOMPDistributeLoop(const OMPLoopDirective &S, const CodeGenLoopTy &CodeGenLoop, Expr *IncExpr)
Emit code for the distribute loop-based directive.
llvm::Function * GenerateSEHFinallyFunction(CodeGenFunction &ParentCGF, const SEHFinallyStmt &Finally)
llvm::Value * emitScalarConstant(const ConstantEmission &Constant, Expr *E)
Definition CGExpr.cpp:2037
void AddAMDGPUFenceAddressSpaceMMRA(llvm::Instruction *Inst, const CallExpr *E)
Definition AMDGPU.cpp:441
void EmitOMPMasterTaskLoopDirective(const OMPMasterTaskLoopDirective &S)
llvm::Value * EmitARCRetainScalarExpr(const Expr *expr)
EmitARCRetainScalarExpr - Semantically equivalent to EmitARCRetainObject(e->getType(),...
Definition CGObjC.cpp:3493
void EmitOMPReverseDirective(const OMPReverseDirective &S)
llvm::Value * getTypeSize(QualType Ty)
Returns calculated size of the specified type.
bool EmitLifetimeStart(llvm::Value *Addr)
Emit a lifetime.begin marker if some criteria are satisfied.
Definition CGDecl.cpp:1356
void EmitStartEHSpec(const Decl *D)
EmitStartEHSpec - Emit the start of the exception spec.
void popCatchScope()
popCatchScope - Pops the catch scope at the top of the EHScope stack, emitting any required code (oth...
LValue EmitUnsupportedLValue(const Expr *E, const char *Name)
EmitUnsupportedLValue - Emit a dummy l-value using the type of E and issue an ErrorUnsupported style ...
Definition CGExpr.cpp:1640
void EmitOMPCancellationPointDirective(const OMPCancellationPointDirective &S)
void EmitDestructorBody(FunctionArgList &Args)
EmitDestructorBody - Emits the body of the current destructor.
Definition CGClass.cpp:1539
void EmitOpenACCDataConstruct(const OpenACCDataConstruct &S)
LValue MakeRawAddrLValue(llvm::Value *V, QualType T, CharUnits Alignment, AlignmentSource Source=AlignmentSource::Type)
Same as MakeAddrLValue above except that the pointer is known to be unsigned.
llvm::MDNode * buildAllocToken(QualType AllocType)
Build metadata used by the AllocToken instrumentation.
Definition CGExpr.cpp:1316
RValue EmitCXXMemberCallExpr(const CXXMemberCallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke=nullptr)
void EmitX86MultiVersionResolver(llvm::Function *Resolver, ArrayRef< FMVResolverOption > Options)
LValue EmitLValueForFieldInitialization(LValue Base, const FieldDecl *Field)
EmitLValueForFieldInitialization - Like EmitLValueForField, except that if the Field is a reference,...
Definition CGExpr.cpp:5858
llvm::Value * EmitBlockLiteral(const BlockExpr *)
Emit block literal.
Definition CGBlocks.cpp:764
void EmitOMPTargetTeamsDistributeParallelForDirective(const OMPTargetTeamsDistributeParallelForDirective &S)
llvm::Value * EmitToMemory(llvm::Value *Value, QualType Ty)
EmitToMemory - Change a scalar value from its value representation to its in-memory representation.
Definition CGExpr.cpp:2223
Address GetAddressOfDirectBaseInCompleteClass(Address Value, const CXXRecordDecl *Derived, const CXXRecordDecl *Base, bool BaseIsVirtual)
GetAddressOfBaseOfCompleteClass - Convert the given pointer to a complete class to the given direct b...
Definition CGClass.cpp:214
void EmitOMPMaskedTaskLoopDirective(const OMPMaskedTaskLoopDirective &S)
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:153
void EmitObjCAtTryStmt(const ObjCAtTryStmt &S)
Definition CGObjC.cpp:2125
SmallVector< llvm::Type *, 2 > getSVEOverloadTypes(const SVETypeFlags &TypeFlags, llvm::Type *ReturnType, ArrayRef< llvm::Value * > Ops)
Definition ARM.cpp:4542
bool ShouldInstrumentFunction()
ShouldInstrumentFunction - Return true if the current function should be instrumented with __cyg_prof...
void startOutlinedSEHHelper(CodeGenFunction &ParentCGF, bool IsFilter, const Stmt *OutlinedStmt)
Arrange a function prototype that can be called by Windows exception handling personalities.
void maybeUpdateMCDCCondBitmap(const Expr *E, llvm::Value *Val)
Update the MCDC temp value with the condition's evaluated result.
LValue getOrCreateOpaqueLValueMapping(const OpaqueValueExpr *e)
Given an opaque value expression, return its LValue mapping if it exists, otherwise create one.
Definition CGExpr.cpp:6306
llvm::function_ref< std::pair< LValue, LValue >(CodeGenFunction &, const OMPExecutableDirective &S)> CodeGenLoopBoundsTy
llvm::Function * generateAwaitSuspendWrapper(Twine const &CoroName, Twine const &SuspendPointName, CoroutineSuspendExpr const &S)
bool EmitScalarRangeCheck(llvm::Value *Value, QualType Ty, SourceLocation Loc)
Check if the scalar Value is within the valid range for the given type Ty.
Definition CGExpr.cpp:2096
ComplexPairTy EmitComplexExpr(const Expr *E, bool IgnoreReal=false, bool IgnoreImag=false)
EmitComplexExpr - Emit the computation of the specified expression of complex type,...
void emitAlignmentAssumptionCheck(llvm::Value *Ptr, QualType Ty, SourceLocation Loc, SourceLocation AssumptionLoc, llvm::Value *Alignment, llvm::Value *OffsetValue, llvm::Value *TheCheck, llvm::Instruction *Assumption)
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:5342
const TargetCodeGenInfo & getTargetHooks() const
void setBeforeOutermostConditional(llvm::Value *value, Address addr, CodeGenFunction &CGF)
CGPointerAuthInfo EmitPointerAuthInfo(const PointerAuthSchema &Schema, llvm::Value *StorageAddress, GlobalDecl SchemaDecl, QualType SchemaType)
Emit the concrete pointer authentication informaton for the given authentication schema.
void EmitOMPTargetExitDataDirective(const OMPTargetExitDataDirective &S)
void EmitCtorPrologue(const CXXConstructorDecl *CD, CXXCtorType Type, FunctionArgList &Args)
EmitCtorPrologue - This routine generates necessary code to initialize base classes and non-static da...
Definition CGClass.cpp:1263
llvm::ConstantInt * getUBSanFunctionTypeHash(QualType T) const
Return a type hash constant for a function instrumented by -fsanitize=function.
RValue EmitBuiltinAlignTo(const CallExpr *E, bool AlignUp)
Emit IR for __builtin_align_up/__builtin_align_down.
LValue EmitHLSLArrayAssignLValue(const BinaryOperator *E)
Definition CGExpr.cpp:6683
void EmitSEHLeaveStmt(const SEHLeaveStmt &S)
void EmitLifetimeEnd(llvm::Value *Addr)
Definition CGDecl.cpp:1368
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:224
void EmitBranchToCounterBlock(const Expr *Cond, BinaryOperator::Opcode LOp, llvm::BasicBlock *TrueBlock, llvm::BasicBlock *FalseBlock, uint64_t TrueCount=0, Stmt::Likelihood LH=Stmt::LH_None, const Expr *CntrIdx=nullptr)
EmitBranchToCounterBlock - Emit a conditional branch to a new block that increments a profile counter...
void EmitPointerAuthCopy(PointerAuthQualifier Qualifier, QualType Type, Address DestField, Address SrcField)
void EmitOMPTargetEnterDataDirective(const OMPTargetEnterDataDirective &S)
LValue EmitVAArgExprLValue(const VAArgExpr *E)
Definition CGExpr.cpp:6715
bool InNoInlineAttributedStmt
True if the current statement has noinline attribute.
SmallVector< llvm::OperandBundleDef, 1 > getBundlesForFunclet(llvm::Value *Callee)
Definition CGCall.cpp:5124
void EmitOMPMaskedTaskLoopSimdDirective(const OMPMaskedTaskLoopSimdDirective &S)
llvm::Value * EmitWebAssemblyBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
llvm::Value * EmitNeonShiftVector(llvm::Value *V, llvm::Type *Ty, bool negateForRightShift)
Definition ARM.cpp:485
void EmitTypeMetadataCodeForVCall(const CXXRecordDecl *RD, llvm::Value *VTable, SourceLocation Loc)
If whole-program virtual table optimization is enabled, emit an assumption that VTable is a member of...
Definition CGClass.cpp:2910
void EmitCapturedLocals(CodeGenFunction &ParentCGF, const Stmt *OutlinedStmt, bool IsFilter)
Scan the outlined statement for captures from the parent function.
llvm::Value * EmitObjCAlloc(llvm::Value *value, llvm::Type *returnType)
Allocate the given objc object.
Definition CGObjC.cpp:2789
llvm::Value * LoadObjCSelf()
LoadObjCSelf - Load the value of self.
Definition CGObjC.cpp:1788
void GenerateObjCMethod(const ObjCMethodDecl *OMD)
Generate an Objective-C method.
Definition CGObjC.cpp:807
void callCStructMoveAssignmentOperator(LValue Dst, LValue Src)
std::pair< bool, RValue > EmitOMPAtomicSimpleUpdateExpr(LValue X, RValue E, BinaryOperatorKind BO, bool IsXLHSInRHSPart, llvm::AtomicOrdering AO, SourceLocation Loc, const llvm::function_ref< RValue(RValue)> CommonGen)
Emit atomic update code for constructs: X = X BO E or X = E BO E.
bool IsInPreservedAIRegion
True if CodeGen currently emits code inside presereved access index region.
RValue EmitAnyExprToTemp(const Expr *E)
EmitAnyExprToTemp - Similarly to EmitAnyExpr(), however, the result will always be accessible even if...
Definition CGExpr.cpp:292
void EmitCoroutineBody(const CoroutineBodyStmt &S)
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,...
LValue EmitStmtExprLValue(const StmtExpr *E)
Definition CGExpr.cpp:6818
void EmitOMPParallelDirective(const OMPParallelDirective &S)
void EmitOMPTaskDirective(const OMPTaskDirective &S)
llvm::Value * unregisterGlobalDtorWithUnAtExit(llvm::Constant *dtorStub)
Call unatexit() with function dtorStub.
void EmitOMPMasterTaskLoopSimdDirective(const OMPMasterTaskLoopSimdDirective &S)
void pushSEHCleanup(CleanupKind kind, llvm::Function *FinallyFunc)
llvm::Value * EmitARCLoadWeakRetained(Address addr)
i8* @objc_loadWeakRetained(i8** addr)
Definition CGObjC.cpp:2643
void EmitOMPDistributeParallelForDirective(const OMPDistributeParallelForDirective &S)
void EmitOMPAssumeDirective(const OMPAssumeDirective &S)
llvm::Value * emitPointerAuthResign(llvm::Value *Pointer, QualType PointerType, const CGPointerAuthInfo &CurAuthInfo, const CGPointerAuthInfo &NewAuthInfo, bool IsKnownNonNull)
int ExpectedOMPLoopDepth
Number of nested loop to be consumed by the last surrounding loop-associated directive.
void EmitOMPPrivateClause(const OMPExecutableDirective &D, OMPPrivateScope &PrivateScope)
llvm::CallInst * EmitNounwindRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
void EmitOMPTeamsDistributeDirective(const OMPTeamsDistributeDirective &S)
llvm::Value * EmitDirectXBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
Definition DirectX.cpp:22
llvm::Value * EmitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E, llvm::Triple::ArchType Arch)
Definition ARM.cpp:5103
void EmitStopPoint(const Stmt *S)
EmitStopPoint - Emit a debug stoppoint if we are emitting debug info.
Definition CGStmt.cpp:48
RawAddress CreateTempAllocaWithoutCast(llvm::Type *Ty, CharUnits align, const Twine &Name="tmp", llvm::Value *ArraySize=nullptr)
CreateTempAlloca - This creates a alloca and inserts it into the entry block.
Definition CGExpr.cpp:107
void EmitOMPTargetUpdateDirective(const OMPTargetUpdateDirective &S)
llvm::Value * EmitWithOriginalRHSBitfieldAssignment(const BinaryOperator *E, llvm::Value **Previous, QualType *SrcType)
Retrieve the implicit cast expression of the rhs in a binary operator expression by passing pointers ...
llvm::Value * EmitMSVCBuiltinExpr(MSVCIntrin BuiltinID, const CallExpr *E)
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 EmitOMPTargetTeamsGenericLoopDirective(const OMPTargetTeamsGenericLoopDirective &S)
bool isMCDCBranchExpr(const Expr *E) const
llvm::Value * EmitFP8NeonFDOTCall(unsigned IID, bool ExtendLaneArg, llvm::Type *RetTy, SmallVectorImpl< llvm::Value * > &Ops, const CallExpr *E, const char *name)
Definition ARM.cpp:454
void EmitMultiVersionResolver(llvm::Function *Resolver, ArrayRef< FMVResolverOption > Options)
void EmitIfStmt(const IfStmt &S)
Definition CGStmt.cpp:866
void emitAutoVarTypeCleanup(const AutoVarEmission &emission, QualType::DestructionKind dtorKind)
Enter a destroy cleanup for the given local variable.
Definition CGDecl.cpp:2150
void emitARCMoveAssignWeak(QualType Ty, Address DstAddr, Address SrcAddr)
Definition CGObjC.cpp:2714
llvm::Value * vectorWrapScalar16(llvm::Value *Op)
Definition ARM.cpp:3850
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.
llvm::CallInst * EmitNounwindRuntimeCall(llvm::FunctionCallee callee, ArrayRef< llvm::Value * > args, const Twine &name="")
void EmitAutoVarCleanups(const AutoVarEmission &emission)
Definition CGDecl.cpp:2217
LValue EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E)
Definition CGExpr.cpp:6794
llvm::Value * EmitARMCDEBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Triple::ArchType Arch)
Definition ARM.cpp:3696
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:1387
static const Expr * stripCond(const Expr *C)
Ignore parentheses and logical-NOT to track conditions consistently.
void EmitFunctionProlog(const CGFunctionInfo &FI, llvm::Function *Fn, const FunctionArgList &Args)
EmitFunctionProlog - Emit the target specific LLVM code to load the arguments for the given function.
Definition CGCall.cpp:3197
void EmitDeferStmt(const DeferStmt &S)
Definition CGStmt.cpp:2031
void registerGlobalDtorWithLLVM(const VarDecl &D, llvm::FunctionCallee fn, llvm::Constant *addr)
Registers the dtor using 'llvm.global_dtors' for platforms that do not support an 'atexit()' function...
Address EmitAddressOfPFPField(Address RecordPtr, const PFPField &Field)
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:2713
SmallVector< llvm::CanonicalLoopInfo *, 4 > OMPLoopNestStack
List of recently emitted OMPCanonicalLoops.
Address EmitArrayToPointerDecay(const Expr *Array, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
Definition CGExpr.cpp:4556
void SetFastMathFlags(FPOptions FPFeatures)
Set the codegen fast-math flags.
void pushLifetimeExtendedDestroy(CleanupKind kind, Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray)
Definition CGDecl.cpp:2353
llvm::Value * EmitAArch64CompareBuiltinExpr(llvm::Value *Op, llvm::Type *Ty, const llvm::CmpInst::Predicate Pred, const llvm::Twine &Name="")
Definition ARM.cpp:2499
llvm::SmallVector< char, 256 > LifetimeExtendedCleanupStack
llvm::Constant * GenerateObjCAtomicSetterCopyHelperFunction(const ObjCPropertyImplDecl *PID)
GenerateObjCAtomicSetterCopyHelperFunction - Given a c++ object type with non-trivial copy assignment...
Definition CGObjC.cpp:3733
llvm::Value * EmitSPIRVBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
Definition SPIR.cpp:22
void EmitOpenACCAtomicConstruct(const OpenACCAtomicConstruct &S)
void EmitObjCAtSynchronizedStmt(const ObjCAtSynchronizedStmt &S)
Definition CGObjC.cpp:2133
Address EmitCompoundStmt(const CompoundStmt &S, bool GetLast=false, AggValueSlot AVS=AggValueSlot::ignored())
EmitCompoundStmt - Emit a compound statement {..} node.
Definition CGStmt.cpp:557
llvm::Value * LoadCXXVTT()
LoadCXXVTT - Load the VTT parameter to base constructors/destructors have virtual bases.
RValue EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue)
void EmitOpenACCCacheConstruct(const OpenACCCacheConstruct &S)
Address EmitVAListRef(const Expr *E)
void EmitOpenACCLoopConstruct(const OpenACCLoopConstruct &S)
void EmitOMPTeamsDistributeParallelForDirective(const OMPTeamsDistributeParallelForDirective &S)
RValue GetUndefRValue(QualType Ty)
GetUndefRValue - Get an appropriate 'undef' rvalue for the given type.
Definition CGExpr.cpp:1608
void EmitParmDecl(const VarDecl &D, ParamValue Arg, unsigned ArgNo)
EmitParmDecl - Emit a ParmVarDecl or an ImplicitParamDecl.
Definition CGDecl.cpp:2675
llvm::Instruction * getPostAllocaInsertPoint()
Return PostAllocaInsertPt.
RValue EmitBuiltinIsAligned(const CallExpr *E)
Emit IR for __builtin_is_aligned.
void EmitAllocToken(llvm::CallBase *CB, QualType AllocType)
Emit and set additional metadata used by the AllocToken instrumentation.
Definition CGExpr.cpp:1330
void EmitARCNoopIntrinsicUse(ArrayRef< llvm::Value * > values)
Emit a call to "clang.arc.noop.use", which consumes the result of a call that has operand bundle "cla...
Definition CGObjC.cpp:2179
llvm::AtomicRMWInst * emitAtomicRMWInst(llvm::AtomicRMWInst::BinOp Op, Address Addr, llvm::Value *Val, llvm::AtomicOrdering Order=llvm::AtomicOrdering::SequentiallyConsistent, llvm::SyncScope::ID SSID=llvm::SyncScope::System, const AtomicExpr *AE=nullptr)
Emit an atomicrmw instruction, and applying relevant metadata when applicable.
LValue EmitComplexAssignmentLValue(const BinaryOperator *E)
Emit an l-value for an assignment (simple or compound) of complex type.
LValue EmitCastLValue(const CastExpr *E)
EmitCastLValue - Casts are never lvalues unless that cast is to a reference type.
Definition CGExpr.cpp:6078
void EmitOMPFuseDirective(const OMPFuseDirective &S)
llvm::Value * EmitPointerArithmetic(const BinaryOperator *BO, Expr *pointerOperand, llvm::Value *pointer, Expr *indexOperand, llvm::Value *index, bool isSubtraction)
Emit pointer + index arithmetic.
void EmitInitializerForField(FieldDecl *Field, LValue LHS, Expr *Init)
Definition CGClass.cpp:678
LValue EmitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E)
Definition CGExpr.cpp:515
LValue EmitLoadOfPointerLValue(Address Ptr, const PointerType *PtrTy)
Definition CGExpr.cpp:3374
void EmitAsmStmt(const AsmStmt &S)
Definition CGStmt.cpp:2781
void EmitDefaultStmt(const DefaultStmt &S, ArrayRef< const Attr * > Attrs)
Definition CGStmt.cpp:1932
void EmitOMPTargetTeamsDistributeDirective(const OMPTargetTeamsDistributeDirective &S)
void EmitLambdaInAllocaCallOpBody(const CXXMethodDecl *MD)
Definition CGClass.cpp:3260
void EmitSwitchStmt(const SwitchStmt &S)
Definition CGStmt.cpp:2323
Address ReturnValuePointer
ReturnValuePointer - The temporary alloca to hold a pointer to sret.
void EmitOMPUseDevicePtrClause(const OMPUseDevicePtrClause &C, OMPPrivateScope &PrivateScope, const llvm::DenseMap< const ValueDecl *, llvm::Value * > CaptureDeviceAddrMap)
llvm::Value * SEHInfo
Value returned by __exception_info intrinsic.
static bool mightAddDeclToScope(const Stmt *S)
Determine if the given statement might introduce a declaration into the current scope,...
llvm::Value * EmitCheckValue(llvm::Value *V)
Convert a value into a format suitable for passing to a runtime sanitizer handler.
Definition CGExpr.cpp:3935
void EmitAnyExprToMem(const Expr *E, Address Location, Qualifiers Quals, bool IsInitializer)
EmitAnyExprToMem - Emits the code necessary to evaluate an arbitrary expression into the given memory...
Definition CGExpr.cpp:302
RValue EmitAnyExpr(const Expr *E, AggValueSlot aggSlot=AggValueSlot::ignored(), bool ignoreResult=false)
EmitAnyExpr - Emit code to compute the specified expression which can have any type.
Definition CGExpr.cpp:273
bool needsEHCleanup(QualType::DestructionKind kind)
Determines whether an EH cleanup is required to destroy a type with the given destruction kind.
LValue EmitExtVectorElementExpr(const ExtVectorElementExpr *E)
Definition CGExpr.cpp:5369
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:353
llvm::DenseMap< const ValueDecl *, FieldDecl * > LambdaCaptureFields
RValue EmitBuiltinNewDeleteCall(const FunctionProtoType *Type, const CallExpr *TheCallExpr, bool IsDelete)
RValue EmitUnsupportedRValue(const Expr *E, const char *Name)
EmitUnsupportedRValue - Emit a dummy r-value using the type of E and issue an ErrorUnsupported style ...
Definition CGExpr.cpp:1634
void EmitOMPParallelForSimdDirective(const OMPParallelForSimdDirective &S)
bool AutoreleaseResult
In ARC, whether we should autorelease the return value.
CleanupKind getCleanupKind(QualType::DestructionKind kind)
llvm::CallInst * EmitRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
uint64_t getCurrentProfileCount()
Get the profiler's current count.
std::pair< LValue, LValue > EmitHLSLOutArgLValues(const HLSLOutArgExpr *E, QualType Ty)
Definition CGExpr.cpp:6272
LValue EmitObjCSelectorLValue(const ObjCSelectorExpr *E)
Definition CGExpr.cpp:6766
llvm::Value * EmitARCRetainNonBlock(llvm::Value *value)
Retain the given object, with normal retain semantics.
Definition CGObjC.cpp:2337
llvm::Type * ConvertTypeForMem(QualType T)
static std::string getNonTrivialCopyConstructorStr(QualType QT, CharUnits Alignment, bool IsVolatile, ASTContext &Ctx)
void generateObjCGetterBody(const ObjCImplementationDecl *classImpl, const ObjCPropertyImplDecl *propImpl, const ObjCMethodDecl *GetterMothodDecl, llvm::Constant *AtomicHelperFn)
Definition CGObjC.cpp:1135
LValue EmitCallExprLValue(const CallExpr *E, llvm::CallBase **CallOrInvoke=nullptr)
Definition CGExpr.cpp:6700
llvm::Value * EmitARCRetainAutoreleaseNonBlock(llvm::Value *value)
Do a fused retain/autorelease of the given object.
Definition CGObjC.cpp:2628
llvm::Value * EmitSVEMovl(const SVETypeFlags &TypeFlags, llvm::ArrayRef< llvm::Value * > Ops, unsigned BuiltinID)
Definition ARM.cpp:4279
void EmitOMPInnerLoop(const OMPExecutableDirective &S, bool RequiresCleanup, const Expr *LoopCond, const Expr *IncExpr, const llvm::function_ref< void(CodeGenFunction &)> BodyGen, const llvm::function_ref< void(CodeGenFunction &)> PostIncGen)
Emit inner loop of the worksharing/simd construct.
void EmitEndEHSpec(const Decl *D)
EmitEndEHSpec - Emit the end of the exception spec.
void EmitSynthesizedCXXCopyCtorCall(const CXXConstructorDecl *D, Address This, Address Src, const CXXConstructExpr *E)
Definition CGClass.cpp:2551
void GenerateCXXGlobalCleanUpFunc(llvm::Function *Fn, ArrayRef< std::tuple< llvm::FunctionType *, llvm::WeakTrackingVH, llvm::Constant * > > DtorsOrStermFinalizers)
GenerateCXXGlobalCleanUpFunc - Generates code for cleaning up global variables.
void EmitDeleteCall(const FunctionDecl *DeleteFD, llvm::Value *Ptr, QualType DeleteTy, llvm::Value *NumElements=nullptr, CharUnits CookieSize=CharUnits())
void EmitOMPTaskLoopSimdDirective(const OMPTaskLoopSimdDirective &S)
static void EmitOMPTargetTeamsDistributeParallelForDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetTeamsDistributeParallelForDirective &S)
llvm::Value * EmitObjCAutoreleasePoolPush()
Produce the code to do a objc_autoreleasepool_push.
Definition CGObjC.cpp:2724
RValue EmitLoadOfBitfieldLValue(LValue LV, SourceLocation Loc)
Definition CGExpr.cpp:2587
void EmitSYCLKernelCallStmt(const SYCLKernelCallStmt &S)
RValue EmitAtomicExpr(AtomicExpr *E)
Definition CGAtomic.cpp:912
void GenerateObjCSetter(ObjCImplementationDecl *IMP, const ObjCPropertyImplDecl *PID)
GenerateObjCSetter - Synthesize an Objective-C property setter function for the given property.
Definition CGObjC.cpp:1672
llvm::Value * EmitARCLoadWeak(Address addr)
i8* @objc_loadWeak(i8** addr) Essentially objc_autorelease(objc_loadWeakRetained(addr)).
Definition CGObjC.cpp:2636
void EmitOMPTargetDirective(const OMPTargetDirective &S)
void ExitSEHTryStmt(const SEHTryStmt &S)
void EmitOpenACCEnterDataConstruct(const OpenACCEnterDataConstruct &S)
LValue EmitLValueForLambdaField(const FieldDecl *Field)
Definition CGExpr.cpp:5572
static void EmitOMPTargetParallelForSimdDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetParallelForSimdDirective &S)
Emit device code for the target parallel for simd directive.
llvm::Value * EmitSVEPredicateTupleCast(llvm::Value *PredTuple, llvm::StructType *Ty)
Definition ARM.cpp:4038
void markStmtMaybeUsed(const Stmt *S)
void emitPFPPostCopyUpdates(Address DestPtr, Address SrcPtr, QualType Ty)
Copy all PFP fields from SrcPtr to DestPtr while updating signatures, assuming that DestPtr was alrea...
llvm::Value * EmitHexagonBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
Definition Hexagon.cpp:77
CodeGenTypes & getTypes() const
llvm::Function * EmitCapturedStmt(const CapturedStmt &S, CapturedRegionKind K)
Generate an outlined function for the body of a CapturedStmt, store any captured variables into the c...
Definition CGStmt.cpp:3286
llvm::Value * EmitX86BuiltinExpr(unsigned BuiltinID, const CallExpr *E)
Definition X86.cpp:793
static TypeEvaluationKind getEvaluationKind(QualType T)
getEvaluationKind - Return the TypeEvaluationKind of QualType T.
void generateThunk(llvm::Function *Fn, const CGFunctionInfo &FnInfo, GlobalDecl GD, const ThunkInfo &Thunk, bool IsUnprototyped)
Generate a thunk for the given method.
void ExitCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock=false)
llvm::Value * EmitIvarOffset(const ObjCInterfaceDecl *Interface, const ObjCIvarDecl *Ivar)
Definition CGExpr.cpp:6772
llvm::Value * EmitSVEPrefetchLoad(const SVETypeFlags &TypeFlags, SmallVectorImpl< llvm::Value * > &Ops, unsigned BuiltinID)
Definition ARM.cpp:4286
bool IsSanitizerScope
True if CodeGen currently emits code implementing sanitizer checks.
void FlattenAccessAndTypeLValue(LValue LVal, SmallVectorImpl< LValue > &AccessList)
Definition CGExpr.cpp:7263
void EmitOMPTeamsDirective(const OMPTeamsDirective &S)
static bool containsBreak(const Stmt *S)
containsBreak - Return true if the statement contains a break out of it.
void emitImplicitAssignmentOperatorBody(FunctionArgList &Args)
Definition CGClass.cpp:1662
void EmitSimpleOMPExecutableDirective(const OMPExecutableDirective &D)
Emit simple code for OpenMP directives in Simd-only mode.
HLSLControlFlowHintAttr::Spelling HLSLControlFlowAttr
HLSL Branch attribute.
LValue EmitCoyieldLValue(const CoyieldExpr *E)
bool InAlwaysInlineAttributedStmt
True if the current statement has always_inline attribute.
void EmitCaseStmt(const CaseStmt &S, ArrayRef< const Attr * > Attrs)
Definition CGStmt.cpp:1817
RawAddress CreateTempAlloca(llvm::Type *Ty, CharUnits align, const Twine &Name="tmp", llvm::Value *ArraySize=nullptr, RawAddress *Alloca=nullptr)
CreateTempAlloca - This creates a alloca and inserts it into the entry block.
llvm::Constant * GenerateObjCAtomicGetterCopyHelperFunction(const ObjCPropertyImplDecl *PID)
Definition CGObjC.cpp:3833
void EmitOMPErrorDirective(const OMPErrorDirective &S)
void EmitOMPTargetTaskBasedDirective(const OMPExecutableDirective &S, const RegionCodeGenTy &BodyGen, OMPTargetDataInfo &InputInfo)
void EmitBreakStmt(const BreakStmt &S)
Definition CGStmt.cpp:1703
void EmitOMPParallelMaskedTaskLoopSimdDirective(const OMPParallelMaskedTaskLoopSimdDirective &S)
void EmitOMPTargetTeamsDirective(const OMPTargetTeamsDirective &S)
void EmitOpenACCComputeConstruct(const OpenACCComputeConstruct &S)
void EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc, LValue LV, QualType Type, SanitizerSet SkippedChecks=SanitizerSet(), llvm::Value *ArraySize=nullptr)
void EmitCfiSlowPathCheck(SanitizerKind::SanitizerOrdinal Ordinal, llvm::Value *Cond, llvm::ConstantInt *TypeId, llvm::Value *Ptr, ArrayRef< llvm::Constant * > StaticArgs)
Emit a slow path cross-DSO CFI check which calls __cfi_slowpath if Cond if false.
Definition CGExpr.cpp:4255
RValue EmitCoawaitExpr(const CoawaitExpr &E, AggValueSlot aggSlot=AggValueSlot::ignored(), bool ignoreResult=false)
llvm::SmallVector< const ParmVarDecl *, 4 > FnArgs
Save Parameter Decl for coroutine.
void EmitDoStmt(const DoStmt &S, ArrayRef< const Attr * > Attrs={})
Definition CGStmt.cpp:1176
void EmitOMPTargetDataDirective(const OMPTargetDataDirective &S)
llvm::Value * EmitSMEZero(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
Definition ARM.cpp:4465
void EmitCXXTemporary(const CXXTemporary *Temporary, QualType TempType, Address Ptr)
Emits all the code to cause the given temporary to be cleaned up.
llvm::Value * authPointerToPointerCast(llvm::Value *ResultPtr, QualType SourceType, QualType DestType)
Address GenerateCapturedStmtArgument(const CapturedStmt &S)
Definition CGStmt.cpp:3301
LValue EmitUnaryOpLValue(const UnaryOperator *E)
Definition CGExpr.cpp:3749
bool EmitOMPLastprivateClauseInit(const OMPExecutableDirective &D, OMPPrivateScope &PrivateScope)
Emit initial code for lastprivate variables.
void StartThunk(llvm::Function *Fn, GlobalDecl GD, const CGFunctionInfo &FnInfo, bool IsUnprototyped)
void EmitFunctionEpilog(const CGFunctionInfo &FI, bool EmitRetDbgLoc, SourceLocation EndLoc, uint64_t RetKeyInstructionsSourceAtom)
EmitFunctionEpilog - Emit the target specific LLVM code to return the given temporary.
Definition CGCall.cpp:4091
Address EmitPointerWithAlignment(const Expr *Addr, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
EmitPointerWithAlignment - Given an expression with a pointer type, emit the value and compute our be...
Definition CGExpr.cpp:1591
static void EmitOMPTargetTeamsDistributeParallelForSimdDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetTeamsDistributeParallelForSimdDirective &S)
Emit device code for the target teams distribute parallel for simd directive.
llvm::BasicBlock * getEHDispatchBlock(EHScopeStack::stable_iterator scope)
void EmitBranch(llvm::BasicBlock *Block)
EmitBranch - Emit a branch to the specified basic block from the current insert block,...
Definition CGStmt.cpp:660
bool LValueIsSuitableForInlineAtomic(LValue Src)
An LValue is a candidate for having its loads and stores be made atomic if we are operating under /vo...
llvm::Function * GenerateOpenMPCapturedStmtFunction(const CapturedStmt &S, const OMPExecutableDirective &D)
void EmitOMPSimdDirective(const OMPSimdDirective &S)
llvm::Value * EmitSVEStructStore(const SVETypeFlags &TypeFlags, SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
Definition ARM.cpp:4213
LValue EmitCheckedLValue(const Expr *E, TypeCheckKind TCK)
Same as EmitLValue but additionally we generate checking code to guard against undefined behavior.
Definition CGExpr.cpp:1672
void EmitInheritedCXXConstructorCall(const CXXConstructorDecl *D, bool ForVirtualBase, Address This, bool InheritedFromVBase, const CXXInheritedCtorInitExpr *E)
Emit a call to a constructor inherited from a base class, passing the current constructor's arguments...
Definition CGClass.cpp:2429
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:189
Address EmitLoadOfReference(LValue RefLVal, LValueBaseInfo *PointeeBaseInfo=nullptr, TBAAAccessInfo *PointeeTBAAInfo=nullptr)
Definition CGExpr.cpp:3322
CGCallee BuildAppleKextVirtualCall(const CXXMethodDecl *MD, NestedNameSpecifier Qual, llvm::Type *Ty)
BuildAppleKextVirtualCall - This routine is to support gcc's kext ABI making indirect call to virtual...
Definition CGCXX.cpp:314
RValue EmitRValueForField(LValue LV, const FieldDecl *FD, SourceLocation Loc)
Definition CGExpr.cpp:6339
void EmitOMPParallelGenericLoopDirective(const OMPLoopDirective &S)
void EmitOMPTargetSimdDirective(const OMPTargetSimdDirective &S)
RawAddress NormalCleanupDest
i32s containing the indexes of the cleanup destinations.
llvm::Value * EmitObjCExtendObjectLifetime(QualType T, llvm::Value *Ptr)
Definition CGObjC.cpp:2160
SmallVector< llvm::Value *, 8 > ObjCEHValueStack
ObjCEHValueStack - Stack of Objective-C exception values, used for rethrows.
void EmitOMPTeamsGenericLoopDirective(const OMPTeamsGenericLoopDirective &S)
void setBlockContextParameter(const ImplicitParamDecl *D, unsigned argNum, llvm::Value *ptr)
LValue EmitCXXBindTemporaryLValue(const CXXBindTemporaryExpr *E)
Definition CGExpr.cpp:6744
RValue EmitCXXMemberPointerCallExpr(const CXXMemberCallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke)
llvm::Type * convertTypeForLoadStore(QualType ASTTy, llvm::Type *LLVMTy=nullptr)
llvm::Value * EmitSMELd1St1(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
Definition ARM.cpp:4418
llvm::Value * EmitPointerAuthBlendDiscriminator(llvm::Value *StorageAddress, llvm::Value *Discriminator)
Create the discriminator from the storage address and the entity hash.
void EmitVarDecl(const VarDecl &D)
EmitVarDecl - Emit a local variable declaration.
Definition CGDecl.cpp:203
AggValueSlot::Overlap_t getOverlapForReturnValue()
Determine whether a return value slot may overlap some other object.
bool sanitizePerformTypeCheck() const
Whether any type-checking sanitizers are enabled.
Definition CGExpr.cpp:742
const BreakContinue * GetDestForLoopControlStmt(const LoopControlStmt &S)
Definition CGStmt.cpp:1689
Address EmitExtVectorElementLValue(LValue V)
Generates lvalue for partial ext_vector access.
Definition CGExpr.cpp:2671
bool EmitOMPLinearClauseInit(const OMPLoopDirective &D)
Emit initial code for linear variables.
void SpecialInitFn(CodeGenFunction &Init, const VarDecl &D, llvm::Value *Address)
llvm::Value * EmitCheckedInBoundsGEP(llvm::Type *ElemTy, llvm::Value *Ptr, ArrayRef< llvm::Value * > IdxList, bool SignedIndices, bool IsSubtraction, SourceLocation Loc, const Twine &Name="")
Same as IRBuilder::CreateInBoundsGEP, but additionally emits a check to detect undefined behavior whe...
void EmitInitializationToLValue(const Expr *E, LValue LV, AggValueSlot::IsZeroed_t IsZeroed=AggValueSlot::IsNotZeroed)
EmitInitializationToLValue - Emit an initializer to an LValue.
Definition CGExpr.cpp:332
void EmitAggExpr(const Expr *E, AggValueSlot AS)
EmitAggExpr - Emit the computation of the specified expression of aggregate type.
llvm::BasicBlock * GetIndirectGotoBlock()
static void EmitOMPTargetParallelGenericLoopDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetParallelGenericLoopDirective &S)
Emit device code for the target parallel loop directive.
llvm::Value * EmitBuiltinAvailable(const VersionTuple &Version)
Definition CGObjC.cpp:4033
void EmitOpenACCHostDataConstruct(const OpenACCHostDataConstruct &S)
Address emitAddrOfRealComponent(Address complex, QualType complexType)
llvm::DILocation * SanitizerAnnotateDebugInfo(ArrayRef< SanitizerKind::SanitizerOrdinal > Ordinals, SanitizerHandler Handler)
Returns debug info, with additional annotation if CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo[Ordi...
EHScopeStack::stable_iterator PrologueCleanupDepth
PrologueCleanupDepth - The cleanup depth enclosing all the cleanups associated with the parameters.
void EmitOpenACCUpdateConstruct(const OpenACCUpdateConstruct &S)
llvm::Value * GetVTTParameter(GlobalDecl GD, bool ForVirtualBase, bool Delegating)
GetVTTParameter - Return the VTT parameter that should be passed to a base constructor/destructor wit...
Definition CGClass.cpp:446
void EmitOMPUnrollDirective(const OMPUnrollDirective &S)
void EmitOMPStripeDirective(const OMPStripeDirective &S)
Address EmitMSVAListRef(const Expr *E)
Emit a "reference" to a __builtin_ms_va_list; this is always the value of the expression,...
llvm::Value * EmitScalarExpr(const Expr *E, bool IgnoreResultAssign=false)
EmitScalarExpr - Emit the computation of the specified expression of LLVM scalar type,...
RValue EmitLoadOfExtVectorElementLValue(LValue V)
Definition CGExpr.cpp:2624
static bool hasAggregateEvaluationKind(QualType T)
static bool IsWrappedCXXThis(const Expr *E)
Check if E is a C++ "this" pointer wrapped in value-preserving casts.
Definition CGExpr.cpp:1649
void EmitCallArgs(CallArgList &Args, PrototypeWrapper Prototype, llvm::iterator_range< CallExpr::const_arg_iterator > ArgRange, AbstractCallee AC=AbstractCallee(), unsigned ParamsToSkip=0, EvaluationOrder Order=EvaluationOrder::Default)
EmitCallArgs - Emit call arguments for a function.
Definition CGCall.cpp:4779
llvm::Value * EmitMatrixIndexExpr(const Expr *E)
Definition CGExpr.cpp:5126
void EmitCaseStmtRange(const CaseStmt &S, ArrayRef< const Attr * > Attrs)
EmitCaseStmtRange - If case statement range is not too big then add multiple cases to switch instruct...
Definition CGStmt.cpp:1732
ComplexPairTy EmitUnPromotedValue(ComplexPairTy result, QualType PromotionType)
llvm::CallInst * EmitTrapCall(llvm::Intrinsic::ID IntrID)
Emit a call to trap or debugtrap and attach function attribute "trap-func-name" if specified.
Definition CGExpr.cpp:4541
LValue MakeAddrLValue(Address Addr, QualType T, AlignmentSource Source=AlignmentSource::Type)
void EmitOMPSingleDirective(const OMPSingleDirective &S)
void EmitTrapCheck(llvm::Value *Checked, SanitizerHandler CheckHandlerID, bool NoMerge=false, const TrapReason *TR=nullptr)
Create a basic block that will call the trap intrinsic, and emit a conditional branch to it,...
Definition CGExpr.cpp:4463
void EmitReturnStmt(const ReturnStmt &S)
EmitReturnStmt - Note that due to GCC extensions, this can have an operand if the function returns vo...
Definition CGStmt.cpp:1564
void EmitLambdaVLACapture(const VariableArrayType *VAT, LValue LV)
void FinishFunction(SourceLocation EndLoc=SourceLocation())
FinishFunction - Complete IR generation of the current function.
llvm::Value * LoadCXXThis()
LoadCXXThis - Load the value of 'this'.
llvm::function_ref< void(CodeGenFunction &, SourceLocation, const unsigned, const bool)> CodeGenOrderedTy
void EmitAtomicStore(RValue rvalue, LValue lvalue, bool isInit)
llvm::Value * EmitFromMemory(llvm::Value *Value, QualType Ty)
EmitFromMemory - Change a scalar value from its memory representation to its value representation.
Definition CGExpr.cpp:2257
llvm::Value * EmitCheckedArgForAssume(const Expr *E)
Emits an argument for a call to a __builtin_assume.
llvm::Value * EmitARCStoreStrongCall(Address addr, llvm::Value *value, bool resultIgnored)
Store into a strong object.
Definition CGObjC.cpp:2524
static void EmitOMPTargetSimdDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetSimdDirective &S)
Emit device code for the target simd directive.
llvm::Function * GenerateCapturedStmtFunction(const CapturedStmt &S)
Creates the outlined function for a CapturedStmt.
Definition CGStmt.cpp:3308
static void EmitOMPTargetParallelForDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetParallelForDirective &S)
Emit device code for the target parallel for directive.
void EnterCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock=false)
const CGFunctionInfo * CurFnInfo
uint64_t getProfileCount(const Stmt *S)
Get the profiler's count for the given statement.
llvm::Value * EmitLoadOfCountedByField(const Expr *Base, const FieldDecl *FD, const FieldDecl *CountDecl)
Build an expression accessing the "counted_by" field.
Definition CGExpr.cpp:1247
Address GetAddrOfLocalVar(const VarDecl *VD)
GetAddrOfLocalVar - Return the address of a local variable.
llvm::Value * EmitNVPTXBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
Definition NVPTX.cpp:428
llvm::Value * getArrayInitIndex()
Get the index of the current ArrayInitLoopExpr, if any.
void EmitDeclStmt(const DeclStmt &S)
Definition CGStmt.cpp:1679
void InitializeVTablePointer(const VPtr &vptr)
Initialize the vtable pointer of the given subobject.
Definition CGClass.cpp:2704
void EmitLabelStmt(const LabelStmt &S)
Definition CGStmt.cpp:763
llvm::Value * EmitVTableTypeCheckedLoad(const CXXRecordDecl *RD, llvm::Value *VTable, llvm::Type *VTableTy, uint64_t VTableByteOffset)
Emit a type checked load from the given vtable.
Definition CGClass.cpp:3097
void EmitUnreachable(SourceLocation Loc)
Emit a reached-unreachable diagnostic if Loc is valid and runtime checking is enabled.
Definition CGExpr.cpp:4451
bool ConstantFoldsToSimpleInteger(const Expr *Cond, bool &Result, bool AllowLabels=false)
ConstantFoldsToSimpleInteger - If the specified expression does not fold to a constant,...
static void EmitOMPTargetTeamsGenericLoopDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetTeamsGenericLoopDirective &S)
Emit device code for the target teams loop directive.
llvm::Value * EmitObjCStringLiteral(const ObjCStringLiteral *E)
Emits an instance of NSConstantString representing the object.
Definition CGObjC.cpp:51
void ErrorUnsupported(const Stmt *S, const char *Type)
ErrorUnsupported - Print out an error that codegen doesn't support the specified stmt yet.
llvm::Value * EmitSVEAllTruePred(const SVETypeFlags &TypeFlags)
Definition ARM.cpp:3988
llvm::Value * EmitSVEReinterpret(llvm::Value *Val, llvm::Type *Ty)
Definition ARM.cpp:4506
void EmitOMPTileDirective(const OMPTileDirective &S)
void EmitDecl(const Decl &D, bool EvaluateConditionDecl=false)
EmitDecl - Emit a declaration.
Definition CGDecl.cpp:52
LValue EmitCXXTypeidLValue(const CXXTypeidExpr *E)
Definition CGExpr.cpp:6729
llvm::Function * generateDestroyHelper(Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray, const VarDecl *VD)
generateDestroyHelper - Generates a helper function which, when invoked, destroys the given object.
void EmitOMPAtomicDirective(const OMPAtomicDirective &S)
LValue EmitMemberExpr(const MemberExpr *E)
Definition CGExpr.cpp:5470
void EmitOpenACCSetConstruct(const OpenACCSetConstruct &S)
std::pair< llvm::Value *, llvm::Value * > ComplexPairTy
Address ReturnValue
ReturnValue - The temporary alloca to hold the return value.
ConstantEmission tryEmitAsConstant(const DeclRefExpr *RefExpr)
Try to emit a reference to the given value without producing it as an l-value.
Definition CGExpr.cpp:1934
void EmitObjCMRRAutoreleasePoolPop(llvm::Value *Ptr)
Produce the code to do a primitive release.
Definition CGObjC.cpp:2814
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:1707
void EmitStoreThroughGlobalRegLValue(RValue Src, LValue Dst)
Store of global named registers are always calls to intrinsics.
Definition CGExpr.cpp:3164
void EmitAttributedStmt(const AttributedStmt &S)
Definition CGStmt.cpp:773
llvm::Value * EmitARCExtendBlockObject(const Expr *expr)
Definition CGObjC.cpp:3524
bool ShouldXRayInstrumentFunction() const
ShouldXRayInstrument - Return true if the current function should be instrumented with XRay nop sleds...
bool isOpaqueValueEmitted(const OpaqueValueExpr *E)
isOpaqueValueEmitted - Return true if the opaque value expression has already been emitted.
Definition CGExpr.cpp:6333
std::pair< llvm::Value *, CGPointerAuthInfo > EmitOrigPointerRValue(const Expr *E)
Retrieve a pointer rvalue and its ptrauth info.
void EmitOMPParallelMasterTaskLoopDirective(const OMPParallelMasterTaskLoopDirective &S)
void EmitOMPDistributeParallelForSimdDirective(const OMPDistributeParallelForSimdDirective &S)
void markStmtAsUsed(bool Skipped, const Stmt *S)
llvm::Instruction * CurrentFuncletPad
llvm::Value * EmitARCStoreWeak(Address addr, llvm::Value *value, bool ignored)
i8* @objc_storeWeak(i8** addr, i8* value) Returns value.
Definition CGObjC.cpp:2651
bool ShouldEmitVTableTypeCheckedLoad(const CXXRecordDecl *RD)
Returns whether we should perform a type checked load when loading a virtual function for virtual cal...
Definition CGClass.cpp:3079
void EmitOMPSectionDirective(const OMPSectionDirective &S)
llvm::Constant * GenerateDestroyHelperFunction(const CGBlockInfo &blockInfo)
Generate the destroy-helper function for a block closure object: static void block_destroy_helper(blo...
void EnsureInsertPoint()
EnsureInsertPoint - Ensure that an insertion point is defined so that emitted IR has a place to go.
void EmitOMPForSimdDirective(const OMPForSimdDirective &S)
llvm::LLVMContext & getLLVMContext()
bool SawAsmBlock
Whether we processed a Microsoft-style asm block during CodeGen.
void EmitNewArrayInitializer(const CXXNewExpr *E, QualType elementType, llvm::Type *ElementTy, Address NewPtr, llvm::Value *NumElements, llvm::Value *AllocSizeWithoutCookie)
RValue EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E, const CXXMethodDecl *MD, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke)
ComplexPairTy EmitPromotedValue(ComplexPairTy result, QualType PromotionType)
bool checkIfFunctionMustProgress()
Returns true if a function must make progress, which means the mustprogress attribute can be added.
LValue EmitMatrixElementExpr(const MatrixElementExpr *E)
Definition CGExpr.cpp:2312
void incrementProfileCounter(const Stmt *S, llvm::Value *StepV=nullptr)
Increment the profiler's counter for the given statement by StepV.
void EmitObjCForCollectionStmt(const ObjCForCollectionStmt &S)
Definition CGObjC.cpp:1804
llvm::SmallVector< VPtr, 4 > VPtrsVector
static unsigned getAccessedFieldNo(unsigned Idx, const llvm::Constant *Elts)
getAccessedFieldNo - Given an encoded value and a result number, return the input field number being ...
Definition CGExpr.cpp:714
llvm::Value * EmitTargetBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue)
EmitTargetBuiltinExpr - Emit the given builtin call.
void emitAlignmentAssumption(llvm::Value *PtrValue, QualType Ty, SourceLocation Loc, SourceLocation AssumptionLoc, llvm::Value *Alignment, llvm::Value *OffsetValue=nullptr)
static void EmitOMPTargetTeamsDistributeSimdDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetTeamsDistributeSimdDirective &S)
Emit device code for the target teams distribute simd directive.
void EmitObjCAutoreleasePoolPop(llvm::Value *Ptr)
Produce the code to do a primitive release.
Definition CGObjC.cpp:2734
void InitializeVTablePointers(const CXXRecordDecl *ClassDecl)
Definition CGClass.cpp:2824
llvm::Value * EmitObjCRetainNonBlock(llvm::Value *value, llvm::Type *returnType)
Retain the given object, with normal retain semantics.
Definition CGObjC.cpp:2858
void EmitARCCopyWeak(Address dst, Address src)
void @objc_copyWeak(i8** dest, i8** src) Disregards the current value in dest.
Definition CGObjC.cpp:2701
bool isMCDCDecisionExpr(const Expr *E) const
llvm::function_ref< void(CodeGenFunction &, const OMPLoopDirective &, JumpDest)> CodeGenLoopTy
llvm::Value * EmitScalarConversion(llvm::Value *Src, QualType SrcTy, QualType DstTy, SourceLocation Loc)
Emit a conversion from the specified type to the specified destination type, both of which are LLVM s...
void EmitIndirectGotoStmt(const IndirectGotoStmt &S)
Definition CGStmt.cpp:842
void EmitVariablyModifiedType(QualType Ty)
EmitVLASize - Capture all the sizes for the VLA expressions in the given variably-modified type and s...
static bool ShouldNullCheckClassCastValue(const CastExpr *Cast)
void EmitVTableAssumptionLoad(const VPtr &vptr, Address This)
Emit assumption that vptr load == global vtable.
Definition CGClass.cpp:2523
llvm::Value * EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue)
void MaybeEmitDeferredVarDeclInit(const VarDecl *var)
Definition CGDecl.cpp:2089
void ProcessOrderScopeAMDGCN(llvm::Value *Order, llvm::Value *Scope, llvm::AtomicOrdering &AO, llvm::SyncScope::ID &SSID)
Definition AMDGPU.cpp:394
bool isObviouslyBranchWithoutCleanups(JumpDest Dest) const
isObviouslyBranchWithoutCleanups - Return true if a branch to the specified destination obviously has...
void EmitSEHTryStmt(const SEHTryStmt &S)
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:1822
void EmitOMPParallelMasterDirective(const OMPParallelMasterDirective &S)
llvm::ScalableVectorType * getSVEPredType(const SVETypeFlags &TypeFlags)
Definition ARM.cpp:3916
void emitARCCopyAssignWeak(QualType Ty, Address DstAddr, Address SrcAddr)
Definition CGObjC.cpp:2707
void EmitBlockWithFallThrough(llvm::BasicBlock *BB, const Stmt *S)
When instrumenting to collect profile data, the counts for some blocks such as switch cases need to n...
llvm::CallInst * EmitNounwindRuntimeCall(llvm::FunctionCallee callee, ArrayRef< Address > args, const Twine &name="")
llvm::Value * EmitNonNullRValueCheck(RValue RV, QualType T)
Create a check that a scalar RValue is non-null.
Definition CGExpr.cpp:1601
void EmitARCIntrinsicUse(ArrayRef< llvm::Value * > values)
Given a number of pointers, inform the optimizer that they're being intrinsically used up until this ...
Definition CGObjC.cpp:2167
llvm::Value * EmitCMSEClearRecord(llvm::Value *V, llvm::IntegerType *ITy, QualType RTy)
Definition CGCall.cpp:4045
void EmitOMPTaskBasedDirective(const OMPExecutableDirective &S, const OpenMPDirectiveKind CapturedRegion, const RegionCodeGenTy &BodyGen, const TaskGenTy &TaskGen, OMPTaskDataTy &Data)
llvm::Value * EmitNeonCall(llvm::Function *F, SmallVectorImpl< llvm::Value * > &O, const char *name, unsigned shift=0, bool rightshift=false)
Definition ARM.cpp:425
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...
void EmitOMPForDirective(const OMPForDirective &S)
bool hasLabelBeenSeenInCurrentScope() const
Return true if a label was seen in the current scope.
llvm::Function * GenerateSEHFilterFunction(CodeGenFunction &ParentCGF, const SEHExceptStmt &Except)
Create a stub filter function that will ultimately hold the code of the filter expression.
void EmitLabel(const LabelDecl *D)
EmitLabel - Emit the block for the given label.
Definition CGStmt.cpp:705
llvm::Value * EmitDynamicCast(Address V, const CXXDynamicCastExpr *DCE)
void EmitOMPLinearClauseFinal(const OMPLoopDirective &D, const llvm::function_ref< llvm::Value *(CodeGenFunction &)> CondGen)
Emit final code for linear clauses.
void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false)
EmitBlock - Emit the given block.
Definition CGStmt.cpp:640
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:2107
LValue MakeNaturalAlignRawAddrLValue(llvm::Value *V, QualType T)
LValue EmitLoadOfReferenceLValue(Address RefAddr, QualType RefTy, AlignmentSource Source=AlignmentSource::Type)
llvm::Value * EmitSVETupleSetOrGet(const SVETypeFlags &TypeFlags, ArrayRef< llvm::Value * > Ops)
Definition ARM.cpp:4567
QualType BuildFunctionArgList(GlobalDecl GD, FunctionArgList &Args)
llvm::Value * EmitPointerAuthAuth(const CGPointerAuthInfo &Info, llvm::Value *Pointer)
void EmitContinueStmt(const ContinueStmt &S)
Definition CGStmt.cpp:1716
llvm::Value * EmitCXXTypeidExpr(const CXXTypeidExpr *E)
void EmitOMPSimdFinal(const OMPLoopDirective &D, const llvm::function_ref< llvm::Value *(CodeGenFunction &)> CondGen)
llvm::Type * ConvertType(const TypeDecl *T)
This class organizes the cross-function state that is used while generating LLVM code.
const llvm::DataLayout & getDataLayout() const
Per-function PGO state.
Definition CodeGenPGO.h:29
This class organizes the cross-module state that is used while lowering AST types to LLVM types.
A specialization of Address that requires the address to be an LLVM Constant.
Definition Address.h:296
static ConstantAddress invalid()
Definition Address.h:304
DominatingValue< Address >::saved_type AggregateAddr
static saved_type save(CodeGenFunction &CGF, RValue value)
ConditionalCleanup stores the saved form of its parameters, then restores them and performs the clean...
A saved depth on the scope stack.
A stack of scopes which respond to exceptions, including cleanups and catch blocks.
static stable_iterator stable_end()
Create a stable reference to the bottom of the EH stack.
FunctionArgList - Type for representing both the decl and type of parameters to a function.
Definition CGCall.h:375
LValue - This represents an lvalue references.
Definition CGValue.h:183
CharUnits getAlignment() const
Definition CGValue.h:355
static LValue MakeAddr(Address Addr, QualType type, ASTContext &Context, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
Definition CGValue.h:454
QualType getType() const
Definition CGValue.h:303
llvm::Value * emitRawPointer(CodeGenFunction &CGF) const
A stack of loop information corresponding to loop nesting levels.
Definition CGLoopInfo.h:207
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
static RawAddress invalid()
Definition Address.h:61
Class provides a way to call simple version of codegen for OpenMP region, or an advanced with possibl...
ReturnValueSlot - Contains the address where the return value of a function can be stored,...
Definition CGCall.h:379
TargetCodeGenInfo - This class organizes various target-specific codegeneration issues,...
Definition TargetInfo.h:49
The class detects jumps which bypass local variables declaration: goto L; int a; L:
CompoundAssignOperator - For compound assignments (e.g.
Definition Expr.h:4303
CompoundLiteralExpr - [C99 6.5.2.5].
Definition Expr.h:3608
CompoundStmt - This represents a group of statements like { stmt stmt }.
Definition Stmt.h:1732
Represents an expression that might suspend coroutine execution; either a co_await or co_yield expres...
Definition ExprCXX.h:5256
SourceLocExprScopeGuard(const Expr *DefaultExpr, CurrentSourceLocExprScope &Current)
Represents the current source location and context used to determine the value of the source location...
A reference to a declared variable, function, enum, etc.
Definition Expr.h:1273
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
This represents one expression.
Definition Expr.h:112
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
Definition Expr.cpp:3086
QualType getType() const
Definition Expr.h:144
ExtVectorElementExpr - This represents access to specific elements of a vector, and may occur on the ...
Definition Expr.h:6609
Represents a member of a struct/union/class.
Definition Decl.h:3160
Represents a function declaration or definition.
Definition Decl.h:2000
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5315
GlobalDecl - represents a global declaration.
Definition GlobalDecl.h:57
const Decl * getDecl() const
Definition GlobalDecl.h:106
GotoStmt - This represents a direct goto.
Definition Stmt.h:2961
This class represents temporary values used to represent inout and out arguments in HLSL.
Definition Expr.h:7396
IfStmt - This represents an if/then/else.
Definition Stmt.h:2251
IndirectGotoStmt - This represents an indirect goto.
Definition Stmt.h:3000
Describes an C or C++ initializer list.
Definition Expr.h:5302
Represents the declaration of a label.
Definition Decl.h:524
LabelStmt - Represents a label, which has a substatement.
Definition Stmt.h:2138
FPExceptionModeKind
Possible floating point exception behavior.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Represents a point when we exit a loop.
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Definition ExprCXX.h:4921
MatrixSingleSubscriptExpr - Matrix single subscript expression for the MatrixType extension when you ...
Definition Expr.h:2798
MatrixSubscriptExpr - Matrix subscript expression for the MatrixType extension.
Definition Expr.h:2868
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition Expr.h:3367
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition TypeBase.h:3661
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
ObjCArrayLiteral - used for objective-c array containers; as in: @["Hello", NSApp,...
Definition ExprObjC.h:192
Represents Objective-C's @synchronized statement.
Definition StmtObjC.h:303
Represents Objective-C's @throw statement.
Definition StmtObjC.h:358
Represents Objective-C's @try ... @catch ... @finally statement.
Definition StmtObjC.h:167
Represents Objective-C's @autoreleasepool Statement.
Definition StmtObjC.h:394
ObjCBoxedExpr - used for generalized expression boxing.
Definition ExprObjC.h:128
ObjCContainerDecl - Represents a container for method declarations.
Definition DeclObjC.h:948
ObjCDictionaryLiteral - AST node to represent objective-c dictionary literals; as in:"name" : NSUserN...
Definition ExprObjC.h:307
ObjCEncodeExpr, used for @encode in Objective-C.
Definition ExprObjC.h:407
Represents Objective-C's collection statement.
Definition StmtObjC.h:23
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Definition DeclObjC.h:2597
Represents an ObjC class declaration.
Definition DeclObjC.h:1154
ObjCIsaExpr - Represent X->isa and X.isa when X is an ObjC 'id' type.
Definition ExprObjC.h:1495
ObjCIvarDecl - Represents an ObjC instance variable.
Definition DeclObjC.h:1952
ObjCIvarRefExpr - A reference to an ObjC instance variable.
Definition ExprObjC.h:546
An expression that sends a message to the given Objective-C object or class.
Definition ExprObjC.h:937
ObjCMethodDecl - Represents an instance or class method declaration.
Definition DeclObjC.h:140
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
Definition DeclObjC.h:2805
ObjCProtocolExpr used for protocol expression in Objective-C.
Definition ExprObjC.h:502
ObjCSelectorExpr used for @selector in Objective-C.
Definition ExprObjC.h:452
ObjCStringLiteral, used for Objective-C string literals i.e.
Definition ExprObjC.h:52
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Definition Expr.h:1181
Expr * getSourceExpr() const
The source expression of an opaque value expression is the expression which originally generated the ...
Definition Expr.h:1231
Represents a parameter to a function.
Definition Decl.h:1790
Pointer-authentication qualifiers.
Definition TypeBase.h:152
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition TypeBase.h:3336
[C99 6.4.2.2] - A predefined identifier such as func.
Definition Expr.h:2008
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
Definition Expr.h:6803
A (possibly-)qualified type.
Definition TypeBase.h:937
The collection of all-type qualifiers we support.
Definition TypeBase.h:331
Represents a struct/union/class.
Definition Decl.h:4327
specific_decl_iterator< FieldDecl > field_iterator
Definition Decl.h:4527
Flags to identify the types for overloaded SVE builtins.
Scope - A scope is a transient data structure that is used while parsing the program.
Definition Scope.h:41
Encodes a location in the source.
A trivial tuple used to represent a source range.
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
Definition Expr.h:4598
Stmt - This represents one statement.
Definition Stmt.h:86
Likelihood
The likelihood of a branch being taken.
Definition Stmt.h:1428
@ LH_None
No attribute set or branches of the IfStmt have the same attribute.
Definition Stmt.h:1430
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1802
Exposes information about the current target.
Definition TargetInfo.h:226
Represents a declaration of a type.
Definition Decl.h:3513
bool isReferenceType() const
Definition TypeBase.h:8649
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition Expr.h:2247
Represents a call to the builtin function __builtin_va_arg.
Definition Expr.h:4960
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:926
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition Decl.cpp:2269
bool isLocalVarDeclOrParm() const
Similar to isLocalVarDecl but also includes parameters.
Definition Decl.h:1262
Represents a C array with a specified size that is not an integer-constant-expression.
Definition TypeBase.h:3974
Expr * getSizeExpr() const
Definition TypeBase.h:3988
WhileStmt - This represents a 'while' stmt.
Definition Stmt.h:2689
#define bool
Definition gpuintrin.h:32
Defines the clang::TargetInfo interface.
AlignmentSource
The source of the alignment of an l-value; an expression of confidence in the alignment actually matc...
Definition CGValue.h:142
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
Definition CGValue.h:155
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
Definition CGValue.h:146
TypeEvaluationKind
The kind of evaluation to perform on values of a particular type.
@ NormalCleanup
Denotes a cleanup that should run when a scope is exited using normal control flow (falling off the e...
ARCPreciseLifetime_t
Does an ARC strong l-value have precise lifetime?
Definition CGValue.h:136
VE builtins.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< ArrayType > arrayType
const AstTypeMatcher< ComplexType > complexType
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
The JSON file list parser is used to communicate input to InstallAPI.
CXXCtorType
C++ constructor types.
Definition ABI.h:24
bool isa(CodeGen::Address addr)
Definition Address.h:330
@ Success
Annotation was successful.
Definition Parser.h:65
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
CapturedRegionKind
The different kinds of captured statement.
@ CR_Default
OpenACCComputeConstruct(OpenACCDirectiveKind K, SourceLocation Start, SourceLocation DirectiveLoc, SourceLocation End, ArrayRef< const OpenACCClause * > Clauses, Stmt *StructuredBlock)
Expr * Cond
};
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
Definition Linkage.h:24
@ Result
The result type of a method or function.
Definition TypeBase.h:905
bool IsXLHSInRHSPart
True if UE has the first form and false if the second.
CXXDtorType
C++ destructor types.
Definition ABI.h:34
LangAS
Defines the address space values used by the address space qualifier of QualType.
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
Definition OpenMPKinds.h:25
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
Definition Specifiers.h:132
llvm::fp::ExceptionBehavior ToConstrainedExceptMD(LangOptions::FPExceptionModeKind Kind)
U cast(CodeGen::Address addr)
Definition Address.h:327
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5919
Diagnostic wrappers for TextAPI types for error reporting.
Definition Dominators.h:30
#define false
Definition stdbool.h:26
#define true
Definition stdbool.h:25
Structure with information about how a bitfield should be accessed.
llvm::SmallVector< llvm::AllocaInst * > Take()
CXXDefaultArgExprScope(CodeGenFunction &CGF, const CXXDefaultArgExpr *E)
FMVResolverOption(llvm::Function *F, ArrayRef< StringRef > Feats, std::optional< StringRef > Arch=std::nullopt)
A jump destination is an abstract label, branching to which may require a jump out through normal cle...
void setScopeDepth(EHScopeStack::stable_iterator depth)
EHScopeStack::stable_iterator getScopeDepth() const
JumpDest(llvm::BasicBlock *Block, EHScopeStack::stable_iterator Depth, unsigned Index)
Header for data within LifetimeExtendedCleanupStack.
unsigned Size
The size of the following cleanup object.
unsigned IsConditional
Whether this is a conditional cleanup.
static Address getAddrOfThreadPrivate(CodeGenFunction &CGF, const VarDecl *VD, Address VDAddr, SourceLocation Loc)
Returns address of the threadprivate variable for the current thread.
llvm::OpenMPIRBuilder::InsertPointTy InsertPointTy
static void EmitOMPOutlinedRegionBody(CodeGenFunction &CGF, const Stmt *RegionBodyStmt, InsertPointTy AllocaIP, InsertPointTy CodeGenIP, Twine RegionName)
Emit the body of an OMP region that will be outlined in OpenMPIRBuilder::finalize().
static Address getAddressOfLocalVariable(CodeGenFunction &CGF, const VarDecl *VD)
Gets the OpenMP-specific address of the local variable /p VD.
static void EmitCaptureStmt(CodeGenFunction &CGF, InsertPointTy CodeGenIP, llvm::BasicBlock &FiniBB, llvm::Function *Fn, ArrayRef< llvm::Value * > Args)
static std::string getNameWithSeparators(ArrayRef< StringRef > Parts, StringRef FirstSeparator=".", StringRef Separator=".")
Get the platform-specific name separator.
static void FinalizeOMPRegion(CodeGenFunction &CGF, InsertPointTy IP)
Emit the Finalization for an OMP region.
static void EmitOMPInlinedRegionBody(CodeGenFunction &CGF, const Stmt *RegionBodyStmt, InsertPointTy AllocaIP, InsertPointTy CodeGenIP, Twine RegionName)
Emit the body of an OMP region.
OMPBuilderCBHelpers & operator=(const OMPBuilderCBHelpers &)=delete
OMPBuilderCBHelpers(const OMPBuilderCBHelpers &)=delete
OMPTargetDataInfo(Address BasePointersArray, Address PointersArray, Address SizesArray, Address MappersArray, unsigned NumberOfTargetItems)
llvm::PointerUnion< const FunctionProtoType *, const ObjCMethodDecl * > P
Struct with all information about dynamic [sub]class needed to set vptr.
This structure provides a set of types that are commonly used during IR emission.
Helper class with most of the code for saving a value for a conditional expression cleanup.
llvm::PointerIntPair< llvm::Value *, 1, bool > saved_type
static llvm::Value * restore(CodeGenFunction &CGF, saved_type value)
static saved_type save(CodeGenFunction &CGF, llvm::Value *value)
static bool needsSaving(llvm::Value *value)
Answer whether the given value needs extra work to be saved.
static type restore(CodeGenFunction &CGF, saved_type value)
static type restore(CodeGenFunction &CGF, saved_type value)
static saved_type save(CodeGenFunction &CGF, type value)
static saved_type save(CodeGenFunction &CGF, type value)
static type restore(CodeGenFunction &CGF, saved_type value)
A metaprogramming class for ensuring that a value will dominate an arbitrary position in a function.
static bool needsSaving(type value)
static saved_type save(CodeGenFunction &CGF, type value)
The this pointer adjustment as well as an optional return adjustment for a thunk.
Definition Thunk.h:157