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