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