clang 20.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 "CGDebugInfo.h"
18#include "CGLoopInfo.h"
19#include "CGValue.h"
20#include "CodeGenModule.h"
21#include "CodeGenPGO.h"
22#include "EHScopeStack.h"
23#include "VarBypassDetector.h"
24#include "clang/AST/CharUnits.h"
26#include "clang/AST/ExprCXX.h"
27#include "clang/AST/ExprObjC.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 LLVMContext;
51class MDNode;
52class SwitchInst;
53class Twine;
54class Value;
55class CanonicalLoopInfo;
56}
57
58namespace clang {
59class ASTContext;
60class CXXDestructorDecl;
61class CXXForRangeStmt;
62class CXXTryStmt;
63class Decl;
64class LabelDecl;
65class FunctionDecl;
66class FunctionProtoType;
67class LabelStmt;
68class ObjCContainerDecl;
69class ObjCInterfaceDecl;
70class ObjCIvarDecl;
71class ObjCMethodDecl;
72class ObjCImplementationDecl;
73class ObjCPropertyImplDecl;
74class TargetInfo;
75class VarDecl;
76class ObjCForCollectionStmt;
77class ObjCAtTryStmt;
78class ObjCAtThrowStmt;
79class ObjCAtSynchronizedStmt;
80class ObjCAutoreleasePoolStmt;
81class OMPUseDevicePtrClause;
82class OMPUseDeviceAddrClause;
83class SVETypeFlags;
84class OMPExecutableDirective;
85
86namespace analyze_os_log {
87class OSLogBufferLayout;
88}
89
90namespace CodeGen {
91class CodeGenTypes;
92class CGCallee;
93class CGFunctionInfo;
94class CGBlockInfo;
95class CGCXXABI;
96class BlockByrefHelpers;
97class BlockByrefInfo;
98class BlockFieldFlags;
99class RegionCodeGenTy;
100class TargetCodeGenInfo;
101struct OMPTaskDataTy;
102struct CGCoroData;
103
104/// The kind of evaluation to perform on values of a particular
105/// type. Basically, is the code in CGExprScalar, CGExprComplex, or
106/// CGExprAgg?
107///
108/// TODO: should vectors maybe be split out into their own thing?
114
115#define LIST_SANITIZER_CHECKS \
116 SANITIZER_CHECK(AddOverflow, add_overflow, 0) \
117 SANITIZER_CHECK(BuiltinUnreachable, builtin_unreachable, 0) \
118 SANITIZER_CHECK(CFICheckFail, cfi_check_fail, 0) \
119 SANITIZER_CHECK(DivremOverflow, divrem_overflow, 0) \
120 SANITIZER_CHECK(DynamicTypeCacheMiss, dynamic_type_cache_miss, 0) \
121 SANITIZER_CHECK(FloatCastOverflow, float_cast_overflow, 0) \
122 SANITIZER_CHECK(FunctionTypeMismatch, function_type_mismatch, 0) \
123 SANITIZER_CHECK(ImplicitConversion, implicit_conversion, 0) \
124 SANITIZER_CHECK(InvalidBuiltin, invalid_builtin, 0) \
125 SANITIZER_CHECK(InvalidObjCCast, invalid_objc_cast, 0) \
126 SANITIZER_CHECK(LoadInvalidValue, load_invalid_value, 0) \
127 SANITIZER_CHECK(MissingReturn, missing_return, 0) \
128 SANITIZER_CHECK(MulOverflow, mul_overflow, 0) \
129 SANITIZER_CHECK(NegateOverflow, negate_overflow, 0) \
130 SANITIZER_CHECK(NullabilityArg, nullability_arg, 0) \
131 SANITIZER_CHECK(NullabilityReturn, nullability_return, 1) \
132 SANITIZER_CHECK(NonnullArg, nonnull_arg, 0) \
133 SANITIZER_CHECK(NonnullReturn, nonnull_return, 1) \
134 SANITIZER_CHECK(OutOfBounds, out_of_bounds, 0) \
135 SANITIZER_CHECK(PointerOverflow, pointer_overflow, 0) \
136 SANITIZER_CHECK(ShiftOutOfBounds, shift_out_of_bounds, 0) \
137 SANITIZER_CHECK(SubOverflow, sub_overflow, 0) \
138 SANITIZER_CHECK(TypeMismatch, type_mismatch, 1) \
139 SANITIZER_CHECK(AlignmentAssumption, alignment_assumption, 0) \
140 SANITIZER_CHECK(VLABoundNotPositive, vla_bound_not_positive, 0) \
141 SANITIZER_CHECK(BoundsSafety, bounds_safety, 0)
142
144#define SANITIZER_CHECK(Enum, Name, Version) Enum,
146#undef SANITIZER_CHECK
148
149/// Helper class with most of the code for saving a value for a
150/// conditional expression cleanup.
152 typedef llvm::PointerIntPair<llvm::Value*, 1, bool> saved_type;
153
154 /// Answer whether the given value needs extra work to be saved.
155 static bool needsSaving(llvm::Value *value) {
156 if (!value)
157 return false;
158
159 // If it's not an instruction, we don't need to save.
160 if (!isa<llvm::Instruction>(value)) return false;
161
162 // If it's an instruction in the entry block, we don't need to save.
163 llvm::BasicBlock *block = cast<llvm::Instruction>(value)->getParent();
164 return (block != &block->getParent()->getEntryBlock());
165 }
166
167 static saved_type save(CodeGenFunction &CGF, llvm::Value *value);
168 static llvm::Value *restore(CodeGenFunction &CGF, saved_type value);
169};
170
171/// A partial specialization of DominatingValue for llvm::Values that
172/// might be llvm::Instructions.
173template <class T> struct DominatingPointer<T,true> : DominatingLLVMValue {
174 typedef T *type;
176 return static_cast<T*>(DominatingLLVMValue::restore(CGF, value));
177 }
178};
179
180/// A specialization of DominatingValue for Address.
181template <> struct DominatingValue<Address> {
182 typedef Address type;
183
184 struct saved_type {
186 llvm::Type *ElementType;
189 llvm::PointerType *EffectiveType;
190 };
191
192 static bool needsSaving(type value) {
195 return true;
196 return false;
197 }
198 static saved_type save(CodeGenFunction &CGF, type value) {
199 return {DominatingLLVMValue::save(CGF, value.getBasePointer()),
200 value.getElementType(), value.getAlignment(),
201 DominatingLLVMValue::save(CGF, value.getOffset()), value.getType()};
202 }
204 return Address(DominatingLLVMValue::restore(CGF, value.BasePtr),
205 value.ElementType, value.Alignment, CGPointerAuthInfo(),
206 DominatingLLVMValue::restore(CGF, value.Offset));
207 }
208};
209
210/// A specialization of DominatingValue for RValue.
211template <> struct DominatingValue<RValue> {
212 typedef RValue type;
214 enum Kind { ScalarLiteral, ScalarAddress, AggregateLiteral,
215 AggregateAddress, ComplexAddress };
216 union {
217 struct {
219 } Vals;
221 };
222 LLVM_PREFERRED_TYPE(Kind)
223 unsigned K : 3;
224
226 : Vals{Val1, DominatingLLVMValue::saved_type()}, K(K) {}
227
230 : Vals{Val1, Val2}, K(ComplexAddress) {}
231
232 saved_type(DominatingValue<Address>::saved_type AggregateAddr, unsigned K)
233 : AggregateAddr(AggregateAddr), K(K) {}
234
235 public:
236 static bool needsSaving(RValue value);
239
240 // implementations in CGCleanup.cpp
241 };
242
243 static bool needsSaving(type value) {
244 return saved_type::needsSaving(value);
245 }
246 static saved_type save(CodeGenFunction &CGF, type value) {
247 return saved_type::save(CGF, value);
248 }
250 return value.restore(CGF);
251 }
252};
253
254/// CodeGenFunction - This class organizes the per-function state that is used
255/// while generating LLVM code.
257 CodeGenFunction(const CodeGenFunction &) = delete;
258 void operator=(const CodeGenFunction &) = delete;
259
260 friend class CGCXXABI;
261public:
262 /// A jump destination is an abstract label, branching to which may
263 /// require a jump out through normal cleanups.
264 struct JumpDest {
265 JumpDest() : Block(nullptr), Index(0) {}
266 JumpDest(llvm::BasicBlock *Block, EHScopeStack::stable_iterator Depth,
267 unsigned Index)
268 : Block(Block), ScopeDepth(Depth), Index(Index) {}
269
270 bool isValid() const { return Block != nullptr; }
271 llvm::BasicBlock *getBlock() const { return Block; }
272 EHScopeStack::stable_iterator getScopeDepth() const { return ScopeDepth; }
273 unsigned getDestIndex() const { return Index; }
274
275 // This should be used cautiously.
277 ScopeDepth = depth;
278 }
279
280 private:
281 llvm::BasicBlock *Block;
283 unsigned Index;
284 };
285
286 CodeGenModule &CGM; // Per-module state.
288
289 // For EH/SEH outlined funclets, this field points to parent's CGF
291
292 typedef std::pair<llvm::Value *, llvm::Value *> ComplexPairTy;
295
296 // Stores variables for which we can't generate correct lifetime markers
297 // because of jumps.
299
300 /// List of recently emitted OMPCanonicalLoops.
301 ///
302 /// Since OMPCanonicalLoops are nested inside other statements (in particular
303 /// CapturedStmt generated by OMPExecutableDirective and non-perfectly nested
304 /// loops), we cannot directly call OMPEmitOMPCanonicalLoop and receive its
305 /// llvm::CanonicalLoopInfo. Instead, we call EmitStmt and any
306 /// OMPEmitOMPCanonicalLoop called by it will add its CanonicalLoopInfo to
307 /// this stack when done. Entering a new loop requires clearing this list; it
308 /// either means we start parsing a new loop nest (in which case the previous
309 /// loop nest goes out of scope) or a second loop in the same level in which
310 /// case it would be ambiguous into which of the two (or more) loops the loop
311 /// nest would extend.
313
314 /// Stack to track the Logical Operator recursion nest for MC/DC.
316
317 /// Stack to track the controlled convergence tokens.
319
320 /// Number of nested loop to be consumed by the last surrounding
321 /// loop-associated directive.
323
324 // CodeGen lambda for loops and support for ordered clause
325 typedef llvm::function_ref<void(CodeGenFunction &, const OMPLoopDirective &,
326 JumpDest)>
328 typedef llvm::function_ref<void(CodeGenFunction &, SourceLocation,
329 const unsigned, const bool)>
331
332 // Codegen lambda for loop bounds in worksharing loop constructs
333 typedef llvm::function_ref<std::pair<LValue, LValue>(
336
337 // Codegen lambda for loop bounds in dispatch-based loop implementation
338 typedef llvm::function_ref<std::pair<llvm::Value *, llvm::Value *>(
340 Address UB)>
342
343 /// CGBuilder insert helper. This function is called after an
344 /// instruction is created using Builder.
345 void InsertHelper(llvm::Instruction *I, const llvm::Twine &Name,
346 llvm::BasicBlock::iterator InsertPt) const;
347
348 /// CurFuncDecl - Holds the Decl for the current outermost
349 /// non-closure context.
350 const Decl *CurFuncDecl = nullptr;
351 /// CurCodeDecl - This is the inner-most code context, which includes blocks.
352 const Decl *CurCodeDecl = nullptr;
353 const CGFunctionInfo *CurFnInfo = nullptr;
355 llvm::Function *CurFn = nullptr;
356
357 /// Save Parameter Decl for coroutine.
359
360 // Holds coroutine data if the current function is a coroutine. We use a
361 // wrapper to manage its lifetime, so that we don't have to define CGCoroData
362 // in this header.
363 struct CGCoroInfo {
364 std::unique_ptr<CGCoroData> Data;
365 bool InSuspendBlock = false;
366 CGCoroInfo();
367 ~CGCoroInfo();
368 };
370
371 bool isCoroutine() const {
372 return CurCoro.Data != nullptr;
373 }
374
375 bool inSuspendBlock() const {
377 }
378
379 // Holds FramePtr for await_suspend wrapper generation,
380 // so that __builtin_coro_frame call can be lowered
381 // directly to value of its second argument
383 llvm::Value *FramePtr = nullptr;
384 };
386
387 // Generates wrapper function for `llvm.coro.await.suspend.*` intrinisics.
388 // It encapsulates SuspendExpr in a function, to separate it's body
389 // from the main coroutine to avoid miscompilations. Intrinisic
390 // is lowered to this function call in CoroSplit pass
391 // Function signature is:
392 // <type> __await_suspend_wrapper_<name>(ptr %awaiter, ptr %hdl)
393 // where type is one of (void, i1, ptr)
394 llvm::Function *generateAwaitSuspendWrapper(Twine const &CoroName,
395 Twine const &SuspendPointName,
396 CoroutineSuspendExpr const &S);
397
398 /// CurGD - The GlobalDecl for the current function being compiled.
400
401 /// PrologueCleanupDepth - The cleanup depth enclosing all the
402 /// cleanups associated with the parameters.
404
405 /// ReturnBlock - Unified return block.
407
408 /// ReturnValue - The temporary alloca to hold the return
409 /// value. This is invalid iff the function has no return value.
411
412 /// ReturnValuePointer - The temporary alloca to hold a pointer to sret.
413 /// This is invalid if sret is not in use.
415
416 /// If a return statement is being visited, this holds the return statment's
417 /// result expression.
418 const Expr *RetExpr = nullptr;
419
420 /// Return true if a label was seen in the current scope.
422 if (CurLexicalScope)
423 return CurLexicalScope->hasLabels();
424 return !LabelMap.empty();
425 }
426
427 /// AllocaInsertPoint - This is an instruction in the entry block before which
428 /// we prefer to insert allocas.
429 llvm::AssertingVH<llvm::Instruction> AllocaInsertPt;
430
431private:
432 /// PostAllocaInsertPt - This is a place in the prologue where code can be
433 /// inserted that will be dominated by all the static allocas. This helps
434 /// achieve two things:
435 /// 1. Contiguity of all static allocas (within the prologue) is maintained.
436 /// 2. All other prologue code (which are dominated by static allocas) do
437 /// appear in the source order immediately after all static allocas.
438 ///
439 /// PostAllocaInsertPt will be lazily created when it is *really* required.
440 llvm::AssertingVH<llvm::Instruction> PostAllocaInsertPt = nullptr;
441
442public:
443 /// Return PostAllocaInsertPt. If it is not yet created, then insert it
444 /// immediately after AllocaInsertPt.
445 llvm::Instruction *getPostAllocaInsertPoint() {
446 if (!PostAllocaInsertPt) {
447 assert(AllocaInsertPt &&
448 "Expected static alloca insertion point at function prologue");
449 assert(AllocaInsertPt->getParent()->isEntryBlock() &&
450 "EBB should be entry block of the current code gen function");
451 PostAllocaInsertPt = AllocaInsertPt->clone();
452 PostAllocaInsertPt->setName("postallocapt");
453 PostAllocaInsertPt->insertAfter(AllocaInsertPt);
454 }
455
456 return PostAllocaInsertPt;
457 }
458
459 /// API for captured statement code generation.
461 public:
463 : Kind(K), ThisValue(nullptr), CXXThisFieldDecl(nullptr) {}
466 : Kind(K), ThisValue(nullptr), CXXThisFieldDecl(nullptr) {
467
469 S.getCapturedRecordDecl()->field_begin();
470 for (CapturedStmt::const_capture_iterator I = S.capture_begin(),
471 E = S.capture_end();
472 I != E; ++I, ++Field) {
473 if (I->capturesThis())
474 CXXThisFieldDecl = *Field;
475 else if (I->capturesVariable())
476 CaptureFields[I->getCapturedVar()->getCanonicalDecl()] = *Field;
477 else if (I->capturesVariableByCopy())
478 CaptureFields[I->getCapturedVar()->getCanonicalDecl()] = *Field;
479 }
480 }
481
482 virtual ~CGCapturedStmtInfo();
483
484 CapturedRegionKind getKind() const { return Kind; }
485
486 virtual void setContextValue(llvm::Value *V) { ThisValue = V; }
487 // Retrieve the value of the context parameter.
488 virtual llvm::Value *getContextValue() const { return ThisValue; }
489
490 /// Lookup the captured field decl for a variable.
491 virtual const FieldDecl *lookup(const VarDecl *VD) const {
492 return CaptureFields.lookup(VD->getCanonicalDecl());
493 }
494
495 bool isCXXThisExprCaptured() const { return getThisFieldDecl() != nullptr; }
496 virtual FieldDecl *getThisFieldDecl() const { return CXXThisFieldDecl; }
497
498 static bool classof(const CGCapturedStmtInfo *) {
499 return true;
500 }
501
502 /// Emit the captured statement body.
503 virtual void EmitBody(CodeGenFunction &CGF, const Stmt *S) {
505 CGF.EmitStmt(S);
506 }
507
508 /// Get the name of the capture helper.
509 virtual StringRef getHelperName() const { return "__captured_stmt"; }
510
511 /// Get the CaptureFields
512 llvm::SmallDenseMap<const VarDecl *, FieldDecl *> getCaptureFields() {
513 return CaptureFields;
514 }
515
516 private:
517 /// The kind of captured statement being generated.
519
520 /// Keep the map between VarDecl and FieldDecl.
521 llvm::SmallDenseMap<const VarDecl *, FieldDecl *> CaptureFields;
522
523 /// The base address of the captured record, passed in as the first
524 /// argument of the parallel region function.
525 llvm::Value *ThisValue;
526
527 /// Captured 'this' type.
528 FieldDecl *CXXThisFieldDecl;
529 };
531
532 /// RAII for correct setting/restoring of CapturedStmtInfo.
534 private:
535 CodeGenFunction &CGF;
536 CGCapturedStmtInfo *PrevCapturedStmtInfo;
537 public:
539 CGCapturedStmtInfo *NewCapturedStmtInfo)
540 : CGF(CGF), PrevCapturedStmtInfo(CGF.CapturedStmtInfo) {
541 CGF.CapturedStmtInfo = NewCapturedStmtInfo;
542 }
543 ~CGCapturedStmtRAII() { CGF.CapturedStmtInfo = PrevCapturedStmtInfo; }
544 };
545
546 /// An abstract representation of regular/ObjC call/message targets.
548 /// The function declaration of the callee.
549 const Decl *CalleeDecl;
550
551 public:
552 AbstractCallee() : CalleeDecl(nullptr) {}
553 AbstractCallee(const FunctionDecl *FD) : CalleeDecl(FD) {}
554 AbstractCallee(const ObjCMethodDecl *OMD) : CalleeDecl(OMD) {}
555 bool hasFunctionDecl() const {
556 return isa_and_nonnull<FunctionDecl>(CalleeDecl);
557 }
558 const Decl *getDecl() const { return CalleeDecl; }
559 unsigned getNumParams() const {
560 if (const auto *FD = dyn_cast<FunctionDecl>(CalleeDecl))
561 return FD->getNumParams();
562 return cast<ObjCMethodDecl>(CalleeDecl)->param_size();
563 }
564 const ParmVarDecl *getParamDecl(unsigned I) const {
565 if (const auto *FD = dyn_cast<FunctionDecl>(CalleeDecl))
566 return FD->getParamDecl(I);
567 return *(cast<ObjCMethodDecl>(CalleeDecl)->param_begin() + I);
568 }
569 };
570
571 /// Sanitizers enabled for this function.
573
574 /// True if CodeGen currently emits code implementing sanitizer checks.
575 bool IsSanitizerScope = false;
576
577 /// RAII object to set/unset CodeGenFunction::IsSanitizerScope.
579 CodeGenFunction *CGF;
580 public:
583 };
584
585 /// In C++, whether we are code generating a thunk. This controls whether we
586 /// should emit cleanups.
587 bool CurFuncIsThunk = false;
588
589 /// In ARC, whether we should autorelease the return value.
590 bool AutoreleaseResult = false;
591
592 /// Whether we processed a Microsoft-style asm block during CodeGen. These can
593 /// potentially set the return value.
594 bool SawAsmBlock = false;
595
597
598 /// True if the current function is an outlined SEH helper. This can be a
599 /// finally block or filter expression.
601
602 /// True if CodeGen currently emits code inside presereved access index
603 /// region.
605
606 /// True if the current statement has nomerge attribute.
608
609 /// True if the current statement has noinline attribute.
611
612 /// True if the current statement has always_inline attribute.
614
615 // The CallExpr within the current statement that the musttail attribute
616 // applies to. nullptr if there is no 'musttail' on the current statement.
617 const CallExpr *MustTailCall = nullptr;
618
619 /// Returns true if a function must make progress, which means the
620 /// mustprogress attribute can be added.
622 if (CGM.getCodeGenOpts().getFiniteLoops() ==
624 return false;
625
626 // C++11 and later guarantees that a thread eventually will do one of the
627 // following (C++11 [intro.multithread]p24 and C++17 [intro.progress]p1):
628 // - terminate,
629 // - make a call to a library I/O function,
630 // - perform an access through a volatile glvalue, or
631 // - perform a synchronization operation or an atomic operation.
632 //
633 // Hence each function is 'mustprogress' in C++11 or later.
634 return getLangOpts().CPlusPlus11;
635 }
636
637 /// Returns true if a loop must make progress, which means the mustprogress
638 /// attribute can be added. \p HasConstantCond indicates whether the branch
639 /// condition is a known constant.
640 bool checkIfLoopMustProgress(const Expr *, bool HasEmptyBody);
641
643 llvm::Value *BlockPointer = nullptr;
644
645 llvm::DenseMap<const ValueDecl *, FieldDecl *> LambdaCaptureFields;
647
648 /// A mapping from NRVO variables to the flags used to indicate
649 /// when the NRVO has been applied to this variable.
650 llvm::DenseMap<const VarDecl *, llvm::Value *> NRVOFlags;
651
654
655 // A stack of cleanups which were added to EHStack but have to be deactivated
656 // later before being popped or emitted. These are usually deactivated on
657 // exiting a `CleanupDeactivationScope` scope. For instance, after a
658 // full-expr.
659 //
660 // These are specially useful for correctly emitting cleanups while
661 // encountering branches out of expression (through stmt-expr or coroutine
662 // suspensions).
665 llvm::Instruction *DominatingIP;
666 };
668
669 // Enters a new scope for capturing cleanups which are deferred to be
670 // deactivated, all of which will be deactivated once the scope is exited.
679
681 assert(!Deactivated && "Deactivating already deactivated scope");
683 for (size_t I = Stack.size(); I > OldDeactivateCleanupStackSize; I--) {
684 CGF.DeactivateCleanupBlock(Stack[I - 1].Cleanup,
685 Stack[I - 1].DominatingIP);
686 Stack[I - 1].DominatingIP->eraseFromParent();
687 }
688 Stack.resize(OldDeactivateCleanupStackSize);
689 Deactivated = true;
690 }
691
693 if (Deactivated)
694 return;
696 }
697 };
698
700
701 llvm::Instruction *CurrentFuncletPad = nullptr;
702
704 bool isRedundantBeforeReturn() override { return true; }
705
706 llvm::Value *Addr;
707 llvm::Value *Size;
708
709 public:
710 CallLifetimeEnd(RawAddress addr, llvm::Value *size)
711 : Addr(addr.getPointer()), Size(size) {}
712
713 void Emit(CodeGenFunction &CGF, Flags flags) override {
714 CGF.EmitLifetimeEnd(Size, Addr);
715 }
716 };
717
718 /// Header for data within LifetimeExtendedCleanupStack.
720 /// The size of the following cleanup object.
721 unsigned Size;
722 /// The kind of cleanup to push.
723 LLVM_PREFERRED_TYPE(CleanupKind)
725 /// Whether this is a conditional cleanup.
726 LLVM_PREFERRED_TYPE(bool)
727 unsigned IsConditional : 1;
728
729 size_t getSize() const { return Size; }
730 CleanupKind getKind() const { return (CleanupKind)Kind; }
731 bool isConditional() const { return IsConditional; }
732 };
733
734 /// i32s containing the indexes of the cleanup destinations.
736
738
739 /// EHResumeBlock - Unified block containing a call to llvm.eh.resume.
740 llvm::BasicBlock *EHResumeBlock = nullptr;
741
742 /// The exception slot. All landing pads write the current exception pointer
743 /// into this alloca.
744 llvm::Value *ExceptionSlot = nullptr;
745
746 /// The selector slot. Under the MandatoryCleanup model, all landing pads
747 /// write the current selector value into this alloca.
748 llvm::AllocaInst *EHSelectorSlot = nullptr;
749
750 /// A stack of exception code slots. Entering an __except block pushes a slot
751 /// on the stack and leaving pops one. The __exception_code() intrinsic loads
752 /// a value from the top of the stack.
754
755 /// Value returned by __exception_info intrinsic.
756 llvm::Value *SEHInfo = nullptr;
757
758 /// Emits a landing pad for the current EH stack.
759 llvm::BasicBlock *EmitLandingPad();
760
761 llvm::BasicBlock *getInvokeDestImpl();
762
763 /// Parent loop-based directive for scan directive.
765 llvm::BasicBlock *OMPBeforeScanBlock = nullptr;
766 llvm::BasicBlock *OMPAfterScanBlock = nullptr;
767 llvm::BasicBlock *OMPScanExitBlock = nullptr;
768 llvm::BasicBlock *OMPScanDispatch = nullptr;
769 bool OMPFirstScanLoop = false;
770
771 /// Manages parent directive for scan directives.
773 CodeGenFunction &CGF;
774 const OMPExecutableDirective *ParentLoopDirectiveForScan;
775
776 public:
778 CodeGenFunction &CGF,
779 const OMPExecutableDirective &ParentLoopDirectiveForScan)
780 : CGF(CGF),
781 ParentLoopDirectiveForScan(CGF.OMPParentLoopDirectiveForScan) {
782 CGF.OMPParentLoopDirectiveForScan = &ParentLoopDirectiveForScan;
783 }
785 CGF.OMPParentLoopDirectiveForScan = ParentLoopDirectiveForScan;
786 }
787 };
788
789 template <class T>
791 return DominatingValue<T>::save(*this, value);
792 }
793
795 public:
796 CGFPOptionsRAII(CodeGenFunction &CGF, FPOptions FPFeatures);
799
800 private:
801 void ConstructorHelper(FPOptions FPFeatures);
802 CodeGenFunction &CGF;
803 FPOptions OldFPFeatures;
804 llvm::fp::ExceptionBehavior OldExcept;
805 llvm::RoundingMode OldRounding;
806 std::optional<CGBuilderTy::FastMathFlagGuard> FMFGuard;
807 };
809
810public:
811 /// ObjCEHValueStack - Stack of Objective-C exception values, used for
812 /// rethrows.
814
815 /// A class controlling the emission of a finally block.
817 /// Where the catchall's edge through the cleanup should go.
818 JumpDest RethrowDest;
819
820 /// A function to call to enter the catch.
821 llvm::FunctionCallee BeginCatchFn;
822
823 /// An i1 variable indicating whether or not the @finally is
824 /// running for an exception.
825 llvm::AllocaInst *ForEHVar = nullptr;
826
827 /// An i8* variable into which the exception pointer to rethrow
828 /// has been saved.
829 llvm::AllocaInst *SavedExnVar = nullptr;
830
831 public:
832 void enter(CodeGenFunction &CGF, const Stmt *Finally,
833 llvm::FunctionCallee beginCatchFn,
834 llvm::FunctionCallee endCatchFn, llvm::FunctionCallee rethrowFn);
835 void exit(CodeGenFunction &CGF);
836 };
837
838 /// Returns true inside SEH __try blocks.
839 bool isSEHTryScope() const { return !SEHTryEpilogueStack.empty(); }
840
841 /// Returns true while emitting a cleanuppad.
842 bool isCleanupPadScope() const {
843 return CurrentFuncletPad && isa<llvm::CleanupPadInst>(CurrentFuncletPad);
844 }
845
846 /// pushFullExprCleanup - Push a cleanup to be run at the end of the
847 /// current full-expression. Safe against the possibility that
848 /// we're currently inside a conditionally-evaluated expression.
849 template <class T, class... As>
850 void pushFullExprCleanup(CleanupKind kind, As... A) {
851 // If we're not in a conditional branch, or if none of the
852 // arguments requires saving, then use the unconditional cleanup.
854 return EHStack.pushCleanup<T>(kind, A...);
855
856 // Stash values in a tuple so we can guarantee the order of saves.
857 typedef std::tuple<typename DominatingValue<As>::saved_type...> SavedTuple;
858 SavedTuple Saved{saveValueInCond(A)...};
859
860 typedef EHScopeStack::ConditionalCleanup<T, As...> CleanupType;
861 EHStack.pushCleanupTuple<CleanupType>(kind, Saved);
863 }
864
865 /// Queue a cleanup to be pushed after finishing the current full-expression,
866 /// potentially with an active flag.
867 template <class T, class... As>
870 return pushCleanupAfterFullExprWithActiveFlag<T>(
871 Kind, RawAddress::invalid(), A...);
872
873 RawAddress ActiveFlag = createCleanupActiveFlag();
874 assert(!DominatingValue<Address>::needsSaving(ActiveFlag) &&
875 "cleanup active flag should never need saving");
876
877 typedef std::tuple<typename DominatingValue<As>::saved_type...> SavedTuple;
878 SavedTuple Saved{saveValueInCond(A)...};
879
880 typedef EHScopeStack::ConditionalCleanup<T, As...> CleanupType;
881 pushCleanupAfterFullExprWithActiveFlag<CleanupType>(Kind, ActiveFlag, Saved);
882 }
883
884 template <class T, class... As>
886 RawAddress ActiveFlag, As... A) {
887 LifetimeExtendedCleanupHeader Header = {sizeof(T), Kind,
888 ActiveFlag.isValid()};
889
892 LifetimeExtendedCleanupStack.size() + sizeof(Header) + Header.Size +
893 (Header.IsConditional ? sizeof(ActiveFlag) : 0));
894
895 static_assert(sizeof(Header) % alignof(T) == 0,
896 "Cleanup will be allocated on misaligned address");
897 char *Buffer = &LifetimeExtendedCleanupStack[OldSize];
898 new (Buffer) LifetimeExtendedCleanupHeader(Header);
899 new (Buffer + sizeof(Header)) T(A...);
900 if (Header.IsConditional)
901 new (Buffer + sizeof(Header) + sizeof(T)) RawAddress(ActiveFlag);
902 }
903
904 // Push a cleanup onto EHStack and deactivate it later. It is usually
905 // deactivated when exiting a `CleanupDeactivationScope` (for example: after a
906 // full expression).
907 template <class T, class... As>
909 // Placeholder dominating IP for this cleanup.
910 llvm::Instruction *DominatingIP =
911 Builder.CreateFlagLoad(llvm::Constant::getNullValue(Int8PtrTy));
912 EHStack.pushCleanup<T>(Kind, A...);
914 {EHStack.stable_begin(), DominatingIP});
915 }
916
917 /// Set up the last cleanup that was pushed as a conditional
918 /// full-expression cleanup.
921 }
922
925
926 /// PushDestructorCleanup - Push a cleanup to call the
927 /// complete-object destructor of an object of the given type at the
928 /// given address. Does nothing if T is not a C++ class type with a
929 /// non-trivial destructor.
931
932 /// PushDestructorCleanup - Push a cleanup to call the
933 /// complete-object variant of the given destructor on the object at
934 /// the given address.
936 Address Addr);
937
938 /// PopCleanupBlock - Will pop the cleanup entry on the stack and
939 /// process all branch fixups.
940 void PopCleanupBlock(bool FallThroughIsBranchThrough = false,
941 bool ForDeactivation = false);
942
943 /// DeactivateCleanupBlock - Deactivates the given cleanup block.
944 /// The block cannot be reactivated. Pops it if it's the top of the
945 /// stack.
946 ///
947 /// \param DominatingIP - An instruction which is known to
948 /// dominate the current IP (if set) and which lies along
949 /// all paths of execution between the current IP and the
950 /// the point at which the cleanup comes into scope.
952 llvm::Instruction *DominatingIP);
953
954 /// ActivateCleanupBlock - Activates an initially-inactive cleanup.
955 /// Cannot be used to resurrect a deactivated cleanup.
956 ///
957 /// \param DominatingIP - An instruction which is known to
958 /// dominate the current IP (if set) and which lies along
959 /// all paths of execution between the current IP and the
960 /// the point at which the cleanup comes into scope.
962 llvm::Instruction *DominatingIP);
963
964 /// Enters a new scope for capturing cleanups, all of which
965 /// will be executed once the scope is exited.
967 EHScopeStack::stable_iterator CleanupStackDepth, OldCleanupScopeDepth;
968 size_t LifetimeExtendedCleanupStackSize;
969 CleanupDeactivationScope DeactivateCleanups;
970 bool OldDidCallStackSave;
971 protected:
973 private:
974
975 RunCleanupsScope(const RunCleanupsScope &) = delete;
976 void operator=(const RunCleanupsScope &) = delete;
977
978 protected:
980
981 public:
982 /// Enter a new cleanup scope.
984 : DeactivateCleanups(CGF), PerformCleanup(true), CGF(CGF) {
985 CleanupStackDepth = CGF.EHStack.stable_begin();
986 LifetimeExtendedCleanupStackSize =
988 OldDidCallStackSave = CGF.DidCallStackSave;
989 CGF.DidCallStackSave = false;
990 OldCleanupScopeDepth = CGF.CurrentCleanupScopeDepth;
991 CGF.CurrentCleanupScopeDepth = CleanupStackDepth;
992 }
993
994 /// Exit this cleanup scope, emitting any accumulated cleanups.
996 if (PerformCleanup)
997 ForceCleanup();
998 }
999
1000 /// Determine whether this scope requires any cleanups.
1001 bool requiresCleanups() const {
1002 return CGF.EHStack.stable_begin() != CleanupStackDepth;
1003 }
1004
1005 /// Force the emission of cleanups now, instead of waiting
1006 /// until this object is destroyed.
1007 /// \param ValuesToReload - A list of values that need to be available at
1008 /// the insertion point after cleanup emission. If cleanup emission created
1009 /// a shared cleanup block, these value pointers will be rewritten.
1010 /// Otherwise, they not will be modified.
1011 void ForceCleanup(std::initializer_list<llvm::Value**> ValuesToReload = {}) {
1012 assert(PerformCleanup && "Already forced cleanup");
1013 CGF.DidCallStackSave = OldDidCallStackSave;
1014 DeactivateCleanups.ForceDeactivate();
1015 CGF.PopCleanupBlocks(CleanupStackDepth, LifetimeExtendedCleanupStackSize,
1016 ValuesToReload);
1017 PerformCleanup = false;
1018 CGF.CurrentCleanupScopeDepth = OldCleanupScopeDepth;
1019 }
1020 };
1021
1022 // Cleanup stack depth of the RunCleanupsScope that was pushed most recently.
1025
1027 SourceRange Range;
1029 LexicalScope *ParentScope;
1030
1031 LexicalScope(const LexicalScope &) = delete;
1032 void operator=(const LexicalScope &) = delete;
1033
1034 public:
1035 /// Enter a new cleanup scope.
1037 : RunCleanupsScope(CGF), Range(Range), ParentScope(CGF.CurLexicalScope) {
1038 CGF.CurLexicalScope = this;
1039 if (CGDebugInfo *DI = CGF.getDebugInfo())
1040 DI->EmitLexicalBlockStart(CGF.Builder, Range.getBegin());
1041 }
1042
1043 void addLabel(const LabelDecl *label) {
1044 assert(PerformCleanup && "adding label to dead scope?");
1045 Labels.push_back(label);
1046 }
1047
1048 /// Exit this cleanup scope, emitting any accumulated
1049 /// cleanups.
1051 if (CGDebugInfo *DI = CGF.getDebugInfo())
1052 DI->EmitLexicalBlockEnd(CGF.Builder, Range.getEnd());
1053
1054 // If we should perform a cleanup, force them now. Note that
1055 // this ends the cleanup scope before rescoping any labels.
1056 if (PerformCleanup) {
1057 ApplyDebugLocation DL(CGF, Range.getEnd());
1058 ForceCleanup();
1059 }
1060 }
1061
1062 /// Force the emission of cleanups now, instead of waiting
1063 /// until this object is destroyed.
1065 CGF.CurLexicalScope = ParentScope;
1067
1068 if (!Labels.empty())
1069 rescopeLabels();
1070 }
1071
1072 bool hasLabels() const {
1073 return !Labels.empty();
1074 }
1075
1076 void rescopeLabels();
1077 };
1078
1079 typedef llvm::DenseMap<const Decl *, Address> DeclMapTy;
1080
1081 /// The class used to assign some variables some temporarily addresses.
1083 DeclMapTy SavedLocals;
1084 DeclMapTy SavedTempAddresses;
1085 OMPMapVars(const OMPMapVars &) = delete;
1086 void operator=(const OMPMapVars &) = delete;
1087
1088 public:
1089 explicit OMPMapVars() = default;
1091 assert(SavedLocals.empty() && "Did not restored original addresses.");
1092 };
1093
1094 /// Sets the address of the variable \p LocalVD to be \p TempAddr in
1095 /// function \p CGF.
1096 /// \return true if at least one variable was set already, false otherwise.
1097 bool setVarAddr(CodeGenFunction &CGF, const VarDecl *LocalVD,
1098 Address TempAddr) {
1099 LocalVD = LocalVD->getCanonicalDecl();
1100 // Only save it once.
1101 if (SavedLocals.count(LocalVD)) return false;
1102
1103 // Copy the existing local entry to SavedLocals.
1104 auto it = CGF.LocalDeclMap.find(LocalVD);
1105 if (it != CGF.LocalDeclMap.end())
1106 SavedLocals.try_emplace(LocalVD, it->second);
1107 else
1108 SavedLocals.try_emplace(LocalVD, Address::invalid());
1109
1110 // Generate the private entry.
1111 QualType VarTy = LocalVD->getType();
1112 if (VarTy->isReferenceType()) {
1113 Address Temp = CGF.CreateMemTemp(VarTy);
1114 CGF.Builder.CreateStore(TempAddr.emitRawPointer(CGF), Temp);
1115 TempAddr = Temp;
1116 }
1117 SavedTempAddresses.try_emplace(LocalVD, TempAddr);
1118
1119 return true;
1120 }
1121
1122 /// Applies new addresses to the list of the variables.
1123 /// \return true if at least one variable is using new address, false
1124 /// otherwise.
1126 copyInto(SavedTempAddresses, CGF.LocalDeclMap);
1127 SavedTempAddresses.clear();
1128 return !SavedLocals.empty();
1129 }
1130
1131 /// Restores original addresses of the variables.
1133 if (!SavedLocals.empty()) {
1134 copyInto(SavedLocals, CGF.LocalDeclMap);
1135 SavedLocals.clear();
1136 }
1137 }
1138
1139 private:
1140 /// Copy all the entries in the source map over the corresponding
1141 /// entries in the destination, which must exist.
1142 static void copyInto(const DeclMapTy &Src, DeclMapTy &Dest) {
1143 for (auto &Pair : Src) {
1144 if (!Pair.second.isValid()) {
1145 Dest.erase(Pair.first);
1146 continue;
1147 }
1148
1149 auto I = Dest.find(Pair.first);
1150 if (I != Dest.end())
1151 I->second = Pair.second;
1152 else
1153 Dest.insert(Pair);
1154 }
1155 }
1156 };
1157
1158 /// The scope used to remap some variables as private in the OpenMP loop body
1159 /// (or other captured region emitted without outlining), and to restore old
1160 /// vars back on exit.
1162 OMPMapVars MappedVars;
1163 OMPPrivateScope(const OMPPrivateScope &) = delete;
1164 void operator=(const OMPPrivateScope &) = delete;
1165
1166 public:
1167 /// Enter a new OpenMP private scope.
1169
1170 /// Registers \p LocalVD variable as a private with \p Addr as the address
1171 /// of the corresponding private variable. \p
1172 /// PrivateGen is the address of the generated private variable.
1173 /// \return true if the variable is registered as private, false if it has
1174 /// been privatized already.
1175 bool addPrivate(const VarDecl *LocalVD, Address Addr) {
1176 assert(PerformCleanup && "adding private to dead scope");
1177 return MappedVars.setVarAddr(CGF, LocalVD, Addr);
1178 }
1179
1180 /// Privatizes local variables previously registered as private.
1181 /// Registration is separate from the actual privatization to allow
1182 /// initializers use values of the original variables, not the private one.
1183 /// This is important, for example, if the private variable is a class
1184 /// variable initialized by a constructor that references other private
1185 /// variables. But at initialization original variables must be used, not
1186 /// private copies.
1187 /// \return true if at least one variable was privatized, false otherwise.
1188 bool Privatize() { return MappedVars.apply(CGF); }
1189
1192 restoreMap();
1193 }
1194
1195 /// Exit scope - all the mapped variables are restored.
1197 if (PerformCleanup)
1198 ForceCleanup();
1199 }
1200
1201 /// Checks if the global variable is captured in current function.
1202 bool isGlobalVarCaptured(const VarDecl *VD) const {
1203 VD = VD->getCanonicalDecl();
1204 return !VD->isLocalVarDeclOrParm() && CGF.LocalDeclMap.count(VD) > 0;
1205 }
1206
1207 /// Restore all mapped variables w/o clean up. This is usefully when we want
1208 /// to reference the original variables but don't want the clean up because
1209 /// that could emit lifetime end too early, causing backend issue #56913.
1210 void restoreMap() { MappedVars.restore(CGF); }
1211 };
1212
1213 /// Save/restore original map of previously emitted local vars in case when we
1214 /// need to duplicate emission of the same code several times in the same
1215 /// function for OpenMP code.
1217 CodeGenFunction &CGF;
1218 DeclMapTy SavedMap;
1219
1220 public:
1222 : CGF(CGF), SavedMap(CGF.LocalDeclMap) {}
1223 ~OMPLocalDeclMapRAII() { SavedMap.swap(CGF.LocalDeclMap); }
1224 };
1225
1226 /// Takes the old cleanup stack size and emits the cleanup blocks
1227 /// that have been added.
1228 void
1230 std::initializer_list<llvm::Value **> ValuesToReload = {});
1231
1232 /// Takes the old cleanup stack size and emits the cleanup blocks
1233 /// that have been added, then adds all lifetime-extended cleanups from
1234 /// the given position to the stack.
1235 void
1237 size_t OldLifetimeExtendedStackSize,
1238 std::initializer_list<llvm::Value **> ValuesToReload = {});
1239
1240 void ResolveBranchFixups(llvm::BasicBlock *Target);
1241
1242 /// The given basic block lies in the current EH scope, but may be a
1243 /// target of a potentially scope-crossing jump; get a stable handle
1244 /// to which we can perform this jump later.
1246 return JumpDest(Target,
1249 }
1250
1251 /// The given basic block lies in the current EH scope, but may be a
1252 /// target of a potentially scope-crossing jump; get a stable handle
1253 /// to which we can perform this jump later.
1254 JumpDest getJumpDestInCurrentScope(StringRef Name = StringRef()) {
1256 }
1257
1258 /// EmitBranchThroughCleanup - Emit a branch from the current insert
1259 /// block through the normal cleanup handling code (if any) and then
1260 /// on to \arg Dest.
1262
1263 /// isObviouslyBranchWithoutCleanups - Return true if a branch to the
1264 /// specified destination obviously has no cleanups to run. 'false' is always
1265 /// a conservatively correct answer for this method.
1267
1268 /// popCatchScope - Pops the catch scope at the top of the EHScope
1269 /// stack, emitting any required code (other than the catch handlers
1270 /// themselves).
1272
1273 llvm::BasicBlock *getEHResumeBlock(bool isCleanup);
1275 llvm::BasicBlock *
1277
1278 /// An object to manage conditionally-evaluated expressions.
1280 llvm::BasicBlock *StartBB;
1281
1282 public:
1284 : StartBB(CGF.Builder.GetInsertBlock()) {}
1285
1287 assert(CGF.OutermostConditional != this);
1288 if (!CGF.OutermostConditional)
1289 CGF.OutermostConditional = this;
1290 }
1291
1293 assert(CGF.OutermostConditional != nullptr);
1294 if (CGF.OutermostConditional == this)
1295 CGF.OutermostConditional = nullptr;
1296 }
1297
1298 /// Returns a block which will be executed prior to each
1299 /// evaluation of the conditional code.
1300 llvm::BasicBlock *getStartingBlock() const {
1301 return StartBB;
1302 }
1303 };
1304
1305 /// isInConditionalBranch - Return true if we're currently emitting
1306 /// one branch or the other of a conditional expression.
1307 bool isInConditionalBranch() const { return OutermostConditional != nullptr; }
1308
1309 void setBeforeOutermostConditional(llvm::Value *value, Address addr,
1310 CodeGenFunction &CGF) {
1311 assert(isInConditionalBranch());
1312 llvm::BasicBlock *block = OutermostConditional->getStartingBlock();
1313 auto store =
1314 new llvm::StoreInst(value, addr.emitRawPointer(CGF), &block->back());
1315 store->setAlignment(addr.getAlignment().getAsAlign());
1316 }
1317
1318 /// An RAII object to record that we're evaluating a statement
1319 /// expression.
1321 CodeGenFunction &CGF;
1322
1323 /// We have to save the outermost conditional: cleanups in a
1324 /// statement expression aren't conditional just because the
1325 /// StmtExpr is.
1326 ConditionalEvaluation *SavedOutermostConditional;
1327
1328 public:
1330 : CGF(CGF), SavedOutermostConditional(CGF.OutermostConditional) {
1331 CGF.OutermostConditional = nullptr;
1332 }
1333
1335 CGF.OutermostConditional = SavedOutermostConditional;
1336 CGF.EnsureInsertPoint();
1337 }
1338 };
1339
1340 /// An object which temporarily prevents a value from being
1341 /// destroyed by aggressive peephole optimizations that assume that
1342 /// all uses of a value have been realized in the IR.
1344 llvm::Instruction *Inst = nullptr;
1345 friend class CodeGenFunction;
1346
1347 public:
1349 };
1350
1351 /// A non-RAII class containing all the information about a bound
1352 /// opaque value. OpaqueValueMapping, below, is a RAII wrapper for
1353 /// this which makes individual mappings very simple; using this
1354 /// class directly is useful when you have a variable number of
1355 /// opaque values or don't want the RAII functionality for some
1356 /// reason.
1358 const OpaqueValueExpr *OpaqueValue;
1359 bool BoundLValue;
1361
1363 bool boundLValue)
1364 : OpaqueValue(ov), BoundLValue(boundLValue) {}
1365 public:
1366 OpaqueValueMappingData() : OpaqueValue(nullptr) {}
1367
1368 static bool shouldBindAsLValue(const Expr *expr) {
1369 // gl-values should be bound as l-values for obvious reasons.
1370 // Records should be bound as l-values because IR generation
1371 // always keeps them in memory. Expressions of function type
1372 // act exactly like l-values but are formally required to be
1373 // r-values in C.
1374 return expr->isGLValue() ||
1375 expr->getType()->isFunctionType() ||
1376 hasAggregateEvaluationKind(expr->getType());
1377 }
1378
1380 const OpaqueValueExpr *ov,
1381 const Expr *e) {
1382 if (shouldBindAsLValue(ov))
1383 return bind(CGF, ov, CGF.EmitLValue(e));
1384 return bind(CGF, ov, CGF.EmitAnyExpr(e));
1385 }
1386
1388 const OpaqueValueExpr *ov,
1389 const LValue &lv) {
1390 assert(shouldBindAsLValue(ov));
1391 CGF.OpaqueLValues.insert(std::make_pair(ov, lv));
1392 return OpaqueValueMappingData(ov, true);
1393 }
1394
1396 const OpaqueValueExpr *ov,
1397 const RValue &rv) {
1398 assert(!shouldBindAsLValue(ov));
1399 CGF.OpaqueRValues.insert(std::make_pair(ov, rv));
1400
1401 OpaqueValueMappingData data(ov, false);
1402
1403 // Work around an extremely aggressive peephole optimization in
1404 // EmitScalarConversion which assumes that all other uses of a
1405 // value are extant.
1406 data.Protection = CGF.protectFromPeepholes(rv);
1407
1408 return data;
1409 }
1410
1411 bool isValid() const { return OpaqueValue != nullptr; }
1412 void clear() { OpaqueValue = nullptr; }
1413
1415 assert(OpaqueValue && "no data to unbind!");
1416
1417 if (BoundLValue) {
1418 CGF.OpaqueLValues.erase(OpaqueValue);
1419 } else {
1420 CGF.OpaqueRValues.erase(OpaqueValue);
1421 CGF.unprotectFromPeepholes(Protection);
1422 }
1423 }
1424 };
1425
1426 /// An RAII object to set (and then clear) a mapping for an OpaqueValueExpr.
1428 CodeGenFunction &CGF;
1430
1431 public:
1432 static bool shouldBindAsLValue(const Expr *expr) {
1434 }
1435
1436 /// Build the opaque value mapping for the given conditional
1437 /// operator if it's the GNU ?: extension. This is a common
1438 /// enough pattern that the convenience operator is really
1439 /// helpful.
1440 ///
1442 const AbstractConditionalOperator *op) : CGF(CGF) {
1443 if (isa<ConditionalOperator>(op))
1444 // Leave Data empty.
1445 return;
1446
1447 const BinaryConditionalOperator *e = cast<BinaryConditionalOperator>(op);
1449 e->getCommon());
1450 }
1451
1452 /// Build the opaque value mapping for an OpaqueValueExpr whose source
1453 /// expression is set to the expression the OVE represents.
1455 : CGF(CGF) {
1456 if (OV) {
1457 assert(OV->getSourceExpr() && "wrong form of OpaqueValueMapping used "
1458 "for OVE with no source expression");
1460 }
1461 }
1462
1464 const OpaqueValueExpr *opaqueValue,
1465 LValue lvalue)
1466 : CGF(CGF), Data(OpaqueValueMappingData::bind(CGF, opaqueValue, lvalue)) {
1467 }
1468
1470 const OpaqueValueExpr *opaqueValue,
1471 RValue rvalue)
1472 : CGF(CGF), Data(OpaqueValueMappingData::bind(CGF, opaqueValue, rvalue)) {
1473 }
1474
1475 void pop() {
1476 Data.unbind(CGF);
1477 Data.clear();
1478 }
1479
1481 if (Data.isValid()) Data.unbind(CGF);
1482 }
1483 };
1484
1485private:
1486 CGDebugInfo *DebugInfo;
1487 /// Used to create unique names for artificial VLA size debug info variables.
1488 unsigned VLAExprCounter = 0;
1489 bool DisableDebugInfo = false;
1490
1491 /// DidCallStackSave - Whether llvm.stacksave has been called. Used to avoid
1492 /// calling llvm.stacksave for multiple VLAs in the same scope.
1493 bool DidCallStackSave = false;
1494
1495 /// IndirectBranch - The first time an indirect goto is seen we create a block
1496 /// with an indirect branch. Every time we see the address of a label taken,
1497 /// we add the label to the indirect goto. Every subsequent indirect goto is
1498 /// codegen'd as a jump to the IndirectBranch's basic block.
1499 llvm::IndirectBrInst *IndirectBranch = nullptr;
1500
1501 /// LocalDeclMap - This keeps track of the LLVM allocas or globals for local C
1502 /// decls.
1503 DeclMapTy LocalDeclMap;
1504
1505 // Keep track of the cleanups for callee-destructed parameters pushed to the
1506 // cleanup stack so that they can be deactivated later.
1507 llvm::DenseMap<const ParmVarDecl *, EHScopeStack::stable_iterator>
1508 CalleeDestructedParamCleanups;
1509
1510 /// SizeArguments - If a ParmVarDecl had the pass_object_size attribute, this
1511 /// will contain a mapping from said ParmVarDecl to its implicit "object_size"
1512 /// parameter.
1513 llvm::SmallDenseMap<const ParmVarDecl *, const ImplicitParamDecl *, 2>
1514 SizeArguments;
1515
1516 /// Track escaped local variables with auto storage. Used during SEH
1517 /// outlining to produce a call to llvm.localescape.
1518 llvm::DenseMap<llvm::AllocaInst *, int> EscapedLocals;
1519
1520 /// LabelMap - This keeps track of the LLVM basic block for each C label.
1521 llvm::DenseMap<const LabelDecl*, JumpDest> LabelMap;
1522
1523 // BreakContinueStack - This keeps track of where break and continue
1524 // statements should jump to.
1525 struct BreakContinue {
1526 BreakContinue(JumpDest Break, JumpDest Continue)
1527 : BreakBlock(Break), ContinueBlock(Continue) {}
1528
1529 JumpDest BreakBlock;
1530 JumpDest ContinueBlock;
1531 };
1532 SmallVector<BreakContinue, 8> BreakContinueStack;
1533
1534 /// Handles cancellation exit points in OpenMP-related constructs.
1535 class OpenMPCancelExitStack {
1536 /// Tracks cancellation exit point and join point for cancel-related exit
1537 /// and normal exit.
1538 struct CancelExit {
1539 CancelExit() = default;
1540 CancelExit(OpenMPDirectiveKind Kind, JumpDest ExitBlock,
1541 JumpDest ContBlock)
1542 : Kind(Kind), ExitBlock(ExitBlock), ContBlock(ContBlock) {}
1543 OpenMPDirectiveKind Kind = llvm::omp::OMPD_unknown;
1544 /// true if the exit block has been emitted already by the special
1545 /// emitExit() call, false if the default codegen is used.
1546 bool HasBeenEmitted = false;
1547 JumpDest ExitBlock;
1548 JumpDest ContBlock;
1549 };
1550
1551 SmallVector<CancelExit, 8> Stack;
1552
1553 public:
1554 OpenMPCancelExitStack() : Stack(1) {}
1555 ~OpenMPCancelExitStack() = default;
1556 /// Fetches the exit block for the current OpenMP construct.
1557 JumpDest getExitBlock() const { return Stack.back().ExitBlock; }
1558 /// Emits exit block with special codegen procedure specific for the related
1559 /// OpenMP construct + emits code for normal construct cleanup.
1560 void emitExit(CodeGenFunction &CGF, OpenMPDirectiveKind Kind,
1561 const llvm::function_ref<void(CodeGenFunction &)> CodeGen) {
1562 if (Stack.back().Kind == Kind && getExitBlock().isValid()) {
1563 assert(CGF.getOMPCancelDestination(Kind).isValid());
1564 assert(CGF.HaveInsertPoint());
1565 assert(!Stack.back().HasBeenEmitted);
1566 auto IP = CGF.Builder.saveAndClearIP();
1567 CGF.EmitBlock(Stack.back().ExitBlock.getBlock());
1568 CodeGen(CGF);
1569 CGF.EmitBranch(Stack.back().ContBlock.getBlock());
1570 CGF.Builder.restoreIP(IP);
1571 Stack.back().HasBeenEmitted = true;
1572 }
1573 CodeGen(CGF);
1574 }
1575 /// Enter the cancel supporting \a Kind construct.
1576 /// \param Kind OpenMP directive that supports cancel constructs.
1577 /// \param HasCancel true, if the construct has inner cancel directive,
1578 /// false otherwise.
1579 void enter(CodeGenFunction &CGF, OpenMPDirectiveKind Kind, bool HasCancel) {
1580 Stack.push_back({Kind,
1581 HasCancel ? CGF.getJumpDestInCurrentScope("cancel.exit")
1582 : JumpDest(),
1583 HasCancel ? CGF.getJumpDestInCurrentScope("cancel.cont")
1584 : JumpDest()});
1585 }
1586 /// Emits default exit point for the cancel construct (if the special one
1587 /// has not be used) + join point for cancel/normal exits.
1588 void exit(CodeGenFunction &CGF) {
1589 if (getExitBlock().isValid()) {
1590 assert(CGF.getOMPCancelDestination(Stack.back().Kind).isValid());
1591 bool HaveIP = CGF.HaveInsertPoint();
1592 if (!Stack.back().HasBeenEmitted) {
1593 if (HaveIP)
1594 CGF.EmitBranchThroughCleanup(Stack.back().ContBlock);
1595 CGF.EmitBlock(Stack.back().ExitBlock.getBlock());
1596 CGF.EmitBranchThroughCleanup(Stack.back().ContBlock);
1597 }
1598 CGF.EmitBlock(Stack.back().ContBlock.getBlock());
1599 if (!HaveIP) {
1600 CGF.Builder.CreateUnreachable();
1601 CGF.Builder.ClearInsertionPoint();
1602 }
1603 }
1604 Stack.pop_back();
1605 }
1606 };
1607 OpenMPCancelExitStack OMPCancelStack;
1608
1609 /// Lower the Likelihood knowledge about the \p Cond via llvm.expect intrin.
1610 llvm::Value *emitCondLikelihoodViaExpectIntrinsic(llvm::Value *Cond,
1611 Stmt::Likelihood LH);
1612
1613 CodeGenPGO PGO;
1614
1615 /// Bitmap used by MC/DC to track condition outcomes of a boolean expression.
1616 Address MCDCCondBitmapAddr = Address::invalid();
1617
1618 /// Calculate branch weights appropriate for PGO data
1619 llvm::MDNode *createProfileWeights(uint64_t TrueCount,
1620 uint64_t FalseCount) const;
1621 llvm::MDNode *createProfileWeights(ArrayRef<uint64_t> Weights) const;
1622 llvm::MDNode *createProfileWeightsForLoop(const Stmt *Cond,
1623 uint64_t LoopCount) const;
1624
1625public:
1626 /// Increment the profiler's counter for the given statement by \p StepV.
1627 /// If \p StepV is null, the default increment is 1.
1628 void incrementProfileCounter(const Stmt *S, llvm::Value *StepV = nullptr) {
1630 !CurFn->hasFnAttribute(llvm::Attribute::NoProfile) &&
1631 !CurFn->hasFnAttribute(llvm::Attribute::SkipProfile)) {
1632 auto AL = ApplyDebugLocation::CreateArtificial(*this);
1633 PGO.emitCounterSetOrIncrement(Builder, S, StepV);
1634 }
1635 PGO.setCurrentStmt(S);
1636 }
1637
1640 CGM.getCodeGenOpts().MCDCCoverage &&
1641 !CurFn->hasFnAttribute(llvm::Attribute::NoProfile));
1642 }
1643
1644 /// Allocate a temp value on the stack that MCDC can use to track condition
1645 /// results.
1647 if (isMCDCCoverageEnabled()) {
1648 PGO.emitMCDCParameters(Builder);
1649 MCDCCondBitmapAddr =
1650 CreateIRTemp(getContext().UnsignedIntTy, "mcdc.addr");
1651 }
1652 }
1653
1654 bool isBinaryLogicalOp(const Expr *E) const {
1655 const BinaryOperator *BOp = dyn_cast<BinaryOperator>(E->IgnoreParens());
1656 return (BOp && BOp->isLogicalOp());
1657 }
1658
1659 /// Zero-init the MCDC temp value.
1662 PGO.emitMCDCCondBitmapReset(Builder, E, MCDCCondBitmapAddr);
1663 PGO.setCurrentStmt(E);
1664 }
1665 }
1666
1667 /// Increment the profiler's counter for the given expression by \p StepV.
1668 /// If \p StepV is null, the default increment is 1.
1671 PGO.emitMCDCTestVectorBitmapUpdate(Builder, E, MCDCCondBitmapAddr, *this);
1672 PGO.setCurrentStmt(E);
1673 }
1674 }
1675
1676 /// Update the MCDC temp value with the condition's evaluated result.
1677 void maybeUpdateMCDCCondBitmap(const Expr *E, llvm::Value *Val) {
1678 if (isMCDCCoverageEnabled()) {
1679 PGO.emitMCDCCondBitmapUpdate(Builder, E, MCDCCondBitmapAddr, Val, *this);
1680 PGO.setCurrentStmt(E);
1681 }
1682 }
1683
1684 /// Get the profiler's count for the given statement.
1685 uint64_t getProfileCount(const Stmt *S) {
1686 return PGO.getStmtCount(S).value_or(0);
1687 }
1688
1689 /// Set the profiler's current count.
1690 void setCurrentProfileCount(uint64_t Count) {
1691 PGO.setCurrentRegionCount(Count);
1692 }
1693
1694 /// Get the profiler's current count. This is generally the count for the most
1695 /// recently incremented counter.
1697 return PGO.getCurrentRegionCount();
1698 }
1699
1700private:
1701
1702 /// SwitchInsn - This is nearest current switch instruction. It is null if
1703 /// current context is not in a switch.
1704 llvm::SwitchInst *SwitchInsn = nullptr;
1705 /// The branch weights of SwitchInsn when doing instrumentation based PGO.
1706 SmallVector<uint64_t, 16> *SwitchWeights = nullptr;
1707
1708 /// The likelihood attributes of the SwitchCase.
1709 SmallVector<Stmt::Likelihood, 16> *SwitchLikelihood = nullptr;
1710
1711 /// CaseRangeBlock - This block holds if condition check for last case
1712 /// statement range in current switch instruction.
1713 llvm::BasicBlock *CaseRangeBlock = nullptr;
1714
1715 /// OpaqueLValues - Keeps track of the current set of opaque value
1716 /// expressions.
1717 llvm::DenseMap<const OpaqueValueExpr *, LValue> OpaqueLValues;
1718 llvm::DenseMap<const OpaqueValueExpr *, RValue> OpaqueRValues;
1719
1720 // VLASizeMap - This keeps track of the associated size for each VLA type.
1721 // We track this by the size expression rather than the type itself because
1722 // in certain situations, like a const qualifier applied to an VLA typedef,
1723 // multiple VLA types can share the same size expression.
1724 // FIXME: Maybe this could be a stack of maps that is pushed/popped as we
1725 // enter/leave scopes.
1726 llvm::DenseMap<const Expr*, llvm::Value*> VLASizeMap;
1727
1728 /// A block containing a single 'unreachable' instruction. Created
1729 /// lazily by getUnreachableBlock().
1730 llvm::BasicBlock *UnreachableBlock = nullptr;
1731
1732 /// Counts of the number return expressions in the function.
1733 unsigned NumReturnExprs = 0;
1734
1735 /// Count the number of simple (constant) return expressions in the function.
1736 unsigned NumSimpleReturnExprs = 0;
1737
1738 /// The last regular (non-return) debug location (breakpoint) in the function.
1739 SourceLocation LastStopPoint;
1740
1741public:
1742 /// Source location information about the default argument or member
1743 /// initializer expression we're evaluating, if any.
1747
1748 /// A scope within which we are constructing the fields of an object which
1749 /// might use a CXXDefaultInitExpr. This stashes away a 'this' value to use
1750 /// if we need to evaluate a CXXDefaultInitExpr within the evaluation.
1752 public:
1754 : CGF(CGF), OldCXXDefaultInitExprThis(CGF.CXXDefaultInitExprThis) {
1755 CGF.CXXDefaultInitExprThis = This;
1756 }
1758 CGF.CXXDefaultInitExprThis = OldCXXDefaultInitExprThis;
1759 }
1760
1761 private:
1762 CodeGenFunction &CGF;
1763 Address OldCXXDefaultInitExprThis;
1764 };
1765
1766 /// The scope of a CXXDefaultInitExpr. Within this scope, the value of 'this'
1767 /// is overridden to be the object under construction.
1769 public:
1771 : CGF(CGF), OldCXXThisValue(CGF.CXXThisValue),
1772 OldCXXThisAlignment(CGF.CXXThisAlignment),
1774 CGF.CXXThisValue = CGF.CXXDefaultInitExprThis.getBasePointer();
1775 CGF.CXXThisAlignment = CGF.CXXDefaultInitExprThis.getAlignment();
1776 }
1778 CGF.CXXThisValue = OldCXXThisValue;
1779 CGF.CXXThisAlignment = OldCXXThisAlignment;
1780 }
1781
1782 public:
1784 llvm::Value *OldCXXThisValue;
1787 };
1788
1792 };
1793
1794 /// The scope of an ArrayInitLoopExpr. Within this scope, the value of the
1795 /// current loop index is overridden.
1797 public:
1798 ArrayInitLoopExprScope(CodeGenFunction &CGF, llvm::Value *Index)
1799 : CGF(CGF), OldArrayInitIndex(CGF.ArrayInitIndex) {
1800 CGF.ArrayInitIndex = Index;
1801 }
1803 CGF.ArrayInitIndex = OldArrayInitIndex;
1804 }
1805
1806 private:
1807 CodeGenFunction &CGF;
1808 llvm::Value *OldArrayInitIndex;
1809 };
1810
1812 public:
1814 : CGF(CGF), OldCurGD(CGF.CurGD), OldCurFuncDecl(CGF.CurFuncDecl),
1815 OldCurCodeDecl(CGF.CurCodeDecl),
1816 OldCXXABIThisDecl(CGF.CXXABIThisDecl),
1817 OldCXXABIThisValue(CGF.CXXABIThisValue),
1818 OldCXXThisValue(CGF.CXXThisValue),
1819 OldCXXABIThisAlignment(CGF.CXXABIThisAlignment),
1820 OldCXXThisAlignment(CGF.CXXThisAlignment),
1821 OldReturnValue(CGF.ReturnValue), OldFnRetTy(CGF.FnRetTy),
1822 OldCXXInheritedCtorInitExprArgs(
1823 std::move(CGF.CXXInheritedCtorInitExprArgs)) {
1824 CGF.CurGD = GD;
1825 CGF.CurFuncDecl = CGF.CurCodeDecl =
1826 cast<CXXConstructorDecl>(GD.getDecl());
1827 CGF.CXXABIThisDecl = nullptr;
1828 CGF.CXXABIThisValue = nullptr;
1829 CGF.CXXThisValue = nullptr;
1830 CGF.CXXABIThisAlignment = CharUnits();
1831 CGF.CXXThisAlignment = CharUnits();
1833 CGF.FnRetTy = QualType();
1834 CGF.CXXInheritedCtorInitExprArgs.clear();
1835 }
1837 CGF.CurGD = OldCurGD;
1838 CGF.CurFuncDecl = OldCurFuncDecl;
1839 CGF.CurCodeDecl = OldCurCodeDecl;
1840 CGF.CXXABIThisDecl = OldCXXABIThisDecl;
1841 CGF.CXXABIThisValue = OldCXXABIThisValue;
1842 CGF.CXXThisValue = OldCXXThisValue;
1843 CGF.CXXABIThisAlignment = OldCXXABIThisAlignment;
1844 CGF.CXXThisAlignment = OldCXXThisAlignment;
1845 CGF.ReturnValue = OldReturnValue;
1846 CGF.FnRetTy = OldFnRetTy;
1847 CGF.CXXInheritedCtorInitExprArgs =
1848 std::move(OldCXXInheritedCtorInitExprArgs);
1849 }
1850
1851 private:
1852 CodeGenFunction &CGF;
1853 GlobalDecl OldCurGD;
1854 const Decl *OldCurFuncDecl;
1855 const Decl *OldCurCodeDecl;
1856 ImplicitParamDecl *OldCXXABIThisDecl;
1857 llvm::Value *OldCXXABIThisValue;
1858 llvm::Value *OldCXXThisValue;
1859 CharUnits OldCXXABIThisAlignment;
1860 CharUnits OldCXXThisAlignment;
1861 Address OldReturnValue;
1862 QualType OldFnRetTy;
1863 CallArgList OldCXXInheritedCtorInitExprArgs;
1864 };
1865
1866 // Helper class for the OpenMP IR Builder. Allows reusability of code used for
1867 // region body, and finalization codegen callbacks. This will class will also
1868 // contain privatization functions used by the privatization call backs
1869 //
1870 // TODO: this is temporary class for things that are being moved out of
1871 // CGOpenMPRuntime, new versions of current CodeGenFunction methods, or
1872 // utility function for use with the OMPBuilder. Once that move to use the
1873 // OMPBuilder is done, everything here will either become part of CodeGenFunc.
1874 // directly, or a new helper class that will contain functions used by both
1875 // this and the OMPBuilder
1876
1878
1882
1883 using InsertPointTy = llvm::OpenMPIRBuilder::InsertPointTy;
1884
1885 /// Cleanup action for allocate support.
1887
1888 private:
1889 llvm::CallInst *RTLFnCI;
1890
1891 public:
1892 OMPAllocateCleanupTy(llvm::CallInst *RLFnCI) : RTLFnCI(RLFnCI) {
1893 RLFnCI->removeFromParent();
1894 }
1895
1896 void Emit(CodeGenFunction &CGF, Flags /*flags*/) override {
1897 if (!CGF.HaveInsertPoint())
1898 return;
1899 CGF.Builder.Insert(RTLFnCI);
1900 }
1901 };
1902
1903 /// Returns address of the threadprivate variable for the current
1904 /// thread. This Also create any necessary OMP runtime calls.
1905 ///
1906 /// \param VD VarDecl for Threadprivate variable.
1907 /// \param VDAddr Address of the Vardecl
1908 /// \param Loc The location where the barrier directive was encountered
1910 const VarDecl *VD, Address VDAddr,
1912
1913 /// Gets the OpenMP-specific address of the local variable /p VD.
1915 const VarDecl *VD);
1916 /// Get the platform-specific name separator.
1917 /// \param Parts different parts of the final name that needs separation
1918 /// \param FirstSeparator First separator used between the initial two
1919 /// parts of the name.
1920 /// \param Separator separator used between all of the rest consecutinve
1921 /// parts of the name
1922 static std::string getNameWithSeparators(ArrayRef<StringRef> Parts,
1923 StringRef FirstSeparator = ".",
1924 StringRef Separator = ".");
1925 /// Emit the Finalization for an OMP region
1926 /// \param CGF The Codegen function this belongs to
1927 /// \param IP Insertion point for generating the finalization code.
1929 CGBuilderTy::InsertPointGuard IPG(CGF.Builder);
1930 assert(IP.getBlock()->end() != IP.getPoint() &&
1931 "OpenMP IR Builder should cause terminated block!");
1932
1933 llvm::BasicBlock *IPBB = IP.getBlock();
1934 llvm::BasicBlock *DestBB = IPBB->getUniqueSuccessor();
1935 assert(DestBB && "Finalization block should have one successor!");
1936
1937 // erase and replace with cleanup branch.
1938 IPBB->getTerminator()->eraseFromParent();
1939 CGF.Builder.SetInsertPoint(IPBB);
1941 CGF.EmitBranchThroughCleanup(Dest);
1942 }
1943
1944 /// Emit the body of an OMP region
1945 /// \param CGF The Codegen function this belongs to
1946 /// \param RegionBodyStmt The body statement for the OpenMP region being
1947 /// generated
1948 /// \param AllocaIP Where to insert alloca instructions
1949 /// \param CodeGenIP Where to insert the region code
1950 /// \param RegionName Name to be used for new blocks
1952 const Stmt *RegionBodyStmt,
1953 InsertPointTy AllocaIP,
1954 InsertPointTy CodeGenIP,
1955 Twine RegionName);
1956
1957 static void EmitCaptureStmt(CodeGenFunction &CGF, InsertPointTy CodeGenIP,
1958 llvm::BasicBlock &FiniBB, llvm::Function *Fn,
1960 llvm::BasicBlock *CodeGenIPBB = CodeGenIP.getBlock();
1961 if (llvm::Instruction *CodeGenIPBBTI = CodeGenIPBB->getTerminator())
1962 CodeGenIPBBTI->eraseFromParent();
1963
1964 CGF.Builder.SetInsertPoint(CodeGenIPBB);
1965
1966 if (Fn->doesNotThrow())
1967 CGF.EmitNounwindRuntimeCall(Fn, Args);
1968 else
1969 CGF.EmitRuntimeCall(Fn, Args);
1970
1971 if (CGF.Builder.saveIP().isSet())
1972 CGF.Builder.CreateBr(&FiniBB);
1973 }
1974
1975 /// Emit the body of an OMP region that will be outlined in
1976 /// OpenMPIRBuilder::finalize().
1977 /// \param CGF The Codegen function this belongs to
1978 /// \param RegionBodyStmt The body statement for the OpenMP region being
1979 /// generated
1980 /// \param AllocaIP Where to insert alloca instructions
1981 /// \param CodeGenIP Where to insert the region code
1982 /// \param RegionName Name to be used for new blocks
1984 const Stmt *RegionBodyStmt,
1985 InsertPointTy AllocaIP,
1986 InsertPointTy CodeGenIP,
1987 Twine RegionName);
1988
1989 /// RAII for preserving necessary info during Outlined region body codegen.
1991
1992 llvm::AssertingVH<llvm::Instruction> OldAllocaIP;
1993 CodeGenFunction::JumpDest OldReturnBlock;
1994 CodeGenFunction &CGF;
1995
1996 public:
1998 llvm::BasicBlock &RetBB)
1999 : CGF(cgf) {
2000 assert(AllocaIP.isSet() &&
2001 "Must specify Insertion point for allocas of outlined function");
2002 OldAllocaIP = CGF.AllocaInsertPt;
2003 CGF.AllocaInsertPt = &*AllocaIP.getPoint();
2004
2005 OldReturnBlock = CGF.ReturnBlock;
2006 CGF.ReturnBlock = CGF.getJumpDestInCurrentScope(&RetBB);
2007 }
2008
2010 CGF.AllocaInsertPt = OldAllocaIP;
2011 CGF.ReturnBlock = OldReturnBlock;
2012 }
2013 };
2014
2015 /// RAII for preserving necessary info during inlined region body codegen.
2017
2018 llvm::AssertingVH<llvm::Instruction> OldAllocaIP;
2019 CodeGenFunction &CGF;
2020
2021 public:
2023 llvm::BasicBlock &FiniBB)
2024 : CGF(cgf) {
2025 // Alloca insertion block should be in the entry block of the containing
2026 // function so it expects an empty AllocaIP in which case will reuse the
2027 // old alloca insertion point, or a new AllocaIP in the same block as
2028 // the old one
2029 assert((!AllocaIP.isSet() ||
2030 CGF.AllocaInsertPt->getParent() == AllocaIP.getBlock()) &&
2031 "Insertion point should be in the entry block of containing "
2032 "function!");
2033 OldAllocaIP = CGF.AllocaInsertPt;
2034 if (AllocaIP.isSet())
2035 CGF.AllocaInsertPt = &*AllocaIP.getPoint();
2036
2037 // TODO: Remove the call, after making sure the counter is not used by
2038 // the EHStack.
2039 // Since this is an inlined region, it should not modify the
2040 // ReturnBlock, and should reuse the one for the enclosing outlined
2041 // region. So, the JumpDest being return by the function is discarded
2042 (void)CGF.getJumpDestInCurrentScope(&FiniBB);
2043 }
2044
2046 };
2047 };
2048
2049private:
2050 /// CXXThisDecl - When generating code for a C++ member function,
2051 /// this will hold the implicit 'this' declaration.
2052 ImplicitParamDecl *CXXABIThisDecl = nullptr;
2053 llvm::Value *CXXABIThisValue = nullptr;
2054 llvm::Value *CXXThisValue = nullptr;
2055 CharUnits CXXABIThisAlignment;
2056 CharUnits CXXThisAlignment;
2057
2058 /// The value of 'this' to use when evaluating CXXDefaultInitExprs within
2059 /// this expression.
2060 Address CXXDefaultInitExprThis = Address::invalid();
2061
2062 /// The current array initialization index when evaluating an
2063 /// ArrayInitIndexExpr within an ArrayInitLoopExpr.
2064 llvm::Value *ArrayInitIndex = nullptr;
2065
2066 /// The values of function arguments to use when evaluating
2067 /// CXXInheritedCtorInitExprs within this context.
2068 CallArgList CXXInheritedCtorInitExprArgs;
2069
2070 /// CXXStructorImplicitParamDecl - When generating code for a constructor or
2071 /// destructor, this will hold the implicit argument (e.g. VTT).
2072 ImplicitParamDecl *CXXStructorImplicitParamDecl = nullptr;
2073 llvm::Value *CXXStructorImplicitParamValue = nullptr;
2074
2075 /// OutermostConditional - Points to the outermost active
2076 /// conditional control. This is used so that we know if a
2077 /// temporary should be destroyed conditionally.
2078 ConditionalEvaluation *OutermostConditional = nullptr;
2079
2080 /// The current lexical scope.
2081 LexicalScope *CurLexicalScope = nullptr;
2082
2083 /// The current source location that should be used for exception
2084 /// handling code.
2085 SourceLocation CurEHLocation;
2086
2087 /// BlockByrefInfos - For each __block variable, contains
2088 /// information about the layout of the variable.
2089 llvm::DenseMap<const ValueDecl *, BlockByrefInfo> BlockByrefInfos;
2090
2091 /// Used by -fsanitize=nullability-return to determine whether the return
2092 /// value can be checked.
2093 llvm::Value *RetValNullabilityPrecondition = nullptr;
2094
2095 /// Check if -fsanitize=nullability-return instrumentation is required for
2096 /// this function.
2097 bool requiresReturnValueNullabilityCheck() const {
2098 return RetValNullabilityPrecondition;
2099 }
2100
2101 /// Used to store precise source locations for return statements by the
2102 /// runtime return value checks.
2103 Address ReturnLocation = Address::invalid();
2104
2105 /// Check if the return value of this function requires sanitization.
2106 bool requiresReturnValueCheck() const;
2107
2108 bool isInAllocaArgument(CGCXXABI &ABI, QualType Ty);
2109 bool hasInAllocaArg(const CXXMethodDecl *MD);
2110
2111 llvm::BasicBlock *TerminateLandingPad = nullptr;
2112 llvm::BasicBlock *TerminateHandler = nullptr;
2114
2115 /// Terminate funclets keyed by parent funclet pad.
2116 llvm::MapVector<llvm::Value *, llvm::BasicBlock *> TerminateFunclets;
2117
2118 /// Largest vector width used in ths function. Will be used to create a
2119 /// function attribute.
2120 unsigned LargestVectorWidth = 0;
2121
2122 /// True if we need emit the life-time markers. This is initially set in
2123 /// the constructor, but could be overwritten to true if this is a coroutine.
2124 bool ShouldEmitLifetimeMarkers;
2125
2126 /// Add OpenCL kernel arg metadata and the kernel attribute metadata to
2127 /// the function metadata.
2128 void EmitKernelMetadata(const FunctionDecl *FD, llvm::Function *Fn);
2129
2130public:
2131 CodeGenFunction(CodeGenModule &cgm, bool suppressNewContext=false);
2133
2134 CodeGenTypes &getTypes() const { return CGM.getTypes(); }
2135 ASTContext &getContext() const { return CGM.getContext(); }
2137 if (DisableDebugInfo)
2138 return nullptr;
2139 return DebugInfo;
2140 }
2141 void disableDebugInfo() { DisableDebugInfo = true; }
2142 void enableDebugInfo() { DisableDebugInfo = false; }
2143
2145 return CGM.getCodeGenOpts().OptimizationLevel == 0;
2146 }
2147
2148 const LangOptions &getLangOpts() const { return CGM.getLangOpts(); }
2149
2150 /// Returns a pointer to the function's exception object and selector slot,
2151 /// which is assigned in every landing pad.
2154
2155 /// Returns the contents of the function's exception object and selector
2156 /// slots.
2157 llvm::Value *getExceptionFromSlot();
2158 llvm::Value *getSelectorFromSlot();
2159
2161
2162 llvm::BasicBlock *getUnreachableBlock() {
2163 if (!UnreachableBlock) {
2164 UnreachableBlock = createBasicBlock("unreachable");
2165 new llvm::UnreachableInst(getLLVMContext(), UnreachableBlock);
2166 }
2167 return UnreachableBlock;
2168 }
2169
2170 llvm::BasicBlock *getInvokeDest() {
2171 if (!EHStack.requiresLandingPad()) return nullptr;
2172 return getInvokeDestImpl();
2173 }
2174
2175 bool currentFunctionUsesSEHTry() const { return !!CurSEHParent; }
2176
2177 const TargetInfo &getTarget() const { return Target; }
2178 llvm::LLVMContext &getLLVMContext() { return CGM.getLLVMContext(); }
2180 return CGM.getTargetCodeGenInfo();
2181 }
2182
2183 //===--------------------------------------------------------------------===//
2184 // Cleanups
2185 //===--------------------------------------------------------------------===//
2186
2187 typedef void Destroyer(CodeGenFunction &CGF, Address addr, QualType ty);
2188
2189 void pushIrregularPartialArrayCleanup(llvm::Value *arrayBegin,
2190 Address arrayEndPointer,
2191 QualType elementType,
2192 CharUnits elementAlignment,
2193 Destroyer *destroyer);
2194 void pushRegularPartialArrayCleanup(llvm::Value *arrayBegin,
2195 llvm::Value *arrayEnd,
2196 QualType elementType,
2197 CharUnits elementAlignment,
2198 Destroyer *destroyer);
2199
2201 Address addr, QualType type);
2203 Address addr, QualType type);
2205 Destroyer *destroyer, bool useEHCleanupForArray);
2207 Address addr, QualType type);
2209 QualType type, Destroyer *destroyer,
2210 bool useEHCleanupForArray);
2212 QualType type, Destroyer *destroyer,
2213 bool useEHCleanupForArray);
2214 void pushCallObjectDeleteCleanup(const FunctionDecl *OperatorDelete,
2215 llvm::Value *CompletePtr,
2216 QualType ElementType);
2219 std::pair<llvm::Value *, llvm::Value *> AddrSizePair);
2221 bool useEHCleanupForArray);
2223 Destroyer *destroyer,
2224 bool useEHCleanupForArray,
2225 const VarDecl *VD);
2226 void emitArrayDestroy(llvm::Value *begin, llvm::Value *end,
2227 QualType elementType, CharUnits elementAlign,
2228 Destroyer *destroyer,
2229 bool checkZeroLength, bool useEHCleanup);
2230
2232
2233 /// Determines whether an EH cleanup is required to destroy a type
2234 /// with the given destruction kind.
2236 switch (kind) {
2237 case QualType::DK_none:
2238 return false;
2242 return getLangOpts().Exceptions;
2244 return getLangOpts().Exceptions &&
2245 CGM.getCodeGenOpts().ObjCAutoRefCountExceptions;
2246 }
2247 llvm_unreachable("bad destruction kind");
2248 }
2249
2252 }
2253
2254 //===--------------------------------------------------------------------===//
2255 // Objective-C
2256 //===--------------------------------------------------------------------===//
2257
2259
2261
2262 /// GenerateObjCGetter - Synthesize an Objective-C property getter function.
2264 const ObjCPropertyImplDecl *PID);
2266 const ObjCPropertyImplDecl *propImpl,
2267 const ObjCMethodDecl *GetterMothodDecl,
2268 llvm::Constant *AtomicHelperFn);
2269
2271 ObjCMethodDecl *MD, bool ctor);
2272
2273 /// GenerateObjCSetter - Synthesize an Objective-C property setter function
2274 /// for the given property.
2276 const ObjCPropertyImplDecl *PID);
2278 const ObjCPropertyImplDecl *propImpl,
2279 llvm::Constant *AtomicHelperFn);
2280
2281 //===--------------------------------------------------------------------===//
2282 // Block Bits
2283 //===--------------------------------------------------------------------===//
2284
2285 /// Emit block literal.
2286 /// \return an LLVM value which is a pointer to a struct which contains
2287 /// information about the block, including the block invoke function, the
2288 /// captured variables, etc.
2289 llvm::Value *EmitBlockLiteral(const BlockExpr *);
2290
2292 const CGBlockInfo &Info,
2293 const DeclMapTy &ldm,
2294 bool IsLambdaConversionToBlock,
2295 bool BuildGlobalBlock);
2296
2297 /// Check if \p T is a C++ class that has a destructor that can throw.
2299
2300 llvm::Constant *GenerateCopyHelperFunction(const CGBlockInfo &blockInfo);
2301 llvm::Constant *GenerateDestroyHelperFunction(const CGBlockInfo &blockInfo);
2303 const ObjCPropertyImplDecl *PID);
2305 const ObjCPropertyImplDecl *PID);
2306 llvm::Value *EmitBlockCopyAndAutorelease(llvm::Value *Block, QualType Ty);
2307
2308 void BuildBlockRelease(llvm::Value *DeclPtr, BlockFieldFlags flags,
2309 bool CanThrow);
2310
2311 class AutoVarEmission;
2312
2314
2315 /// Enter a cleanup to destroy a __block variable. Note that this
2316 /// cleanup should be a no-op if the variable hasn't left the stack
2317 /// yet; if a cleanup is required for the variable itself, that needs
2318 /// to be done externally.
2319 ///
2320 /// \param Kind Cleanup kind.
2321 ///
2322 /// \param Addr When \p LoadBlockVarAddr is false, the address of the __block
2323 /// structure that will be passed to _Block_object_dispose. When
2324 /// \p LoadBlockVarAddr is true, the address of the field of the block
2325 /// structure that holds the address of the __block structure.
2326 ///
2327 /// \param Flags The flag that will be passed to _Block_object_dispose.
2328 ///
2329 /// \param LoadBlockVarAddr Indicates whether we need to emit a load from
2330 /// \p Addr to get the address of the __block structure.
2332 bool LoadBlockVarAddr, bool CanThrow);
2333
2334 void setBlockContextParameter(const ImplicitParamDecl *D, unsigned argNum,
2335 llvm::Value *ptr);
2336
2339
2340 /// BuildBlockByrefAddress - Computes the location of the
2341 /// data in a variable which is declared as __block.
2343 bool followForward = true);
2345 const BlockByrefInfo &info,
2346 bool followForward,
2347 const llvm::Twine &name);
2348
2350
2352
2353 void GenerateCode(GlobalDecl GD, llvm::Function *Fn,
2354 const CGFunctionInfo &FnInfo);
2355
2356 /// Annotate the function with an attribute that disables TSan checking at
2357 /// runtime.
2358 void markAsIgnoreThreadCheckingAtRuntime(llvm::Function *Fn);
2359
2360 /// Emit code for the start of a function.
2361 /// \param Loc The location to be associated with the function.
2362 /// \param StartLoc The location of the function body.
2364 QualType RetTy,
2365 llvm::Function *Fn,
2366 const CGFunctionInfo &FnInfo,
2367 const FunctionArgList &Args,
2369 SourceLocation StartLoc = SourceLocation());
2370
2372
2376 void EmitFunctionBody(const Stmt *Body);
2377 void EmitBlockWithFallThrough(llvm::BasicBlock *BB, const Stmt *S);
2378
2379 void EmitForwardingCallToLambda(const CXXMethodDecl *LambdaCallOperator,
2380 CallArgList &CallArgs,
2381 const CGFunctionInfo *CallOpFnInfo = nullptr,
2382 llvm::Constant *CallOpFn = nullptr);
2386 CallArgList &CallArgs);
2388 const CGFunctionInfo **ImplFnInfo,
2389 llvm::Function **ImplFn);
2392 EmitStoreThroughLValue(RValue::get(VLASizeMap[VAT->getSizeExpr()]), LV);
2393 }
2394 void EmitAsanPrologueOrEpilogue(bool Prologue);
2395
2396 /// Emit the unified return block, trying to avoid its emission when
2397 /// possible.
2398 /// \return The debug location of the user written return statement if the
2399 /// return block is avoided.
2400 llvm::DebugLoc EmitReturnBlock();
2401
2402 /// FinishFunction - Complete IR generation of the current function. It is
2403 /// legal to call this function even if there is no current insertion point.
2405
2406 void StartThunk(llvm::Function *Fn, GlobalDecl GD,
2407 const CGFunctionInfo &FnInfo, bool IsUnprototyped);
2408
2409 void EmitCallAndReturnForThunk(llvm::FunctionCallee Callee,
2410 const ThunkInfo *Thunk, bool IsUnprototyped);
2411
2413
2414 /// Emit a musttail call for a thunk with a potentially adjusted this pointer.
2415 void EmitMustTailThunk(GlobalDecl GD, llvm::Value *AdjustedThisPtr,
2416 llvm::FunctionCallee Callee);
2417
2418 /// Generate a thunk for the given method.
2419 void generateThunk(llvm::Function *Fn, const CGFunctionInfo &FnInfo,
2420 GlobalDecl GD, const ThunkInfo &Thunk,
2421 bool IsUnprototyped);
2422
2423 llvm::Function *GenerateVarArgsThunk(llvm::Function *Fn,
2424 const CGFunctionInfo &FnInfo,
2425 GlobalDecl GD, const ThunkInfo &Thunk);
2426
2428 FunctionArgList &Args);
2429
2431
2432 /// Struct with all information about dynamic [sub]class needed to set vptr.
2433 struct VPtr {
2438 };
2439
2440 /// Initialize the vtable pointer of the given subobject.
2442
2444
2447
2449 CharUnits OffsetFromNearestVBase,
2450 bool BaseIsNonVirtualPrimaryBase,
2451 const CXXRecordDecl *VTableClass,
2452 VisitedVirtualBasesSetTy &VBases, VPtrsVector &vptrs);
2453
2455
2456 // VTableTrapMode - whether we guarantee that loading the
2457 // vtable is guaranteed to trap on authentication failure,
2458 // even if the resulting vtable pointer is unused.
2459 enum class VTableAuthMode {
2461 MustTrap,
2462 UnsafeUbsanStrip // Should only be used for Vptr UBSan check
2463 };
2464 /// GetVTablePtr - Return the Value of the vtable pointer member pointed
2465 /// to by This.
2466 llvm::Value *
2467 GetVTablePtr(Address This, llvm::Type *VTableTy,
2468 const CXXRecordDecl *VTableClass,
2470
2479 };
2480
2481 /// Derived is the presumed address of an object of type T after a
2482 /// cast. If T is a polymorphic class type, emit a check that the virtual
2483 /// table for Derived belongs to a class derived from T.
2484 void EmitVTablePtrCheckForCast(QualType T, Address Derived, bool MayBeNull,
2486
2487 /// EmitVTablePtrCheckForCall - Virtual method MD is being called via VTable.
2488 /// If vptr CFI is enabled, emit a check that VTable is valid.
2489 void EmitVTablePtrCheckForCall(const CXXRecordDecl *RD, llvm::Value *VTable,
2491
2492 /// EmitVTablePtrCheck - Emit a check that VTable is a valid virtual table for
2493 /// RD using llvm.type.test.
2494 void EmitVTablePtrCheck(const CXXRecordDecl *RD, llvm::Value *VTable,
2496
2497 /// If whole-program virtual table optimization is enabled, emit an assumption
2498 /// that VTable is a member of RD's type identifier. Or, if vptr CFI is
2499 /// enabled, emit a check that VTable is a member of RD's type identifier.
2501 llvm::Value *VTable, SourceLocation Loc);
2502
2503 /// Returns whether we should perform a type checked load when loading a
2504 /// virtual function for virtual calls to members of RD. This is generally
2505 /// true when both vcall CFI and whole-program-vtables are enabled.
2507
2508 /// Emit a type checked load from the given vtable.
2510 llvm::Value *VTable,
2511 llvm::Type *VTableTy,
2512 uint64_t VTableByteOffset);
2513
2514 /// EnterDtorCleanups - Enter the cleanups necessary to complete the
2515 /// given phase of destruction for a destructor. The end result
2516 /// should call destructors on members and base classes in reverse
2517 /// order of their construction.
2519
2520 /// ShouldInstrumentFunction - Return true if the current function should be
2521 /// instrumented with __cyg_profile_func_* calls
2523
2524 /// ShouldSkipSanitizerInstrumentation - Return true if the current function
2525 /// should not be instrumented with sanitizers.
2527
2528 /// ShouldXRayInstrument - Return true if the current function should be
2529 /// instrumented with XRay nop sleds.
2531
2532 /// AlwaysEmitXRayCustomEvents - Return true if we must unconditionally emit
2533 /// XRay custom event handling calls.
2535
2536 /// AlwaysEmitXRayTypedEvents - Return true if clang must unconditionally emit
2537 /// XRay typed event handling calls.
2539
2540 /// Return a type hash constant for a function instrumented by
2541 /// -fsanitize=function.
2542 llvm::ConstantInt *getUBSanFunctionTypeHash(QualType T) const;
2543
2544 /// EmitFunctionProlog - Emit the target specific LLVM code to load the
2545 /// arguments for the given function. This is also responsible for naming the
2546 /// LLVM function arguments.
2548 llvm::Function *Fn,
2549 const FunctionArgList &Args);
2550
2551 /// EmitFunctionEpilog - Emit the target specific LLVM code to return the
2552 /// given temporary.
2553 void EmitFunctionEpilog(const CGFunctionInfo &FI, bool EmitRetDbgLoc,
2554 SourceLocation EndLoc);
2555
2556 /// Emit a test that checks if the return value \p RV is nonnull.
2557 void EmitReturnValueCheck(llvm::Value *RV);
2558
2559 /// EmitStartEHSpec - Emit the start of the exception spec.
2560 void EmitStartEHSpec(const Decl *D);
2561
2562 /// EmitEndEHSpec - Emit the end of the exception spec.
2563 void EmitEndEHSpec(const Decl *D);
2564
2565 /// getTerminateLandingPad - Return a landing pad that just calls terminate.
2566 llvm::BasicBlock *getTerminateLandingPad();
2567
2568 /// getTerminateLandingPad - Return a cleanup funclet that just calls
2569 /// terminate.
2570 llvm::BasicBlock *getTerminateFunclet();
2571
2572 /// getTerminateHandler - Return a handler (not a landing pad, just
2573 /// a catch handler) that just calls terminate. This is used when
2574 /// a terminate scope encloses a try.
2575 llvm::BasicBlock *getTerminateHandler();
2576
2578 llvm::Type *ConvertType(QualType T);
2580 llvm::Type *LLVMTy = nullptr);
2581 llvm::Type *ConvertType(const TypeDecl *T) {
2582 return ConvertType(getContext().getTypeDeclType(T));
2583 }
2584
2585 /// LoadObjCSelf - Load the value of self. This function is only valid while
2586 /// generating code for an Objective-C method.
2587 llvm::Value *LoadObjCSelf();
2588
2589 /// TypeOfSelfObject - Return type of object that this self represents.
2591
2592 /// getEvaluationKind - Return the TypeEvaluationKind of QualType \c T.
2594
2596 return getEvaluationKind(T) == TEK_Scalar;
2597 }
2598
2601 }
2602
2603 /// createBasicBlock - Create an LLVM basic block.
2604 llvm::BasicBlock *createBasicBlock(const Twine &name = "",
2605 llvm::Function *parent = nullptr,
2606 llvm::BasicBlock *before = nullptr) {
2607 return llvm::BasicBlock::Create(getLLVMContext(), name, parent, before);
2608 }
2609
2610 /// getBasicBlockForLabel - Return the LLVM basicblock that the specified
2611 /// label maps to.
2613
2614 /// SimplifyForwardingBlocks - If the given basic block is only a branch to
2615 /// another basic block, simplify it. This assumes that no other code could
2616 /// potentially reference the basic block.
2617 void SimplifyForwardingBlocks(llvm::BasicBlock *BB);
2618
2619 /// EmitBlock - Emit the given block \arg BB and set it as the insert point,
2620 /// adding a fall-through branch from the current insert block if
2621 /// necessary. It is legal to call this function even if there is no current
2622 /// insertion point.
2623 ///
2624 /// IsFinished - If true, indicates that the caller has finished emitting
2625 /// branches to the given block and does not expect to emit code into it. This
2626 /// means the block can be ignored if it is unreachable.
2627 void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false);
2628
2629 /// EmitBlockAfterUses - Emit the given block somewhere hopefully
2630 /// near its uses, and leave the insertion point in it.
2631 void EmitBlockAfterUses(llvm::BasicBlock *BB);
2632
2633 /// EmitBranch - Emit a branch to the specified basic block from the current
2634 /// insert block, taking care to avoid creation of branches from dummy
2635 /// blocks. It is legal to call this function even if there is no current
2636 /// insertion point.
2637 ///
2638 /// This function clears the current insertion point. The caller should follow
2639 /// calls to this function with calls to Emit*Block prior to generation new
2640 /// code.
2641 void EmitBranch(llvm::BasicBlock *Block);
2642
2643 /// HaveInsertPoint - True if an insertion point is defined. If not, this
2644 /// indicates that the current code being emitted is unreachable.
2645 bool HaveInsertPoint() const {
2646 return Builder.GetInsertBlock() != nullptr;
2647 }
2648
2649 /// EnsureInsertPoint - Ensure that an insertion point is defined so that
2650 /// emitted IR has a place to go. Note that by definition, if this function
2651 /// creates a block then that block is unreachable; callers may do better to
2652 /// detect when no insertion point is defined and simply skip IR generation.
2654 if (!HaveInsertPoint())
2656 }
2657
2658 /// ErrorUnsupported - Print out an error that codegen doesn't support the
2659 /// specified stmt yet.
2660 void ErrorUnsupported(const Stmt *S, const char *Type);
2661
2662 //===--------------------------------------------------------------------===//
2663 // Helpers
2664 //===--------------------------------------------------------------------===//
2665
2667 llvm::BasicBlock *LHSBlock,
2668 llvm::BasicBlock *RHSBlock,
2669 llvm::BasicBlock *MergeBlock,
2670 QualType MergedType) {
2671 Builder.SetInsertPoint(MergeBlock);
2672 llvm::PHINode *PtrPhi = Builder.CreatePHI(LHS.getType(), 2, "cond");
2673 PtrPhi->addIncoming(LHS.getBasePointer(), LHSBlock);
2674 PtrPhi->addIncoming(RHS.getBasePointer(), RHSBlock);
2675 LHS.replaceBasePointer(PtrPhi);
2676 LHS.setAlignment(std::min(LHS.getAlignment(), RHS.getAlignment()));
2677 return LHS;
2678 }
2679
2680 /// Construct an address with the natural alignment of T. If a pointer to T
2681 /// is expected to be signed, the pointer passed to this function must have
2682 /// been signed, and the returned Address will have the pointer authentication
2683 /// information needed to authenticate the signed pointer.
2685 llvm::Value *Ptr, QualType T, CharUnits Alignment = CharUnits::Zero(),
2686 bool ForPointeeType = false, LValueBaseInfo *BaseInfo = nullptr,
2687 TBAAAccessInfo *TBAAInfo = nullptr,
2688 KnownNonNull_t IsKnownNonNull = NotKnownNonNull) {
2689 if (Alignment.isZero())
2690 Alignment =
2691 CGM.getNaturalTypeAlignment(T, BaseInfo, TBAAInfo, ForPointeeType);
2692 return Address(Ptr, ConvertTypeForMem(T), Alignment,
2693 CGM.getPointerAuthInfoForPointeeType(T), /*Offset=*/nullptr,
2694 IsKnownNonNull);
2695 }
2696
2699 return MakeAddrLValue(Addr, T, LValueBaseInfo(Source),
2701 }
2702
2704 TBAAAccessInfo TBAAInfo) {
2705 return LValue::MakeAddr(Addr, T, getContext(), BaseInfo, TBAAInfo);
2706 }
2707
2708 LValue MakeAddrLValue(llvm::Value *V, QualType T, CharUnits Alignment,
2710 return MakeAddrLValue(makeNaturalAddressForPointer(V, T, Alignment), T,
2712 }
2713
2714 /// Same as MakeAddrLValue above except that the pointer is known to be
2715 /// unsigned.
2716 LValue MakeRawAddrLValue(llvm::Value *V, QualType T, CharUnits Alignment,
2718 Address Addr(V, ConvertTypeForMem(T), Alignment);
2719 return LValue::MakeAddr(Addr, T, getContext(), LValueBaseInfo(Source),
2721 }
2722
2723 LValue
2726 return LValue::MakeAddr(Addr, T, getContext(), LValueBaseInfo(Source),
2727 TBAAAccessInfo());
2728 }
2729
2730 /// Given a value of type T* that may not be to a complete object, construct
2731 /// an l-value with the natural pointee alignment of T.
2733
2734 LValue
2736 KnownNonNull_t IsKnownNonNull = NotKnownNonNull);
2737
2738 /// Same as MakeNaturalAlignPointeeAddrLValue except that the pointer is known
2739 /// to be unsigned.
2741
2743
2745 LValueBaseInfo *PointeeBaseInfo = nullptr,
2746 TBAAAccessInfo *PointeeTBAAInfo = nullptr);
2749 AlignmentSource Source =
2751 LValue RefLVal = MakeAddrLValue(RefAddr, RefTy, LValueBaseInfo(Source),
2752 CGM.getTBAAAccessInfo(RefTy));
2753 return EmitLoadOfReferenceLValue(RefLVal);
2754 }
2755
2756 /// Load a pointer with type \p PtrTy stored at address \p Ptr.
2757 /// Note that \p PtrTy is the type of the loaded pointer, not the addresses
2758 /// it is loaded from.
2760 LValueBaseInfo *BaseInfo = nullptr,
2761 TBAAAccessInfo *TBAAInfo = nullptr);
2763
2764private:
2765 struct AllocaTracker {
2766 void Add(llvm::AllocaInst *I) { Allocas.push_back(I); }
2767 llvm::SmallVector<llvm::AllocaInst *> Take() { return std::move(Allocas); }
2768
2769 private:
2771 };
2772 AllocaTracker *Allocas = nullptr;
2773
2774public:
2775 // Captures all the allocas created during the scope of its RAII object.
2778 : CGF(CGF), OldTracker(CGF.Allocas) {
2779 CGF.Allocas = &Tracker;
2780 }
2781 ~AllocaTrackerRAII() { CGF.Allocas = OldTracker; }
2782
2783 llvm::SmallVector<llvm::AllocaInst *> Take() { return Tracker.Take(); }
2784
2785 private:
2786 CodeGenFunction &CGF;
2787 AllocaTracker *OldTracker;
2788 AllocaTracker Tracker;
2789 };
2790
2791 /// CreateTempAlloca - This creates an alloca and inserts it into the entry
2792 /// block if \p ArraySize is nullptr, otherwise inserts it at the current
2793 /// insertion point of the builder. The caller is responsible for setting an
2794 /// appropriate alignment on
2795 /// the alloca.
2796 ///
2797 /// \p ArraySize is the number of array elements to be allocated if it
2798 /// is not nullptr.
2799 ///
2800 /// LangAS::Default is the address space of pointers to local variables and
2801 /// temporaries, as exposed in the source language. In certain
2802 /// configurations, this is not the same as the alloca address space, and a
2803 /// cast is needed to lift the pointer from the alloca AS into
2804 /// LangAS::Default. This can happen when the target uses a restricted
2805 /// address space for the stack but the source language requires
2806 /// LangAS::Default to be a generic address space. The latter condition is
2807 /// common for most programming languages; OpenCL is an exception in that
2808 /// LangAS::Default is the private address space, which naturally maps
2809 /// to the stack.
2810 ///
2811 /// Because the address of a temporary is often exposed to the program in
2812 /// various ways, this function will perform the cast. The original alloca
2813 /// instruction is returned through \p Alloca if it is not nullptr.
2814 ///
2815 /// The cast is not performaed in CreateTempAllocaWithoutCast. This is
2816 /// more efficient if the caller knows that the address will not be exposed.
2817 llvm::AllocaInst *CreateTempAlloca(llvm::Type *Ty, const Twine &Name = "tmp",
2818 llvm::Value *ArraySize = nullptr);
2820 const Twine &Name = "tmp",
2821 llvm::Value *ArraySize = nullptr,
2822 RawAddress *Alloca = nullptr);
2824 const Twine &Name = "tmp",
2825 llvm::Value *ArraySize = nullptr);
2826
2827 /// CreateDefaultAlignedTempAlloca - This creates an alloca with the
2828 /// default ABI alignment of the given LLVM type.
2829 ///
2830 /// IMPORTANT NOTE: This is *not* generally the right alignment for
2831 /// any given AST type that happens to have been lowered to the
2832 /// given IR type. This should only ever be used for function-local,
2833 /// IR-driven manipulations like saving and restoring a value. Do
2834 /// not hand this address off to arbitrary IRGen routines, and especially
2835 /// do not pass it as an argument to a function that might expect a
2836 /// properly ABI-aligned value.
2838 const Twine &Name = "tmp");
2839
2840 /// CreateIRTemp - Create a temporary IR object of the given type, with
2841 /// appropriate alignment. This routine should only be used when an temporary
2842 /// value needs to be stored into an alloca (for example, to avoid explicit
2843 /// PHI construction), but the type is the IR type, not the type appropriate
2844 /// for storing in memory.
2845 ///
2846 /// That is, this is exactly equivalent to CreateMemTemp, but calling
2847 /// ConvertType instead of ConvertTypeForMem.
2848 RawAddress CreateIRTemp(QualType T, const Twine &Name = "tmp");
2849
2850 /// CreateMemTemp - Create a temporary memory object of the given type, with
2851 /// appropriate alignmen and cast it to the default address space. Returns
2852 /// the original alloca instruction by \p Alloca if it is not nullptr.
2853 RawAddress CreateMemTemp(QualType T, const Twine &Name = "tmp",
2854 RawAddress *Alloca = nullptr);
2856 const Twine &Name = "tmp",
2857 RawAddress *Alloca = nullptr);
2858
2859 /// CreateMemTemp - Create a temporary memory object of the given type, with
2860 /// appropriate alignmen without casting it to the default address space.
2861 RawAddress CreateMemTempWithoutCast(QualType T, const Twine &Name = "tmp");
2863 const Twine &Name = "tmp");
2864
2865 /// CreateAggTemp - Create a temporary memory object for the given
2866 /// aggregate type.
2867 AggValueSlot CreateAggTemp(QualType T, const Twine &Name = "tmp",
2868 RawAddress *Alloca = nullptr) {
2869 return AggValueSlot::forAddr(
2870 CreateMemTemp(T, Name, Alloca), T.getQualifiers(),
2873 }
2874
2875 /// EvaluateExprAsBool - Perform the usual unary conversions on the specified
2876 /// expression and compare the result against zero, returning an Int1Ty value.
2877 llvm::Value *EvaluateExprAsBool(const Expr *E);
2878
2879 /// Retrieve the implicit cast expression of the rhs in a binary operator
2880 /// expression by passing pointers to Value and QualType
2881 /// This is used for implicit bitfield conversion checks, which
2882 /// must compare with the value before potential truncation.
2884 llvm::Value **Previous,
2885 QualType *SrcType);
2886
2887 /// Emit a check that an [implicit] conversion of a bitfield. It is not UB,
2888 /// so we use the value after conversion.
2889 void EmitBitfieldConversionCheck(llvm::Value *Src, QualType SrcType,
2890 llvm::Value *Dst, QualType DstType,
2891 const CGBitFieldInfo &Info,
2893
2894 /// EmitIgnoredExpr - Emit an expression in a context which ignores the result.
2895 void EmitIgnoredExpr(const Expr *E);
2896
2897 /// EmitAnyExpr - Emit code to compute the specified expression which can have
2898 /// any type. The result is returned as an RValue struct. If this is an
2899 /// aggregate expression, the aggloc/agglocvolatile arguments indicate where
2900 /// the result should be returned.
2901 ///
2902 /// \param ignoreResult True if the resulting value isn't used.
2905 bool ignoreResult = false);
2906
2907 // EmitVAListRef - Emit a "reference" to a va_list; this is either the address
2908 // or the value of the expression, depending on how va_list is defined.
2910
2911 /// Emit a "reference" to a __builtin_ms_va_list; this is
2912 /// always the value of the expression, because a __builtin_ms_va_list is a
2913 /// pointer to a char.
2915
2916 /// EmitAnyExprToTemp - Similarly to EmitAnyExpr(), however, the result will
2917 /// always be accessible even if no aggregate location is provided.
2919
2920 /// EmitAnyExprToMem - Emits the code necessary to evaluate an
2921 /// arbitrary expression into the given memory location.
2922 void EmitAnyExprToMem(const Expr *E, Address Location,
2923 Qualifiers Quals, bool IsInitializer);
2924
2925 void EmitAnyExprToExn(const Expr *E, Address Addr);
2926
2927 /// EmitExprAsInit - Emits the code necessary to initialize a
2928 /// location in memory with the given initializer.
2929 void EmitExprAsInit(const Expr *init, const ValueDecl *D, LValue lvalue,
2930 bool capturedByInit);
2931
2932 /// hasVolatileMember - returns true if aggregate type has a volatile
2933 /// member.
2935 if (const RecordType *RT = T->getAs<RecordType>()) {
2936 const RecordDecl *RD = cast<RecordDecl>(RT->getDecl());
2937 return RD->hasVolatileMember();
2938 }
2939 return false;
2940 }
2941
2942 /// Determine whether a return value slot may overlap some other object.
2944 // FIXME: Assuming no overlap here breaks guaranteed copy elision for base
2945 // class subobjects. These cases may need to be revisited depending on the
2946 // resolution of the relevant core issue.
2948 }
2949
2950 /// Determine whether a field initialization may overlap some other object.
2952
2953 /// Determine whether a base class initialization may overlap some other
2954 /// object.
2956 const CXXRecordDecl *BaseRD,
2957 bool IsVirtual);
2958
2959 /// Emit an aggregate assignment.
2961 bool IsVolatile = hasVolatileMember(EltTy);
2962 EmitAggregateCopy(Dest, Src, EltTy, AggValueSlot::MayOverlap, IsVolatile);
2963 }
2964
2966 AggValueSlot::Overlap_t MayOverlap) {
2967 EmitAggregateCopy(Dest, Src, Src.getType(), MayOverlap);
2968 }
2969
2970 /// EmitAggregateCopy - Emit an aggregate copy.
2971 ///
2972 /// \param isVolatile \c true iff either the source or the destination is
2973 /// volatile.
2974 /// \param MayOverlap Whether the tail padding of the destination might be
2975 /// occupied by some other object. More efficient code can often be
2976 /// generated if not.
2978 AggValueSlot::Overlap_t MayOverlap,
2979 bool isVolatile = false);
2980
2981 /// GetAddrOfLocalVar - Return the address of a local variable.
2983 auto it = LocalDeclMap.find(VD);
2984 assert(it != LocalDeclMap.end() &&
2985 "Invalid argument to GetAddrOfLocalVar(), no decl!");
2986 return it->second;
2987 }
2988
2989 /// Given an opaque value expression, return its LValue mapping if it exists,
2990 /// otherwise create one.
2992
2993 /// Given an opaque value expression, return its RValue mapping if it exists,
2994 /// otherwise create one.
2996
2997 /// Get the index of the current ArrayInitLoopExpr, if any.
2998 llvm::Value *getArrayInitIndex() { return ArrayInitIndex; }
2999
3000 /// getAccessedFieldNo - Given an encoded value and a result number, return
3001 /// the input field number being accessed.
3002 static unsigned getAccessedFieldNo(unsigned Idx, const llvm::Constant *Elts);
3003
3004 llvm::BlockAddress *GetAddrOfLabel(const LabelDecl *L);
3005 llvm::BasicBlock *GetIndirectGotoBlock();
3006
3007 /// Check if \p E is a C++ "this" pointer wrapped in value-preserving casts.
3008 static bool IsWrappedCXXThis(const Expr *E);
3009
3010 /// EmitNullInitialization - Generate code to set a value of the given type to
3011 /// null, If the type contains data member pointers, they will be initialized
3012 /// to -1 in accordance with the Itanium C++ ABI.
3014
3015 /// Emits a call to an LLVM variable-argument intrinsic, either
3016 /// \c llvm.va_start or \c llvm.va_end.
3017 /// \param ArgValue A reference to the \c va_list as emitted by either
3018 /// \c EmitVAListRef or \c EmitMSVAListRef.
3019 /// \param IsStart If \c true, emits a call to \c llvm.va_start; otherwise,
3020 /// calls \c llvm.va_end.
3021 llvm::Value *EmitVAStartEnd(llvm::Value *ArgValue, bool IsStart);
3022
3023 /// Generate code to get an argument from the passed in pointer
3024 /// and update it accordingly.
3025 /// \param VE The \c VAArgExpr for which to generate code.
3026 /// \param VAListAddr Receives a reference to the \c va_list as emitted by
3027 /// either \c EmitVAListRef or \c EmitMSVAListRef.
3028 /// \returns A pointer to the argument.
3029 // FIXME: We should be able to get rid of this method and use the va_arg
3030 // instruction in LLVM instead once it works well enough.
3033
3034 /// emitArrayLength - Compute the length of an array, even if it's a
3035 /// VLA, and drill down to the base element type.
3037 QualType &baseType,
3038 Address &addr);
3039
3040 /// EmitVLASize - Capture all the sizes for the VLA expressions in
3041 /// the given variably-modified type and store them in the VLASizeMap.
3042 ///
3043 /// This function can be called with a null (unreachable) insert point.
3045
3047 llvm::Value *NumElts;
3049
3050 VlaSizePair(llvm::Value *NE, QualType T) : NumElts(NE), Type(T) {}
3051 };
3052
3053 /// Return the number of elements for a single dimension
3054 /// for the given array type.
3057
3058 /// Returns an LLVM value that corresponds to the size,
3059 /// in non-variably-sized elements, of a variable length array type,
3060 /// plus that largest non-variably-sized element type. Assumes that
3061 /// the type has already been emitted with EmitVariablyModifiedType.
3064
3065 /// LoadCXXThis - Load the value of 'this'. This function is only valid while
3066 /// generating code for an C++ member function.
3067 llvm::Value *LoadCXXThis() {
3068 assert(CXXThisValue && "no 'this' value for this function");
3069 return CXXThisValue;
3070 }
3072
3073 /// LoadCXXVTT - Load the VTT parameter to base constructors/destructors have
3074 /// virtual bases.
3075 // FIXME: Every place that calls LoadCXXVTT is something
3076 // that needs to be abstracted properly.
3077 llvm::Value *LoadCXXVTT() {
3078 assert(CXXStructorImplicitParamValue && "no VTT value for this function");
3079 return CXXStructorImplicitParamValue;
3080 }
3081
3082 /// GetAddressOfBaseOfCompleteClass - Convert the given pointer to a
3083 /// complete class to the given direct base.
3084 Address
3086 const CXXRecordDecl *Derived,
3087 const CXXRecordDecl *Base,
3088 bool BaseIsVirtual);
3089
3090 static bool ShouldNullCheckClassCastValue(const CastExpr *Cast);
3091
3092 /// GetAddressOfBaseClass - This function will add the necessary delta to the
3093 /// load of 'this' and returns address of the base class.
3095 const CXXRecordDecl *Derived,
3098 bool NullCheckValue, SourceLocation Loc);
3099
3101 const CXXRecordDecl *Derived,
3104 bool NullCheckValue);
3105
3106 /// GetVTTParameter - Return the VTT parameter that should be passed to a
3107 /// base constructor/destructor with virtual bases.
3108 /// FIXME: VTTs are Itanium ABI-specific, so the definition should move
3109 /// to ItaniumCXXABI.cpp together with all the references to VTT.
3110 llvm::Value *GetVTTParameter(GlobalDecl GD, bool ForVirtualBase,
3111 bool Delegating);
3112
3114 CXXCtorType CtorType,
3115 const FunctionArgList &Args,
3117 // It's important not to confuse this and the previous function. Delegating
3118 // constructors are the C++0x feature. The constructor delegate optimization
3119 // is used to reduce duplication in the base and complete consturctors where
3120 // they are substantially the same.
3122 const FunctionArgList &Args);
3123
3124 /// Emit a call to an inheriting constructor (that is, one that invokes a
3125 /// constructor inherited from a base class) by inlining its definition. This
3126 /// is necessary if the ABI does not support forwarding the arguments to the
3127 /// base class constructor (because they're variadic or similar).
3129 CXXCtorType CtorType,
3130 bool ForVirtualBase,
3131 bool Delegating,
3132 CallArgList &Args);
3133
3134 /// Emit a call to a constructor inherited from a base class, passing the
3135 /// current constructor's arguments along unmodified (without even making
3136 /// a copy).
3138 bool ForVirtualBase, Address This,
3139 bool InheritedFromVBase,
3141
3143 bool ForVirtualBase, bool Delegating,
3144 AggValueSlot ThisAVS, const CXXConstructExpr *E);
3145
3147 bool ForVirtualBase, bool Delegating,
3148 Address This, CallArgList &Args,
3150 SourceLocation Loc, bool NewPointerIsChecked);
3151
3152 /// Emit assumption load for all bases. Requires to be called only on
3153 /// most-derived class and not under construction of the object.
3155
3156 /// Emit assumption that vptr load == global vtable.
3157 void EmitVTableAssumptionLoad(const VPtr &vptr, Address This);
3158
3160 Address This, Address Src,
3161 const CXXConstructExpr *E);
3162
3164 const ArrayType *ArrayTy,
3165 Address ArrayPtr,
3166 const CXXConstructExpr *E,
3167 bool NewPointerIsChecked,
3168 bool ZeroInitialization = false);
3169
3171 llvm::Value *NumElements,
3172 Address ArrayPtr,
3173 const CXXConstructExpr *E,
3174 bool NewPointerIsChecked,
3175 bool ZeroInitialization = false);
3176
3178
3180 bool ForVirtualBase, bool Delegating, Address This,
3181 QualType ThisTy);
3182
3184 llvm::Type *ElementTy, Address NewPtr,
3185 llvm::Value *NumElements,
3186 llvm::Value *AllocSizeWithoutCookie);
3187
3188 void EmitCXXTemporary(const CXXTemporary *Temporary, QualType TempType,
3189 Address Ptr);
3190
3195
3196 llvm::Value *EmitLifetimeStart(llvm::TypeSize Size, llvm::Value *Addr);
3197 void EmitLifetimeEnd(llvm::Value *Size, llvm::Value *Addr);
3198
3199 llvm::Value *EmitCXXNewExpr(const CXXNewExpr *E);
3201
3202 void EmitDeleteCall(const FunctionDecl *DeleteFD, llvm::Value *Ptr,
3203 QualType DeleteTy, llvm::Value *NumElements = nullptr,
3204 CharUnits CookieSize = CharUnits());
3205
3207 const CallExpr *TheCallExpr, bool IsDelete);
3208
3209 llvm::Value *EmitCXXTypeidExpr(const CXXTypeidExpr *E);
3210 llvm::Value *EmitDynamicCast(Address V, const CXXDynamicCastExpr *DCE);
3212
3213 /// Situations in which we might emit a check for the suitability of a
3214 /// pointer or glvalue. Needs to be kept in sync with ubsan_handlers.cpp in
3215 /// compiler-rt.
3217 /// Checking the operand of a load. Must be suitably sized and aligned.
3219 /// Checking the destination of a store. Must be suitably sized and aligned.
3221 /// Checking the bound value in a reference binding. Must be suitably sized
3222 /// and aligned, but is not required to refer to an object (until the
3223 /// reference is used), per core issue 453.
3225 /// Checking the object expression in a non-static data member access. Must
3226 /// be an object within its lifetime.
3228 /// Checking the 'this' pointer for a call to a non-static member function.
3229 /// Must be an object within its lifetime.
3231 /// Checking the 'this' pointer for a constructor call.
3233 /// Checking the operand of a static_cast to a derived pointer type. Must be
3234 /// null or an object within its lifetime.
3236 /// Checking the operand of a static_cast to a derived reference type. Must
3237 /// be an object within its lifetime.
3239 /// Checking the operand of a cast to a base object. Must be suitably sized
3240 /// and aligned.
3242 /// Checking the operand of a cast to a virtual base object. Must be an
3243 /// object within its lifetime.
3245 /// Checking the value assigned to a _Nonnull pointer. Must not be null.
3247 /// Checking the operand of a dynamic_cast or a typeid expression. Must be
3248 /// null or an object within its lifetime.
3251
3252 /// Determine whether the pointer type check \p TCK permits null pointers.
3254
3255 /// Determine whether the pointer type check \p TCK requires a vptr check.
3257
3258 /// Whether any type-checking sanitizers are enabled. If \c false,
3259 /// calls to EmitTypeCheck can be skipped.
3261
3263 QualType Type, SanitizerSet SkippedChecks = SanitizerSet(),
3264 llvm::Value *ArraySize = nullptr) {
3266 return;
3267 EmitTypeCheck(TCK, Loc, LV.emitRawPointer(*this), Type, LV.getAlignment(),
3268 SkippedChecks, ArraySize);
3269 }
3270
3272 QualType Type, CharUnits Alignment = CharUnits::Zero(),
3273 SanitizerSet SkippedChecks = SanitizerSet(),
3274 llvm::Value *ArraySize = nullptr) {
3276 return;
3277 EmitTypeCheck(TCK, Loc, Addr.emitRawPointer(*this), Type, Alignment,
3278 SkippedChecks, ArraySize);
3279 }
3280
3281 /// Emit a check that \p V is the address of storage of the
3282 /// appropriate size and alignment for an object of type \p Type
3283 /// (or if ArraySize is provided, for an array of that bound).
3285 QualType Type, CharUnits Alignment = CharUnits::Zero(),
3286 SanitizerSet SkippedChecks = SanitizerSet(),
3287 llvm::Value *ArraySize = nullptr);
3288
3289 /// Emit a check that \p Base points into an array object, which
3290 /// we can access at index \p Index. \p Accessed should be \c false if we
3291 /// this expression is used as an lvalue, for instance in "&Arr[Idx]".
3292 void EmitBoundsCheck(const Expr *E, const Expr *Base, llvm::Value *Index,
3293 QualType IndexType, bool Accessed);
3294 void EmitBoundsCheckImpl(const Expr *E, llvm::Value *Bound,
3295 llvm::Value *Index, QualType IndexType,
3296 QualType IndexedType, bool Accessed);
3297
3298 // Find a struct's flexible array member and get its offset. It may be
3299 // embedded inside multiple sub-structs, but must still be the last field.
3300 const FieldDecl *
3302 const FieldDecl *FAMDecl,
3303 uint64_t &Offset);
3304
3305 /// Find the FieldDecl specified in a FAM's "counted_by" attribute. Returns
3306 /// \p nullptr if either the attribute or the field doesn't exist.
3308
3309 /// Build an expression accessing the "counted_by" field.
3310 llvm::Value *EmitCountedByFieldExpr(const Expr *Base,
3311 const FieldDecl *FAMDecl,
3312 const FieldDecl *CountDecl);
3313
3315 bool isInc, bool isPre);
3317 bool isInc, bool isPre);
3318
3319 /// Converts Location to a DebugLoc, if debug information is enabled.
3320 llvm::DebugLoc SourceLocToDebugLoc(SourceLocation Location);
3321
3322 /// Get the record field index as represented in debug info.
3323 unsigned getDebugInfoFIndex(const RecordDecl *Rec, unsigned FieldIndex);
3324
3325
3326 //===--------------------------------------------------------------------===//
3327 // Declaration Emission
3328 //===--------------------------------------------------------------------===//
3329
3330 /// EmitDecl - Emit a declaration.
3331 ///
3332 /// This function can be called with a null (unreachable) insert point.
3333 void EmitDecl(const Decl &D);
3334
3335 /// EmitVarDecl - Emit a local variable declaration.
3336 ///
3337 /// This function can be called with a null (unreachable) insert point.
3338 void EmitVarDecl(const VarDecl &D);
3339
3340 void EmitScalarInit(const Expr *init, const ValueDecl *D, LValue lvalue,
3341 bool capturedByInit);
3342
3344 llvm::Value *Address);
3345
3346 /// Determine whether the given initializer is trivial in the sense
3347 /// that it requires no code to be generated.
3349
3350 /// EmitAutoVarDecl - Emit an auto variable declaration.
3351 ///
3352 /// This function can be called with a null (unreachable) insert point.
3354
3356 friend class CodeGenFunction;
3357
3358 const VarDecl *Variable;
3359
3360 /// The address of the alloca for languages with explicit address space
3361 /// (e.g. OpenCL) or alloca casted to generic pointer for address space
3362 /// agnostic languages (e.g. C++). Invalid if the variable was emitted
3363 /// as a global constant.
3364 Address Addr;
3365
3366 llvm::Value *NRVOFlag;
3367
3368 /// True if the variable is a __block variable that is captured by an
3369 /// escaping block.
3370 bool IsEscapingByRef;
3371
3372 /// True if the variable is of aggregate type and has a constant
3373 /// initializer.
3374 bool IsConstantAggregate;
3375
3376 /// Non-null if we should use lifetime annotations.
3377 llvm::Value *SizeForLifetimeMarkers;
3378
3379 /// Address with original alloca instruction. Invalid if the variable was
3380 /// emitted as a global constant.
3381 RawAddress AllocaAddr;
3382
3383 struct Invalid {};
3384 AutoVarEmission(Invalid)
3385 : Variable(nullptr), Addr(Address::invalid()),
3386 AllocaAddr(RawAddress::invalid()) {}
3387
3388 AutoVarEmission(const VarDecl &variable)
3389 : Variable(&variable), Addr(Address::invalid()), NRVOFlag(nullptr),
3390 IsEscapingByRef(false), IsConstantAggregate(false),
3391 SizeForLifetimeMarkers(nullptr), AllocaAddr(RawAddress::invalid()) {}
3392
3393 bool wasEmittedAsGlobal() const { return !Addr.isValid(); }
3394
3395 public:
3396 static AutoVarEmission invalid() { return AutoVarEmission(Invalid()); }
3397
3398 bool useLifetimeMarkers() const {
3399 return SizeForLifetimeMarkers != nullptr;
3400 }
3401 llvm::Value *getSizeForLifetimeMarkers() const {
3402 assert(useLifetimeMarkers());
3403 return SizeForLifetimeMarkers;
3404 }
3405
3406 /// Returns the raw, allocated address, which is not necessarily
3407 /// the address of the object itself. It is casted to default
3408 /// address space for address space agnostic languages.
3410 return Addr;
3411 }
3412
3413 /// Returns the address for the original alloca instruction.
3414 RawAddress getOriginalAllocatedAddress() const { return AllocaAddr; }
3415
3416 /// Returns the address of the object within this declaration.
3417 /// Note that this does not chase the forwarding pointer for
3418 /// __block decls.
3420 if (!IsEscapingByRef) return Addr;
3421
3422 return CGF.emitBlockByrefAddress(Addr, Variable, /*forward*/ false);
3423 }
3424 };
3426 void EmitAutoVarInit(const AutoVarEmission &emission);
3429 QualType::DestructionKind dtorKind);
3430
3431 /// Emits the alloca and debug information for the size expressions for each
3432 /// dimension of an array. It registers the association of its (1-dimensional)
3433 /// QualTypes and size expression's debug node, so that CGDebugInfo can
3434 /// reference this node when creating the DISubrange object to describe the
3435 /// array types.
3437 const VarDecl &D,
3438 bool EmitDebugInfo);
3439
3441 llvm::GlobalValue::LinkageTypes Linkage);
3442
3444 union {
3446 llvm::Value *Value;
3447 };
3448
3449 bool IsIndirect;
3450
3451 ParamValue(llvm::Value *V) : Value(V), IsIndirect(false) {}
3452 ParamValue(Address A) : Addr(A), IsIndirect(true) {}
3453
3454 public:
3455 static ParamValue forDirect(llvm::Value *value) {
3456 return ParamValue(value);
3457 }
3459 assert(!addr.getAlignment().isZero());
3460 return ParamValue(addr);
3461 }
3462
3463 bool isIndirect() const { return IsIndirect; }
3464 llvm::Value *getAnyValue() const {
3465 if (!isIndirect())
3466 return Value;
3467 assert(!Addr.hasOffset() && "unexpected offset");
3468 return Addr.getBasePointer();
3469 }
3470
3471 llvm::Value *getDirectValue() const {
3472 assert(!isIndirect());
3473 return Value;
3474 }
3475
3477 assert(isIndirect());
3478 return Addr;
3479 }
3480 };
3481
3482 /// EmitParmDecl - Emit a ParmVarDecl or an ImplicitParamDecl.
3483 void EmitParmDecl(const VarDecl &D, ParamValue Arg, unsigned ArgNo);
3484
3485 /// protectFromPeepholes - Protect a value that we're intending to
3486 /// store to the side, but which will probably be used later, from
3487 /// aggressive peepholing optimizations that might delete it.
3488 ///
3489 /// Pass the result to unprotectFromPeepholes to declare that
3490 /// protection is no longer required.
3491 ///
3492 /// There's no particular reason why this shouldn't apply to
3493 /// l-values, it's just that no existing peepholes work on pointers.
3496
3497 void emitAlignmentAssumptionCheck(llvm::Value *Ptr, QualType Ty,
3499 SourceLocation AssumptionLoc,
3500 llvm::Value *Alignment,
3501 llvm::Value *OffsetValue,
3502 llvm::Value *TheCheck,
3503 llvm::Instruction *Assumption);
3504
3505 void emitAlignmentAssumption(llvm::Value *PtrValue, QualType Ty,
3506 SourceLocation Loc, SourceLocation AssumptionLoc,
3507 llvm::Value *Alignment,
3508 llvm::Value *OffsetValue = nullptr);
3509
3510 void emitAlignmentAssumption(llvm::Value *PtrValue, const Expr *E,
3511 SourceLocation AssumptionLoc,
3512 llvm::Value *Alignment,
3513 llvm::Value *OffsetValue = nullptr);
3514
3515 //===--------------------------------------------------------------------===//
3516 // Statement Emission
3517 //===--------------------------------------------------------------------===//
3518
3519 /// EmitStopPoint - Emit a debug stoppoint if we are emitting debug info.
3520 void EmitStopPoint(const Stmt *S);
3521
3522 /// EmitStmt - Emit the code for the statement \arg S. It is legal to call
3523 /// this function even if there is no current insertion point.
3524 ///
3525 /// This function may clear the current insertion point; callers should use
3526 /// EnsureInsertPoint if they wish to subsequently generate code without first
3527 /// calling EmitBlock, EmitBranch, or EmitStmt.
3528 void EmitStmt(const Stmt *S, ArrayRef<const Attr *> Attrs = std::nullopt);
3529
3530 /// EmitSimpleStmt - Try to emit a "simple" statement which does not
3531 /// necessarily require an insertion point or debug information; typically
3532 /// because the statement amounts to a jump or a container of other
3533 /// statements.
3534 ///
3535 /// \return True if the statement was handled.
3537
3538 Address EmitCompoundStmt(const CompoundStmt &S, bool GetLast = false,
3541 bool GetLast = false,
3542 AggValueSlot AVS =
3544
3545 /// EmitLabel - Emit the block for the given label. It is legal to call this
3546 /// function even if there is no current insertion point.
3547 void EmitLabel(const LabelDecl *D); // helper for EmitLabelStmt.
3548
3549 void EmitLabelStmt(const LabelStmt &S);
3551 void EmitGotoStmt(const GotoStmt &S);
3553 void EmitIfStmt(const IfStmt &S);
3554
3556 ArrayRef<const Attr *> Attrs = std::nullopt);
3557 void EmitDoStmt(const DoStmt &S, ArrayRef<const Attr *> Attrs = std::nullopt);
3558 void EmitForStmt(const ForStmt &S,
3559 ArrayRef<const Attr *> Attrs = std::nullopt);
3561 void EmitDeclStmt(const DeclStmt &S);
3562 void EmitBreakStmt(const BreakStmt &S);
3568 void EmitAsmStmt(const AsmStmt &S);
3569
3575
3580 bool ignoreResult = false);
3584 bool ignoreResult = false);
3586 RValue EmitCoroutineIntrinsic(const CallExpr *E, unsigned int IID);
3587
3588 void EnterCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock = false);
3589 void ExitCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock = false);
3590
3596 void VolatilizeTryBlocks(llvm::BasicBlock *BB,
3598
3600 llvm::Function *FinallyFunc);
3602 const Stmt *OutlinedStmt);
3603
3605 const SEHExceptStmt &Except);
3606
3608 const SEHFinallyStmt &Finally);
3609
3611 llvm::Value *ParentFP,
3612 llvm::Value *EntryEBP);
3613 llvm::Value *EmitSEHExceptionCode();
3614 llvm::Value *EmitSEHExceptionInfo();
3616
3617 /// Emit simple code for OpenMP directives in Simd-only mode.
3619
3620 /// Scan the outlined statement for captures from the parent function. For
3621 /// each capture, mark the capture as escaped and emit a call to
3622 /// llvm.localrecover. Insert the localrecover result into the LocalDeclMap.
3624 bool IsFilter);
3625
3626 /// Recovers the address of a local in a parent function. ParentVar is the
3627 /// address of the variable used in the immediate parent function. It can
3628 /// either be an alloca or a call to llvm.localrecover if there are nested
3629 /// outlined functions. ParentFP is the frame pointer of the outermost parent
3630 /// frame.
3632 Address ParentVar,
3633 llvm::Value *ParentFP);
3634
3636 ArrayRef<const Attr *> Attrs = std::nullopt);
3637
3638 /// Controls insertion of cancellation exit blocks in worksharing constructs.
3640 CodeGenFunction &CGF;
3641
3642 public:
3644 bool HasCancel)
3645 : CGF(CGF) {
3646 CGF.OMPCancelStack.enter(CGF, Kind, HasCancel);
3647 }
3648 ~OMPCancelStackRAII() { CGF.OMPCancelStack.exit(CGF); }
3649 };
3650
3651 /// Returns calculated size of the specified type.
3652 llvm::Value *getTypeSize(QualType Ty);
3660 SmallVectorImpl<llvm::Value *> &CapturedVars);
3661 void emitOMPSimpleStore(LValue LVal, RValue RVal, QualType RValTy,
3663 /// Perform element by element copying of arrays with type \a
3664 /// OriginalType from \a SrcAddr to \a DestAddr using copying procedure
3665 /// generated by \a CopyGen.
3666 ///
3667 /// \param DestAddr Address of the destination array.
3668 /// \param SrcAddr Address of the source array.
3669 /// \param OriginalType Type of destination and source arrays.
3670 /// \param CopyGen Copying procedure that copies value of single array element
3671 /// to another single array element.
3673 Address DestAddr, Address SrcAddr, QualType OriginalType,
3674 const llvm::function_ref<void(Address, Address)> CopyGen);
3675 /// Emit proper copying of data from one variable to another.
3676 ///
3677 /// \param OriginalType Original type of the copied variables.
3678 /// \param DestAddr Destination address.
3679 /// \param SrcAddr Source address.
3680 /// \param DestVD Destination variable used in \a CopyExpr (for arrays, has
3681 /// type of the base array element).
3682 /// \param SrcVD Source variable used in \a CopyExpr (for arrays, has type of
3683 /// the base array element).
3684 /// \param Copy Actual copygin expression for copying data from \a SrcVD to \a
3685 /// DestVD.
3686 void EmitOMPCopy(QualType OriginalType,
3687 Address DestAddr, Address SrcAddr,
3688 const VarDecl *DestVD, const VarDecl *SrcVD,
3689 const Expr *Copy);
3690 /// Emit atomic update code for constructs: \a X = \a X \a BO \a E or
3691 /// \a X = \a E \a BO \a E.
3692 ///
3693 /// \param X Value to be updated.
3694 /// \param E Update value.
3695 /// \param BO Binary operation for update operation.
3696 /// \param IsXLHSInRHSPart true if \a X is LHS in RHS part of the update
3697 /// expression, false otherwise.
3698 /// \param AO Atomic ordering of the generated atomic instructions.
3699 /// \param CommonGen Code generator for complex expressions that cannot be
3700 /// expressed through atomicrmw instruction.
3701 /// \returns <true, OldAtomicValue> if simple 'atomicrmw' instruction was
3702 /// generated, <false, RValue::get(nullptr)> otherwise.
3703 std::pair<bool, RValue> EmitOMPAtomicSimpleUpdateExpr(
3704 LValue X, RValue E, BinaryOperatorKind BO, bool IsXLHSInRHSPart,
3705 llvm::AtomicOrdering AO, SourceLocation Loc,
3706 const llvm::function_ref<RValue(RValue)> CommonGen);
3708 OMPPrivateScope &PrivateScope);
3710 OMPPrivateScope &PrivateScope);
3712 const OMPUseDevicePtrClause &C, OMPPrivateScope &PrivateScope,
3713 const llvm::DenseMap<const ValueDecl *, llvm::Value *>
3714 CaptureDeviceAddrMap);
3716 const OMPUseDeviceAddrClause &C, OMPPrivateScope &PrivateScope,
3717 const llvm::DenseMap<const ValueDecl *, llvm::Value *>
3718 CaptureDeviceAddrMap);
3719 /// Emit code for copyin clause in \a D directive. The next code is
3720 /// generated at the start of outlined functions for directives:
3721 /// \code
3722 /// threadprivate_var1 = master_threadprivate_var1;
3723 /// operator=(threadprivate_var2, master_threadprivate_var2);
3724 /// ...
3725 /// __kmpc_barrier(&loc, global_tid);
3726 /// \endcode
3727 ///
3728 /// \param D OpenMP directive possibly with 'copyin' clause(s).
3729 /// \returns true if at least one copyin variable is found, false otherwise.
3731 /// Emit initial code for lastprivate variables. If some variable is
3732 /// not also firstprivate, then the default initialization is used. Otherwise
3733 /// initialization of this variable is performed by EmitOMPFirstprivateClause
3734 /// method.
3735 ///
3736 /// \param D Directive that may have 'lastprivate' directives.
3737 /// \param PrivateScope Private scope for capturing lastprivate variables for
3738 /// proper codegen in internal captured statement.
3739 ///
3740 /// \returns true if there is at least one lastprivate variable, false
3741 /// otherwise.
3743 OMPPrivateScope &PrivateScope);
3744 /// Emit final copying of lastprivate values to original variables at
3745 /// the end of the worksharing or simd directive.
3746 ///
3747 /// \param D Directive that has at least one 'lastprivate' directives.
3748 /// \param IsLastIterCond Boolean condition that must be set to 'i1 true' if
3749 /// it is the last iteration of the loop code in associated directive, or to
3750 /// 'i1 false' otherwise. If this item is nullptr, no final check is required.
3752 bool NoFinals,
3753 llvm::Value *IsLastIterCond = nullptr);
3754 /// Emit initial code for linear clauses.
3756 CodeGenFunction::OMPPrivateScope &PrivateScope);
3757 /// Emit final code for linear clauses.
3758 /// \param CondGen Optional conditional code for final part of codegen for
3759 /// linear clause.
3761 const OMPLoopDirective &D,
3762 const llvm::function_ref<llvm::Value *(CodeGenFunction &)> CondGen);
3763 /// Emit initial code for reduction variables. Creates reduction copies
3764 /// and initializes them with the values according to OpenMP standard.
3765 ///
3766 /// \param D Directive (possibly) with the 'reduction' clause.
3767 /// \param PrivateScope Private scope for capturing reduction variables for
3768 /// proper codegen in internal captured statement.
3769 ///
3771 OMPPrivateScope &PrivateScope,
3772 bool ForInscan = false);
3773 /// Emit final update of reduction values to original variables at
3774 /// the end of the directive.
3775 ///
3776 /// \param D Directive that has at least one 'reduction' directives.
3777 /// \param ReductionKind The kind of reduction to perform.
3779 const OpenMPDirectiveKind ReductionKind);
3780 /// Emit initial code for linear variables. Creates private copies
3781 /// and initializes them with the values according to OpenMP standard.
3782 ///
3783 /// \param D Directive (possibly) with the 'linear' clause.
3784 /// \return true if at least one linear variable is found that should be
3785 /// initialized with the value of the original variable, false otherwise.
3787
3788 typedef const llvm::function_ref<void(CodeGenFunction & /*CGF*/,
3789 llvm::Function * /*OutlinedFn*/,
3790 const OMPTaskDataTy & /*Data*/)>
3793 const OpenMPDirectiveKind CapturedRegion,
3794 const RegionCodeGenTy &BodyGen,
3795 const TaskGenTy &TaskGen, OMPTaskDataTy &Data);
3802 explicit OMPTargetDataInfo() = default;
3805 unsigned NumberOfTargetItems)
3809 };
3811 const RegionCodeGenTy &BodyGen,
3812 OMPTargetDataInfo &InputInfo);
3815 CodeGenFunction &CGF,
3816 const CapturedStmt *CS,
3854 void
3857 void
3864 void
3880 void
3904
3905 /// Emit device code for the target directive.
3907 StringRef ParentName,
3908 const OMPTargetDirective &S);
3909 static void
3912 /// Emit device code for the target parallel for directive.
3914 CodeGenModule &CGM, StringRef ParentName,
3916 /// Emit device code for the target parallel for simd directive.
3918 CodeGenModule &CGM, StringRef ParentName,
3920 /// Emit device code for the target teams directive.
3921 static void
3923 const OMPTargetTeamsDirective &S);
3924 /// Emit device code for the target teams distribute directive.
3926 CodeGenModule &CGM, StringRef ParentName,
3928 /// Emit device code for the target teams distribute simd directive.
3930 CodeGenModule &CGM, StringRef ParentName,
3932 /// Emit device code for the target simd directive.
3934 StringRef ParentName,
3935 const OMPTargetSimdDirective &S);
3936 /// Emit device code for the target teams distribute parallel for simd
3937 /// directive.
3939 CodeGenModule &CGM, StringRef ParentName,
3941
3942 /// Emit device code for the target teams loop directive.
3944 CodeGenModule &CGM, StringRef ParentName,
3946
3947 /// Emit device code for the target parallel loop directive.
3949 CodeGenModule &CGM, StringRef ParentName,
3951
3953 CodeGenModule &CGM, StringRef ParentName,
3955
3956 /// Emit the Stmt \p S and return its topmost canonical loop, if any.
3957 /// TODO: The \p Depth paramter is not yet implemented and must be 1. In the
3958 /// future it is meant to be the number of loops expected in the loop nests
3959 /// (usually specified by the "collapse" clause) that are collapsed to a
3960 /// single loop by this function.
3961 llvm::CanonicalLoopInfo *EmitOMPCollapsedCanonicalLoopNest(const Stmt *S,
3962 int Depth);
3963
3964 /// Emit an OMPCanonicalLoop using the OpenMPIRBuilder.
3966
3967 /// Emit inner loop of the worksharing/simd construct.
3968 ///
3969 /// \param S Directive, for which the inner loop must be emitted.
3970 /// \param RequiresCleanup true, if directive has some associated private
3971 /// variables.
3972 /// \param LoopCond Bollean condition for loop continuation.
3973 /// \param IncExpr Increment expression for loop control variable.
3974 /// \param BodyGen Generator for the inner body of the inner loop.
3975 /// \param PostIncGen Genrator for post-increment code (required for ordered
3976 /// loop directvies).
3978 const OMPExecutableDirective &S, bool RequiresCleanup,
3979 const Expr *LoopCond, const Expr *IncExpr,
3980 const llvm::function_ref<void(CodeGenFunction &)> BodyGen,
3981 const llvm::function_ref<void(CodeGenFunction &)> PostIncGen);
3982
3984 /// Emit initial code for loop counters of loop-based directives.
3986 OMPPrivateScope &LoopScope);
3987
3988 /// Helper for the OpenMP loop directives.
3990
3991 /// Emit code for the worksharing loop-based directive.
3992 /// \return true, if this construct has any lastprivate clause, false -
3993 /// otherwise.
3995 const CodeGenLoopBoundsTy &CodeGenLoopBounds,
3996 const CodeGenDispatchBoundsTy &CGDispatchBounds);
3997
3998 /// Emit code for the distribute loop-based directive.
4000 const CodeGenLoopTy &CodeGenLoop, Expr *IncExpr);
4001
4002 /// Helpers for the OpenMP loop directives.
4005 const OMPLoopDirective &D,
4006 const llvm::function_ref<llvm::Value *(CodeGenFunction &)> CondGen);
4007
4008 /// Emits the lvalue for the expression with possibly captured variable.
4010
4011private:
4012 /// Helpers for blocks.
4013 llvm::Value *EmitBlockLiteral(const CGBlockInfo &Info);
4014
4015 /// struct with the values to be passed to the OpenMP loop-related functions
4016 struct OMPLoopArguments {
4017 /// loop lower bound
4019 /// loop upper bound
4021 /// loop stride
4023 /// isLastIteration argument for runtime functions
4025 /// Chunk value generated by sema
4026 llvm::Value *Chunk = nullptr;
4027 /// EnsureUpperBound
4028 Expr *EUB = nullptr;
4029 /// IncrementExpression
4030 Expr *IncExpr = nullptr;
4031 /// Loop initialization
4032 Expr *Init = nullptr;
4033 /// Loop exit condition
4034 Expr *Cond = nullptr;
4035 /// Update of LB after a whole chunk has been executed
4036 Expr *NextLB = nullptr;
4037 /// Update of UB after a whole chunk has been executed
4038 Expr *NextUB = nullptr;
4039 /// Distinguish between the for distribute and sections
4040 OpenMPDirectiveKind DKind = llvm::omp::OMPD_unknown;
4041 OMPLoopArguments() = default;
4042 OMPLoopArguments(Address LB, Address UB, Address ST, Address IL,
4043 llvm::Value *Chunk = nullptr, Expr *EUB = nullptr,
4044 Expr *IncExpr = nullptr, Expr *Init = nullptr,
4045 Expr *Cond = nullptr, Expr *NextLB = nullptr,
4046 Expr *NextUB = nullptr)
4047 : LB(LB), UB(UB), ST(ST), IL(IL), Chunk(Chunk), EUB(EUB),
4048 IncExpr(IncExpr), Init(Init), Cond(Cond), NextLB(NextLB),
4049 NextUB(NextUB) {}
4050 };
4051 void EmitOMPOuterLoop(bool DynamicOrOrdered, bool IsMonotonic,
4052 const OMPLoopDirective &S, OMPPrivateScope &LoopScope,
4053 const OMPLoopArguments &LoopArgs,
4054 const CodeGenLoopTy &CodeGenLoop,
4055 const CodeGenOrderedTy &CodeGenOrdered);
4056 void EmitOMPForOuterLoop(const OpenMPScheduleTy &ScheduleKind,
4057 bool IsMonotonic, const OMPLoopDirective &S,
4058 OMPPrivateScope &LoopScope, bool Ordered,
4059 const OMPLoopArguments &LoopArgs,
4060 const CodeGenDispatchBoundsTy &CGDispatchBounds);
4061 void EmitOMPDistributeOuterLoop(OpenMPDistScheduleClauseKind ScheduleKind,
4062 const OMPLoopDirective &S,
4063 OMPPrivateScope &LoopScope,
4064 const OMPLoopArguments &LoopArgs,
4065 const CodeGenLoopTy &CodeGenLoopContent);
4066 /// Emit code for sections directive.
4067 void EmitSections(const OMPExecutableDirective &S);
4068
4069public:
4070 //===--------------------------------------------------------------------===//
4071 // OpenACC Emission
4072 //===--------------------------------------------------------------------===//
4074 // TODO OpenACC: Implement this. It is currently implemented as a 'no-op',
4075 // simply emitting its structured block, but in the future we will implement
4076 // some sort of IR.
4077 EmitStmt(S.getStructuredBlock());
4078 }
4079
4081 // TODO OpenACC: Implement this. It is currently implemented as a 'no-op',
4082 // simply emitting its loop, but in the future we will implement
4083 // some sort of IR.
4084 EmitStmt(S.getLoop());
4085 }
4086
4087 //===--------------------------------------------------------------------===//
4088 // LValue Expression Emission
4089 //===--------------------------------------------------------------------===//
4090
4091 /// Create a check that a scalar RValue is non-null.
4093
4094 /// GetUndefRValue - Get an appropriate 'undef' rvalue for the given type.
4096
4097 /// EmitUnsupportedRValue - Emit a dummy r-value using the type of E
4098 /// and issue an ErrorUnsupported style diagnostic (using the
4099 /// provided Name).
4101 const char *Name);
4102
4103 /// EmitUnsupportedLValue - Emit a dummy l-value using the type of E and issue
4104 /// an ErrorUnsupported style diagnostic (using the provided Name).
4106 const char *Name);
4107
4108 /// EmitLValue - Emit code to compute a designator that specifies the location
4109 /// of the expression.
4110 ///
4111 /// This can return one of two things: a simple address or a bitfield
4112 /// reference. In either case, the LLVM Value* in the LValue structure is
4113 /// guaranteed to be an LLVM pointer type.
4114 ///
4115 /// If this returns a bitfield reference, nothing about the pointee type of
4116 /// the LLVM value is known: For example, it may not be a pointer to an
4117 /// integer.
4118 ///
4119 /// If this returns a normal address, and if the lvalue's C type is fixed
4120 /// size, this method guarantees that the returned pointer type will point to
4121 /// an LLVM type of the same size of the lvalue's type. If the lvalue has a
4122 /// variable length type, this is not possible.
4123 ///
4125 KnownNonNull_t IsKnownNonNull = NotKnownNonNull);
4126
4127private:
4128 LValue EmitLValueHelper(const Expr *E, KnownNonNull_t IsKnownNonNull);
4129
4130public:
4131 /// Same as EmitLValue but additionally we generate checking code to
4132 /// guard against undefined behavior. This is only suitable when we know
4133 /// that the address will be used to access the object.
4135
4138
4139 void EmitAtomicInit(Expr *E, LValue lvalue);
4140
4142
4145
4147 llvm::AtomicOrdering AO, bool IsVolatile = false,
4149
4150 void EmitAtomicStore(RValue rvalue, LValue lvalue, bool isInit);
4151
4152 void EmitAtomicStore(RValue rvalue, LValue lvalue, llvm::AtomicOrdering AO,
4153 bool IsVolatile, bool isInit);
4154
4155 std::pair<RValue, llvm::Value *> EmitAtomicCompareExchange(
4157 llvm::AtomicOrdering Success =
4158 llvm::AtomicOrdering::SequentiallyConsistent,
4159 llvm::AtomicOrdering Failure =
4160 llvm::AtomicOrdering::SequentiallyConsistent,
4161 bool IsWeak = false, AggValueSlot Slot = AggValueSlot::ignored());
4162
4163 void EmitAtomicUpdate(LValue LVal, llvm::AtomicOrdering AO,
4164 const llvm::function_ref<RValue(RValue)> &UpdateOp,
4165 bool IsVolatile);
4166
4167 /// EmitToMemory - Change a scalar value from its value
4168 /// representation to its in-memory representation.
4169 llvm::Value *EmitToMemory(llvm::Value *Value, QualType Ty);
4170
4171 /// EmitFromMemory - Change a scalar value from its memory
4172 /// representation to its value representation.
4173 llvm::Value *EmitFromMemory(llvm::Value *Value, QualType Ty);
4174
4175 /// Check if the scalar \p Value is within the valid range for the given
4176 /// type \p Ty.
4177 ///
4178 /// Returns true if a check is needed (even if the range is unknown).
4179 bool EmitScalarRangeCheck(llvm::Value *Value, QualType Ty,
4181
4182 /// EmitLoadOfScalar - Load a scalar value from an address, taking
4183 /// care to appropriately convert from the memory representation to
4184 /// the LLVM value representation.
4185 llvm::Value *EmitLoadOfScalar(Address Addr, bool Volatile, QualType Ty,
4188 bool isNontemporal = false) {
4189 return EmitLoadOfScalar(Addr, Volatile, Ty, Loc, LValueBaseInfo(Source),
4190 CGM.getTBAAAccessInfo(Ty), isNontemporal);
4191 }
4192
4193 llvm::Value *EmitLoadOfScalar(Address Addr, bool Volatile, QualType Ty,
4195 TBAAAccessInfo TBAAInfo,
4196 bool isNontemporal = false);
4197
4198 /// EmitLoadOfScalar - Load a scalar value from an address, taking
4199 /// care to appropriately convert from the memory representation to
4200 /// the LLVM value representation. The l-value must be a simple
4201 /// l-value.
4203
4204 /// EmitStoreOfScalar - Store a scalar value to an address, taking
4205 /// care to appropriately convert from the memory representation to
4206 /// the LLVM value representation.
4207 void EmitStoreOfScalar(llvm::Value *Value, Address Addr,
4208 bool Volatile, QualType Ty,
4210 bool isInit = false, bool isNontemporal = false) {
4211 EmitStoreOfScalar(Value, Addr, Volatile, Ty, LValueBaseInfo(Source),
4212 CGM.getTBAAAccessInfo(Ty), isInit, isNontemporal);
4213 }
4214
4215 void EmitStoreOfScalar(llvm::Value *Value, Address Addr,
4216 bool Volatile, QualType Ty,
4217 LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo,
4218 bool isInit = false, bool isNontemporal = false);
4219
4220 /// EmitStoreOfScalar - Store a scalar value to an address, taking
4221 /// care to appropriately convert from the memory representation to
4222 /// the LLVM value representation. The l-value must be a simple
4223 /// l-value. The isInit flag indicates whether this is an initialization.
4224 /// If so, atomic qualifiers are ignored and the store is always non-atomic.
4225 void EmitStoreOfScalar(llvm::Value *value, LValue lvalue, bool isInit=false);
4226
4227 /// EmitLoadOfLValue - Given an expression that represents a value lvalue,
4228 /// this method emits the address of the lvalue, then loads the result as an
4229 /// rvalue, returning the rvalue.
4234
4235 /// Like EmitLoadOfLValue but also handles complex and aggregate types.
4238 SourceLocation Loc = {});
4239
4240 /// EmitStoreThroughLValue - Store the specified rvalue into the specified
4241 /// lvalue, where both are guaranteed to the have the same type, and that type
4242 /// is 'Ty'.
4243 void EmitStoreThroughLValue(RValue Src, LValue Dst, bool isInit = false);
4246
4247 /// EmitStoreThroughBitfieldLValue - Store Src into Dst with same constraints
4248 /// as EmitStoreThroughLValue.
4249 ///
4250 /// \param Result [out] - If non-null, this will be set to a Value* for the
4251 /// bit-field contents after the store, appropriate for use as the result of
4252 /// an assignment to the bit-field.
4254 llvm::Value **Result=nullptr);
4255
4256 /// Emit an l-value for an assignment (simple or compound) of complex type.
4260 llvm::Value *&Result);
4261
4262 // Note: only available for agg return types
4265 // Note: only available for agg return types
4267 // Note: only available for agg return types
4275 bool Accessed = false);
4278 bool IsLowerBound = true);
4289
4291
4293
4295 LValueBaseInfo *BaseInfo = nullptr,
4296 TBAAAccessInfo *TBAAInfo = nullptr);
4297
4299 llvm::PointerIntPair<llvm::Constant*, 1, bool> ValueAndIsReference;
4300 ConstantEmission(llvm::Constant *C, bool isReference)
4301 : ValueAndIsReference(C, isReference) {}
4302 public:
4304 static ConstantEmission forReference(llvm::Constant *C) {
4305 return ConstantEmission(C, true);
4306 }
4307 static ConstantEmission forValue(llvm::Constant *C) {
4308 return ConstantEmission(C, false);
4309 }
4310
4311 explicit operator bool() const {
4312 return ValueAndIsReference.getOpaqueValue() != nullptr;
4313 }
4314
4315 bool isReference() const { return ValueAndIsReference.getInt(); }
4317 assert(isReference());
4318 return CGF.MakeNaturalAlignAddrLValue(ValueAndIsReference.getPointer(),
4319 refExpr->getType());
4320 }
4321
4322 llvm::Constant *getValue() const {
4323 assert(!isReference());
4324 return ValueAndIsReference.getPointer();
4325 }
4326 };
4327
4330 llvm::Value *emitScalarConstant(const ConstantEmission &Constant, Expr *E);
4331
4335
4337 const ObjCIvarDecl *Ivar);
4339 const ObjCIvarDecl *Ivar);
4343 llvm::Value *ThisValue);
4344
4345 /// EmitLValueForFieldInitialization - Like EmitLValueForField, except that
4346 /// if the Field is a reference, this will return the address of the reference
4347 /// and not the address of the value stored in the reference.
4349 const FieldDecl* Field);
4350
4352 llvm::Value* Base, const ObjCIvarDecl *Ivar,
4353 unsigned CVRQualifiers);
4354
4359
4366
4367 //===--------------------------------------------------------------------===//
4368 // Scalar Expression Emission
4369 //===--------------------------------------------------------------------===//
4370
4371 /// EmitCall - Generate a call of the given function, expecting the given
4372 /// result type, and using the given argument list which specifies both the
4373 /// LLVM arguments and the types they were derived from.
4374 RValue EmitCall(const CGFunctionInfo &CallInfo, const CGCallee &Callee,
4376 llvm::CallBase **callOrInvoke, bool IsMustTail,
4378 bool IsVirtualFunctionPointerThunk = false);
4379 RValue EmitCall(const CGFunctionInfo &CallInfo, const CGCallee &Callee,
4381 llvm::CallBase **callOrInvoke = nullptr,
4382 bool IsMustTail = false) {
4383 return EmitCall(CallInfo, Callee, ReturnValue, Args, callOrInvoke,
4384 IsMustTail, SourceLocation());
4385 }
4386 RValue EmitCall(QualType FnType, const CGCallee &Callee, const CallExpr *E,
4387 ReturnValueSlot ReturnValue, llvm::Value *Chain = nullptr);
4392
4393 void checkTargetFeatures(const CallExpr *E, const FunctionDecl *TargetDecl);
4395
4396 llvm::CallInst *EmitRuntimeCall(llvm::FunctionCallee callee,
4397 const Twine &name = "");
4398 llvm::CallInst *EmitRuntimeCall(llvm::FunctionCallee callee,
4400 const Twine &name = "");
4401 llvm::CallInst *EmitNounwindRuntimeCall(llvm::FunctionCallee callee,
4402 const Twine &name = "");
4403 llvm::CallInst *EmitNounwindRuntimeCall(llvm::FunctionCallee callee,
4404 ArrayRef<Address> args,
4405 const Twine &name = "");
4406 llvm::CallInst *EmitNounwindRuntimeCall(llvm::FunctionCallee callee,
4408 const Twine &name = "");
4409
4411 getBundlesForFunclet(llvm::Value *Callee);
4412
4413 llvm::CallBase *EmitCallOrInvoke(llvm::FunctionCallee Callee,
4415 const Twine &Name = "");
4416 llvm::CallBase *EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee,
4418 const Twine &name = "");
4419 llvm::CallBase *EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee,
4420 const Twine &name = "");
4421 void EmitNoreturnRuntimeCallOrInvoke(llvm::FunctionCallee callee,
4423
4425 NestedNameSpecifier *Qual,
4426 llvm::Type *Ty);
4427
4430 const CXXRecordDecl *RD);
4431
4433
4434 /// Create the discriminator from the storage address and the entity hash.
4435 llvm::Value *EmitPointerAuthBlendDiscriminator(llvm::Value *StorageAddress,
4436 llvm::Value *Discriminator);
4438 llvm::Value *StorageAddress,
4439 GlobalDecl SchemaDecl,
4440 QualType SchemaType);
4441
4442 llvm::Value *EmitPointerAuthSign(const CGPointerAuthInfo &Info,
4443 llvm::Value *Pointer);
4444
4445 llvm::Value *EmitPointerAuthAuth(const CGPointerAuthInfo &Info,
4446 llvm::Value *Pointer);
4447
4449 const CGPointerAuthInfo &CurAuthInfo,
4450 const CGPointerAuthInfo &NewAuthInfo,
4451 bool IsKnownNonNull);
4452 llvm::Value *emitPointerAuthResignCall(llvm::Value *Pointer,
4453 const CGPointerAuthInfo &CurInfo,
4454 const CGPointerAuthInfo &NewInfo);
4455
4457 const CGPointerAuthInfo &Info,
4459
4460 llvm::Value *authPointerToPointerCast(llvm::Value *ResultPtr,
4461 QualType SourceType, QualType DestType);
4463 QualType DestType);
4464
4466
4467 llvm::Value *getAsNaturalPointerTo(Address Addr, QualType PointeeType) {
4468 return getAsNaturalAddressOf(Addr, PointeeType).getBasePointer();
4469 }
4470
4471 // Return the copy constructor name with the prefix "__copy_constructor_"
4472 // removed.
4474 CharUnits Alignment,
4475 bool IsVolatile,
4476 ASTContext &Ctx);
4477
4478 // Return the destructor name with the prefix "__destructor_" removed.
4480 CharUnits Alignment,
4481 bool IsVolatile,
4482 ASTContext &Ctx);
4483
4484 // These functions emit calls to the special functions of non-trivial C
4485 // structs.
4493
4494 RValue
4496 const CGCallee &Callee,
4497 ReturnValueSlot ReturnValue, llvm::Value *This,
4498 llvm::Value *ImplicitParam,
4499 QualType ImplicitParamTy, const CallExpr *E,
4500 CallArgList *RtlArgs);
4502 llvm::Value *This, QualType ThisTy,
4503 llvm::Value *ImplicitParam,
4504 QualType ImplicitParamTy, const CallExpr *E);
4508 const CXXMethodDecl *MD,
4510 bool HasQualifier,
4511 NestedNameSpecifier *Qualifier,
4512 bool IsArrow, const Expr *Base);
4513 // Compute the object pointer.
4515 llvm::Value *memberPtr,
4516 const MemberPointerType *memberPtrType,
4517 LValueBaseInfo *BaseInfo = nullptr,
4518 TBAAAccessInfo *TBAAInfo = nullptr);
4521
4523 const CXXMethodDecl *MD,
4526
4529
4533
4534 RValue EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
4536
4537 RValue emitRotate(const CallExpr *E, bool IsRotateRight);
4538
4539 /// Emit IR for __builtin_os_log_format.
4541
4542 /// Emit IR for __builtin_is_aligned.
4544 /// Emit IR for __builtin_align_up/__builtin_align_down.
4545 RValue EmitBuiltinAlignTo(const CallExpr *E, bool AlignUp);
4546
4549 CharUnits BufferAlignment);
4550
4552
4553 /// EmitTargetBuiltinExpr - Emit the given builtin call. Returns 0 if the call
4554 /// is unhandled by the current target.
4555 llvm::Value *EmitTargetBuiltinExpr(unsigned BuiltinID, const CallExpr *E,
4557
4558 llvm::Value *EmitAArch64CompareBuiltinExpr(llvm::Value *Op, llvm::Type *Ty,
4559 const llvm::CmpInst::Predicate Fp,
4560 const llvm::CmpInst::Predicate Ip,
4561 const llvm::Twine &Name = "");
4562 llvm::Value *EmitARMBuiltinExpr(unsigned BuiltinID, const CallExpr *E,
4564 llvm::Triple::ArchType Arch);
4565 llvm::Value *EmitARMMVEBuiltinExpr(unsigned BuiltinID, const CallExpr *E,
4567 llvm::Triple::ArchType Arch);
4568 llvm::Value *EmitARMCDEBuiltinExpr(unsigned BuiltinID, const CallExpr *E,
4570 llvm::Triple::ArchType Arch);
4571 llvm::Value *EmitCMSEClearRecord(llvm::Value *V, llvm::IntegerType *ITy,
4572 QualType RTy);
4573 llvm::Value *EmitCMSEClearRecord(llvm::Value *V, llvm::ArrayType *ATy,
4574 QualType RTy);
4575
4576 llvm::Value *EmitCommonNeonBuiltinExpr(unsigned BuiltinID,
4577 unsigned LLVMIntrinsic,
4578 unsigned AltLLVMIntrinsic,
4579 const char *NameHint,
4580 unsigned Modifier,
4581 const CallExpr *E,
4583 Address PtrOp0, Address PtrOp1,
4584 llvm::Triple::ArchType Arch);
4585
4586 llvm::Function *LookupNeonLLVMIntrinsic(unsigned IntrinsicID,
4587 unsigned Modifier, llvm::Type *ArgTy,
4588 const CallExpr *E);
4589 llvm::Value *EmitNeonCall(llvm::Function *F,
4591 const char *name,
4592 unsigned shift = 0, bool rightshift = false);
4593 llvm::Value *EmitNeonSplat(llvm::Value *V, llvm::Constant *Idx,
4594 const llvm::ElementCount &Count);
4595 llvm::Value *EmitNeonSplat(llvm::Value *V, llvm::Constant *Idx);
4596 llvm::Value *EmitNeonShiftVector(llvm::Value *V, llvm::Type *Ty,
4597 bool negateForRightShift);
4598 llvm::Value *EmitNeonRShiftImm(llvm::Value *Vec, llvm::Value *Amt,
4599 llvm::Type *Ty, bool usgn, const char *name);
4600 llvm::Value *vectorWrapScalar16(llvm::Value *Op);
4601 /// SVEBuiltinMemEltTy - Returns the memory element type for this memory
4602 /// access builtin. Only required if it can't be inferred from the base
4603 /// pointer operand.
4604 llvm::Type *SVEBuiltinMemEltTy(const SVETypeFlags &TypeFlags);
4605
4607 getSVEOverloadTypes(const SVETypeFlags &TypeFlags, llvm::Type *ReturnType,
4609 llvm::Type *getEltType(const SVETypeFlags &TypeFlags);
4610 llvm::ScalableVectorType *getSVEType(const SVETypeFlags &TypeFlags);
4611 llvm::ScalableVectorType *getSVEPredType(const SVETypeFlags &TypeFlags);
4612 llvm::Value *EmitSVETupleSetOrGet(const SVETypeFlags &TypeFlags,
4613 llvm::Type *ReturnType,
4615 llvm::Value *EmitSVETupleCreate(const SVETypeFlags &TypeFlags,
4616 llvm::Type *ReturnType,
4618 llvm::Value *EmitSVEAllTruePred(const SVETypeFlags &TypeFlags);
4619 llvm::Value *EmitSVEDupX(llvm::Value *Scalar);
4620 llvm::Value *EmitSVEDupX(llvm::Value *Scalar, llvm::Type *Ty);
4621 llvm::Value *EmitSVEReinterpret(llvm::Value *Val, llvm::Type *Ty);
4622 llvm::Value *EmitSVEPMull(const SVETypeFlags &TypeFlags,
4624 unsigned BuiltinID);
4625 llvm::Value *EmitSVEMovl(const SVETypeFlags &TypeFlags,
4627 unsigned BuiltinID);
4628 llvm::Value *EmitSVEPredicateCast(llvm::Value *Pred,
4629 llvm::ScalableVectorType *VTy);
4630 llvm::Value *EmitSVEGatherLoad(const SVETypeFlags &TypeFlags,
4632 unsigned IntID);
4633 llvm::Value *EmitSVEScatterStore(const SVETypeFlags &TypeFlags,
4635 unsigned IntID);
4636 llvm::Value *EmitSVEMaskedLoad(const CallExpr *, llvm::Type *ReturnTy,
4638 unsigned BuiltinID, bool IsZExtReturn);
4639 llvm::Value *EmitSVEMaskedStore(const CallExpr *,
4641 unsigned BuiltinID);
4642 llvm::Value *EmitSVEPrefetchLoad(const SVETypeFlags &TypeFlags,
4644 unsigned BuiltinID);
4645 llvm::Value *EmitSVEGatherPrefetch(const SVETypeFlags &TypeFlags,
4647 unsigned IntID);
4648 llvm::Value *EmitSVEStructLoad(const SVETypeFlags &TypeFlags,
4650 unsigned IntID);
4651 llvm::Value *EmitSVEStructStore(const SVETypeFlags &TypeFlags,
4653 unsigned IntID);
4654 /// FormSVEBuiltinResult - Returns the struct of scalable vectors as a wider
4655 /// vector. It extracts the scalable vector from the struct and inserts into
4656 /// the wider vector. This avoids the error when allocating space in llvm
4657 /// for struct of scalable vectors if a function returns struct.
4658 llvm::Value *FormSVEBuiltinResult(llvm::Value *Call);
4659
4660 llvm::Value *EmitAArch64SVEBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4661
4662 llvm::Value *EmitSMELd1St1(const SVETypeFlags &TypeFlags,
4664 unsigned IntID);
4665 llvm::Value *EmitSMEReadWrite(const SVETypeFlags &TypeFlags,
4667 unsigned IntID);
4668 llvm::Value *EmitSMEZero(const SVETypeFlags &TypeFlags,
4670 unsigned IntID);
4671 llvm::Value *EmitSMELdrStr(const SVETypeFlags &TypeFlags,
4673 unsigned IntID);
4674
4675 void GetAArch64SVEProcessedOperands(unsigned BuiltinID, const CallExpr *E,
4677 SVETypeFlags TypeFlags);
4678
4679 llvm::Value *EmitAArch64SMEBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4680
4681 llvm::Value *EmitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E,
4682 llvm::Triple::ArchType Arch);
4683 llvm::Value *EmitBPFBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4684
4686 llvm::Value *EmitX86BuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4687 llvm::Value *EmitPPCBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4688 llvm::Value *EmitAMDGPUBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4689 llvm::Value *EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4690 llvm::Value *EmitScalarOrConstFoldImmArg(unsigned ICEArguments, unsigned Idx,
4691 const CallExpr *E);
4692 llvm::Value *EmitSystemZBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4693 llvm::Value *EmitNVPTXBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4694 llvm::Value *EmitWebAssemblyBuiltinExpr(unsigned BuiltinID,
4695 const CallExpr *E);
4696 llvm::Value *EmitHexagonBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4697 llvm::Value *EmitRISCVBuiltinExpr(unsigned BuiltinID, const CallExpr *E,
4699
4700 llvm::Value *EmitRISCVCpuSupports(const CallExpr *E);
4701 llvm::Value *EmitRISCVCpuInit();
4702
4703 void AddAMDGPUFenceAddressSpaceMMRA(llvm::Instruction *Inst,
4704 const CallExpr *E);
4705 void ProcessOrderScopeAMDGCN(llvm::Value *Order, llvm::Value *Scope,
4706 llvm::AtomicOrdering &AO,
4707 llvm::SyncScope::ID &SSID);
4708
4709 enum class MSVCIntrin;
4710 llvm::Value *EmitMSVCBuiltinExpr(MSVCIntrin BuiltinID, const CallExpr *E);
4711
4712 llvm::Value *EmitBuiltinAvailable(const VersionTuple &Version);
4713
4716 llvm::Value *EmitObjCBoxedExpr(const ObjCBoxedExpr *E);
4719 llvm::Value *EmitObjCCollectionLiteral(const Expr *E,
4720 const ObjCMethodDecl *MethodWithObjects);
4723 ReturnValueSlot Return = ReturnValueSlot());
4724
4725 /// Retrieves the default cleanup kind for an ARC cleanup.
4726 /// Except under -fobjc-arc-eh, ARC cleanups are normal-only.
4728 return CGM.getCodeGenOpts().ObjCAutoRefCountExceptions
4730 }
4731
4732 // ARC primitives.
4733 void EmitARCInitWeak(Address addr, llvm::Value *value);
4735 llvm::Value *EmitARCLoadWeak(Address addr);
4737 llvm::Value *EmitARCStoreWeak(Address addr, llvm::Value *value, bool ignored);
4738 void emitARCCopyAssignWeak(QualType Ty, Address DstAddr, Address SrcAddr);
4739 void emitARCMoveAssignWeak(QualType Ty, Address DstAddr, Address SrcAddr);
4742 llvm::Value *EmitARCRetainAutorelease(QualType type, llvm::Value *value);
4743 llvm::Value *EmitARCRetainAutoreleaseNonBlock(llvm::Value *value);
4744 llvm::Value *EmitARCStoreStrong(LValue lvalue, llvm::Value *value,
4745 bool resultIgnored);
4746 llvm::Value *EmitARCStoreStrongCall(Address addr, llvm::Value *value,
4747 bool resultIgnored);
4748 llvm::Value *EmitARCRetain(QualType type, llvm::Value *value);
4749 llvm::Value *EmitARCRetainNonBlock(llvm::Value *value);
4750 llvm::Value *EmitARCRetainBlock(llvm::Value *value, bool mandatory);
4752 void EmitARCRelease(llvm::Value *value, ARCPreciseLifetime_t precise);
4753 llvm::Value *EmitARCAutorelease(llvm::Value *value);
4754 llvm::Value *EmitARCAutoreleaseReturnValue(llvm::Value *value);
4755 llvm::Value *EmitARCRetainAutoreleaseReturnValue(llvm::Value *value);
4756 llvm::Value *EmitARCRetainAutoreleasedReturnValue(llvm::Value *value);
4757 llvm::Value *EmitARCUnsafeClaimAutoreleasedReturnValue(llvm::Value *value);
4758
4759 llvm::Value *EmitObjCAutorelease(llvm::Value *value, llvm::Type *returnType);
4760 llvm::Value *EmitObjCRetainNonBlock(llvm::Value *value,
4761 llvm::Type *returnType);
4762 void EmitObjCRelease(llvm::Value *value, ARCPreciseLifetime_t precise);
4763
4764 std::pair<LValue,llvm::Value*>
4766 std::pair<LValue,llvm::Value*>
4767 EmitARCStoreStrong(const BinaryOperator *e, bool ignored);
4768 std::pair<LValue,llvm::Value*>
4770
4771 llvm::Value *EmitObjCAlloc(llvm::Value *value,
4772 llvm::Type *returnType);
4773 llvm::Value *EmitObjCAllocWithZone(llvm::Value *value,
4774 llvm::Type *returnType);
4775 llvm::Value *EmitObjCAllocInit(llvm::Value *value, llvm::Type *resultType);
4776
4777 llvm::Value *EmitObjCThrowOperand(const Expr *expr);
4778 llvm::Value *EmitObjCConsumeObject(QualType T, llvm::Value *Ptr);
4779 llvm::Value *EmitObjCExtendObjectLifetime(QualType T, llvm::Value *Ptr);
4780
4781 llvm::Value *EmitARCExtendBlockObject(const Expr *expr);
4782 llvm::Value *EmitARCReclaimReturnedObject(const Expr *e,
4783 bool allowUnsafeClaim);
4784 llvm::Value *EmitARCRetainScalarExpr(const Expr *expr);
4787
4789
4791
4797
4798 void EmitObjCAutoreleasePoolPop(llvm::Value *Ptr);
4801 void EmitObjCAutoreleasePoolCleanup(llvm::Value *Ptr);
4802 void EmitObjCMRRAutoreleasePoolPop(llvm::Value *Ptr);
4803
4804 /// Emits a reference binding to the passed in expression.
4806
4807 //===--------------------------------------------------------------------===//
4808 // Expression Emission
4809 //===--------------------------------------------------------------------===//
4810
4811 // Expressions are broken into three classes: scalar, complex, aggregate.
4812
4813 /// EmitScalarExpr - Emit the computation of the specified expression of LLVM
4814 /// scalar type, returning the result.
4815 llvm::Value *EmitScalarExpr(const Expr *E , bool IgnoreResultAssign = false);
4816
4817 /// Emit a conversion from the specified type to the specified destination
4818 /// type, both of which are LLVM scalar types.
4819 llvm::Value *EmitScalarConversion(llvm::Value *Src, QualType SrcTy,
4820 QualType DstTy, SourceLocation Loc);
4821
4822 /// Emit a conversion from the specified complex type to the specified
4823 /// destination type, where the destination type is an LLVM scalar type.
4825 QualType DstTy,
4827
4828 /// EmitAggExpr - Emit the computation of the specified expression
4829 /// of aggregate type. The result is computed into the given slot,
4830 /// which may be null to indicate that the value is not needed.
4831 void EmitAggExpr(const Expr *E, AggValueSlot AS);
4832
4833 /// EmitAggExprToLValue - Emit the computation of the specified expression of
4834 /// aggregate type into a temporary LValue.
4836
4838
4839 /// EmitAggFinalDestCopy - Emit copy of the specified aggregate into
4840 /// destination address.
4842 ExprValueKind SrcKind);
4843
4844 /// Build all the stores needed to initialize an aggregate at Dest with the
4845 /// value Val.
4846 void EmitAggregateStore(llvm::Value *Val, Address Dest, bool DestIsVolatile);
4847
4848 /// EmitExtendGCLifetime - Given a pointer to an Objective-C object,
4849 /// make sure it survives garbage collection until this point.
4850 void EmitExtendGCLifetime(llvm::Value *object);
4851
4852 /// EmitComplexExpr - Emit the computation of the specified expression of
4853 /// complex type, returning the result.
4855 bool IgnoreReal = false,
4856 bool IgnoreImag = false);
4857
4858 /// EmitComplexExprIntoLValue - Emit the given expression of complex
4859 /// type and place its result into the specified l-value.
4860 void EmitComplexExprIntoLValue(const Expr *E, LValue dest, bool isInit);
4861
4862 /// EmitStoreOfComplex - Store a complex number into the specified l-value.
4863 void EmitStoreOfComplex(ComplexPairTy V, LValue dest, bool isInit);
4864
4865 /// EmitLoadOfComplex - Load a complex number from the specified l-value.
4867
4869 llvm::Value *EmitPromotedScalarExpr(const Expr *E, QualType PromotionType);
4872
4875
4876 /// AddInitializerToStaticVarDecl - Add the initializer for 'D' to the
4877 /// global variable that has already been created for it. If the initializer
4878 /// has a different type than GV does, this may free GV and return a different
4879 /// one. Otherwise it just returns GV.
4880 llvm::GlobalVariable *
4882 llvm::GlobalVariable *GV);
4883
4884 // Emit an @llvm.invariant.start call for the given memory region.
4885 void EmitInvariantStart(llvm::Constant *Addr, CharUnits Size);
4886
4887 /// EmitCXXGlobalVarDeclInit - Create the initializer for a C++
4888 /// variable with global storage.
4889 void EmitCXXGlobalVarDeclInit(const VarDecl &D, llvm::GlobalVariable *GV,
4890 bool PerformInit);
4891
4892 llvm::Constant *createAtExitStub(const VarDecl &VD, llvm::FunctionCallee Dtor,
4893 llvm::Constant *Addr);
4894
4895 llvm::Function *createTLSAtExitStub(const VarDecl &VD,
4896 llvm::FunctionCallee Dtor,
4897 llvm::Constant *Addr,
4898 llvm::FunctionCallee &AtExit);
4899
4900 /// Call atexit() with a function that passes the given argument to
4901 /// the given function.
4902 void registerGlobalDtorWithAtExit(const VarDecl &D, llvm::FunctionCallee fn,
4903 llvm::Constant *addr);
4904
4905 /// Registers the dtor using 'llvm.global_dtors' for platforms that do not
4906 /// support an 'atexit()' function.
4907 void registerGlobalDtorWithLLVM(const VarDecl &D, llvm::FunctionCallee fn,
4908 llvm::Constant *addr);
4909
4910 /// Call atexit() with function dtorStub.
4911 void registerGlobalDtorWithAtExit(llvm::Constant *dtorStub);
4912
4913 /// Call unatexit() with function dtorStub.
4914 llvm::Value *unregisterGlobalDtorWithUnAtExit(llvm::Constant *dtorStub);
4915
4916 /// Emit code in this function to perform a guarded variable
4917 /// initialization. Guarded initializations are used when it's not
4918 /// possible to prove that an initialization will be done exactly
4919 /// once, e.g. with a static local variable or a static data member
4920 /// of a class template.
4921 void EmitCXXGuardedInit(const VarDecl &D, llvm::GlobalVariable *DeclPtr,
4922 bool PerformInit);
4923
4925
4926 /// Emit a branch to select whether or not to perform guarded initialization.
4927 void EmitCXXGuardedInitBranch(llvm::Value *NeedsInit,
4928 llvm::BasicBlock *InitBlock,
4929 llvm::BasicBlock *NoInitBlock,
4930 GuardKind Kind, const VarDecl *D);
4931
4932 /// GenerateCXXGlobalInitFunc - Generates code for initializing global
4933 /// variables.
4934 void
4935 GenerateCXXGlobalInitFunc(llvm::Function *Fn,
4936 ArrayRef<llvm::Function *> CXXThreadLocals,
4938
4939 /// GenerateCXXGlobalCleanUpFunc - Generates code for cleaning up global
4940 /// variables.
4942 llvm::Function *Fn,
4943 ArrayRef<std::tuple<llvm::FunctionType *, llvm::WeakTrackingVH,
4944 llvm::Constant *>>
4945 DtorsOrStermFinalizers);
4946
4947 void GenerateCXXGlobalVarDeclInitFunc(llvm::Function *Fn,
4948 const VarDecl *D,
4949 llvm::GlobalVariable *Addr,
4950 bool PerformInit);
4951
4953
4954 void EmitSynthesizedCXXCopyCtor(Address Dest, Address Src, const Expr *Exp);
4955
4956 void EmitCXXThrowExpr(const CXXThrowExpr *E, bool KeepInsertionPoint = true);
4957
4959
4960 //===--------------------------------------------------------------------===//
4961 // Annotations Emission
4962 //===--------------------------------------------------------------------===//
4963
4964 /// Emit an annotation call (intrinsic).
4965 llvm::Value *EmitAnnotationCall(llvm::Function *AnnotationFn,
4966 llvm::Value *AnnotatedVal,
4967 StringRef AnnotationStr,
4968 SourceLocation Location,
4969 const AnnotateAttr *Attr);
4970
4971 /// Emit local annotations for the local variable V, declared by D.
4972 void EmitVarAnnotations(const VarDecl *D, llvm::Value *V);
4973
4974 /// Emit field annotations for the given field & value. Returns the
4975 /// annotation result.
4977
4978 //===--------------------------------------------------------------------===//
4979 // Internal Helpers
4980 //===--------------------------------------------------------------------===//
4981
4982 /// ContainsLabel - Return true if the statement contains a label in it. If
4983 /// this statement is not executed normally, it not containing a label means
4984 /// that we can just remove the code.
4985 static bool ContainsLabel(const Stmt *S, bool IgnoreCaseStmts = false);
4986
4987 /// containsBreak - Return true if the statement contains a break out of it.
4988 /// If the statement (recursively) contains a switch or loop with a break
4989 /// inside of it, this is fine.
4990 static bool containsBreak(const Stmt *S);
4991
4992 /// Determine if the given statement might introduce a declaration into the
4993 /// current scope, by being a (possibly-labelled) DeclStmt.
4994 static bool mightAddDeclToScope(const Stmt *S);
4995
4996 /// ConstantFoldsToSimpleInteger - If the specified expression does not fold
4997 /// to a constant, or if it does but contains a label, return false. If it
4998 /// constant folds return true and set the boolean result in Result.
5000 bool AllowLabels = false);
5001
5002 /// ConstantFoldsToSimpleInteger - If the specified expression does not fold
5003 /// to a constant, or if it does but contains a label, return false. If it
5004 /// constant folds return true and set the folded value.
5005 bool ConstantFoldsToSimpleInteger(const Expr *Cond, llvm::APSInt &Result,
5006 bool AllowLabels = false);
5007
5008 /// Ignore parentheses and logical-NOT to track conditions consistently.
5009 static const Expr *stripCond(const Expr *C);
5010
5011 /// isInstrumentedCondition - Determine whether the given condition is an
5012 /// instrumentable condition (i.e. no "&&" or "||").
5013 static bool isInstrumentedCondition(const Expr *C);
5014
5015 /// EmitBranchToCounterBlock - Emit a conditional branch to a new block that
5016 /// increments a profile counter based on the semantics of the given logical
5017 /// operator opcode. This is used to instrument branch condition coverage
5018 /// for logical operators.
5020 llvm::BasicBlock *TrueBlock,
5021 llvm::BasicBlock *FalseBlock,
5022 uint64_t TrueCount = 0,
5024 const Expr *CntrIdx = nullptr);
5025
5026 /// EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g. for an
5027 /// if statement) to the specified blocks. Based on the condition, this might
5028 /// try to simplify the codegen of the conditional based on the branch.
5029 /// TrueCount should be the number of times we expect the condition to
5030 /// evaluate to true based on PGO data.
5031 void EmitBranchOnBoolExpr(const Expr *Cond, llvm::BasicBlock *TrueBlock,
5032 llvm::BasicBlock *FalseBlock, uint64_t TrueCount,
5034 const Expr *ConditionalOp = nullptr);
5035
5036 /// Given an assignment `*LHS = RHS`, emit a test that checks if \p RHS is
5037 /// nonnull, if \p LHS is marked _Nonnull.
5038 void EmitNullabilityCheck(LValue LHS, llvm::Value *RHS, SourceLocation Loc);
5039
5040 /// An enumeration which makes it easier to specify whether or not an
5041 /// operation is a subtraction.
5042 enum { NotSubtraction = false, IsSubtraction = true };
5043
5044 /// Same as IRBuilder::CreateInBoundsGEP, but additionally emits a check to
5045 /// detect undefined behavior when the pointer overflow sanitizer is enabled.
5046 /// \p SignedIndices indicates whether any of the GEP indices are signed.
5047 /// \p IsSubtraction indicates whether the expression used to form the GEP
5048 /// is a subtraction.
5049 llvm::Value *EmitCheckedInBoundsGEP(llvm::Type *ElemTy, llvm::Value *Ptr,
5051 bool SignedIndices,
5052 bool IsSubtraction,
5054 const Twine &Name = "");
5055
5057 llvm::Type *elementType, bool SignedIndices,
5059 CharUnits Align, const Twine &Name = "");
5060
5061 /// Specifies which type of sanitizer check to apply when handling a
5062 /// particular builtin.
5066 };
5067
5068 /// Emits an argument for a call to a builtin. If the builtin sanitizer is
5069 /// enabled, a runtime check specified by \p Kind is also emitted.
5071
5072 /// Emit a description of a type in a format suitable for passing to
5073 /// a runtime sanitizer handler.
5075
5076 /// Convert a value into a format suitable for passing to a runtime
5077 /// sanitizer handler.
5078 llvm::Value *EmitCheckValue(llvm::Value *V);
5079
5080 /// Emit a description of a source location in a format suitable for
5081 /// passing to a runtime sanitizer handler.
5083
5086
5087 /// Create a basic block that will either trap or call a handler function in
5088 /// the UBSan runtime with the provided arguments, and create a conditional
5089 /// branch to it.
5090 void EmitCheck(ArrayRef<std::pair<llvm::Value *, SanitizerMask>> Checked,
5092 ArrayRef<llvm::Value *> DynamicArgs);
5093
5094 /// Emit a slow path cross-DSO CFI check which calls __cfi_slowpath
5095 /// if Cond if false.
5096 void EmitCfiSlowPathCheck(SanitizerMask Kind, llvm::Value *Cond,
5097 llvm::ConstantInt *TypeId, llvm::Value *Ptr,
5098 ArrayRef<llvm::Constant *> StaticArgs);
5099
5100 /// Emit a reached-unreachable diagnostic if \p Loc is valid and runtime
5101 /// checking is enabled. Otherwise, just emit an unreachable instruction.
5103
5104 /// Create a basic block that will call the trap intrinsic, and emit a
5105 /// conditional branch to it, for the -ftrapv checks.
5106 void EmitTrapCheck(llvm::Value *Checked, SanitizerHandler CheckHandlerID);
5107
5108 /// Emit a call to trap or debugtrap and attach function attribute
5109 /// "trap-func-name" if specified.
5110 llvm::CallInst *EmitTrapCall(llvm::Intrinsic::ID IntrID);
5111
5112 /// Emit a stub for the cross-DSO CFI check function.
5114
5115 /// Emit a cross-DSO CFI failure handling function.
5117
5118 /// Create a check for a function parameter that may potentially be
5119 /// declared as non-null.
5121 AbstractCallee AC, unsigned ParmNum);
5122
5124 SourceLocation ArgLoc, AbstractCallee AC,
5125 unsigned ParmNum);
5126
5127 /// EmitCallArg - Emit a single call argument.
5128 void EmitCallArg(CallArgList &args, const Expr *E, QualType ArgType);
5129
5130 /// EmitDelegateCallArg - We are performing a delegate call; that
5131 /// is, the current function is delegating to another one. Produce
5132 /// a r-value suitable for passing the given parameter.
5133 void EmitDelegateCallArg(CallArgList &args, const VarDecl *param,
5134 SourceLocation loc);
5135
5136 /// SetFPAccuracy - Set the minimum required accuracy of the given floating
5137 /// point operation, expressed as the maximum relative error in ulp.
5138 void SetFPAccuracy(llvm::Value *Val, float Accuracy);
5139
5140 /// Set the minimum required accuracy of the given sqrt operation
5141 /// based on CodeGenOpts.
5142 void SetSqrtFPAccuracy(llvm::Value *Val);
5143
5144 /// Set the minimum required accuracy of the given sqrt operation based on
5145 /// CodeGenOpts.
5146 void SetDivFPAccuracy(llvm::Value *Val);
5147
5148 /// Set the codegen fast-math flags.
5149 void SetFastMathFlags(FPOptions FPFeatures);
5150
5151 // Truncate or extend a boolean vector to the requested number of elements.
5152 llvm::Value *emitBoolVecConversion(llvm::Value *SrcVec,
5153 unsigned NumElementsDst,
5154 const llvm::Twine &Name = "");
5155 // Adds a convergence_ctrl token to |Input| and emits the required parent
5156 // convergence instructions.
5157 template <typename CallType>
5158 CallType *addControlledConvergenceToken(CallType *Input) {
5159 return cast<CallType>(
5160 addConvergenceControlToken(Input, ConvergenceTokenStack.back()));
5161 }
5162
5163private:
5164 // Emits a convergence_loop instruction for the given |BB|, with |ParentToken|
5165 // as it's parent convergence instr.
5166 llvm::IntrinsicInst *emitConvergenceLoopToken(llvm::BasicBlock *BB,
5167 llvm::Value *ParentToken);
5168 // Adds a convergence_ctrl token with |ParentToken| as parent convergence
5169 // instr to the call |Input|.
5170 llvm::CallBase *addConvergenceControlToken(llvm::CallBase *Input,
5171 llvm::Value *ParentToken);
5172 // Find the convergence_entry instruction |F|, or emits ones if none exists.
5173 // Returns the convergence instruction.
5174 llvm::IntrinsicInst *getOrEmitConvergenceEntryToken(llvm::Function *F);
5175 // Find the convergence_loop instruction for the loop defined by |LI|, or
5176 // emits one if none exists. Returns the convergence instruction.
5177 llvm::IntrinsicInst *getOrEmitConvergenceLoopToken(const LoopInfo *LI);
5178
5179private:
5180 llvm::MDNode *getRangeForLoadFromType(QualType Ty);
5181 void EmitReturnOfRValue(RValue RV, QualType Ty);
5182
5183 void deferPlaceholderReplacement(llvm::Instruction *Old, llvm::Value *New);
5184
5186 DeferredReplacements;
5187
5188 /// Set the address of a local variable.
5189 void setAddrOfLocalVar(const VarDecl *VD, Address Addr) {
5190 assert(!LocalDeclMap.count(VD) && "Decl already exists in LocalDeclMap!");
5191 LocalDeclMap.insert({VD, Addr});
5192 }
5193
5194 /// ExpandTypeFromArgs - Reconstruct a structure of type \arg Ty
5195 /// from function arguments into \arg Dst. See ABIArgInfo::Expand.
5196 ///
5197 /// \param AI - The first function argument of the expansion.
5198 void ExpandTypeFromArgs(QualType Ty, LValue Dst,
5199 llvm::Function::arg_iterator &AI);
5200
5201 /// ExpandTypeToArgs - Expand an CallArg \arg Arg, with the LLVM type for \arg
5202 /// Ty, into individual arguments on the provided vector \arg IRCallArgs,
5203 /// starting at index \arg IRCallArgPos. See ABIArgInfo::Expand.
5204 void ExpandTypeToArgs(QualType Ty, CallArg Arg, llvm::FunctionType *IRFuncTy,
5205 SmallVectorImpl<llvm::Value *> &IRCallArgs,
5206 unsigned &IRCallArgPos);
5207
5208 std::pair<llvm::Value *, llvm::Type *>
5209 EmitAsmInput(const TargetInfo::ConstraintInfo &Info, const Expr *InputExpr,
5210 std::string &ConstraintStr);
5211
5212 std::pair<llvm::Value *, llvm::Type *>
5213 EmitAsmInputLValue(const TargetInfo::ConstraintInfo &Info, LValue InputValue,
5214 QualType InputType, std::string &ConstraintStr,
5215 SourceLocation Loc);
5216
5217 /// Attempts to statically evaluate the object size of E. If that
5218 /// fails, emits code to figure the size of E out for us. This is
5219 /// pass_object_size aware.
5220 ///
5221 /// If EmittedExpr is non-null, this will use that instead of re-emitting E.
5222 llvm::Value *evaluateOrEmitBuiltinObjectSize(const Expr *E, unsigned Type,
5223 llvm::IntegerType *ResType,
5224 llvm::Value *EmittedE,
5225 bool IsDynamic);
5226
5227 /// Emits the size of E, as required by __builtin_object_size. This
5228 /// function is aware of pass_object_size parameters, and will act accordingly
5229 /// if E is a parameter with the pass_object_size attribute.
5230 llvm::Value *emitBuiltinObjectSize(const Expr *E, unsigned Type,
5231 llvm::IntegerType *ResType,
5232 llvm::Value *EmittedE,
5233 bool IsDynamic);
5234
5235 llvm::Value *emitFlexibleArrayMemberSize(const Expr *E, unsigned Type,
5236 llvm::IntegerType *ResType);
5237
5238 void emitZeroOrPatternForAutoVarInit(QualType type, const VarDecl &D,
5239 Address Loc);
5240
5241public:
5242 enum class EvaluationOrder {
5243 ///! No language constraints on evaluation order.
5244 Default,
5245 ///! Language semantics require left-to-right evaluation.
5247 ///! Language semantics require right-to-left evaluation.
5249 };
5250
5251 // Wrapper for function prototype sources. Wraps either a FunctionProtoType or
5252 // an ObjCMethodDecl.
5254 llvm::PointerUnion<const FunctionProtoType *, const ObjCMethodDecl *> P;
5255
5258 };
5259
5261 llvm::iterator_range<CallExpr::const_arg_iterator> ArgRange,
5263 unsigned ParamsToSkip = 0,
5265
5266 /// EmitPointerWithAlignment - Given an expression with a pointer type,
5267 /// emit the value and compute our best estimate of the alignment of the
5268 /// pointee.
5269 ///
5270 /// \param BaseInfo - If non-null, this will be initialized with
5271 /// information about the source of the alignment and the may-alias
5272 /// attribute. Note that this function will conservatively fall back on
5273 /// the type when it doesn't recognize the expression and may-alias will
5274 /// be set to false.
5275 ///
5276 /// One reasonable way to use this information is when there's a language
5277 /// guarantee that the pointer must be aligned to some stricter value, and
5278 /// we're simply trying to ensure that sufficiently obvious uses of under-
5279 /// aligned objects don't get miscompiled; for example, a placement new
5280 /// into the address of a local variable. In such a case, it's quite
5281 /// reasonable to just ignore the returned alignment when it isn't from an
5282 /// explicit source.
5283 Address
5284 EmitPointerWithAlignment(const Expr *Addr, LValueBaseInfo *BaseInfo = nullptr,
5285 TBAAAccessInfo *TBAAInfo = nullptr,
5286 KnownNonNull_t IsKnownNonNull = NotKnownNonNull);
5287
5288 /// If \p E references a parameter with pass_object_size info or a constant
5289 /// array size modifier, emit the object size divided by the size of \p EltTy.
5290 /// Otherwise return null.
5291 llvm::Value *LoadPassedObjectSize(const Expr *E, QualType EltTy);
5292
5293 void EmitSanitizerStatReport(llvm::SanitizerStatKind SSK);
5294
5296 llvm::Function *Function;
5297 struct Conds {
5298 StringRef Architecture;
5300
5301 Conds(StringRef Arch, ArrayRef<StringRef> Feats)
5302 : Architecture(Arch), Features(Feats.begin(), Feats.end()) {}
5304
5305 MultiVersionResolverOption(llvm::Function *F, StringRef Arch,
5306 ArrayRef<StringRef> Feats)
5307 : Function(F), Conditions(Arch, Feats) {}
5308 };
5309
5310 // Emits the body of a multiversion function's resolver. Assumes that the
5311 // options are already sorted in the proper order, with the 'default' option
5312 // last (if it exists).
5313 void EmitMultiVersionResolver(llvm::Function *Resolver,
5315 void
5316 EmitX86MultiVersionResolver(llvm::Function *Resolver,
5318 void
5319 EmitAArch64MultiVersionResolver(llvm::Function *Resolver,
5321
5322private:
5323 QualType getVarArgType(const Expr *Arg);
5324
5325 void EmitDeclMetadata();
5326
5327 BlockByrefHelpers *buildByrefHelpers(llvm::StructType &byrefType,
5328 const AutoVarEmission &emission);
5329
5330 void AddObjCARCExceptionMetadata(llvm::Instruction *Inst);
5331
5332 llvm::Value *GetValueForARMHint(unsigned BuiltinID);
5333 llvm::Value *EmitX86CpuIs(const CallExpr *E);
5334 llvm::Value *EmitX86CpuIs(StringRef CPUStr);
5335 llvm::Value *EmitX86CpuSupports(const CallExpr *E);
5336 llvm::Value *EmitX86CpuSupports(ArrayRef<StringRef> FeatureStrs);
5337 llvm::Value *EmitX86CpuSupports(std::array<uint32_t, 4> FeatureMask);
5338 llvm::Value *EmitX86CpuInit();
5339 llvm::Value *FormX86ResolverCondition(const MultiVersionResolverOption &RO);
5340 llvm::Value *EmitAArch64CpuInit();
5341 llvm::Value *
5342 FormAArch64ResolverCondition(const MultiVersionResolverOption &RO);
5343 llvm::Value *EmitAArch64CpuSupports(const CallExpr *E);
5344 llvm::Value *EmitAArch64CpuSupports(ArrayRef<StringRef> FeatureStrs);
5345};
5346
5349 if (!needsSaving(value)) return saved_type(value, false);
5350
5351 // Otherwise, we need an alloca.
5352 auto align = CharUnits::fromQuantity(
5353 CGF.CGM.getDataLayout().getPrefTypeAlign(value->getType()));
5354 Address alloca =
5355 CGF.CreateTempAlloca(value->getType(), align, "cond-cleanup.save");
5356 CGF.Builder.CreateStore(value, alloca);
5357
5358 return saved_type(alloca.emitRawPointer(CGF), true);
5359}
5360
5362 saved_type value) {
5363 // If the value says it wasn't saved, trust that it's still dominating.
5364 if (!value.getInt()) return value.getPointer();
5365
5366 // Otherwise, it should be an alloca instruction, as set up in save().
5367 auto alloca = cast<llvm::AllocaInst>(value.getPointer());
5368 return CGF.Builder.CreateAlignedLoad(alloca->getAllocatedType(), alloca,
5369 alloca->getAlign());
5370}
5371
5372} // end namespace CodeGen
5373
5374// Map the LangOption for floating point exception behavior into
5375// the corresponding enum in the IR.
5376llvm::fp::ExceptionBehavior
5378} // end namespace clang
5379
5380#endif
Enums/classes describing ABI related information about constructors, destructors and thunks.
#define V(N, I)
Definition: ASTContext.h:3338
static bool CanThrow(Expr *E, ASTContext &Ctx)
Definition: CFG.cpp:2679
@ ForDeactivation
Definition: CGCleanup.cpp:1195
const Decl * D
Expr * E
enum clang::sema::@1651::IndirectLocalPathEntry::EntryKind Kind
unsigned OldSize
Defines the clang::Expr interface and subclasses for C++ expressions.
const CFGBlock * Block
Definition: HTMLLogger.cpp:153
#define X(type, name)
Definition: Value.h:143
llvm::MachO::Architecture Architecture
Definition: MachO.h:27
llvm::MachO::Target Target
Definition: MachO.h:51
Defines some OpenMP-specific enums and functions.
SourceRange Range
Definition: SemaObjC.cpp:757
VarDecl * Variable
Definition: SemaObjC.cpp:756
SourceLocation Loc
Definition: SemaObjC.cpp:758
const char * Data
This file defines OpenACC AST classes for statement-level contructs.
This file defines OpenMP AST classes for executable directives and clauses.
C Language Family Type Representation.
StateNode * Previous
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:186
AbstractConditionalOperator - An abstract base class for ConditionalOperator and BinaryConditionalOpe...
Definition: Expr.h:4165
This class represents BOTH the OpenMP Array Section and OpenACC 'subarray', with a boolean differenti...
Definition: Expr.h:6916
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
Definition: Expr.h:2674
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition: Type.h:3540
AsmStmt is the base class for GCCAsmStmt and MSAsmStmt.
Definition: Stmt.h:3105
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
Definition: Expr.h:6619
Attr - This represents one attribute.
Definition: Attr.h:42
Represents an attribute applied to a statement.
Definition: Stmt.h:2085
BinaryConditionalOperator - The GNU extension to the conditional operator which allows the middle ope...
Definition: Expr.h:4265
OpaqueValueExpr * getOpaqueValue() const
getOpaqueValue - Return the opaque value placeholder.
Definition: Expr.h:4303
Expr * getCommon() const
getCommon - Return the common expression, written to the left of the condition.
Definition: Expr.h:4300
A builtin binary operation expression such as "x + y" or "x <= y".
Definition: Expr.h:3860
static bool isLogicalOp(Opcode Opc)
Definition: Expr.h:3992
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Definition: Expr.h:6355
BreakStmt - This represents a break.
Definition: Stmt.h:2985
Represents a call to a CUDA kernel function.
Definition: ExprCXX.h:231
Represents binding an expression to a temporary.
Definition: ExprCXX.h:1491
Represents a call to a C++ constructor.
Definition: ExprCXX.h:1546
Represents a C++ constructor within a class.
Definition: DeclCXX.h:2535
A default argument (C++ [dcl.fct.default]).
Definition: ExprCXX.h:1268
A use of a default initializer in a constructor or in aggregate initialization.
Definition: ExprCXX.h:1375
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition: ExprCXX.h:2497
Represents a C++ destructor within a class.
Definition: DeclCXX.h:2799
A C++ dynamic_cast expression (C++ [expr.dynamic.cast]).
Definition: ExprCXX.h:478
CXXForRangeStmt - This represents C++0x [stmt.ranged]'s ranged for statement, represented as 'for (ra...
Definition: StmtCXX.h:135
Represents a call to an inherited base class constructor from an inheriting constructor.
Definition: ExprCXX.h:1737
Represents a call to a member function that may be written either with member call syntax (e....
Definition: ExprCXX.h:176
Represents a static or instance method of a struct/union/class.
Definition: DeclCXX.h:2060
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Definition: ExprCXX.h:2240
A call to an overloaded operator written using operator syntax.
Definition: ExprCXX.h:81
Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
Definition: ExprCXX.h:2616
Represents a C++ struct/union/class.
Definition: DeclCXX.h:258
Represents a C++ temporary.
Definition: ExprCXX.h:1457
A C++ throw-expression (C++ [except.throw]).
Definition: ExprCXX.h:1206
CXXTryStmt - A C++ try block, including all handlers.
Definition: StmtCXX.h:69
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
Definition: ExprCXX.h:845
A Microsoft C++ __uuidof expression, which gets the _GUID that corresponds to the supplied type or ex...
Definition: ExprCXX.h:1066
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition: Expr.h:2830
Describes the capture of either a variable, or 'this', or variable-length array type.
Definition: Stmt.h:3775
This captures a statement into a function.
Definition: Stmt.h:3762
CaseStmt - Represent a case statement.
Definition: Stmt.h:1806
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition: Expr.h:3498
const CXXBaseSpecifier *const * path_const_iterator
Definition: Expr.h:3565
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
Represents a 'co_await' expression.
Definition: ExprCXX.h:5183
bool hasProfileClangInstr() const
Check if Clang profile instrumenation is on.
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:193
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:251
CharUnits getAlignment() const
Definition: Address.h:189
llvm::Type * getElementType() const
Return the type of the values stored in this address.
Definition: Address.h:207
bool hasOffset() const
Definition: Address.h:242
void setAlignment(CharUnits Value)
Definition: Address.h:191
llvm::Value * getOffset() const
Definition: Address.h:244
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:181
bool isValid() const
Definition: Address.h:177
llvm::PointerType * getType() const
Return the type of the pointer value.
Definition: Address.h:199
An aggregate value slot.
Definition: CGValue.h:504
static AggValueSlot ignored()
ignored - Returns an aggregate value slot indicating that the aggregate value is being ignored.
Definition: CGValue.h:572
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:587
A scoped helper to set the current debug location to the specified location or preferred location of ...
Definition: CGDebugInfo.h:852
static ApplyDebugLocation CreateArtificial(CodeGenFunction &CGF)
Apply TemporaryLocation if it is valid.
Definition: CGDebugInfo.h:892
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:156
llvm::StoreInst * CreateStore(llvm::Value *Val, Address Addr, bool IsVolatile=false)
Definition: CGBuilder.h:135
llvm::LoadInst * CreateFlagLoad(llvm::Value *Addr, const llvm::Twine &Name="")
Emit a load from an i1 flag variable.
Definition: CGBuilder.h:157
llvm::LoadInst * CreateAlignedLoad(llvm::Type *Ty, llvm::Value *Addr, CharUnits Align, const llvm::Twine &Name="")
Definition: CGBuilder.h:127
Implements C++ ABI-specific code generation functions.
Definition: CGCXXABI.h:43
All available information about a concrete callee.
Definition: CGCall.h:63
This class gathers all debug information during compilation and is responsible for emitting to llvm g...
Definition: CGDebugInfo.h:58
CGFunctionInfo - Class to encapsulate the information about a function definition.
CallArgList - Type for representing both the value and type of arguments in a call.
Definition: CGCall.h:274
An abstract representation of regular/ObjC call/message targets.
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.
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.
RAII for correct setting/restoring of CapturedStmtInfo.
CGCapturedStmtRAII(CodeGenFunction &CGF, CGCapturedStmtInfo *NewCapturedStmtInfo)
CXXDefaultInitExprScope(CodeGenFunction &CGF, const CXXDefaultInitExpr *E)
void Emit(CodeGenFunction &CGF, Flags flags) override
Emit the cleanup.
CallLifetimeEnd(RawAddress addr, llvm::Value *size)
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, Expr *refExpr) const
A scope within which we are constructing the fields of an object which might use a CXXDefaultInitExpr...
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.
InlinedInheritingConstructorScope(CodeGenFunction &CGF, GlobalDecl GD)
void rescopeLabels()
Change the cleanup scope of the labels in this lexical scope to match the scope of the enclosing cont...
Definition: CGStmt.cpp:690
LexicalScope(CodeGenFunction &CGF, SourceRange Range)
Enter a new cleanup scope.
void ForceCleanup()
Force the emission of cleanups now, instead of waiting until this object is destroyed.
~LexicalScope()
Exit this cleanup scope, emitting any accumulated cleanups.
RAII for preserving necessary info during inlined region body codegen.
InlinedRegionBodyRAII(CodeGenFunction &cgf, InsertPointTy &AllocaIP, llvm::BasicBlock &FiniBB)
void Emit(CodeGenFunction &CGF, Flags) override
Emit the cleanup.
RAII for preserving necessary info during Outlined region body codegen.
OutlinedRegionBodyRAII(CodeGenFunction &cgf, InsertPointTy &AllocaIP, llvm::BasicBlock &RetBB)
Controls insertion of cancellation exit blocks in worksharing constructs.
OMPCancelStackRAII(CodeGenFunction &CGF, OpenMPDirectiveKind Kind, bool HasCancel)
Save/restore original map of previously emitted local vars in case when we need to duplicate emission...
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)
An RAII object to set (and then clear) a mapping for an OpaqueValueExpr.
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...
Enters a new scope for capturing cleanups, all of which will be executed once the scope is exited.
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.
RAII object to set/unset CodeGenFunction::IsSanitizerScope.
An RAII object to record that we're evaluating a statement expression.
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
void EmitForStmt(const ForStmt &S, ArrayRef< const Attr * > Attrs=std::nullopt)
void GenerateObjCCtorDtorMethod(ObjCImplementationDecl *IMP, ObjCMethodDecl *MD, bool ctor)
llvm::Value * EmitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E, llvm::Triple::ArchType Arch)
void emitAutoVarTypeCleanup(const AutoVarEmission &emission, QualType::DestructionKind dtorKind)
EHScopeStack::stable_iterator CurrentCleanupScopeDepth
llvm::Value * EmitFromMemory(llvm::Value *Value, QualType Ty)
EmitFromMemory - Change a scalar value from its memory representation to its value representation.
void GenerateCXXGlobalInitFunc(llvm::Function *Fn, ArrayRef< llvm::Function * > CXXThreadLocals, ConstantAddress Guard=ConstantAddress::invalid())
GenerateCXXGlobalInitFunc - Generates code for initializing global variables.
llvm::Value * EmitPointerAuthAuth(const CGPointerAuthInfo &Info, llvm::Value *Pointer)
LValue EmitOpaqueValueLValue(const OpaqueValueExpr *e)
RValue EmitLoadOfGlobalRegLValue(LValue LV)
void EmitGotoStmt(const GotoStmt &S)
void EmitSynthesizedCXXCopyCtorCall(const CXXConstructorDecl *D, Address This, Address Src, const CXXConstructExpr *E)
void EmitDestructorBody(FunctionArgList &Args)
void EmitOMPTaskBasedDirective(const OMPExecutableDirective &S, const OpenMPDirectiveKind CapturedRegion, const RegionCodeGenTy &BodyGen, const TaskGenTy &TaskGen, OMPTaskDataTy &Data)
void StartObjCMethod(const ObjCMethodDecl *MD, const ObjCContainerDecl *CD)
llvm::BasicBlock * getEHDispatchBlock(EHScopeStack::stable_iterator scope)
void EmitOMPTargetTeamsDirective(const OMPTargetTeamsDirective &S)
void pushCallObjectDeleteCleanup(const FunctionDecl *OperatorDelete, llvm::Value *CompletePtr, QualType ElementType)
llvm::Value * EmitMSVCBuiltinExpr(MSVCIntrin BuiltinID, const CallExpr *E)
void EmitCXXConstructorCall(const CXXConstructorDecl *D, CXXCtorType Type, bool ForVirtualBase, bool Delegating, Address This, CallArgList &Args, AggValueSlot::Overlap_t Overlap, SourceLocation Loc, bool NewPointerIsChecked)
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...
LValue EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E)
void EmitARCDestroyWeak(Address addr)
void FinishFunction(SourceLocation EndLoc=SourceLocation())
FinishFunction - Complete IR generation of the current function.
RValue EmitCXXMemberPointerCallExpr(const CXXMemberCallExpr *E, ReturnValueSlot ReturnValue)
LValue EmitCompoundLiteralLValue(const CompoundLiteralExpr *E)
void EmitNullInitialization(Address DestPtr, QualType Ty)
EmitNullInitialization - Generate code to set a value of the given type to null, If the type contains...
void enterByrefCleanup(CleanupKind Kind, Address Addr, BlockFieldFlags Flags, bool LoadBlockVarAddr, bool CanThrow)
Enter a cleanup to destroy a __block variable.
void EmitOMPParallelGenericLoopDirective(const OMPLoopDirective &S)
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...
llvm::Value * EmitLifetimeStart(llvm::TypeSize Size, llvm::Value *Addr)
void EmitPointerAuthOperandBundle(const CGPointerAuthInfo &Info, SmallVectorImpl< llvm::OperandBundleDef > &Bundles)
void EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc, llvm::Value *V, QualType Type, CharUnits Alignment=CharUnits::Zero(), SanitizerSet SkippedChecks=SanitizerSet(), llvm::Value *ArraySize=nullptr)
Emit a check that V is the address of storage of the appropriate size and alignment for an object of ...
GlobalDecl CurGD
CurGD - The GlobalDecl for the current function being compiled.
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.
Address EmitCXXMemberDataPointerAddress(const Expr *E, Address base, llvm::Value *memberPtr, const MemberPointerType *memberPtrType, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
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())
void EmitAsanPrologueOrEpilogue(bool Prologue)
llvm::Value * EmitARCExtendBlockObject(const Expr *expr)
bool checkIfLoopMustProgress(const Expr *, bool HasEmptyBody)
Returns true if a loop must make progress, which means the mustprogress attribute can be added.
void DeactivateCleanupBlock(EHScopeStack::stable_iterator Cleanup, llvm::Instruction *DominatingIP)
DeactivateCleanupBlock - Deactivates the given cleanup block.
llvm::Value * EmitNonNullRValueCheck(RValue RV, QualType T)
Create a check that a scalar RValue is non-null.
static TypeEvaluationKind getEvaluationKind(QualType T)
getEvaluationKind - Return the TypeEvaluationKind of QualType T.
static bool ContainsLabel(const Stmt *S, bool IgnoreCaseStmts=false)
ContainsLabel - Return true if the statement contains a label in it.
LValue EmitCastLValue(const CastExpr *E)
void EnterSEHTryStmt(const SEHTryStmt &S)
CurrentSourceLocExprScope CurSourceLocExprScope
Source location information about the default argument or member initializer expression we're evaluat...
void checkTargetFeatures(SourceLocation Loc, const FunctionDecl *TargetDecl)
llvm::Value * EmitSVEPredicateCast(llvm::Value *Pred, llvm::ScalableVectorType *VTy)
Address getExceptionSlot()
Returns a pointer to the function's exception object and selector slot, which is assigned in every la...
RawAddress CreateMemTemp(QualType T, CharUnits Align, const Twine &Name="tmp", RawAddress *Alloca=nullptr)
bool isBinaryLogicalOp(const Expr *E) const
void EmitBranchOnBoolExpr(const Expr *Cond, llvm::BasicBlock *TrueBlock, llvm::BasicBlock *FalseBlock, uint64_t TrueCount, Stmt::Likelihood LH=Stmt::LH_None, const Expr *ConditionalOp=nullptr)
EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g.
void VolatilizeTryBlocks(llvm::BasicBlock *BB, llvm::SmallPtrSet< llvm::BasicBlock *, 10 > &V)
void EmitLambdaInAllocaImplFn(const CXXMethodDecl *CallOp, const CGFunctionInfo **ImplFnInfo, llvm::Function **ImplFn)
llvm::Function * GenerateSEHFinallyFunction(CodeGenFunction &ParentCGF, const SEHFinallyStmt &Finally)
llvm::CallInst * EmitTrapCall(llvm::Intrinsic::ID IntrID)
Emit a call to trap or debugtrap and attach function attribute "trap-func-name" if specified.
llvm::Function * GenerateSEHFilterFunction(CodeGenFunction &ParentCGF, const SEHExceptStmt &Except)
static Destroyer destroyNonTrivialCStruct
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...
bool sanitizePerformTypeCheck() const
Whether any type-checking sanitizers are enabled.
void EmitCallAndReturnForThunk(llvm::FunctionCallee Callee, const ThunkInfo *Thunk, bool IsUnprototyped)
void EmitDelegateCXXConstructorCall(const CXXConstructorDecl *Ctor, CXXCtorType CtorType, const FunctionArgList &Args, SourceLocation Loc)
void EmitSanitizerStatReport(llvm::SanitizerStatKind SSK)
static bool cxxDestructorCanThrow(QualType T)
Check if T is a C++ class that has a destructor that can throw.
void EmitDelegatingCXXConstructorCall(const CXXConstructorDecl *Ctor, const FunctionArgList &Args)
llvm::Function * GenerateVarArgsThunk(llvm::Function *Fn, const CGFunctionInfo &FnInfo, GlobalDecl GD, const ThunkInfo &Thunk)
SanitizerSet SanOpts
Sanitizers enabled for this function.
RValue EmitBuiltinIsAligned(const CallExpr *E)
Emit IR for __builtin_is_aligned.
LValue EmitCoawaitLValue(const CoawaitExpr *E)
llvm::BasicBlock * getInvokeDestImpl()
LValue getOrCreateOpaqueLValueMapping(const OpaqueValueExpr *e)
Given an opaque value expression, return its LValue mapping if it exists, otherwise create one.
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 EmitIfStmt(const IfStmt &S)
void EmitForwardingCallToLambda(const CXXMethodDecl *LambdaCallOperator, CallArgList &CallArgs, const CGFunctionInfo *CallOpFnInfo=nullptr, llvm::Constant *CallOpFn=nullptr)
void EmitOMPOrderedDirective(const OMPOrderedDirective &S)
void EmitOMPTargetDirective(const OMPTargetDirective &S)
void PushDestructorCleanup(const CXXDestructorDecl *Dtor, QualType T, Address Addr)
PushDestructorCleanup - Push a cleanup to call the complete-object variant of the given destructor on...
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...
LValue EmitAggExprToLValue(const Expr *E)
EmitAggExprToLValue - Emit the computation of the specified expression of aggregate type into a tempo...
bool IsOutlinedSEHHelper
True if the current function is an outlined SEH helper.
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.
bool EmitOMPFirstprivateClause(const OMPExecutableDirective &D, OMPPrivateScope &PrivateScope)
void EmitARCMoveWeak(Address dst, Address src)
LValue EmitScalarCompoundAssignWithComplex(const CompoundAssignOperator *E, llvm::Value *&Result)
void EmitOMPReductionClauseInit(const OMPExecutableDirective &D, OMPPrivateScope &PrivateScope, bool ForInscan=false)
Emit initial code for reduction variables.
void EmitOMPAtomicDirective(const OMPAtomicDirective &S)
void EmitVTableAssumptionLoad(const VPtr &vptr, Address This)
Emit assumption that vptr load == global vtable.
void unprotectFromPeepholes(PeepholeProtection protection)
Address getAsNaturalAddressOf(Address Addr, QualType PointeeTy)
llvm::CallInst * EmitRuntimeCall(llvm::FunctionCallee callee, ArrayRef< llvm::Value * > args, const Twine &name="")
void startOutlinedSEHHelper(CodeGenFunction &ParentCGF, bool IsFilter, const Stmt *OutlinedStmt)
void EmitOMPTargetEnterDataDirective(const OMPTargetEnterDataDirective &S)
llvm::Value * EmitHexagonBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
void EmitOMPParallelMasterTaskLoopDirective(const OMPParallelMasterTaskLoopDirective &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...
void generateObjCGetterBody(const ObjCImplementationDecl *classImpl, const ObjCPropertyImplDecl *propImpl, const ObjCMethodDecl *GetterMothodDecl, llvm::Constant *AtomicHelperFn)
void EmitAutoVarDecl(const VarDecl &D)
EmitAutoVarDecl - Emit an auto variable declaration.
void GetAArch64SVEProcessedOperands(unsigned BuiltinID, const CallExpr *E, SmallVectorImpl< llvm::Value * > &Ops, SVETypeFlags TypeFlags)
llvm::Value * EmitIvarOffsetAsPointerDiff(const ObjCInterfaceDecl *Interface, const ObjCIvarDecl *Ivar)
llvm::Value * EmitAMDGPUBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
llvm::Constant * createAtExitStub(const VarDecl &VD, llvm::FunctionCallee Dtor, llvm::Constant *Addr)
void EmitLambdaStaticInvokeBody(const CXXMethodDecl *MD)
bool ShouldInstrumentFunction()
ShouldInstrumentFunction - Return true if the current function should be instrumented with __cyg_prof...
void EmitLifetimeEnd(llvm::Value *Size, llvm::Value *Addr)
LValue MakeAddrLValue(llvm::Value *V, QualType T, CharUnits Alignment, AlignmentSource Source=AlignmentSource::Type)
Address EmitCompoundStmtWithoutScope(const CompoundStmt &S, bool GetLast=false, AggValueSlot AVS=AggValueSlot::ignored())
void EmitStoreThroughLValue(RValue Src, LValue Dst, bool isInit=false)
EmitStoreThroughLValue - Store the specified rvalue into the specified lvalue, where both are guarant...
static void EmitOMPTargetTeamsDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetTeamsDirective &S)
Emit device code for the target teams directive.
void pushLifetimeExtendedDestroy(CleanupKind kind, Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray)
void callCStructDefaultConstructor(LValue Dst)
void EmitOMPReverseDirective(const OMPReverseDirective &S)
static bool hasScalarEvaluationKind(QualType T)
RValue EmitBlockCallExpr(const CallExpr *E, ReturnValueSlot ReturnValue)
llvm::Value * EmitObjCAutoreleasePoolPush()
bool isCleanupPadScope() const
Returns true while emitting a cleanuppad.
llvm::Value * EmitNeonSplat(llvm::Value *V, llvm::Constant *Idx)
void EmitVTablePtrCheckForCall(const CXXRecordDecl *RD, llvm::Value *VTable, CFITypeCheckKind TCK, SourceLocation Loc)
EmitVTablePtrCheckForCall - Virtual method MD is being called via VTable.
llvm::Value * EmitARCRetainAutoreleaseNonBlock(llvm::Value *value)
void EmitObjCMRRAutoreleasePoolPop(llvm::Value *Ptr)
const BlockByrefInfo & getBlockByrefInfo(const VarDecl *var)
AwaitSuspendWrapperInfo CurAwaitSuspendWrapper
llvm::function_ref< std::pair< llvm::Value *, llvm::Value * >(CodeGenFunction &, const OMPExecutableDirective &S, Address LB, Address UB)> CodeGenDispatchBoundsTy
LValue EmitCompoundAssignmentLValue(const CompoundAssignOperator *E)
CGCapturedStmtInfo * CapturedStmtInfo
void EmitCallArgs(CallArgList &Args, PrototypeWrapper Prototype, llvm::iterator_range< CallExpr::const_arg_iterator > ArgRange, AbstractCallee AC=AbstractCallee(), unsigned ParamsToSkip=0, EvaluationOrder Order=EvaluationOrder::Default)
BuiltinCheckKind
Specifies which type of sanitizer check to apply when handling a particular builtin.
void EmitIndirectGotoStmt(const IndirectGotoStmt &S)
void EmitDecl(const Decl &D)
EmitDecl - Emit a declaration.
LValue MakeNaturalAlignPointeeRawAddrLValue(llvm::Value *V, QualType T)
Same as MakeNaturalAlignPointeeAddrLValue except that the pointer is known to be unsigned.
void EmitBoundsCheck(const Expr *E, const Expr *Base, llvm::Value *Index, QualType IndexType, bool Accessed)
Emit a check that Base points into an array object, which we can access at index Index.
Address authPointerToPointerCast(Address Ptr, QualType SourceType, QualType DestType)
void EmitCXXTryStmt(const CXXTryStmt &S)
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.
std::pair< LValue, llvm::Value * > EmitARCStoreStrong(const BinaryOperator *e, bool ignored)
void EmitKCFIOperandBundle(const CGCallee &Callee, SmallVectorImpl< llvm::OperandBundleDef > &Bundles)
llvm::Value * EmitCheckedArgForBuiltin(const Expr *E, BuiltinCheckKind Kind)
Emits an argument for a call to a builtin.
bool EmitSimpleStmt(const Stmt *S, ArrayRef< const Attr * > Attrs)
EmitSimpleStmt - Try to emit a "simple" statement which does not necessarily require an insertion poi...
void generateThunk(llvm::Function *Fn, const CGFunctionInfo &FnInfo, GlobalDecl GD, const ThunkInfo &Thunk, bool IsUnprototyped)
Generate a thunk for the given method.
void pushIrregularPartialArrayCleanup(llvm::Value *arrayBegin, Address arrayEndPointer, QualType elementType, CharUnits elementAlignment, Destroyer *destroyer)
llvm::Value * EmitARCRetainAutoreleasedReturnValue(llvm::Value *value)
void emitAlignmentAssumptionCheck(llvm::Value *Ptr, QualType Ty, SourceLocation Loc, SourceLocation AssumptionLoc, llvm::Value *Alignment, llvm::Value *OffsetValue, llvm::Value *TheCheck, llvm::Instruction *Assumption)
llvm::BlockAddress * GetAddrOfLabel(const LabelDecl *L)
static void EmitOMPTargetTeamsDistributeDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetTeamsDistributeDirective &S)
Emit device code for the target teams distribute directive.
Address EmitLoadOfPointer(Address Ptr, const PointerType *PtrTy, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
Load a pointer with type PtrTy stored at address Ptr.
RawAddress CreateDefaultAlignTempAlloca(llvm::Type *Ty, const Twine &Name="tmp")
CreateDefaultAlignedTempAlloca - This creates an alloca with the default ABI alignment of the given L...
void EmitSynthesizedCXXCopyCtor(Address Dest, Address Src, const Expr *Exp)
static void EmitOMPTargetParallelForSimdDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetParallelForSimdDirective &S)
Emit device code for the target parallel for simd directive.
llvm::Value * EmitObjCAllocWithZone(llvm::Value *value, llvm::Type *returnType)
void EmitCXXAggrConstructorCall(const CXXConstructorDecl *D, llvm::Value *NumElements, Address ArrayPtr, const CXXConstructExpr *E, bool NewPointerIsChecked, bool ZeroInitialization=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...
VlaSizePair getVLASize(const VariableArrayType *vla)
Returns an LLVM value that corresponds to the size, in non-variably-sized elements,...
llvm::Value * EmitSVEGatherLoad(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
void EmitCXXAggrConstructorCall(const CXXConstructorDecl *D, const ArrayType *ArrayTy, Address ArrayPtr, const CXXConstructExpr *E, bool NewPointerIsChecked, bool ZeroInitialization=false)
void popCatchScope()
popCatchScope - Pops the catch scope at the top of the EHScope stack, emitting any required code (oth...
CleanupKind getARCCleanupKind()
Retrieves the default cleanup kind for an ARC cleanup.
void EmitEndEHSpec(const Decl *D)
EmitEndEHSpec - Emit the end of the exception spec.
llvm::Value * EmitRISCVCpuSupports(const CallExpr *E)
AggValueSlot::Overlap_t getOverlapForBaseInit(const CXXRecordDecl *RD, const CXXRecordDecl *BaseRD, bool IsVirtual)
Determine whether a base class initialization may overlap some other object.
void EmitLabel(const LabelDecl *D)
EmitLabel - Emit the block for the given label.
const OMPExecutableDirective * OMPParentLoopDirectiveForScan
Parent loop-based directive for scan directive.
llvm::Value * EmitNVPTXBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
void EmitOMPTeamsDistributeParallelForDirective(const OMPTeamsDistributeParallelForDirective &S)
bool CurFuncIsThunk
In C++, whether we are code generating a thunk.
void EmitOMPTaskDirective(const OMPTaskDirective &S)
RValue EmitRValueForField(LValue LV, const FieldDecl *FD, SourceLocation Loc)
void EmitOMPScanDirective(const OMPScanDirective &S)
void EmitAnyExprToExn(const Expr *E, Address Addr)
void EmitOMPTaskLoopDirective(const OMPTaskLoopDirective &S)
JumpDest getOMPCancelDestination(OpenMPDirectiveKind Kind)
llvm::Value * EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
void EmitCXXDestructorCall(const CXXDestructorDecl *D, CXXDtorType Type, bool ForVirtualBase, bool Delegating, Address This, QualType ThisTy)
void EmitAArch64MultiVersionResolver(llvm::Function *Resolver, ArrayRef< MultiVersionResolverOption > Options)
void EmitOMPMasterTaskLoopSimdDirective(const OMPMasterTaskLoopSimdDirective &S)
llvm::Value * EmitARCAutoreleaseReturnValue(llvm::Value *value)
llvm::Value * EmitAArch64SVEBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
void GenerateObjCMethod(const ObjCMethodDecl *OMD)
void EmitOMPUseDevicePtrClause(const OMPUseDevicePtrClause &C, OMPPrivateScope &PrivateScope, const llvm::DenseMap< const ValueDecl *, llvm::Value * > CaptureDeviceAddrMap)
RValue emitBuiltinOSLogFormat(const CallExpr &E)
Emit IR for __builtin_os_log_format.
LValue EmitLValue(const Expr *E, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
EmitLValue - Emit code to compute a designator that specifies the location of the expression.
bool isSEHTryScope() const
Returns true inside SEH __try blocks.
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.
llvm::Value * EmitARCAutorelease(llvm::Value *value)
llvm::Value * emitPointerAuthResignCall(llvm::Value *Pointer, const CGPointerAuthInfo &CurInfo, const CGPointerAuthInfo &NewInfo)
RValue EmitAtomicLoad(LValue LV, SourceLocation SL, AggValueSlot Slot=AggValueSlot::ignored())
void EmitExtendGCLifetime(llvm::Value *object)
EmitExtendGCLifetime - Given a pointer to an Objective-C object, make sure it survives garbage collec...
llvm::Value * EmitVAStartEnd(llvm::Value *ArgValue, bool IsStart)
Emits a call to an LLVM variable-argument intrinsic, either llvm.va_start or llvm....
void EmitOMPDistributeLoop(const OMPLoopDirective &S, const CodeGenLoopTy &CodeGenLoop, Expr *IncExpr)
Emit code for the distribute loop-based directive.
void EmitARCNoopIntrinsicUse(ArrayRef< llvm::Value * > values)
bool hasVolatileMember(QualType T)
hasVolatileMember - returns true if aggregate type has a volatile member.
llvm::Value * EmitSVEMaskedStore(const CallExpr *, SmallVectorImpl< llvm::Value * > &Ops, unsigned BuiltinID)
llvm::Constant * GenerateObjCAtomicGetterCopyHelperFunction(const ObjCPropertyImplDecl *PID)
void callCStructCopyAssignmentOperator(LValue Dst, LValue Src)
void EmitOMPTaskLoopBasedDirective(const OMPLoopDirective &S)
void callCStructMoveConstructor(LValue Dst, LValue Src)
llvm::Value * EmitIvarOffset(const ObjCInterfaceDecl *Interface, const ObjCIvarDecl *Ivar)
llvm::Value * EmitSVEReinterpret(llvm::Value *Val, llvm::Type *Ty)
llvm::SmallVector< DeferredDeactivateCleanup > DeferredDeactivationCleanupStack
llvm::Value * EmitARCStoreWeak(Address addr, llvm::Value *value, bool ignored)
void EmitSEHExceptionCodeSave(CodeGenFunction &ParentCGF, llvm::Value *ParentFP, llvm::Value *EntryEBP)
llvm::Value * getAsNaturalPointerTo(Address Addr, QualType PointeeType)
llvm::BasicBlock * getEHResumeBlock(bool isCleanup)
static void EmitOMPTargetDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetDirective &S)
Emit device code for the target directive.
void EmitDeleteCall(const FunctionDecl *DeleteFD, llvm::Value *Ptr, QualType DeleteTy, llvm::Value *NumElements=nullptr, CharUnits CookieSize=CharUnits())
LValue EmitBinaryOperatorLValue(const BinaryOperator *E)
void EmitVariablyModifiedType(QualType Ty)
EmitVLASize - Capture all the sizes for the VLA expressions in the given variably-modified type and s...
void callCStructCopyConstructor(LValue Dst, LValue Src)
void EmitCaseStmt(const CaseStmt &S, ArrayRef< const Attr * > Attrs)
RawAddress CreateTempAllocaWithoutCast(llvm::Type *Ty, CharUnits align, const Twine &Name="tmp", llvm::Value *ArraySize=nullptr)
llvm::BasicBlock * createBasicBlock(const Twine &name="", llvm::Function *parent=nullptr, llvm::BasicBlock *before=nullptr)
createBasicBlock - Create an LLVM basic block.
void EmitAtomicUpdate(LValue LVal, llvm::AtomicOrdering AO, const llvm::function_ref< RValue(RValue)> &UpdateOp, bool IsVolatile)
RValue EmitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *E)
LValue EmitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E)
llvm::Value * EmitSEHExceptionInfo()
RValue EmitBuiltinAlignTo(const CallExpr *E, bool AlignUp)
Emit IR for __builtin_align_up/__builtin_align_down.
llvm::Value * EmitARCLoadWeakRetained(Address addr)
void EmitDefaultStmt(const DefaultStmt &S, ArrayRef< const Attr * > Attrs)
const LangOptions & getLangOpts() const
llvm::Value * LoadPassedObjectSize(const Expr *E, QualType EltTy)
If E references a parameter with pass_object_size info or a constant array size modifier,...
static void EmitOMPTargetSimdDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetSimdDirective &S)
Emit device code for the target simd directive.
void EmitOMPDistributeSimdDirective(const OMPDistributeSimdDirective &S)
llvm::Value * EmitObjCProtocolExpr(const ObjCProtocolExpr *E)
void EmitFunctionEpilog(const CGFunctionInfo &FI, bool EmitRetDbgLoc, SourceLocation EndLoc)
EmitFunctionEpilog - Emit the target specific LLVM code to return the given temporary.
llvm::Value * EmitObjCStringLiteral(const ObjCStringLiteral *E)
void ProcessOrderScopeAMDGCN(llvm::Value *Order, llvm::Value *Scope, llvm::AtomicOrdering &AO, llvm::SyncScope::ID &SSID)
void EmitOMPPrivateLoopCounters(const OMPLoopDirective &S, OMPPrivateScope &LoopScope)
Emit initial code for loop counters of loop-based directives.
llvm::Constant * EmitCheckTypeDescriptor(QualType T)
Emit a description of a type in a format suitable for passing to a runtime sanitizer handler.
void pushEHDestroy(QualType::DestructionKind dtorKind, Address addr, QualType type)
void EmitOMPDistributeParallelForDirective(const OMPDistributeParallelForDirective &S)
llvm::BasicBlock * EHResumeBlock
EHResumeBlock - Unified block containing a call to llvm.eh.resume.
LValue EmitLValueForFieldInitialization(LValue Base, const FieldDecl *Field)
EmitLValueForFieldInitialization - Like EmitLValueForField, except that if the Field is a reference,...
LValue EmitInitListLValue(const InitListExpr *E)
llvm::Value * EmitARCRetainAutorelease(QualType type, llvm::Value *value)
void emitArrayDestroy(llvm::Value *begin, llvm::Value *end, QualType elementType, CharUnits elementAlign, Destroyer *destroyer, bool checkZeroLength, bool useEHCleanup)
void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false)
EmitBlock - Emit the given block.
RValue EmitCXXMemberOrOperatorCall(const CXXMethodDecl *Method, const CGCallee &Callee, ReturnValueSlot ReturnValue, llvm::Value *This, llvm::Value *ImplicitParam, QualType ImplicitParamTy, const CallExpr *E, CallArgList *RtlArgs)
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 EmitOMPInterchangeDirective(const OMPInterchangeDirective &S)
void EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc, Address Addr, QualType Type, CharUnits Alignment=CharUnits::Zero(), SanitizerSet SkippedChecks=SanitizerSet(), llvm::Value *ArraySize=nullptr)
void EmitTrapCheck(llvm::Value *Checked, SanitizerHandler CheckHandlerID)
Create a basic block that will call the trap intrinsic, and emit a conditional branch to it,...
llvm::Function * generateAwaitSuspendWrapper(Twine const &CoroName, Twine const &SuspendPointName, CoroutineSuspendExpr const &S)
void EmitObjCAtThrowStmt(const ObjCAtThrowStmt &S)
void EmitUnreachable(SourceLocation Loc)
Emit a reached-unreachable diagnostic if Loc is valid and runtime checking is enabled.
static bool isInstrumentedCondition(const Expr *C)
isInstrumentedCondition - Determine whether the given condition is an instrumentable condition (i....
void EmitX86MultiVersionResolver(llvm::Function *Resolver, ArrayRef< MultiVersionResolverOption > Options)
SmallVector< llvm::Value *, 8 > ObjCEHValueStack
ObjCEHValueStack - Stack of Objective-C exception values, used for rethrows.
void EmitOMPTeamsGenericLoopDirective(const OMPTeamsGenericLoopDirective &S)
bool ConstantFoldsToSimpleInteger(const Expr *Cond, llvm::APSInt &Result, bool AllowLabels=false)
ConstantFoldsToSimpleInteger - If the specified expression does not fold to a constant,...
void pushDestroyAndDeferDeactivation(QualType::DestructionKind dtorKind, Address addr, QualType type)
void EmitFunctionBody(const Stmt *Body)
VlaSizePair getVLAElements1D(QualType vla)
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...
llvm::Value * EmitSVETupleCreate(const SVETypeFlags &TypeFlags, llvm::Type *ReturnType, ArrayRef< llvm::Value * > Ops)
const CodeGen::CGBlockInfo * BlockInfo
void EmitOMPTeamsDistributeDirective(const OMPTeamsDistributeDirective &S)
void EmitAggregateCopyCtor(LValue Dest, LValue Src, AggValueSlot::Overlap_t MayOverlap)
llvm::Value * EmitVTableTypeCheckedLoad(const CXXRecordDecl *RD, llvm::Value *VTable, llvm::Type *VTableTy, uint64_t VTableByteOffset)
Emit a type checked load from the given vtable.
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,...
void pushDestroyAndDeferDeactivation(CleanupKind cleanupKind, Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray)
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.
SmallVector< llvm::OperandBundleDef, 1 > getBundlesForFunclet(llvm::Value *Callee)
llvm::Value * EmitObjCBoxedExpr(const ObjCBoxedExpr *E)
llvm::AllocaInst * EHSelectorSlot
The selector slot.
Address EmitLoadOfReference(LValue RefLVal, LValueBaseInfo *PointeeBaseInfo=nullptr, TBAAAccessInfo *PointeeTBAAInfo=nullptr)
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...
llvm::CallBase * EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee, const Twine &name="")
void emitByrefStructureInit(const AutoVarEmission &emission)
void SimplifyForwardingBlocks(llvm::BasicBlock *BB)
SimplifyForwardingBlocks - If the given basic block is only a branch to another basic block,...
ComplexPairTy EmitComplexExpr(const Expr *E, bool IgnoreReal=false, bool IgnoreImag=false)
EmitComplexExpr - Emit the computation of the specified expression of complex type,...
void callCStructDestructor(LValue Dst)
RValue EmitLoadOfLValue(LValue V, SourceLocation Loc)
EmitLoadOfLValue - Given an expression that represents a value lvalue, this method emits the address ...
llvm::Value * EmitObjCRetainNonBlock(llvm::Value *value, llvm::Type *returnType)
llvm::Value * GetVTTParameter(GlobalDecl GD, bool ForVirtualBase, bool Delegating)
GetVTTParameter - Return the VTT parameter that should be passed to a base constructor/destructor wit...
RValue convertTempToRValue(Address addr, QualType type, SourceLocation Loc)
void EmitOMPParallelDirective(const OMPParallelDirective &S)
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...
llvm::Value * EmitObjCAutorelease(llvm::Value *value, llvm::Type *returnType)
Address EmitExtVectorElementLValue(LValue V)
void EmitOMPSimdFinal(const OMPLoopDirective &D, const llvm::function_ref< llvm::Value *(CodeGenFunction &)> CondGen)
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...
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.
void EmitBlockAfterUses(llvm::BasicBlock *BB)
EmitBlockAfterUses - Emit the given block somewhere hopefully near its uses, and leave the insertion ...
llvm::Value * EmitSMELdrStr(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
LValue MakeAddrLValue(Address Addr, QualType T, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
void SetDivFPAccuracy(llvm::Value *Val)
Set the minimum required accuracy of the given sqrt operation based on CodeGenOpts.
RValue EmitObjCMessageExpr(const ObjCMessageExpr *E, ReturnValueSlot Return=ReturnValueSlot())
void EmitContinueStmt(const ContinueStmt &S)
void setCurrentProfileCount(uint64_t Count)
Set the profiler's current count.
llvm::BasicBlock * getTerminateFunclet()
getTerminateLandingPad - Return a cleanup funclet that just calls terminate.
void EmitIgnoredExpr(const Expr *E)
EmitIgnoredExpr - Emit an expression in a context which ignores the result.
llvm::Value * EmitARCStoreStrongCall(Address addr, llvm::Value *value, bool resultIgnored)
void EmitStoreOfScalar(llvm::Value *Value, Address Addr, bool Volatile, QualType Ty, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo, bool isInit=false, bool isNontemporal=false)
bool InNoMergeAttributedStmt
True if the current statement has nomerge attribute.
LValue EmitCallExprLValue(const CallExpr *E)
LValue EmitUnsupportedLValue(const Expr *E, const char *Name)
EmitUnsupportedLValue - Emit a dummy l-value using the type of E and issue an ErrorUnsupported style ...
llvm::Value * FormSVEBuiltinResult(llvm::Value *Call)
FormSVEBuiltinResult - Returns the struct of scalable vectors as a wider vector.
llvm::Value * EmitNeonSplat(llvm::Value *V, llvm::Constant *Idx, const llvm::ElementCount &Count)
VPtrsVector getVTablePointers(const CXXRecordDecl *VTableClass)
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.
llvm::Type * ConvertTypeForMem(QualType T)
llvm::Function * createTLSAtExitStub(const VarDecl &VD, llvm::FunctionCallee Dtor, llvm::Constant *Addr, llvm::FunctionCallee &AtExit)
Address EmitCheckedInBoundsGEP(Address Addr, ArrayRef< llvm::Value * > IdxList, llvm::Type *elementType, bool SignedIndices, bool IsSubtraction, SourceLocation Loc, CharUnits Align, const Twine &Name="")
void EmitOMPDistributeParallelForSimdDirective(const OMPDistributeParallelForSimdDirective &S)
llvm::Value * EmitARCUnsafeUnretainedScalarExpr(const Expr *expr)
const Decl * CurCodeDecl
CurCodeDecl - This is the inner-most code context, which includes blocks.
LValue MakeAddrLValueWithoutTBAA(Address Addr, QualType T, AlignmentSource Source=AlignmentSource::Type)
void EmitAutoVarInit(const AutoVarEmission &emission)
llvm::BasicBlock * getUnreachableBlock()
void EmitOMPForSimdDirective(const OMPForSimdDirective &S)
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 GenerateOpenMPCapturedVars(const CapturedStmt &S, SmallVectorImpl< llvm::Value * > &CapturedVars)
void EmitNonNullArgCheck(Address Addr, QualType ArgType, SourceLocation ArgLoc, AbstractCallee AC, unsigned ParmNum)
llvm::Value * EmitObjCDictionaryLiteral(const ObjCDictionaryLiteral *E)
bool isPointerKnownNonNull(const Expr *E)
RawAddress CreateMemTempWithoutCast(QualType T, CharUnits Align, const Twine &Name="tmp")
llvm::Value * EmitSVEMaskedLoad(const CallExpr *, llvm::Type *ReturnTy, SmallVectorImpl< llvm::Value * > &Ops, unsigned BuiltinID, bool IsZExtReturn)
bool AlwaysEmitXRayCustomEvents() const
AlwaysEmitXRayCustomEvents - Return true if we must unconditionally emit XRay custom event handling c...
llvm::SmallVector< const JumpDest *, 2 > SEHTryEpilogueStack
void EmitScalarInit(const Expr *init, const ValueDecl *D, LValue lvalue, bool capturedByInit)
JumpDest ReturnBlock
ReturnBlock - Unified return block.
DominatingValue< T >::saved_type saveValueInCond(T value)
const llvm::function_ref< void(CodeGenFunction &, llvm::Function *, const OMPTaskDataTy &)> TaskGenTy
static void EmitOMPTargetTeamsGenericLoopDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetTeamsGenericLoopDirective &S)
Emit device code for the target teams loop directive.
llvm::Value * ExceptionSlot
The exception slot.
unsigned getDebugInfoFIndex(const RecordDecl *Rec, unsigned FieldIndex)
Get the record field index as represented in debug info.
LValue EmitLValueForField(LValue Base, const FieldDecl *Field)
llvm::Value * EmitARCRetainBlock(llvm::Value *value, bool mandatory)
QualType TypeOfSelfObject()
TypeOfSelfObject - Return type of object that this self represents.
LValue EmitCheckedLValue(const Expr *E, TypeCheckKind TCK)
Same as EmitLValue but additionally we generate checking code to guard against undefined behavior.
llvm::Value * EmitSVEDupX(llvm::Value *Scalar)
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...
void EmitOMPFlushDirective(const OMPFlushDirective &S)
void EmitStaticVarDecl(const VarDecl &D, llvm::GlobalValue::LinkageTypes Linkage)
void EmitSEHLeaveStmt(const SEHLeaveStmt &S)
llvm::Value * EmitObjCArrayLiteral(const ObjCArrayLiteral *E)
@ ForceLeftToRight
! Language semantics require left-to-right evaluation.
@ Default
! No language constraints on evaluation order.
@ ForceRightToLeft
! Language semantics require right-to-left evaluation.
void EmitAttributedStmt(const AttributedStmt &S)
void EmitVarAnnotations(const VarDecl *D, llvm::Value *V)
Emit local annotations for the local variable V, declared by D.
llvm::BasicBlock * OMPBeforeScanBlock
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...
Destroyer * getDestroyer(QualType::DestructionKind destructionKind)
void EmitOMPCancelDirective(const OMPCancelDirective &S)
llvm::SmallPtrSet< const CXXRecordDecl *, 4 > VisitedVirtualBasesSetTy
void EmitNewArrayInitializer(const CXXNewExpr *E, QualType elementType, llvm::Type *ElementTy, Address NewPtr, llvm::Value *NumElements, llvm::Value *AllocSizeWithoutCookie)
RawAddress CreateMemTempWithoutCast(QualType T, const Twine &Name="tmp")
CreateMemTemp - Create a temporary memory object of the given type, with appropriate alignmen without...
void EmitOMPGenericLoopDirective(const OMPGenericLoopDirective &S)
llvm::Value * EmitPointerAuthSign(const CGPointerAuthInfo &Info, llvm::Value *Pointer)
void EmitOMPTargetTeamsDistributeDirective(const OMPTargetTeamsDistributeDirective &S)
void EmitObjCRelease(llvm::Value *value, ARCPreciseLifetime_t precise)
void EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst, llvm::Value **Result=nullptr)
EmitStoreThroughBitfieldLValue - Store Src into Dst with same constraints as EmitStoreThroughLValue.
void pushCleanupAndDeferDeactivation(CleanupKind Kind, As... A)
void EmitAtomicInit(Expr *E, LValue lvalue)
static const Expr * stripCond(const Expr *C)
Ignore parentheses and logical-NOT to track conditions consistently.
void EmitCfiCheckStub()
Emit a stub for the cross-DSO CFI check function.
static std::string getNonTrivialDestructorStr(QualType QT, CharUnits Alignment, bool IsVolatile, ASTContext &Ctx)
llvm::DenseMap< const Decl *, Address > DeclMapTy
void EmitCaseStmtRange(const CaseStmt &S, ArrayRef< const Attr * > Attrs)
llvm::Value * EmitObjCConsumeObject(QualType T, llvm::Value *Ptr)
PeepholeProtection protectFromPeepholes(RValue rvalue)
protectFromPeepholes - Protect a value that we're intending to store to the side, but which will prob...
ConstantEmission tryEmitAsConstant(DeclRefExpr *refExpr)
llvm::Value * EmitARCLoadWeak(Address addr)
const TargetInfo & getTarget() const
void initFullExprCleanup()
Set up the last cleanup that was pushed as a conditional full-expression cleanup.
LValue EmitCXXConstructLValue(const CXXConstructExpr *E)
llvm::Value * EmitCMSEClearRecord(llvm::Value *V, llvm::IntegerType *ITy, QualType RTy)
void EmitOMPTaskgroupDirective(const OMPTaskgroupDirective &S)
static void EmitOMPTargetTeamsDistributeParallelForDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetTeamsDistributeParallelForDirective &S)
void emitOMPSimpleStore(LValue LVal, RValue RVal, QualType RValTy, SourceLocation Loc)
bool isInConditionalBranch() const
isInConditionalBranch - Return true if we're currently emitting one branch or the other of a conditio...
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.
llvm::DebugLoc SourceLocToDebugLoc(SourceLocation Location)
Converts Location to a DebugLoc, if debug information is enabled.
llvm::Value * EmitPointerAuthBlendDiscriminator(llvm::Value *StorageAddress, llvm::Value *Discriminator)
Create the discriminator from the storage address and the entity hash.
llvm::Constant * GenerateDestroyHelperFunction(const CGBlockInfo &blockInfo)
llvm::Value * vectorWrapScalar16(llvm::Value *Op)
llvm::Function * LookupNeonLLVMIntrinsic(unsigned IntrinsicID, unsigned Modifier, llvm::Type *ArgTy, const CallExpr *E)
llvm::Value * getTypeSize(QualType Ty)
Returns calculated size of the specified type.
std::pair< LValue, llvm::Value * > EmitARCStoreAutoreleasing(const BinaryOperator *e)
void EmitLabelStmt(const LabelStmt &S)
void emitDestroy(Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray)
RValue EmitCall(QualType FnType, const CGCallee &Callee, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Value *Chain=nullptr)
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.
llvm::Value * EmitObjCAllocInit(llvm::Value *value, llvm::Type *resultType)
LValue EmitVAArgExprLValue(const VAArgExpr *E)
llvm::Value * EmitSEHExceptionCode()
bool EmitScalarRangeCheck(llvm::Value *Value, QualType Ty, SourceLocation Loc)
Check if the scalar Value is within the valid range for the given type Ty.
llvm::Value * EmitObjCCollectionLiteral(const Expr *E, const ObjCMethodDecl *MethodWithObjects)
void EmitOMPDepobjDirective(const OMPDepobjDirective &S)
llvm::Function * generateDestroyHelper(Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray, const VarDecl *VD)
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...
llvm::Value * EmitTargetBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue)
EmitTargetBuiltinExpr - Emit the given builtin call.
llvm::Value * EmitCountedByFieldExpr(const Expr *Base, const FieldDecl *FAMDecl, const FieldDecl *CountDecl)
Build an expression accessing the "counted_by" field.
void GenerateCXXGlobalCleanUpFunc(llvm::Function *Fn, ArrayRef< std::tuple< llvm::FunctionType *, llvm::WeakTrackingVH, llvm::Constant * > > DtorsOrStermFinalizers)
GenerateCXXGlobalCleanUpFunc - Generates code for cleaning up global variables.
void EmitCXXGuardedInit(const VarDecl &D, llvm::GlobalVariable *DeclPtr, bool PerformInit)
Emit code in this function to perform a guarded variable initialization.
const Expr * RetExpr
If a return statement is being visited, this holds the return statment's result expression.
void EmitARCRelease(llvm::Value *value, ARCPreciseLifetime_t precise)
void EmitCXXGlobalVarDeclInit(const VarDecl &D, llvm::GlobalVariable *GV, bool PerformInit)
EmitCXXGlobalVarDeclInit - Create the initializer for a C++ variable with global storage.
LValue EmitCoyieldLValue(const CoyieldExpr *E)
void EmitInitializerForField(FieldDecl *Field, LValue LHS, Expr *Init)
llvm::Value * EmitObjCThrowOperand(const Expr *expr)
RValue EmitAnyExprToTemp(const Expr *E)
EmitAnyExprToTemp - Similarly to EmitAnyExpr(), however, the result will always be accessible even if...
void pushCleanupAfterFullExpr(CleanupKind Kind, As... A)
Queue a cleanup to be pushed after finishing the current full-expression, potentially with an active ...
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::Value * emitPointerAuthResign(llvm::Value *Pointer, QualType PointerType, const CGPointerAuthInfo &CurAuthInfo, const CGPointerAuthInfo &NewAuthInfo, bool IsKnownNonNull)
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....
void EmitOMPSingleDirective(const OMPSingleDirective &S)
std::pair< LValue, llvm::Value * > EmitARCStoreUnsafeUnretained(const BinaryOperator *e, bool ignored)
ComplexPairTy EmitPromotedComplexExpr(const Expr *E, QualType PromotionType)
void pushFullExprCleanup(CleanupKind kind, As... A)
pushFullExprCleanup - Push a cleanup to be run at the end of the current full-expression.
RValue EmitCoroutineIntrinsic(const CallExpr *E, unsigned int IID)
void initFullExprCleanupWithFlag(RawAddress ActiveFlag)
RValue EmitSimpleCallExpr(const CallExpr *E, ReturnValueSlot ReturnValue)
llvm::Value * EmitAArch64SMEBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
void EmitOMPTargetTeamsGenericLoopDirective(const OMPTargetTeamsGenericLoopDirective &S)
RValue EmitAMDGPUDevicePrintfCallExpr(const CallExpr *E)
void EmitReturnValueCheck(llvm::Value *RV)
Emit a test that checks if the return value RV is nonnull.
llvm::BasicBlock * getInvokeDest()
Address EmitArrayToPointerDecay(const Expr *Array, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
void EmitCheck(ArrayRef< std::pair< llvm::Value *, SanitizerMask > > Checked, SanitizerHandler Check, ArrayRef< llvm::Constant * > StaticArgs, ArrayRef< llvm::Value * > DynamicArgs)
Create a basic block that will either trap or call a handler function in the UBSan runtime with the p...
RValue EmitBuiltinNewDeleteCall(const FunctionProtoType *Type, const CallExpr *TheCallExpr, bool IsDelete)
Address mergeAddressesInConditionalExpr(Address LHS, Address RHS, llvm::BasicBlock *LHSBlock, llvm::BasicBlock *RHSBlock, llvm::BasicBlock *MergeBlock, QualType MergedType)
llvm::CanonicalLoopInfo * EmitOMPCollapsedCanonicalLoopNest(const Stmt *S, int Depth)
Emit the Stmt S and return its topmost canonical loop, if any.
LValue EmitUnaryOpLValue(const UnaryOperator *E)
void EmitBlockWithFallThrough(llvm::BasicBlock *BB, const Stmt *S)
llvm::Value * LoadObjCSelf()
LoadObjCSelf - Load the value of self.
bool ShouldEmitVTableTypeCheckedLoad(const CXXRecordDecl *RD)
Returns whether we should perform a type checked load when loading a virtual function for virtual cal...
ComplexPairTy EmitComplexPrePostIncDec(const UnaryOperator *E, LValue LV, bool isInc, bool isPre)
RValue EmitUnsupportedRValue(const Expr *E, const char *Name)
EmitUnsupportedRValue - Emit a dummy r-value using the type of E and issue an ErrorUnsupported style ...
void EmitAtomicStore(RValue rvalue, LValue lvalue, llvm::AtomicOrdering AO, bool IsVolatile, bool isInit)
llvm::Value * EmitARCRetainAutoreleaseReturnValue(llvm::Value *value)
llvm::Value * EmitSVETupleSetOrGet(const SVETypeFlags &TypeFlags, llvm::Type *ReturnType, ArrayRef< llvm::Value * > Ops)
void EmitARCCopyWeak(Address dst, Address src)
void maybeResetMCDCCondBitmap(const Expr *E)
Zero-init the MCDC temp value.
static unsigned getAccessedFieldNo(unsigned Idx, const llvm::Constant *Elts)
getAccessedFieldNo - Given an encoded value and a result number, return the input field number being ...
void EmitSimpleOMPExecutableDirective(const OMPExecutableDirective &D)
Emit simple code for OpenMP directives in Simd-only mode.
void pushSEHCleanup(CleanupKind kind, llvm::Function *FinallyFunc)
RValue EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue)
void PushDestructorCleanup(QualType T, Address Addr)
PushDestructorCleanup - Push a cleanup to call the complete-object destructor of an object of the giv...
void EmitCXXConstructorCall(const CXXConstructorDecl *D, CXXCtorType Type, bool ForVirtualBase, bool Delegating, AggValueSlot ThisAVS, const CXXConstructExpr *E)
void EmitOMPDistributeDirective(const OMPDistributeDirective &S)
CGCallee BuildAppleKextVirtualDestructorCall(const CXXDestructorDecl *DD, CXXDtorType Type, const CXXRecordDecl *RD)
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.
void EmitOMPParallelForDirective(const OMPParallelForDirective &S)
void EmitOMPTeamsDirective(const OMPTeamsDirective &S)
bool ShouldSkipSanitizerInstrumentation()
ShouldSkipSanitizerInstrumentation - Return true if the current function should not be instrumented w...
uint64_t getCurrentProfileCount()
Get the profiler's current count.
void EmitBoundsCheckImpl(const Expr *E, llvm::Value *Bound, llvm::Value *Index, QualType IndexType, QualType IndexedType, bool Accessed)
llvm::Value * EmitSVEDupX(llvm::Value *Scalar, llvm::Type *Ty)
llvm::Value * EmitSVEPrefetchLoad(const SVETypeFlags &TypeFlags, SmallVectorImpl< llvm::Value * > &Ops, unsigned BuiltinID)
SmallVector< const BinaryOperator *, 16 > MCDCLogOpStack
Stack to track the Logical Operator recursion nest for MC/DC.
llvm::Value * EmitAArch64CompareBuiltinExpr(llvm::Value *Op, llvm::Type *Ty, const llvm::CmpInst::Predicate Fp, const llvm::CmpInst::Predicate Ip, const llvm::Twine &Name="")
void setBlockContextParameter(const ImplicitParamDecl *D, unsigned argNum, llvm::Value *ptr)
void defaultInitNonTrivialCStructVar(LValue Dst)
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.
void EmitCfiCheckFail()
Emit a cross-DSO CFI failure handling function.
AggValueSlot CreateAggTemp(QualType T, const Twine &Name="tmp", RawAddress *Alloca=nullptr)
CreateAggTemp - Create a temporary memory object for the given aggregate type.
RValue EmitLoadOfExtVectorElementLValue(LValue V)
llvm::ScalableVectorType * getSVEType(const SVETypeFlags &TypeFlags)
void EmitOMPUnrollDirective(const OMPUnrollDirective &S)
void EmitOMPParallelMasterTaskLoopSimdDirective(const OMPParallelMasterTaskLoopSimdDirective &S)
void EmitDelegateCallArg(CallArgList &args, const VarDecl *param, SourceLocation loc)
EmitDelegateCallArg - We are performing a delegate call; that is, the current function is delegating ...
void EmitOMPTargetDataDirective(const OMPTargetDataDirective &S)
RValue EmitCoyieldExpr(const CoyieldExpr &E, AggValueSlot aggSlot=AggValueSlot::ignored(), bool ignoreResult=false)
ComplexPairTy EmitLoadOfComplex(LValue src, SourceLocation loc)
EmitLoadOfComplex - Load a complex number from the specified l-value.
static bool ShouldNullCheckClassCastValue(const CastExpr *Cast)
bool HaveInsertPoint() const
HaveInsertPoint - True if an insertion point is defined.
RValue emitRotate(const CallExpr *E, bool IsRotateRight)
llvm::Value * EmitComplexToScalarConversion(ComplexPairTy Src, QualType SrcTy, QualType DstTy, SourceLocation Loc)
Emit a conversion from the specified complex type to the specified destination type,...
llvm::Constant * EmitCheckSourceLocation(SourceLocation Loc)
Emit a description of a source location in a format suitable for passing to a runtime sanitizer handl...
void markAsIgnoreThreadCheckingAtRuntime(llvm::Function *Fn)
Annotate the function with an attribute that disables TSan checking at runtime.
void EmitSwitchStmt(const SwitchStmt &S)
LValue EmitLValueForLambdaField(const FieldDecl *Field, llvm::Value *ThisValue)
bool isTrivialInitializer(const Expr *Init)
Determine whether the given initializer is trivial in the sense that it requires no code to be genera...
LValue EmitComplexAssignmentLValue(const BinaryOperator *E)
Emit an l-value for an assignment (simple or compound) of complex type.
void ErrorUnsupported(const Stmt *S, const char *Type)
ErrorUnsupported - Print out an error that codegen doesn't support the specified stmt yet.
void EmitOMPTargetTeamsDistributeParallelForSimdDirective(const OMPTargetTeamsDistributeParallelForSimdDirective &S)
Address recoverAddrOfEscapedLocal(CodeGenFunction &ParentCGF, Address ParentVar, llvm::Value *ParentFP)
Recovers the address of a local in a parent function.
const FieldDecl * FindFlexibleArrayMemberFieldAndOffset(ASTContext &Ctx, const RecordDecl *RD, const FieldDecl *FAMDecl, uint64_t &Offset)
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.
LValue EmitObjCSelectorLValue(const ObjCSelectorExpr *E)
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...
Address EmitVAListRef(const Expr *E)
LValue EmitObjCEncodeExprLValue(const ObjCEncodeExpr *E)
Address emitAddrOfImagComponent(Address complex, QualType complexType)
Address emitBlockByrefAddress(Address baseAddr, const BlockByrefInfo &info, bool followForward, const llvm::Twine &name)
LValue EmitDeclRefLValue(const DeclRefExpr *E)
llvm::Value * EmitLoadOfScalar(LValue lvalue, SourceLocation Loc)
EmitLoadOfScalar - Load a scalar value from an address, taking care to appropriately convert from the...
void EmitOMPTeamsDistributeParallelForSimdDirective(const OMPTeamsDistributeParallelForSimdDirective &S)
void EmitBranch(llvm::BasicBlock *Block)
EmitBranch - Emit a branch to the specified basic block from the current insert block,...
AggValueSlot::Overlap_t getOverlapForFieldInit(const FieldDecl *FD)
Determine whether a field initialization may overlap some other object.
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::Function * GenerateCapturedStmtFunction(const CapturedStmt &S)
void EmitAggregateCopy(LValue Dest, LValue Src, QualType EltTy, AggValueSlot::Overlap_t MayOverlap, bool isVolatile=false)
EmitAggregateCopy - Emit an aggregate copy.
llvm::Value * EmitARCReclaimReturnedObject(const Expr *e, bool allowUnsafeClaim)
void EmitSEHTryStmt(const SEHTryStmt &S)
void maybeCreateMCDCCondBitmap()
Allocate a temp value on the stack that MCDC can use to track condition results.
void EmitOMPInteropDirective(const OMPInteropDirective &S)
llvm::Value * EmitNeonShiftVector(llvm::Value *V, llvm::Type *Ty, bool negateForRightShift)
void ExitSEHTryStmt(const SEHTryStmt &S)
llvm::Constant * GenerateCopyHelperFunction(const CGBlockInfo &blockInfo)
void EmitCXXDeleteExpr(const CXXDeleteExpr *E)
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 * unregisterGlobalDtorWithUnAtExit(llvm::Constant *dtorStub)
Call unatexit() with function dtorStub.
SmallVector< llvm::IntrinsicInst *, 4 > ConvergenceTokenStack
Stack to track the controlled convergence tokens.
llvm::BasicBlock * OMPScanDispatch
llvm::BasicBlock * getTerminateLandingPad()
getTerminateLandingPad - Return a landing pad that just calls terminate.
llvm::BasicBlock * getTerminateHandler()
getTerminateHandler - Return a handler (not a landing pad, just a catch handler) that just calls term...
void EmitObjCAutoreleasePoolPop(llvm::Value *Ptr)
llvm::Value * EmitSVEMovl(const SVETypeFlags &TypeFlags, llvm::ArrayRef< llvm::Value * > Ops, unsigned BuiltinID)
llvm::function_ref< std::pair< LValue, LValue >(CodeGenFunction &, const OMPExecutableDirective &S)> CodeGenLoopBoundsTy
RValue EmitCall(const CGFunctionInfo &CallInfo, const CGCallee &Callee, ReturnValueSlot ReturnValue, const CallArgList &Args, llvm::CallBase **callOrInvoke=nullptr, bool IsMustTail=false)
llvm::Value * EmitARCRetainAutoreleaseScalarExpr(const Expr *expr)
void emitAlignmentAssumption(llvm::Value *PtrValue, QualType Ty, SourceLocation Loc, SourceLocation AssumptionLoc, llvm::Value *Alignment, llvm::Value *OffsetValue=nullptr)
const TargetCodeGenInfo & getTargetHooks() const
void setBeforeOutermostConditional(llvm::Value *value, Address addr, CodeGenFunction &CGF)
llvm::Value * emitBoolVecConversion(llvm::Value *SrcVec, unsigned NumElementsDst, const llvm::Twine &Name="")
LValue MakeNaturalAlignRawAddrLValue(llvm::Value *V, QualType T)
LValue EmitPredefinedLValue(const PredefinedExpr *E)
llvm::Value * EmitARMBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Triple::ArchType Arch)
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...
RValue EmitReferenceBindingToExpr(const Expr *E)
Emits a reference binding to the passed in expression.
llvm::Type * getEltType(const SVETypeFlags &TypeFlags)
CodeGenFunction(CodeGenModule &cgm, bool suppressNewContext=false)
void EmitAggExpr(const Expr *E, AggValueSlot AS)
EmitAggExpr - Emit the computation of the specified expression of aggregate type.
void EmitOMPTargetTaskBasedDirective(const OMPExecutableDirective &S, const RegionCodeGenTy &BodyGen, OMPTargetDataInfo &InputInfo)
void EmitDeclStmt(const DeclStmt &S)
bool ShouldXRayInstrumentFunction() const
ShouldXRayInstrument - Return true if the current function should be instrumented with XRay nop sleds...
Address GetAddressOfDerivedClass(Address Value, const CXXRecordDecl *Derived, CastExpr::path_const_iterator PathBegin, CastExpr::path_const_iterator PathEnd, bool NullCheckValue)
bool InNoInlineAttributedStmt
True if the current statement has noinline attribute.
void EmitOMPTargetParallelDirective(const OMPTargetParallelDirective &S)
void EnterCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock=false)
static bool IsConstructorDelegationValid(const CXXConstructorDecl *Ctor)
llvm::Function * GenerateBlockFunction(GlobalDecl GD, const CGBlockInfo &Info, const DeclMapTy &ldm, bool IsLambdaConversionToBlock, bool BuildGlobalBlock)
void EmitStoreThroughExtVectorComponentLValue(RValue Src, LValue Dst)
void EmitOMPParallelMaskedDirective(const OMPParallelMaskedDirective &S)
static void EmitOMPTargetParallelForDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetParallelForDirective &S)
Emit device code for the target parallel for directive.
llvm::Value * EmitSVEPMull(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned BuiltinID)
void EmitStartEHSpec(const Decl *D)
EmitStartEHSpec - Emit the start of the exception spec.
void EmitCoroutineBody(const CoroutineBodyStmt &S)
Address EmitCompoundStmt(const CompoundStmt &S, bool GetLast=false, AggValueSlot AVS=AggValueSlot::ignored())
llvm::Value * EmitToMemory(llvm::Value *Value, QualType Ty)
EmitToMemory - Change a scalar value from its value representation to its in-memory representation.
void EmitMultiVersionResolver(llvm::Function *Resolver, ArrayRef< MultiVersionResolverOption > Options)
void EmitDoStmt(const DoStmt &S, ArrayRef< const Attr * > Attrs=std::nullopt)
llvm::Value * EmitCheckValue(llvm::Value *V)
Convert a value into a format suitable for passing to a runtime sanitizer handler.
RValue EmitOpenMPDevicePrintfCallExpr(const CallExpr *E)
VlaSizePair getVLAElements1D(const VariableArrayType *vla)
Return the number of elements for a single dimension for the given array type.
void EmitCXXTemporary(const CXXTemporary *Temporary, QualType TempType, Address Ptr)
llvm::Value * EmitCMSEClearRecord(llvm::Value *V, llvm::ArrayType *ATy, QualType RTy)
void EmitStoreOfScalar(llvm::Value *value, LValue lvalue, bool isInit=false)
EmitStoreOfScalar - Store a scalar value to an address, taking care to appropriately convert from the...
void EmitAggregateStore(llvm::Value *Val, Address Dest, bool DestIsVolatile)
Build all the stores needed to initialize an aggregate at Dest with the value Val.
bool IsInPreservedAIRegion
True if CodeGen currently emits code inside presereved access index region.
llvm::Value * EmitARCRetain(QualType type, llvm::Value *value)
llvm::Value * authPointerToPointerCast(llvm::Value *ResultPtr, QualType SourceType, QualType DestType)
bool AlwaysEmitXRayTypedEvents() const
AlwaysEmitXRayTypedEvents - Return true if clang must unconditionally emit XRay typed event handling ...
void pushCleanupAfterFullExprWithActiveFlag(CleanupKind Kind, RawAddress ActiveFlag, As... A)
void SetSqrtFPAccuracy(llvm::Value *Val)
Set the minimum required accuracy of the given sqrt operation based on CodeGenOpts.
void registerGlobalDtorWithAtExit(llvm::Constant *dtorStub)
Call atexit() with function dtorStub.
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.
void EmitOMPSimdInit(const OMPLoopDirective &D)
Helpers for the OpenMP loop directives.
RValue EmitPseudoObjectRValue(const PseudoObjectExpr *e, AggValueSlot slot=AggValueSlot::ignored())
RValue EmitCXXDestructorCall(GlobalDecl Dtor, const CGCallee &Callee, llvm::Value *This, QualType ThisTy, llvm::Value *ImplicitParam, QualType ImplicitParamTy, const CallExpr *E)
llvm::Value * EmitSVEScatterStore(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
llvm::Value * EmitObjCSelectorExpr(const ObjCSelectorExpr *E)
void EmitConstructorBody(FunctionArgList &Args)
void SetFastMathFlags(FPOptions FPFeatures)
Set the codegen fast-math flags.
int ExpectedOMPLoopDepth
Number of nested loop to be consumed by the last surrounding loop-associated directive.
void EmitVarDecl(const VarDecl &D)
EmitVarDecl - Emit a local variable declaration.
llvm::Value * EmitARCUnsafeClaimAutoreleasedReturnValue(llvm::Value *value)
void EmitOMPParallelForSimdDirective(const OMPParallelForSimdDirective &S)
llvm::CallInst * EmitNounwindRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
llvm::Value * EmitBuiltinAvailable(const VersionTuple &Version)
llvm::Value * EmitARCStoreStrong(LValue lvalue, llvm::Value *value, bool resultIgnored)
CGCallee BuildAppleKextVirtualCall(const CXXMethodDecl *MD, NestedNameSpecifier *Qual, llvm::Type *Ty)
LValue EmitObjCMessageExprLValue(const ObjCMessageExpr *E)
void EmitVTableAssumptionLoads(const CXXRecordDecl *ClassDecl, Address This)
Emit assumption load for all bases.
llvm::Function * generateBuiltinOSLogHelperFunction(const analyze_os_log::OSLogBufferLayout &Layout, CharUnits BufferAlignment)
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...
CGCallee EmitCallee(const Expr *E)
llvm::Value * EmitBlockLiteral(const BlockExpr *)
Emit block literal.
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.
void EmitAggFinalDestCopy(QualType Type, AggValueSlot Dest, const LValue &Src, ExprValueKind SrcKind)
EmitAggFinalDestCopy - Emit copy of the specified aggregate into destination address.
void Destroyer(CodeGenFunction &CGF, Address addr, QualType ty)
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="")
llvm::Constant * GenerateObjCAtomicSetterCopyHelperFunction(const ObjCPropertyImplDecl *PID)
ComplexPairTy EmitUnPromotedValue(ComplexPairTy result, QualType PromotionType)
LValue EmitLoadOfPointerLValue(Address Ptr, const PointerType *PtrTy)
llvm::Value * EmitScalarOrConstFoldImmArg(unsigned ICEArguments, unsigned Idx, const CallExpr *E)
void maybeUpdateMCDCCondBitmap(const Expr *E, llvm::Value *Val)
Update the MCDC temp value with the condition's evaluated result.
static void EmitOMPTargetTeamsDistributeSimdDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetTeamsDistributeSimdDirective &S)
Emit device code for the target teams distribute simd directive.
void checkTargetFeatures(const CallExpr *E, const FunctionDecl *TargetDecl)
void EmitLambdaInAllocaCallOpBody(const CXXMethodDecl *MD)
SmallVector< llvm::CanonicalLoopInfo *, 4 > OMPLoopNestStack
List of recently emitted OMPCanonicalLoops.
bool EmitOMPWorksharingLoop(const OMPLoopDirective &S, Expr *EUB, const CodeGenLoopBoundsTy &CodeGenLoopBounds, const CodeGenDispatchBoundsTy &CGDispatchBounds)
Emit code for the worksharing loop-based directive.
llvm::SmallVector< char, 256 > LifetimeExtendedCleanupStack
void EmitCXXForRangeStmt(const CXXForRangeStmt &S, ArrayRef< const Attr * > Attrs=std::nullopt)
llvm::Value * LoadCXXVTT()
LoadCXXVTT - Load the VTT parameter to base constructors/destructors have virtual bases.
void EmitDeclRefExprDbgValue(const DeclRefExpr *E, const APValue &Init)
void EmitOpenACCLoopConstruct(const OpenACCLoopConstruct &S)
void EmitCXXThrowExpr(const CXXThrowExpr *E, bool KeepInsertionPoint=true)
void EmitOMPLinearClause(const OMPLoopDirective &D, CodeGenFunction::OMPPrivateScope &PrivateScope)
Emit initial code for linear clauses.
llvm::Instruction * getPostAllocaInsertPoint()
Return PostAllocaInsertPt.
void StartThunk(llvm::Function *Fn, GlobalDecl GD, const CGFunctionInfo &FnInfo, bool IsUnprototyped)
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 ...
void EmitBranchThroughCleanup(JumpDest Dest)
EmitBranchThroughCleanup - Emit a branch from the current insert block through the normal cleanup han...
void emitARCMoveAssignWeak(QualType Ty, Address DstAddr, Address SrcAddr)
LValue EmitMemberExpr(const MemberExpr *E)
AutoVarEmission EmitAutoVarAlloca(const VarDecl &var)
void pushDestroy(QualType::DestructionKind dtorKind, Address addr, QualType type)
LValue EmitArraySubscriptExpr(const ArraySubscriptExpr *E, bool Accessed=false)
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...
RValue EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E, const CXXMethodDecl *MD, ReturnValueSlot ReturnValue)
bool ConstantFoldsToSimpleInteger(const Expr *Cond, bool &Result, bool AllowLabels=false)
ConstantFoldsToSimpleInteger - If the specified expression does not fold to a constant,...
Address ReturnValuePointer
ReturnValuePointer - The temporary alloca to hold a pointer to sret.
llvm::ConstantInt * getUBSanFunctionTypeHash(QualType T) const
Return a type hash constant for a function instrumented by -fsanitize=function.
ComplexPairTy EmitPromotedValue(ComplexPairTy result, QualType PromotionType)
llvm::Value * SEHInfo
Value returned by __exception_info intrinsic.
llvm::Value * BuildVector(ArrayRef< llvm::Value * > Ops)
ConstantEmission tryEmitAsConstant(const MemberExpr *ME)
llvm::Value * EmitWebAssemblyBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
void callCStructMoveAssignmentOperator(LValue Dst, LValue Src)
void EmitAutoVarCleanups(const AutoVarEmission &emission)
llvm::GlobalVariable * AddInitializerToStaticVarDecl(const VarDecl &D, llvm::GlobalVariable *GV)
AddInitializerToStaticVarDecl - Add the initializer for 'D' to the global variable that has already b...
llvm::Value * EmitARMCDEBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Triple::ArchType Arch)
void EmitOMPTileDirective(const OMPTileDirective &S)
void PopCleanupBlock(bool FallThroughIsBranchThrough=false, bool ForDeactivation=false)
PopCleanupBlock - Will pop the cleanup entry on the stack and process all branch fixups.
JumpDest getJumpDestForLabel(const LabelDecl *S)
getBasicBlockForLabel - Return the LLVM basicblock that the specified label maps to.
bool EmitOMPLinearClauseInit(const OMPLoopDirective &D)
Emit initial code for linear variables.
bool needsEHCleanup(QualType::DestructionKind kind)
Determines whether an EH cleanup is required to destroy a type with the given destruction kind.
llvm::Value * EmitPromotedScalarExpr(const Expr *E, QualType PromotionType)
llvm::BasicBlock * EmitLandingPad()
Emits a landing pad for the current EH stack.
void EmitObjCAtSynchronizedStmt(const ObjCAtSynchronizedStmt &S)
llvm::DenseMap< const ValueDecl *, FieldDecl * > LambdaCaptureFields
llvm::Function * EmitCapturedStmt(const CapturedStmt &S, CapturedRegionKind K)
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...
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="")
void EmitOMPLoopBody(const OMPLoopDirective &D, JumpDest LoopExit)
Helper for the OpenMP loop directives.
void EmitCXXConstructExpr(const CXXConstructExpr *E, AggValueSlot Dest)
VlaSizePair getVLASize(QualType vla)
llvm::Value * EmitObjCMRRAutoreleasePoolPush()
void EmitInvariantStart(llvm::Constant *Addr, CharUnits Size)
void maybeUpdateMCDCTestVectorBitmap(const Expr *E)
Increment the profiler's counter for the given expression by StepV.
void EmitOMPLinearClauseFinal(const OMPLoopDirective &D, const llvm::function_ref< llvm::Value *(CodeGenFunction &)> CondGen)
Emit final code for linear clauses.
llvm::Type * ConvertType(QualType T)
llvm::Value * EmitCXXTypeidExpr(const CXXTypeidExpr *E)
void EmitNoreturnRuntimeCallOrInvoke(llvm::FunctionCallee callee, ArrayRef< llvm::Value * > args)
void EmitOMPSectionsDirective(const OMPSectionsDirective &S)
RValue EmitCXXMemberCallExpr(const CXXMemberCallExpr *E, ReturnValueSlot ReturnValue)
Address GetAddrOfBlockDecl(const VarDecl *var)
CodeGenTypes & getTypes() const
void EmitARCInitWeak(Address addr, llvm::Value *value)
llvm::CallBase * EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee, ArrayRef< llvm::Value * > args, const Twine &name="")
LValue EmitArraySectionExpr(const ArraySectionExpr *E, bool IsLowerBound=true)
llvm::BasicBlock * OMPScanExitBlock
llvm::Value * EmitSystemZBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
void emitAlignmentAssumption(llvm::Value *PtrValue, const Expr *E, SourceLocation AssumptionLoc, llvm::Value *Alignment, llvm::Value *OffsetValue=nullptr)
static void EmitOMPTargetTeamsDistributeParallelForSimdDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetTeamsDistributeParallelForSimdDirective &S)
Emit device code for the target teams distribute parallel for simd directive.
bool IsSanitizerScope
True if CodeGen currently emits code implementing sanitizer checks.
LValue EmitCXXTypeidLValue(const CXXTypeidExpr *E)
llvm::CallBase * EmitCallOrInvoke(llvm::FunctionCallee Callee, ArrayRef< llvm::Value * > Args, const Twine &Name="")
void EmitStoreThroughGlobalRegLValue(RValue Src, LValue Dst)
Address EmitCXXUuidofExpr(const CXXUuidofExpr *E)
bool InAlwaysInlineAttributedStmt
True if the current statement has always_inline attribute.
RawAddress CreateTempAlloca(llvm::Type *Ty, CharUnits align, const Twine &Name="tmp", llvm::Value *ArraySize=nullptr, RawAddress *Alloca=nullptr)
void EmitOMPUseDeviceAddrClause(const OMPUseDeviceAddrClause &C, OMPPrivateScope &PrivateScope, const llvm::DenseMap< const ValueDecl *, llvm::Value * > CaptureDeviceAddrMap)
void generateObjCSetterBody(const ObjCImplementationDecl *classImpl, const ObjCPropertyImplDecl *propImpl, llvm::Constant *AtomicHelperFn)
void EmitOMPTargetSimdDirective(const OMPTargetSimdDirective &S)
void EmitOMPTaskyieldDirective(const OMPTaskyieldDirective &S)
void EmitCallArg(CallArgList &args, const Expr *E, QualType ArgType)
EmitCallArg - Emit a single call argument.
llvm::Value * EmitSMEReadWrite(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
void EmitOpenACCComputeConstruct(const OpenACCComputeConstruct &S)
void EmitOMPSimdDirective(const OMPSimdDirective &S)
void EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc, LValue LV, QualType Type, SanitizerSet SkippedChecks=SanitizerSet(), llvm::Value *ArraySize=nullptr)
llvm::Value * EmitSMELd1St1(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
void EmitOMPCriticalDirective(const OMPCriticalDirective &S)
llvm::SmallVector< const ParmVarDecl *, 4 > FnArgs
Save Parameter Decl for coroutine.
void ActivateCleanupBlock(EHScopeStack::stable_iterator Cleanup, llvm::Instruction *DominatingIP)
ActivateCleanupBlock - Activates an initially-inactive cleanup.
void PopCleanupBlocks(EHScopeStack::stable_iterator OldCleanupStackSize, size_t OldLifetimeExtendedStackSize, std::initializer_list< llvm::Value ** > ValuesToReload={})
Takes the old cleanup stack size and emits the cleanup blocks that have been added,...
QualType BuildFunctionArgList(GlobalDecl GD, FunctionArgList &Args)
void GenerateCXXGlobalVarDeclInitFunc(llvm::Function *Fn, const VarDecl *D, llvm::GlobalVariable *Addr, bool PerformInit)
llvm::Value * EmitPPCBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
LValue EmitStringLiteralLValue(const StringLiteral *E)
void EmitCapturedLocals(CodeGenFunction &ParentCGF, const Stmt *OutlinedStmt, bool IsFilter)
Scan the outlined statement for captures from the parent function.
static Destroyer destroyARCStrongPrecise
void EmitARCIntrinsicUse(ArrayRef< llvm::Value * > values)
RValue EmitNVPTXDevicePrintfCallExpr(const CallExpr *E)
void EmitObjCAutoreleasePoolStmt(const ObjCAutoreleasePoolStmt &S)
void EmitOMPForDirective(const OMPForDirective &S)
void EmitOMPMetaDirective(const OMPMetaDirective &S)
void EmitCtorPrologue(const CXXConstructorDecl *CD, CXXCtorType Type, FunctionArgList &Args)
RawAddress NormalCleanupDest
i32s containing the indexes of the cleanup destinations.
RValue EmitAtomicLoad(LValue lvalue, SourceLocation loc, llvm::AtomicOrdering AO, bool IsVolatile=false, AggValueSlot slot=AggValueSlot::ignored())
llvm::Value * EvaluateExprAsBool(const Expr *E)
EvaluateExprAsBool - Perform the usual unary conversions on the specified expression and compare the ...
llvm::Value * EmitSVEStructLoad(const SVETypeFlags &TypeFlags, SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
void EmitOMPTargetUpdateDirective(const OMPTargetUpdateDirective &S)
LValue InitCapturedStruct(const CapturedStmt &S)
void EmitOMPParallelMasterDirective(const OMPParallelMasterDirective &S)
void EmitReturnStmt(const ReturnStmt &S)
AggValueSlot::Overlap_t getOverlapForReturnValue()
Determine whether a return value slot may overlap some other object.
RValue EmitCoawaitExpr(const CoawaitExpr &E, AggValueSlot aggSlot=AggValueSlot::ignored(), bool ignoreResult=false)
void EmitLambdaDelegatingInvokeBody(const CXXMethodDecl *MD, CallArgList &CallArgs)
Address EmitMSVAListRef(const Expr *E)
Emit a "reference" to a __builtin_ms_va_list; this is always the value of the expression,...
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 ...
LValue EmitOMPSharedLValue(const Expr *E)
Emits the lvalue for the expression with possibly captured variable.
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 EmitOMPTargetTeamsDistributeSimdDirective(const OMPTargetTeamsDistributeSimdDirective &S)
llvm::Value * EmitARCRetainNonBlock(llvm::Value *value)
void processInReduction(const OMPExecutableDirective &S, OMPTaskDataTy &Data, CodeGenFunction &CGF, const CapturedStmt *CS, OMPPrivateScope &Scope)
void EmitOMPMasterDirective(const OMPMasterDirective &S)
void EmitOMPMasterTaskLoopDirective(const OMPMasterTaskLoopDirective &S)
llvm::Value * EmitObjCExtendObjectLifetime(QualType T, llvm::Value *Ptr)
EHScopeStack::stable_iterator PrologueCleanupDepth
PrologueCleanupDepth - The cleanup depth enclosing all the cleanups associated with the parameters.
void EmitOMPTargetParallelGenericLoopDirective(const OMPTargetParallelGenericLoopDirective &S)
void pushStackRestore(CleanupKind kind, Address SPMem)
llvm::Value * EmitDynamicCast(Address V, const CXXDynamicCastExpr *DCE)
llvm::Value * EmitNeonRShiftImm(llvm::Value *Vec, llvm::Value *Amt, llvm::Type *Ty, bool usgn, const char *name)
void GenerateObjCSetter(ObjCImplementationDecl *IMP, const ObjCPropertyImplDecl *PID)
GenerateObjCSetter - Synthesize an Objective-C property setter function for the given property.
bool EmitOMPCopyinClause(const OMPExecutableDirective &D)
Emit code for copyin clause in D directive.
llvm::Value * EmitBlockCopyAndAutorelease(llvm::Value *Block, QualType Ty)
static bool mightAddDeclToScope(const Stmt *S)
Determine if the given statement might introduce a declaration into the current scope,...
SmallVector< llvm::Type *, 2 > getSVEOverloadTypes(const SVETypeFlags &TypeFlags, llvm::Type *ReturnType, ArrayRef< llvm::Value * > Ops)
void EmitOMPMaskedDirective(const OMPMaskedDirective &S)
uint64_t getProfileCount(const Stmt *S)
Get the profiler's count for the given statement.
LValue EmitMatrixSubscriptExpr(const MatrixSubscriptExpr *E)
LValue EmitPseudoObjectLValue(const PseudoObjectExpr *e)
static bool hasAggregateEvaluationKind(QualType T)
void EmitOMPPrivateClause(const OMPExecutableDirective &D, OMPPrivateScope &PrivateScope)
void EmitOMPTaskwaitDirective(const OMPTaskwaitDirective &S)
llvm::Function * GenerateOpenMPCapturedStmtFunction(const CapturedStmt &S, SourceLocation Loc)
llvm::Value * EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV, bool isInc, bool isPre)
void EmitOMPTargetParallelForSimdDirective(const OMPTargetParallelForSimdDirective &S)
RawAddress CreateIRTemp(QualType T, const Twine &Name="tmp")
CreateIRTemp - Create a temporary IR object of the given type, with appropriate alignment.
llvm::Value * EmitLoadOfScalar(Address Addr, bool Volatile, QualType Ty, SourceLocation Loc, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo, bool isNontemporal=false)
void emitImplicitAssignmentOperatorBody(FunctionArgList &Args)
void emitARCCopyAssignWeak(QualType Ty, Address DstAddr, Address SrcAddr)
const FieldDecl * FindCountedByField(const FieldDecl *FD)
Find the FieldDecl specified in a FAM's "counted_by" attribute.
void SetFPAccuracy(llvm::Value *Val, float Accuracy)
SetFPAccuracy - Set the minimum required accuracy of the given floating point operation,...
LValue MakeAddrLValue(Address Addr, QualType T, AlignmentSource Source=AlignmentSource::Type)
void EmitStoreOfComplex(ComplexPairTy V, LValue dest, bool isInit)
EmitStoreOfComplex - Store a complex number into the specified l-value.
void EmitBreakStmt(const BreakStmt &S)
Address GenerateCapturedStmtArgument(const CapturedStmt &S)
void EmitLambdaVLACapture(const VariableArrayType *VAT, LValue LV)
static void EmitOMPTargetParallelGenericLoopDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetParallelGenericLoopDirective &S)
Emit device code for the target parallel loop directive.
llvm::Value * LoadCXXThis()
LoadCXXThis - Load the value of 'this'.
llvm::function_ref< void(CodeGenFunction &, SourceLocation, const unsigned, const bool)> CodeGenOrderedTy
llvm::Value * EmitARMMVEBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Triple::ArchType Arch)
void GenerateObjCGetter(ObjCImplementationDecl *IMP, const ObjCPropertyImplDecl *PID)
GenerateObjCGetter - Synthesize an Objective-C property getter function.
LValue EmitLoadOfReferenceLValue(LValue RefLVal)
const CGFunctionInfo * CurFnInfo
LValue MakeNaturalAlignAddrLValue(llvm::Value *V, QualType T, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
bool isObviouslyBranchWithoutCleanups(JumpDest Dest) const
isObviouslyBranchWithoutCleanups - Return true if a branch to the specified destination obviously has...
llvm::Value * EmitSVEStructStore(const SVETypeFlags &TypeFlags, SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
Address GetAddrOfLocalVar(const VarDecl *VD)
GetAddrOfLocalVar - Return the address of a local variable.
llvm::BasicBlock * getFuncletEHDispatchBlock(EHScopeStack::stable_iterator scope)
void EmitObjCAutoreleasePoolCleanup(llvm::Value *Ptr)
llvm::Value * getArrayInitIndex()
Get the index of the current ArrayInitLoopExpr, if any.
void InsertHelper(llvm::Instruction *I, const llvm::Twine &Name, llvm::BasicBlock::iterator InsertPt) const
CGBuilder insert helper.
void pushKmpcAllocFree(CleanupKind Kind, std::pair< llvm::Value *, llvm::Value * > AddrSizePair)
LValue EmitObjCIsaExpr(const ObjCIsaExpr *E)
void EmitParmDecl(const VarDecl &D, ParamValue Arg, unsigned ArgNo)
EmitParmDecl - Emit a ParmVarDecl or an ImplicitParamDecl.
llvm::Value * EmitSEHAbnormalTermination()
void EmitCfiSlowPathCheck(SanitizerMask Kind, 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.
void EmitCoreturnStmt(const CoreturnStmt &S)
void EnterDtorCleanups(const CXXDestructorDecl *Dtor, CXXDtorType Type)
EnterDtorCleanups - Enter the cleanups necessary to complete the given phase of destruction for a des...
void EmitAtomicStore(RValue rvalue, LValue lvalue, bool isInit)
Address EmitFieldAnnotations(const FieldDecl *D, Address V)
Emit field annotations for the given field & value.
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...
llvm::Value * EmitX86BuiltinExpr(unsigned BuiltinID, const CallExpr *E)
llvm::BasicBlock * OMPAfterScanBlock
LValue EmitCXXUuidofLValue(const CXXUuidofExpr *E)
std::pair< llvm::Value *, llvm::Value * > ComplexPairTy
Address ReturnValue
ReturnValue - The temporary alloca to hold the return value.
void EmitOMPTargetExitDataDirective(const OMPTargetExitDataDirective &S)
static bool isNullPointerAllowed(TypeCheckKind TCK)
Determine whether the pointer type check TCK permits null pointers.
void EmitOMPErrorDirective(const OMPErrorDirective &S)
static Destroyer destroyARCStrongImprecise
void EmitOMPSectionDirective(const OMPSectionDirective &S)
RValue getOrCreateOpaqueRValueMapping(const OpaqueValueExpr *e)
Given an opaque value expression, return its RValue mapping if it exists, otherwise create one.
static void EmitOMPTargetParallelDeviceFunction(CodeGenModule &CGM, StringRef ParentName, const OMPTargetParallelDirective &S)
llvm::Value * EmitSVEAllTruePred(const SVETypeFlags &TypeFlags)
void EmitOMPBarrierDirective(const OMPBarrierDirective &S)
void EmitStopPoint(const Stmt *S)
EmitStopPoint - Emit a debug stoppoint if we are emitting debug info.
void EmitIgnoredConditionalOperator(const AbstractConditionalOperator *E)
RValue GetUndefRValue(QualType Ty)
GetUndefRValue - Get an appropriate 'undef' rvalue for the given type.
LValue EmitLValueForIvar(QualType ObjectTy, llvm::Value *Base, const ObjCIvarDecl *Ivar, unsigned CVRQualifiers)
RValue EmitCallExpr(const CallExpr *E, ReturnValueSlot ReturnValue=ReturnValueSlot())
RValue EmitCUDAKernelCallExpr(const CUDAKernelCallExpr *E, ReturnValueSlot ReturnValue)
void ExitCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock=false)
void EmitOMPCancellationPointDirective(const OMPCancellationPointDirective &S)
llvm::Value * EmitObjCAlloc(llvm::Value *value, llvm::Type *returnType)
llvm::Value * emitScalarConstant(const ConstantEmission &Constant, Expr *E)
LValue EmitStmtExprLValue(const StmtExpr *E)
llvm::Instruction * CurrentFuncletPad
void EmitStmt(const Stmt *S, ArrayRef< const Attr * > Attrs=std::nullopt)
EmitStmt - Emit the code for the statement.
llvm::Type * SVEBuiltinMemEltTy(const SVETypeFlags &TypeFlags)
SVEBuiltinMemEltTy - Returns the memory element type for this memory access builtin.
void EmitWhileStmt(const WhileStmt &S, ArrayRef< const Attr * > Attrs=std::nullopt)
void EnsureInsertPoint()
EnsureInsertPoint - Ensure that an insertion point is defined so that emitted IR has a place to go.
void EmitObjCForCollectionStmt(const ObjCForCollectionStmt &S)
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 ...
llvm::LLVMContext & getLLVMContext()
void EmitOMPTaskLoopSimdDirective(const OMPTaskLoopSimdDirective &S)
bool SawAsmBlock
Whether we processed a Microsoft-style asm block during CodeGen.
llvm::Value * EmitScalarExpr(const Expr *E, bool IgnoreResultAssign=false)
EmitScalarExpr - Emit the computation of the specified expression of LLVM scalar type,...
void ResolveBranchFixups(llvm::BasicBlock *Target)
void AddAMDGPUFenceAddressSpaceMMRA(llvm::Instruction *Inst, const CallExpr *E)
bool checkIfFunctionMustProgress()
Returns true if a function must make progress, which means the mustprogress attribute can be added.
void EmitOMPTargetTeamsDistributeParallelForDirective(const OMPTargetTeamsDistributeParallelForDirective &S)
bool LValueIsSuitableForInlineAtomic(LValue Src)
void incrementProfileCounter(const Stmt *S, llvm::Value *StepV=nullptr)
Increment the profiler's counter for the given statement by StepV.
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.
RValue EmitLoadOfAnyValue(LValue V, AggValueSlot Slot=AggValueSlot::ignored(), SourceLocation Loc={})
Like EmitLoadOfLValue but also handles complex and aggregate types.
llvm::SmallVector< VPtr, 4 > VPtrsVector
llvm::Value * EmitSMEZero(const SVETypeFlags &TypeFlags, llvm::SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
llvm::Value * getSelectorFromSlot()
llvm::Value * EmitARCRetainScalarExpr(const Expr *expr)
bool EmitOMPLastprivateClauseInit(const OMPExecutableDirective &D, OMPPrivateScope &PrivateScope)
Emit initial code for lastprivate variables.
static std::string getNonTrivialCopyConstructorStr(QualType QT, CharUnits Alignment, bool IsVolatile, ASTContext &Ctx)
void InitializeVTablePointers(const CXXRecordDecl *ClassDecl)
llvm::Value * EmitRISCVBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue)
void EmitOMPParallelSectionsDirective(const OMPParallelSectionsDirective &S)
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)
void getVTablePointers(BaseSubobject Base, const CXXRecordDecl *NearestVBase, CharUnits OffsetFromNearestVBase, bool BaseIsNonVirtualPrimaryBase, const CXXRecordDecl *VTableClass, VisitedVirtualBasesSetTy &VBases, VPtrsVector &vptrs)
llvm::function_ref< void(CodeGenFunction &, const OMPLoopDirective &, JumpDest)> CodeGenLoopTy
void BuildBlockRelease(llvm::Value *DeclPtr, BlockFieldFlags flags, bool CanThrow)
llvm::Value * EmitNeonCall(llvm::Function *F, SmallVectorImpl< llvm::Value * > &O, const char *name, unsigned shift=0, bool rightshift=false)
void EmitOMPCanonicalLoop(const OMPCanonicalLoop *S)
Emit an OMPCanonicalLoop using the OpenMPIRBuilder.
void InitializeVTablePointer(const VPtr &vptr)
Initialize the vtable pointer of the given subobject.
llvm::Value * EmitAnnotationCall(llvm::Function *AnnotationFn, llvm::Value *AnnotatedVal, StringRef AnnotationStr, SourceLocation Location, const AnnotateAttr *Attr)
Emit an annotation call (intrinsic).
llvm::Value * EmitCXXNewExpr(const CXXNewExpr *E)
void EmitOMPTeamsDistributeSimdDirective(const OMPTeamsDistributeSimdDirective &S)
llvm::BasicBlock * GetIndirectGotoBlock()
void EmitAsmStmt(const AsmStmt &S)
Address emitAddrOfRealComponent(Address complex, QualType complexType)
RValue EmitCXXMemberOrOperatorMemberCallExpr(const CallExpr *CE, const CXXMethodDecl *MD, ReturnValueSlot ReturnValue, bool HasQualifier, NestedNameSpecifier *Qualifier, bool IsArrow, const Expr *Base)
void EmitARCDestroyStrong(Address addr, ARCPreciseLifetime_t precise)
void EmitObjCAtTryStmt(const ObjCAtTryStmt &S)
static bool isVptrCheckRequired(TypeCheckKind TCK, QualType Ty)
Determine whether the pointer type check TCK requires a vptr check.
llvm::ScalableVectorType * getSVEPredType(const SVETypeFlags &TypeFlags)
LValue EmitComplexCompoundAssignmentLValue(const CompoundAssignOperator *E)
llvm::Type * convertTypeForLoadStore(QualType ASTTy, llvm::Type *LLVMTy=nullptr)
void pushRegularPartialArrayCleanup(llvm::Value *arrayBegin, llvm::Value *arrayEnd, QualType elementType, CharUnits elementAlignment, Destroyer *destroyer)
llvm::Value * getExceptionFromSlot()
Returns the contents of the function's exception object and selector slots.
llvm::DebugLoc EmitReturnBlock()
Emit the unified return block, trying to avoid its emission when possible.
LValue EmitConditionalOperatorLValue(const AbstractConditionalOperator *E)
void GenerateCode(GlobalDecl GD, llvm::Function *Fn, const CGFunctionInfo &FnInfo)
llvm::Value * EmitSVEGatherPrefetch(const SVETypeFlags &TypeFlags, SmallVectorImpl< llvm::Value * > &Ops, unsigned IntID)
llvm::CallInst * EmitNounwindRuntimeCall(llvm::FunctionCallee callee, ArrayRef< Address > args, const Twine &name="")
void EmitStoreOfScalar(llvm::Value *Value, Address Addr, bool Volatile, QualType Ty, AlignmentSource Source=AlignmentSource::Type, bool isInit=false, bool isNontemporal=false)
EmitStoreOfScalar - Store a scalar value to an address, taking care to appropriately convert from the...
bool hasLabelBeenSeenInCurrentScope() const
Return true if a label was seen in the current scope.
RValue EmitAtomicExpr(AtomicExpr *E)
CGPointerAuthInfo EmitPointerAuthInfo(const PointerAuthSchema &Schema, llvm::Value *StorageAddress, GlobalDecl SchemaDecl, QualType SchemaType)
LValue EmitExtVectorElementExpr(const ExtVectorElementExpr *E)
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.
void EmitOMPTargetParallelForDirective(const OMPTargetParallelForDirective &S)
RValue EmitLoadOfBitfieldLValue(LValue LV, SourceLocation Loc)
CallType * addControlledConvergenceToken(CallType *Input)
LValue EmitLoadOfReferenceLValue(Address RefAddr, QualType RefTy, AlignmentSource Source=AlignmentSource::Type)
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.
LValue EmitCXXBindTemporaryLValue(const CXXBindTemporaryExpr *E)
llvm::Value * EmitBPFBuiltinExpr(unsigned BuiltinID, const CallExpr *E)
LValue EmitPointerToDataMemberBinaryExpr(const BinaryOperator *E)
LValue EmitLValueForLambdaField(const FieldDecl *Field)
void EmitMustTailThunk(GlobalDecl GD, llvm::Value *AdjustedThisPtr, llvm::FunctionCallee Callee)
Emit a musttail call for a thunk with a potentially adjusted this pointer.
static bool IsWrappedCXXThis(const Expr *E)
Check if E is a C++ "this" pointer wrapped in value-preserving casts.
static bool containsBreak(const Stmt *S)
containsBreak - Return true if the statement contains a break out of it.
void pushDestroy(CleanupKind kind, Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray)
llvm::Type * ConvertType(const TypeDecl *T)
This class organizes the cross-function state that is used while generating LLVM code.
const LangOptions & getLangOpts() const
CharUnits getNaturalTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, bool forPointeeType=false)
CGPointerAuthInfo getPointerAuthInfoForPointeeType(QualType type)
const llvm::DataLayout & getDataLayout() const
TBAAAccessInfo getTBAAAccessInfo(QualType AccessType)
getTBAAAccessInfo - Get TBAA information that describes an access to an object of the given type.
ASTContext & getContext() const
const TargetCodeGenInfo & getTargetCodeGenInfo()
const CodeGenOptions & getCodeGenOpts() const
llvm::LLVMContext & getLLVMContext()
This class organizes the cross-module state that is used while lowering AST types to LLVM types.
Definition: CodeGenTypes.h:54
A specialization of Address that requires the address to be an LLVM Constant.
Definition: Address.h:294
static ConstantAddress invalid()
Definition: Address.h:302
DominatingValue< Address >::saved_type AggregateAddr
static saved_type save(CodeGenFunction &CGF, RValue value)
Information for lazily generating a cleanup.
Definition: EHScopeStack.h:141
ConditionalCleanup stores the saved form of its parameters, then restores them and performs the clean...
Definition: EHScopeStack.h:203
A saved depth on the scope stack.
Definition: EHScopeStack.h:101
A stack of scopes which respond to exceptions, including cleanups and catch blocks.
Definition: EHScopeStack.h:94
stable_iterator getInnermostNormalCleanup() const
Returns the innermost normal cleanup on the stack, or stable_end() if there are no normal cleanups.
Definition: EHScopeStack.h:370
stable_iterator stable_begin() const
Create a stable reference to the top of the EH stack.
Definition: EHScopeStack.h:393
static stable_iterator stable_end()
Create a stable reference to the bottom of the EH stack.
Definition: EHScopeStack.h:398
void pushCleanupTuple(CleanupKind Kind, std::tuple< As... > A)
Push a lazily-created cleanup on the stack. Tuple version.
Definition: EHScopeStack.h:295
FunctionArgList - Type for representing both the decl and type of parameters to a function.
Definition: CGCall.h:368
LValue - This represents an lvalue references.
Definition: CGValue.h:182
CharUnits getAlignment() const
Definition: CGValue.h:343
static LValue MakeAddr(Address Addr, QualType type, ASTContext &Context, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
Definition: CGValue.h:432
QualType getType() const
Definition: CGValue.h:291
llvm::Value * emitRawPointer(CodeGenFunction &CGF) const
A stack of loop information corresponding to loop nesting levels.
Definition: CGLoopInfo.h:204
Information used when generating a structured loop.
Definition: CGLoopInfo.h:90
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:98
An abstract representation of an aligned address.
Definition: Address.h:42
static RawAddress invalid()
Definition: Address.h:61
bool isValid() const
Definition: Address.h:62
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:372
TargetCodeGenInfo - This class organizes various target-specific codegeneration issues,...
Definition: TargetInfo.h:47
The class detects jumps which bypass local variables declaration: goto L; int a; L:
CompoundAssignOperator - For compound assignments (e.g.
Definition: Expr.h:4112
CompoundLiteralExpr - [C99 6.5.2.5].
Definition: Expr.h:3428
CompoundStmt - This represents a group of statements like { stmt stmt }.
Definition: Stmt.h:1606
ContinueStmt - This represents a continue.
Definition: Stmt.h:2955
Represents a 'co_return' statement in the C++ Coroutines TS.
Definition: StmtCXX.h:473
Represents the body of a coroutine.
Definition: StmtCXX.h:320
Represents an expression that might suspend coroutine execution; either a co_await or co_yield expres...
Definition: ExprCXX.h:5069
Represents a 'co_yield' expression.
Definition: ExprCXX.h:5264
Represents the current source location and context used to determine the value of the source location...
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
Definition: DeclBase.h:2359
A reference to a declared variable, function, enum, etc.
Definition: Expr.h:1265
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
Definition: Stmt.h:1497
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
DoStmt - This represents a 'do/while' stmt.
Definition: Stmt.h:2730
This represents one expression.
Definition: Expr.h:110
QualType getType() const
Definition: Expr.h:142
ExtVectorElementExpr - This represents access to specific elements of a vector, and may occur on the ...
Definition: Expr.h:6295
Represents a member of a struct/union/class.
Definition: Decl.h:3030
ForStmt - This represents a 'for (init;cond;inc)' stmt.
Definition: Stmt.h:2786
Represents a function declaration or definition.
Definition: Decl.h:1932
Represents a prototype with parameter type info, e.g.
Definition: Type.h:4973
GlobalDecl - represents a global declaration.
Definition: GlobalDecl.h:56
const Decl * getDecl() const
Definition: GlobalDecl.h:103
GotoStmt - This represents a direct goto.
Definition: Stmt.h:2867
IfStmt - This represents an if/then/else.
Definition: Stmt.h:2143
IndirectGotoStmt - This represents an indirect goto.
Definition: Stmt.h:2906
Describes an C or C++ initializer list.
Definition: Expr.h:5029
Represents the declaration of a label.
Definition: Decl.h:499
LabelStmt - Represents a label, which has a substatement.
Definition: Stmt.h:2036
FPExceptionModeKind
Possible floating point exception behavior.
Definition: LangOptions.h:276
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:461
Represents a point when we exit a loop.
Definition: ProgramPoint.h:711
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Definition: ExprCXX.h:4726
MatrixSubscriptExpr - Matrix subscript expression for the MatrixType extension.
Definition: Expr.h:2752
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition: Expr.h:3187
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition: Type.h:3482
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
This represents '#pragma omp atomic' directive.
Definition: StmtOpenMP.h:2947
This represents '#pragma omp barrier' directive.
Definition: StmtOpenMP.h:2625
This represents '#pragma omp cancel' directive.
Definition: StmtOpenMP.h:3655
This represents '#pragma omp cancellation point' directive.
Definition: StmtOpenMP.h:3597
Representation of an OpenMP canonical loop.
Definition: StmtOpenMP.h:142
This represents '#pragma omp critical' directive.
Definition: StmtOpenMP.h:2076
This represents '#pragma omp depobj' directive.
Definition: StmtOpenMP.h:2841
This represents '#pragma omp distribute' directive.
Definition: StmtOpenMP.h:4425
This represents '#pragma omp distribute parallel for' composite directive.
Definition: StmtOpenMP.h:4547
This represents '#pragma omp distribute parallel for simd' composite directive.
Definition: StmtOpenMP.h:4643
This represents '#pragma omp distribute simd' composite directive.
Definition: StmtOpenMP.h:4708
This represents '#pragma omp error' directive.
Definition: StmtOpenMP.h:6432
This is a basic class for representing single OpenMP executable directive.
Definition: StmtOpenMP.h:266
This represents '#pragma omp flush' directive.
Definition: StmtOpenMP.h:2789
This represents '#pragma omp for' directive.
Definition: StmtOpenMP.h:1634
This represents '#pragma omp for simd' directive.
Definition: StmtOpenMP.h:1724
This represents '#pragma omp loop' directive.
Definition: StmtOpenMP.h:6103
Represents the '#pragma omp interchange' loop transformation directive.
Definition: StmtOpenMP.h:5769
This represents '#pragma omp interop' directive.
Definition: StmtOpenMP.h:5895
This is a common base class for loop directives ('omp simd', 'omp for', 'omp for simd' etc....
Definition: StmtOpenMP.h:1004
This represents '#pragma omp masked' directive.
Definition: StmtOpenMP.h:6013
This represents '#pragma omp master' directive.
Definition: StmtOpenMP.h:2028
This represents '#pragma omp master taskloop' directive.
Definition: StmtOpenMP.h:3854
This represents '#pragma omp master taskloop simd' directive.
Definition: StmtOpenMP.h:4006
This represents '#pragma omp metadirective' directive.
Definition: StmtOpenMP.h:6064
This represents '#pragma omp ordered' directive.
Definition: StmtOpenMP.h:2893
This represents '#pragma omp parallel' directive.
Definition: StmtOpenMP.h:612
This represents '#pragma omp parallel for' directive.
Definition: StmtOpenMP.h:2147
This represents '#pragma omp parallel for simd' directive.
Definition: StmtOpenMP.h:2244
This represents '#pragma omp parallel masked' directive.
Definition: StmtOpenMP.h:2372
This represents '#pragma omp parallel master' directive.
Definition: StmtOpenMP.h:2309
This represents '#pragma omp parallel master taskloop' directive.
Definition: StmtOpenMP.h:4137
This represents '#pragma omp parallel master taskloop simd' directive.
Definition: StmtOpenMP.h:4293
This represents '#pragma omp parallel sections' directive.
Definition: StmtOpenMP.h:2436
Represents the '#pragma omp reverse' loop transformation directive.
Definition: StmtOpenMP.h:5704
This represents '#pragma omp scan' directive.
Definition: StmtOpenMP.h:5842
This represents '#pragma omp section' directive.
Definition: StmtOpenMP.h:1864
This represents '#pragma omp sections' directive.
Definition: StmtOpenMP.h:1787
This represents '#pragma omp simd' directive.
Definition: StmtOpenMP.h:1571
This represents '#pragma omp single' directive.
Definition: StmtOpenMP.h:1977
This represents '#pragma omp target data' directive.
Definition: StmtOpenMP.h:3206
This represents '#pragma omp target' directive.
Definition: StmtOpenMP.h:3152
This represents '#pragma omp target enter data' directive.
Definition: StmtOpenMP.h:3260
This represents '#pragma omp target exit data' directive.
Definition: StmtOpenMP.h:3315
This represents '#pragma omp target parallel' directive.
Definition: StmtOpenMP.h:3369
This represents '#pragma omp target parallel for' directive.
Definition: StmtOpenMP.h:3449
This represents '#pragma omp target parallel for simd' directive.
Definition: StmtOpenMP.h:4774
This represents '#pragma omp target parallel loop' directive.
Definition: StmtOpenMP.h:6370
This represents '#pragma omp target simd' directive.
Definition: StmtOpenMP.h:4841
This represents '#pragma omp target teams' directive.
Definition: StmtOpenMP.h:5199
This represents '#pragma omp target teams distribute' combined directive.
Definition: StmtOpenMP.h:5255
This represents '#pragma omp target teams distribute parallel for' combined directive.
Definition: StmtOpenMP.h:5322
This represents '#pragma omp target teams distribute parallel for simd' combined directive.
Definition: StmtOpenMP.h:5420
This represents '#pragma omp target teams distribute simd' combined directive.
Definition: StmtOpenMP.h:5490
This represents '#pragma omp target teams loop' directive.
Definition: StmtOpenMP.h:6230
This represents '#pragma omp target update' directive.
Definition: StmtOpenMP.h:4491
This represents '#pragma omp task' directive.
Definition: StmtOpenMP.h:2517
This represents '#pragma omp taskloop' directive.
Definition: StmtOpenMP.h:3715
This represents '#pragma omp taskloop simd' directive.
Definition: StmtOpenMP.h:3788
This represents '#pragma omp taskgroup' directive.
Definition: StmtOpenMP.h:2722
This represents '#pragma omp taskwait' directive.
Definition: StmtOpenMP.h:2671
This represents '#pragma omp taskyield' directive.
Definition: StmtOpenMP.h:2579
This represents '#pragma omp teams' directive.
Definition: StmtOpenMP.h:3544
This represents '#pragma omp teams distribute' directive.
Definition: StmtOpenMP.h:4906
This represents '#pragma omp teams distribute parallel for' composite directive.
Definition: StmtOpenMP.h:5106
This represents '#pragma omp teams distribute parallel for simd' composite directive.
Definition: StmtOpenMP.h:5040
This represents '#pragma omp teams distribute simd' combined directive.
Definition: StmtOpenMP.h:4972
This represents '#pragma omp teams loop' directive.
Definition: StmtOpenMP.h:6165
This represents the '#pragma omp tile' loop transformation directive.
Definition: StmtOpenMP.h:5548
This represents the '#pragma omp unroll' loop transformation directive.
Definition: StmtOpenMP.h:5630
This represents clause 'use_device_addr' in the '#pragma omp ...' directives.
This represents clause 'use_device_ptr' in the '#pragma omp ...' directives.
ObjCArrayLiteral - used for objective-c array containers; as in: @["Hello", NSApp,...
Definition: ExprObjC.h:191
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:127
ObjCContainerDecl - Represents a container for method declarations.
Definition: DeclObjC.h:947
ObjCDictionaryLiteral - AST node to represent objective-c dictionary literals; as in:"name" : NSUserN...
Definition: ExprObjC.h:309
ObjCEncodeExpr, used for @encode in Objective-C.
Definition: ExprObjC.h:410
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:2594
Represents an ObjC class declaration.
Definition: DeclObjC.h:1153
ObjCIsaExpr - Represent X->isa and X.isa when X is an ObjC 'id' type.
Definition: ExprObjC.h:1491
ObjCIvarDecl - Represents an ObjC instance variable.
Definition: DeclObjC.h:1950
ObjCIvarRefExpr - A reference to an ObjC instance variable.
Definition: ExprObjC.h:549
An expression that sends a message to the given Objective-C object or class.
Definition: ExprObjC.h:945
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:2802
ObjCProtocolExpr used for protocol expression in Objective-C.
Definition: ExprObjC.h:505
ObjCSelectorExpr used for @selector in Objective-C.
Definition: ExprObjC.h:455
ObjCStringLiteral, used for Objective-C string literals i.e.
Definition: ExprObjC.h:51
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Definition: Expr.h:1173
Expr * getSourceExpr() const
The source expression of an opaque value expression is the expression which originally generated the ...
Definition: Expr.h:1223
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
Definition: StmtOpenACC.h:132
This class represents a 'loop' construct.
Definition: StmtOpenACC.h:200
Represents a parameter to a function.
Definition: Decl.h:1722
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition: Type.h:3161
[C99 6.4.2.2] - A predefined identifier such as func.
Definition: Expr.h:1991
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
Definition: Expr.h:6487
A (possibly-)qualified type.
Definition: Type.h:941
@ DK_cxx_destructor
Definition: Type.h:1532
@ DK_nontrivial_c_struct
Definition: Type.h:1535
@ DK_objc_weak_lifetime
Definition: Type.h:1534
@ DK_objc_strong_lifetime
Definition: Type.h:1533
The collection of all-type qualifiers we support.
Definition: Type.h:319
Represents a struct/union/class.
Definition: Decl.h:4141
bool hasVolatileMember() const
Definition: Decl.h:4204
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Definition: Type.h:5936
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
Definition: Stmt.h:3024
Represents a __leave statement.
Definition: Stmt.h:3723
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:4407
Stmt - This represents one statement.
Definition: Stmt.h:84
Likelihood
The likelihood of a branch being taken.
Definition: Stmt.h:1301
@ LH_None
No attribute set or branches of the IfStmt have the same attribute.
Definition: Stmt.h:1303
StringLiteral - This represents a string literal expression, e.g.
Definition: Expr.h:1778
SwitchStmt - This represents a 'switch' stmt.
Definition: Stmt.h:2393
Exposes information about the current target.
Definition: TargetInfo.h:218
Represents a declaration of a type.
Definition: Decl.h:3363
The base class of the type hierarchy.
Definition: Type.h:1829
bool isReferenceType() const
Definition: Type.h:8010
const T * getAs() const
Member-template getAs<specific type>'.
Definition: Type.h:8516
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition: Expr.h:2188
Represents a call to the builtin function __builtin_va_arg.
Definition: Expr.h:4691
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition: Decl.h:667
QualType getType() const
Definition: Decl.h:678
Represents a variable declaration or definition.
Definition: Decl.h:879
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition: Decl.cpp:2239
bool isLocalVarDeclOrParm() const
Similar to isLocalVarDecl but also includes parameters.
Definition: Decl.h:1210
Represents a C array with a specified size that is not an integer-constant-expression.
Definition: Type.h:3769
Expr * getSizeExpr() const
Definition: Type.h:3788
WhileStmt - This represents a 'while' stmt.
Definition: Stmt.h:2589
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:141
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
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...
Definition: EHScopeStack.h:84
ARCPreciseLifetime_t
Does an ARC strong l-value have precise lifetime?
Definition: CGValue.h:135
@ NotKnownNonNull
Definition: Address.h:33
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< ArrayType > arrayType
Matches all kinds of arrays.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
const AstTypeMatcher< ComplexType > complexType
Matches C99 complex types.
The JSON file list parser is used to communicate input to InstallAPI.
CXXCtorType
C++ constructor types.
Definition: ABI.h:24
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
Definition: OpenMPKinds.h:24
BinaryOperatorKind
CapturedRegionKind
The different kinds of captured statement.
Definition: CapturedStmt.h:16
@ CR_Default
Definition: CapturedStmt.h:17
OpenMPDistScheduleClauseKind
OpenMP attributes for 'dist_schedule' clause.
Definition: OpenMPKinds.h:103
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.
CXXDtorType
C++ destructor types.
Definition: ABI.h:33
const FunctionProtoType * T
@ Success
Template argument deduction was successful.
llvm::fp::ExceptionBehavior ToConstrainedExceptMD(LangOptions::FPExceptionModeKind Kind)
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
Diagnostic wrappers for TextAPI types for error reporting.
Definition: Dominators.h:30
#define true
Definition: stdbool.h:25
#define false
Definition: stdbool.h:26
#define bool
Definition: stdbool.h:24
Structure with information about how a bitfield should be accessed.
llvm::SmallVector< llvm::AllocaInst * > Take()
CXXDefaultArgExprScope(CodeGenFunction &CGF, const CXXDefaultArgExpr *E)
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.
MultiVersionResolverOption(llvm::Function *F, StringRef Arch, ArrayRef< StringRef > Feats)
struct clang::CodeGen::CodeGenFunction::MultiVersionResolverOption::Conds Conditions
static Address getAddrOfThreadPrivate(CodeGenFunction &CGF, const VarDecl *VD, Address VDAddr, SourceLocation Loc)
Returns address of the threadprivate variable for the current thread.
llvm::OpenMPIRBuilder::InsertPointTy InsertPointTy
static void EmitOMPOutlinedRegionBody(CodeGenFunction &CGF, const Stmt *RegionBodyStmt, InsertPointTy AllocaIP, InsertPointTy CodeGenIP, Twine RegionName)
Emit the body of an OMP region that will be outlined in OpenMPIRBuilder::finalize().
static Address getAddressOfLocalVariable(CodeGenFunction &CGF, const VarDecl *VD)
Gets the OpenMP-specific address of the local variable /p VD.
static void EmitCaptureStmt(CodeGenFunction &CGF, InsertPointTy CodeGenIP, llvm::BasicBlock &FiniBB, llvm::Function *Fn, ArrayRef< llvm::Value * > Args)
static std::string getNameWithSeparators(ArrayRef< StringRef > Parts, StringRef FirstSeparator=".", StringRef Separator=".")
Get the platform-specific name separator.
static void FinalizeOMPRegion(CodeGenFunction &CGF, InsertPointTy IP)
Emit the Finalization for an OMP region.
static void EmitOMPInlinedRegionBody(CodeGenFunction &CGF, const Stmt *RegionBodyStmt, InsertPointTy AllocaIP, InsertPointTy CodeGenIP, Twine RegionName)
Emit the body of an OMP region.
OMPBuilderCBHelpers & operator=(const OMPBuilderCBHelpers &)=delete
OMPBuilderCBHelpers(const OMPBuilderCBHelpers &)=delete
OMPTargetDataInfo(Address BasePointersArray, Address PointersArray, Address SizesArray, Address MappersArray, unsigned NumberOfTargetItems)
llvm::PointerUnion< const FunctionProtoType *, const ObjCMethodDecl * > P
Struct with all information about dynamic [sub]class needed to set vptr.
This structure provides a set of types that are commonly used during IR emission.
Helper class with most of the code for saving a value for a conditional expression cleanup.
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.
llvm::PointerIntPair< llvm::Value *, 1, bool > saved_type
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.
Definition: EHScopeStack.h:65
static saved_type save(CodeGenFunction &CGF, type value)
Definition: EHScopeStack.h:59
Scheduling data for loop-based OpenMP directives.
Definition: OpenMPKinds.h:179
The this pointer adjustment as well as an optional return adjustment for a thunk.
Definition: Thunk.h:157