1 //===-- CodeGenFunction.h - Per-Function state for LLVM CodeGen -*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This is the internal per-function state used for llvm translation.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_CLANG_LIB_CODEGEN_CODEGENFUNCTION_H
14 #define LLVM_CLANG_LIB_CODEGEN_CODEGENFUNCTION_H
16 #include "CGBuilder.h"
17 #include "CGDebugInfo.h"
18 #include "CGLoopInfo.h"
20 #include "CodeGenModule.h"
21 #include "CodeGenPGO.h"
22 #include "EHScopeStack.h"
23 #include "VarBypassDetector.h"
24 #include "clang/AST/CharUnits.h"
25 #include "clang/AST/CurrentSourceLocExprScope.h"
26 #include "clang/AST/ExprCXX.h"
27 #include "clang/AST/ExprObjC.h"
28 #include "clang/AST/ExprOpenMP.h"
29 #include "clang/AST/StmtOpenMP.h"
30 #include "clang/AST/Type.h"
31 #include "clang/Basic/ABI.h"
32 #include "clang/Basic/CapturedStmt.h"
33 #include "clang/Basic/CodeGenOptions.h"
34 #include "clang/Basic/OpenMPKinds.h"
35 #include "clang/Basic/TargetInfo.h"
36 #include "llvm/ADT/ArrayRef.h"
37 #include "llvm/ADT/DenseMap.h"
38 #include "llvm/ADT/MapVector.h"
39 #include "llvm/ADT/SmallVector.h"
40 #include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
41 #include "llvm/IR/ValueHandle.h"
42 #include "llvm/Support/Debug.h"
43 #include "llvm/Transforms/Utils/SanitizerStats.h"
53 class CanonicalLoopInfo
;
58 class CXXDestructorDecl
;
59 class CXXForRangeStmt
;
64 class FunctionProtoType
;
66 class ObjCContainerDecl
;
67 class ObjCInterfaceDecl
;
70 class ObjCImplementationDecl
;
71 class ObjCPropertyImplDecl
;
74 class ObjCForCollectionStmt
;
76 class ObjCAtThrowStmt
;
77 class ObjCAtSynchronizedStmt
;
78 class ObjCAutoreleasePoolStmt
;
79 class OMPUseDevicePtrClause
;
80 class OMPUseDeviceAddrClause
;
82 class OMPExecutableDirective
;
84 namespace analyze_os_log
{
85 class OSLogBufferLayout
;
94 class BlockByrefHelpers
;
96 class BlockFieldFlags
;
97 class RegionCodeGenTy
;
98 class TargetCodeGenInfo
;
102 /// The kind of evaluation to perform on values of a particular
103 /// type. Basically, is the code in CGExprScalar, CGExprComplex, or
106 /// TODO: should vectors maybe be split out into their own thing?
107 enum TypeEvaluationKind
{
113 #define LIST_SANITIZER_CHECKS \
114 SANITIZER_CHECK(AddOverflow, add_overflow, 0) \
115 SANITIZER_CHECK(BuiltinUnreachable, builtin_unreachable, 0) \
116 SANITIZER_CHECK(CFICheckFail, cfi_check_fail, 0) \
117 SANITIZER_CHECK(DivremOverflow, divrem_overflow, 0) \
118 SANITIZER_CHECK(DynamicTypeCacheMiss, dynamic_type_cache_miss, 0) \
119 SANITIZER_CHECK(FloatCastOverflow, float_cast_overflow, 0) \
120 SANITIZER_CHECK(FunctionTypeMismatch, function_type_mismatch, 0) \
121 SANITIZER_CHECK(ImplicitConversion, implicit_conversion, 0) \
122 SANITIZER_CHECK(InvalidBuiltin, invalid_builtin, 0) \
123 SANITIZER_CHECK(InvalidObjCCast, invalid_objc_cast, 0) \
124 SANITIZER_CHECK(LoadInvalidValue, load_invalid_value, 0) \
125 SANITIZER_CHECK(MissingReturn, missing_return, 0) \
126 SANITIZER_CHECK(MulOverflow, mul_overflow, 0) \
127 SANITIZER_CHECK(NegateOverflow, negate_overflow, 0) \
128 SANITIZER_CHECK(NullabilityArg, nullability_arg, 0) \
129 SANITIZER_CHECK(NullabilityReturn, nullability_return, 1) \
130 SANITIZER_CHECK(NonnullArg, nonnull_arg, 0) \
131 SANITIZER_CHECK(NonnullReturn, nonnull_return, 1) \
132 SANITIZER_CHECK(OutOfBounds, out_of_bounds, 0) \
133 SANITIZER_CHECK(PointerOverflow, pointer_overflow, 0) \
134 SANITIZER_CHECK(ShiftOutOfBounds, shift_out_of_bounds, 0) \
135 SANITIZER_CHECK(SubOverflow, sub_overflow, 0) \
136 SANITIZER_CHECK(TypeMismatch, type_mismatch, 1) \
137 SANITIZER_CHECK(AlignmentAssumption, alignment_assumption, 0) \
138 SANITIZER_CHECK(VLABoundNotPositive, vla_bound_not_positive, 0)
140 enum SanitizerHandler
{
141 #define SANITIZER_CHECK(Enum, Name, Version) Enum,
142 LIST_SANITIZER_CHECKS
143 #undef SANITIZER_CHECK
146 /// Helper class with most of the code for saving a value for a
147 /// conditional expression cleanup.
148 struct DominatingLLVMValue
{
149 typedef llvm::PointerIntPair
<llvm::Value
*, 1, bool> saved_type
;
151 /// Answer whether the given value needs extra work to be saved.
152 static bool needsSaving(llvm::Value
*value
) {
153 // If it's not an instruction, we don't need to save.
154 if (!isa
<llvm::Instruction
>(value
)) return false;
156 // If it's an instruction in the entry block, we don't need to save.
157 llvm::BasicBlock
*block
= cast
<llvm::Instruction
>(value
)->getParent();
158 return (block
!= &block
->getParent()->getEntryBlock());
161 static saved_type
save(CodeGenFunction
&CGF
, llvm::Value
*value
);
162 static llvm::Value
*restore(CodeGenFunction
&CGF
, saved_type value
);
165 /// A partial specialization of DominatingValue for llvm::Values that
166 /// might be llvm::Instructions.
167 template <class T
> struct DominatingPointer
<T
,true> : DominatingLLVMValue
{
169 static type
restore(CodeGenFunction
&CGF
, saved_type value
) {
170 return static_cast<T
*>(DominatingLLVMValue::restore(CGF
, value
));
174 /// A specialization of DominatingValue for Address.
175 template <> struct DominatingValue
<Address
> {
176 typedef Address type
;
179 DominatingLLVMValue::saved_type SavedValue
;
180 llvm::Type
*ElementType
;
184 static bool needsSaving(type value
) {
185 return DominatingLLVMValue::needsSaving(value
.getPointer());
187 static saved_type
save(CodeGenFunction
&CGF
, type value
) {
188 return { DominatingLLVMValue::save(CGF
, value
.getPointer()),
189 value
.getElementType(), value
.getAlignment() };
191 static type
restore(CodeGenFunction
&CGF
, saved_type value
) {
192 return Address(DominatingLLVMValue::restore(CGF
, value
.SavedValue
),
193 value
.ElementType
, value
.Alignment
);
197 /// A specialization of DominatingValue for RValue.
198 template <> struct DominatingValue
<RValue
> {
201 enum Kind
{ ScalarLiteral
, ScalarAddress
, AggregateLiteral
,
202 AggregateAddress
, ComplexAddress
};
205 llvm::Type
*ElementType
;
208 saved_type(llvm::Value
*v
, llvm::Type
*e
, Kind k
, unsigned a
= 0)
209 : Value(v
), ElementType(e
), K(k
), Align(a
) {}
212 static bool needsSaving(RValue value
);
213 static saved_type
save(CodeGenFunction
&CGF
, RValue value
);
214 RValue
restore(CodeGenFunction
&CGF
);
216 // implementations in CGCleanup.cpp
219 static bool needsSaving(type value
) {
220 return saved_type::needsSaving(value
);
222 static saved_type
save(CodeGenFunction
&CGF
, type value
) {
223 return saved_type::save(CGF
, value
);
225 static type
restore(CodeGenFunction
&CGF
, saved_type value
) {
226 return value
.restore(CGF
);
230 /// CodeGenFunction - This class organizes the per-function state that is used
231 /// while generating LLVM code.
232 class CodeGenFunction
: public CodeGenTypeCache
{
233 CodeGenFunction(const CodeGenFunction
&) = delete;
234 void operator=(const CodeGenFunction
&) = delete;
236 friend class CGCXXABI
;
238 /// A jump destination is an abstract label, branching to which may
239 /// require a jump out through normal cleanups.
241 JumpDest() : Block(nullptr), Index(0) {}
242 JumpDest(llvm::BasicBlock
*Block
, EHScopeStack::stable_iterator Depth
,
244 : Block(Block
), ScopeDepth(Depth
), Index(Index
) {}
246 bool isValid() const { return Block
!= nullptr; }
247 llvm::BasicBlock
*getBlock() const { return Block
; }
248 EHScopeStack::stable_iterator
getScopeDepth() const { return ScopeDepth
; }
249 unsigned getDestIndex() const { return Index
; }
251 // This should be used cautiously.
252 void setScopeDepth(EHScopeStack::stable_iterator depth
) {
257 llvm::BasicBlock
*Block
;
258 EHScopeStack::stable_iterator ScopeDepth
;
262 CodeGenModule
&CGM
; // Per-module state.
263 const TargetInfo
&Target
;
265 // For EH/SEH outlined funclets, this field points to parent's CGF
266 CodeGenFunction
*ParentCGF
= nullptr;
268 typedef std::pair
<llvm::Value
*, llvm::Value
*> ComplexPairTy
;
269 LoopInfoStack LoopStack
;
272 // Stores variables for which we can't generate correct lifetime markers
274 VarBypassDetector Bypasses
;
276 /// List of recently emitted OMPCanonicalLoops.
278 /// Since OMPCanonicalLoops are nested inside other statements (in particular
279 /// CapturedStmt generated by OMPExecutableDirective and non-perfectly nested
280 /// loops), we cannot directly call OMPEmitOMPCanonicalLoop and receive its
281 /// llvm::CanonicalLoopInfo. Instead, we call EmitStmt and any
282 /// OMPEmitOMPCanonicalLoop called by it will add its CanonicalLoopInfo to
283 /// this stack when done. Entering a new loop requires clearing this list; it
284 /// either means we start parsing a new loop nest (in which case the previous
285 /// loop nest goes out of scope) or a second loop in the same level in which
286 /// case it would be ambiguous into which of the two (or more) loops the loop
287 /// nest would extend.
288 SmallVector
<llvm::CanonicalLoopInfo
*, 4> OMPLoopNestStack
;
290 /// Number of nested loop to be consumed by the last surrounding
291 /// loop-associated directive.
292 int ExpectedOMPLoopDepth
= 0;
294 // CodeGen lambda for loops and support for ordered clause
295 typedef llvm::function_ref
<void(CodeGenFunction
&, const OMPLoopDirective
&,
298 typedef llvm::function_ref
<void(CodeGenFunction
&, SourceLocation
,
299 const unsigned, const bool)>
302 // Codegen lambda for loop bounds in worksharing loop constructs
303 typedef llvm::function_ref
<std::pair
<LValue
, LValue
>(
304 CodeGenFunction
&, const OMPExecutableDirective
&S
)>
307 // Codegen lambda for loop bounds in dispatch-based loop implementation
308 typedef llvm::function_ref
<std::pair
<llvm::Value
*, llvm::Value
*>(
309 CodeGenFunction
&, const OMPExecutableDirective
&S
, Address LB
,
311 CodeGenDispatchBoundsTy
;
313 /// CGBuilder insert helper. This function is called after an
314 /// instruction is created using Builder.
315 void InsertHelper(llvm::Instruction
*I
, const llvm::Twine
&Name
,
316 llvm::BasicBlock
*BB
,
317 llvm::BasicBlock::iterator InsertPt
) const;
319 /// CurFuncDecl - Holds the Decl for the current outermost
320 /// non-closure context.
321 const Decl
*CurFuncDecl
= nullptr;
322 /// CurCodeDecl - This is the inner-most code context, which includes blocks.
323 const Decl
*CurCodeDecl
= nullptr;
324 const CGFunctionInfo
*CurFnInfo
= nullptr;
326 llvm::Function
*CurFn
= nullptr;
328 /// Save Parameter Decl for coroutine.
329 llvm::SmallVector
<const ParmVarDecl
*, 4> FnArgs
;
331 // Holds coroutine data if the current function is a coroutine. We use a
332 // wrapper to manage its lifetime, so that we don't have to define CGCoroData
335 std::unique_ptr
<CGCoroData
> Data
;
336 bool InSuspendBlock
= false;
342 bool isCoroutine() const {
343 return CurCoro
.Data
!= nullptr;
346 bool inSuspendBlock() const {
347 return isCoroutine() && CurCoro
.InSuspendBlock
;
350 /// CurGD - The GlobalDecl for the current function being compiled.
353 /// PrologueCleanupDepth - The cleanup depth enclosing all the
354 /// cleanups associated with the parameters.
355 EHScopeStack::stable_iterator PrologueCleanupDepth
;
357 /// ReturnBlock - Unified return block.
358 JumpDest ReturnBlock
;
360 /// ReturnValue - The temporary alloca to hold the return
361 /// value. This is invalid iff the function has no return value.
362 Address ReturnValue
= Address::invalid();
364 /// ReturnValuePointer - The temporary alloca to hold a pointer to sret.
365 /// This is invalid if sret is not in use.
366 Address ReturnValuePointer
= Address::invalid();
368 /// If a return statement is being visited, this holds the return statment's
369 /// result expression.
370 const Expr
*RetExpr
= nullptr;
372 /// Return true if a label was seen in the current scope.
373 bool hasLabelBeenSeenInCurrentScope() const {
375 return CurLexicalScope
->hasLabels();
376 return !LabelMap
.empty();
379 /// AllocaInsertPoint - This is an instruction in the entry block before which
380 /// we prefer to insert allocas.
381 llvm::AssertingVH
<llvm::Instruction
> AllocaInsertPt
;
384 /// PostAllocaInsertPt - This is a place in the prologue where code can be
385 /// inserted that will be dominated by all the static allocas. This helps
386 /// achieve two things:
387 /// 1. Contiguity of all static allocas (within the prologue) is maintained.
388 /// 2. All other prologue code (which are dominated by static allocas) do
389 /// appear in the source order immediately after all static allocas.
391 /// PostAllocaInsertPt will be lazily created when it is *really* required.
392 llvm::AssertingVH
<llvm::Instruction
> PostAllocaInsertPt
= nullptr;
395 /// Return PostAllocaInsertPt. If it is not yet created, then insert it
396 /// immediately after AllocaInsertPt.
397 llvm::Instruction
*getPostAllocaInsertPoint() {
398 if (!PostAllocaInsertPt
) {
399 assert(AllocaInsertPt
&&
400 "Expected static alloca insertion point at function prologue");
401 assert(AllocaInsertPt
->getParent()->isEntryBlock() &&
402 "EBB should be entry block of the current code gen function");
403 PostAllocaInsertPt
= AllocaInsertPt
->clone();
404 PostAllocaInsertPt
->setName("postallocapt");
405 PostAllocaInsertPt
->insertAfter(AllocaInsertPt
);
408 return PostAllocaInsertPt
;
411 /// API for captured statement code generation.
412 class CGCapturedStmtInfo
{
414 explicit CGCapturedStmtInfo(CapturedRegionKind K
= CR_Default
)
415 : Kind(K
), ThisValue(nullptr), CXXThisFieldDecl(nullptr) {}
416 explicit CGCapturedStmtInfo(const CapturedStmt
&S
,
417 CapturedRegionKind K
= CR_Default
)
418 : Kind(K
), ThisValue(nullptr), CXXThisFieldDecl(nullptr) {
420 RecordDecl::field_iterator Field
=
421 S
.getCapturedRecordDecl()->field_begin();
422 for (CapturedStmt::const_capture_iterator I
= S
.capture_begin(),
424 I
!= E
; ++I
, ++Field
) {
425 if (I
->capturesThis())
426 CXXThisFieldDecl
= *Field
;
427 else if (I
->capturesVariable())
428 CaptureFields
[I
->getCapturedVar()->getCanonicalDecl()] = *Field
;
429 else if (I
->capturesVariableByCopy())
430 CaptureFields
[I
->getCapturedVar()->getCanonicalDecl()] = *Field
;
434 virtual ~CGCapturedStmtInfo();
436 CapturedRegionKind
getKind() const { return Kind
; }
438 virtual void setContextValue(llvm::Value
*V
) { ThisValue
= V
; }
439 // Retrieve the value of the context parameter.
440 virtual llvm::Value
*getContextValue() const { return ThisValue
; }
442 /// Lookup the captured field decl for a variable.
443 virtual const FieldDecl
*lookup(const VarDecl
*VD
) const {
444 return CaptureFields
.lookup(VD
->getCanonicalDecl());
447 bool isCXXThisExprCaptured() const { return getThisFieldDecl() != nullptr; }
448 virtual FieldDecl
*getThisFieldDecl() const { return CXXThisFieldDecl
; }
450 static bool classof(const CGCapturedStmtInfo
*) {
454 /// Emit the captured statement body.
455 virtual void EmitBody(CodeGenFunction
&CGF
, const Stmt
*S
) {
456 CGF
.incrementProfileCounter(S
);
460 /// Get the name of the capture helper.
461 virtual StringRef
getHelperName() const { return "__captured_stmt"; }
463 /// Get the CaptureFields
464 llvm::SmallDenseMap
<const VarDecl
*, FieldDecl
*> getCaptureFields() {
465 return CaptureFields
;
469 /// The kind of captured statement being generated.
470 CapturedRegionKind Kind
;
472 /// Keep the map between VarDecl and FieldDecl.
473 llvm::SmallDenseMap
<const VarDecl
*, FieldDecl
*> CaptureFields
;
475 /// The base address of the captured record, passed in as the first
476 /// argument of the parallel region function.
477 llvm::Value
*ThisValue
;
479 /// Captured 'this' type.
480 FieldDecl
*CXXThisFieldDecl
;
482 CGCapturedStmtInfo
*CapturedStmtInfo
= nullptr;
484 /// RAII for correct setting/restoring of CapturedStmtInfo.
485 class CGCapturedStmtRAII
{
487 CodeGenFunction
&CGF
;
488 CGCapturedStmtInfo
*PrevCapturedStmtInfo
;
490 CGCapturedStmtRAII(CodeGenFunction
&CGF
,
491 CGCapturedStmtInfo
*NewCapturedStmtInfo
)
492 : CGF(CGF
), PrevCapturedStmtInfo(CGF
.CapturedStmtInfo
) {
493 CGF
.CapturedStmtInfo
= NewCapturedStmtInfo
;
495 ~CGCapturedStmtRAII() { CGF
.CapturedStmtInfo
= PrevCapturedStmtInfo
; }
498 /// An abstract representation of regular/ObjC call/message targets.
499 class AbstractCallee
{
500 /// The function declaration of the callee.
501 const Decl
*CalleeDecl
;
504 AbstractCallee() : CalleeDecl(nullptr) {}
505 AbstractCallee(const FunctionDecl
*FD
) : CalleeDecl(FD
) {}
506 AbstractCallee(const ObjCMethodDecl
*OMD
) : CalleeDecl(OMD
) {}
507 bool hasFunctionDecl() const {
508 return isa_and_nonnull
<FunctionDecl
>(CalleeDecl
);
510 const Decl
*getDecl() const { return CalleeDecl
; }
511 unsigned getNumParams() const {
512 if (const auto *FD
= dyn_cast
<FunctionDecl
>(CalleeDecl
))
513 return FD
->getNumParams();
514 return cast
<ObjCMethodDecl
>(CalleeDecl
)->param_size();
516 const ParmVarDecl
*getParamDecl(unsigned I
) const {
517 if (const auto *FD
= dyn_cast
<FunctionDecl
>(CalleeDecl
))
518 return FD
->getParamDecl(I
);
519 return *(cast
<ObjCMethodDecl
>(CalleeDecl
)->param_begin() + I
);
523 /// Sanitizers enabled for this function.
524 SanitizerSet SanOpts
;
526 /// True if CodeGen currently emits code implementing sanitizer checks.
527 bool IsSanitizerScope
= false;
529 /// RAII object to set/unset CodeGenFunction::IsSanitizerScope.
530 class SanitizerScope
{
531 CodeGenFunction
*CGF
;
533 SanitizerScope(CodeGenFunction
*CGF
);
537 /// In C++, whether we are code generating a thunk. This controls whether we
538 /// should emit cleanups.
539 bool CurFuncIsThunk
= false;
541 /// In ARC, whether we should autorelease the return value.
542 bool AutoreleaseResult
= false;
544 /// Whether we processed a Microsoft-style asm block during CodeGen. These can
545 /// potentially set the return value.
546 bool SawAsmBlock
= false;
548 GlobalDecl CurSEHParent
;
550 /// True if the current function is an outlined SEH helper. This can be a
551 /// finally block or filter expression.
552 bool IsOutlinedSEHHelper
= false;
554 /// True if CodeGen currently emits code inside presereved access index
556 bool IsInPreservedAIRegion
= false;
558 /// True if the current statement has nomerge attribute.
559 bool InNoMergeAttributedStmt
= false;
561 /// True if the current statement has noinline attribute.
562 bool InNoInlineAttributedStmt
= false;
564 /// True if the current statement has always_inline attribute.
565 bool InAlwaysInlineAttributedStmt
= false;
567 // The CallExpr within the current statement that the musttail attribute
568 // applies to. nullptr if there is no 'musttail' on the current statement.
569 const CallExpr
*MustTailCall
= nullptr;
571 /// Returns true if a function must make progress, which means the
572 /// mustprogress attribute can be added.
573 bool checkIfFunctionMustProgress() {
574 if (CGM
.getCodeGenOpts().getFiniteLoops() ==
575 CodeGenOptions::FiniteLoopsKind::Never
)
578 // C++11 and later guarantees that a thread eventually will do one of the
579 // following (C++11 [intro.multithread]p24 and C++17 [intro.progress]p1):
581 // - make a call to a library I/O function,
582 // - perform an access through a volatile glvalue, or
583 // - perform a synchronization operation or an atomic operation.
585 // Hence each function is 'mustprogress' in C++11 or later.
586 return getLangOpts().CPlusPlus11
;
589 /// Returns true if a loop must make progress, which means the mustprogress
590 /// attribute can be added. \p HasConstantCond indicates whether the branch
591 /// condition is a known constant.
592 bool checkIfLoopMustProgress(bool HasConstantCond
) {
593 if (CGM
.getCodeGenOpts().getFiniteLoops() ==
594 CodeGenOptions::FiniteLoopsKind::Always
)
596 if (CGM
.getCodeGenOpts().getFiniteLoops() ==
597 CodeGenOptions::FiniteLoopsKind::Never
)
600 // If the containing function must make progress, loops also must make
601 // progress (as in C++11 and later).
602 if (checkIfFunctionMustProgress())
605 // Now apply rules for plain C (see 6.8.5.6 in C11).
606 // Loops with constant conditions do not have to make progress in any C
611 // Loops with non-constant conditions must make progress in C11 and later.
612 return getLangOpts().C11
;
615 const CodeGen::CGBlockInfo
*BlockInfo
= nullptr;
616 llvm::Value
*BlockPointer
= nullptr;
618 llvm::DenseMap
<const ValueDecl
*, FieldDecl
*> LambdaCaptureFields
;
619 FieldDecl
*LambdaThisCaptureField
= nullptr;
621 /// A mapping from NRVO variables to the flags used to indicate
622 /// when the NRVO has been applied to this variable.
623 llvm::DenseMap
<const VarDecl
*, llvm::Value
*> NRVOFlags
;
625 EHScopeStack EHStack
;
626 llvm::SmallVector
<char, 256> LifetimeExtendedCleanupStack
;
627 llvm::SmallVector
<const JumpDest
*, 2> SEHTryEpilogueStack
;
629 llvm::Instruction
*CurrentFuncletPad
= nullptr;
631 class CallLifetimeEnd final
: public EHScopeStack::Cleanup
{
632 bool isRedundantBeforeReturn() override
{ return true; }
638 CallLifetimeEnd(Address addr
, llvm::Value
*size
)
639 : Addr(addr
.getPointer()), Size(size
) {}
641 void Emit(CodeGenFunction
&CGF
, Flags flags
) override
{
642 CGF
.EmitLifetimeEnd(Size
, Addr
);
646 /// Header for data within LifetimeExtendedCleanupStack.
647 struct LifetimeExtendedCleanupHeader
{
648 /// The size of the following cleanup object.
650 /// The kind of cleanup to push: a value from the CleanupKind enumeration.
652 /// Whether this is a conditional cleanup.
653 unsigned IsConditional
: 1;
655 size_t getSize() const { return Size
; }
656 CleanupKind
getKind() const { return (CleanupKind
)Kind
; }
657 bool isConditional() const { return IsConditional
; }
660 /// i32s containing the indexes of the cleanup destinations.
661 Address NormalCleanupDest
= Address::invalid();
663 unsigned NextCleanupDestIndex
= 1;
665 /// EHResumeBlock - Unified block containing a call to llvm.eh.resume.
666 llvm::BasicBlock
*EHResumeBlock
= nullptr;
668 /// The exception slot. All landing pads write the current exception pointer
669 /// into this alloca.
670 llvm::Value
*ExceptionSlot
= nullptr;
672 /// The selector slot. Under the MandatoryCleanup model, all landing pads
673 /// write the current selector value into this alloca.
674 llvm::AllocaInst
*EHSelectorSlot
= nullptr;
676 /// A stack of exception code slots. Entering an __except block pushes a slot
677 /// on the stack and leaving pops one. The __exception_code() intrinsic loads
678 /// a value from the top of the stack.
679 SmallVector
<Address
, 1> SEHCodeSlotStack
;
681 /// Value returned by __exception_info intrinsic.
682 llvm::Value
*SEHInfo
= nullptr;
684 /// Emits a landing pad for the current EH stack.
685 llvm::BasicBlock
*EmitLandingPad();
687 llvm::BasicBlock
*getInvokeDestImpl();
689 /// Parent loop-based directive for scan directive.
690 const OMPExecutableDirective
*OMPParentLoopDirectiveForScan
= nullptr;
691 llvm::BasicBlock
*OMPBeforeScanBlock
= nullptr;
692 llvm::BasicBlock
*OMPAfterScanBlock
= nullptr;
693 llvm::BasicBlock
*OMPScanExitBlock
= nullptr;
694 llvm::BasicBlock
*OMPScanDispatch
= nullptr;
695 bool OMPFirstScanLoop
= false;
697 /// Manages parent directive for scan directives.
698 class ParentLoopDirectiveForScanRegion
{
699 CodeGenFunction
&CGF
;
700 const OMPExecutableDirective
*ParentLoopDirectiveForScan
;
703 ParentLoopDirectiveForScanRegion(
704 CodeGenFunction
&CGF
,
705 const OMPExecutableDirective
&ParentLoopDirectiveForScan
)
707 ParentLoopDirectiveForScan(CGF
.OMPParentLoopDirectiveForScan
) {
708 CGF
.OMPParentLoopDirectiveForScan
= &ParentLoopDirectiveForScan
;
710 ~ParentLoopDirectiveForScanRegion() {
711 CGF
.OMPParentLoopDirectiveForScan
= ParentLoopDirectiveForScan
;
716 typename DominatingValue
<T
>::saved_type
saveValueInCond(T value
) {
717 return DominatingValue
<T
>::save(*this, value
);
720 class CGFPOptionsRAII
{
722 CGFPOptionsRAII(CodeGenFunction
&CGF
, FPOptions FPFeatures
);
723 CGFPOptionsRAII(CodeGenFunction
&CGF
, const Expr
*E
);
727 void ConstructorHelper(FPOptions FPFeatures
);
728 CodeGenFunction
&CGF
;
729 FPOptions OldFPFeatures
;
730 llvm::fp::ExceptionBehavior OldExcept
;
731 llvm::RoundingMode OldRounding
;
732 std::optional
<CGBuilderTy::FastMathFlagGuard
> FMFGuard
;
734 FPOptions CurFPFeatures
;
737 /// ObjCEHValueStack - Stack of Objective-C exception values, used for
739 SmallVector
<llvm::Value
*, 8> ObjCEHValueStack
;
741 /// A class controlling the emission of a finally block.
743 /// Where the catchall's edge through the cleanup should go.
744 JumpDest RethrowDest
;
746 /// A function to call to enter the catch.
747 llvm::FunctionCallee BeginCatchFn
;
749 /// An i1 variable indicating whether or not the @finally is
750 /// running for an exception.
751 llvm::AllocaInst
*ForEHVar
= nullptr;
753 /// An i8* variable into which the exception pointer to rethrow
755 llvm::AllocaInst
*SavedExnVar
= nullptr;
758 void enter(CodeGenFunction
&CGF
, const Stmt
*Finally
,
759 llvm::FunctionCallee beginCatchFn
,
760 llvm::FunctionCallee endCatchFn
, llvm::FunctionCallee rethrowFn
);
761 void exit(CodeGenFunction
&CGF
);
764 /// Returns true inside SEH __try blocks.
765 bool isSEHTryScope() const { return !SEHTryEpilogueStack
.empty(); }
767 /// Returns true while emitting a cleanuppad.
768 bool isCleanupPadScope() const {
769 return CurrentFuncletPad
&& isa
<llvm::CleanupPadInst
>(CurrentFuncletPad
);
772 /// pushFullExprCleanup - Push a cleanup to be run at the end of the
773 /// current full-expression. Safe against the possibility that
774 /// we're currently inside a conditionally-evaluated expression.
775 template <class T
, class... As
>
776 void pushFullExprCleanup(CleanupKind kind
, As
... A
) {
777 // If we're not in a conditional branch, or if none of the
778 // arguments requires saving, then use the unconditional cleanup.
779 if (!isInConditionalBranch())
780 return EHStack
.pushCleanup
<T
>(kind
, A
...);
782 // Stash values in a tuple so we can guarantee the order of saves.
783 typedef std::tuple
<typename DominatingValue
<As
>::saved_type
...> SavedTuple
;
784 SavedTuple Saved
{saveValueInCond(A
)...};
786 typedef EHScopeStack::ConditionalCleanup
<T
, As
...> CleanupType
;
787 EHStack
.pushCleanupTuple
<CleanupType
>(kind
, Saved
);
788 initFullExprCleanup();
791 /// Queue a cleanup to be pushed after finishing the current full-expression,
792 /// potentially with an active flag.
793 template <class T
, class... As
>
794 void pushCleanupAfterFullExpr(CleanupKind Kind
, As
... A
) {
795 if (!isInConditionalBranch())
796 return pushCleanupAfterFullExprWithActiveFlag
<T
>(Kind
, Address::invalid(),
799 Address ActiveFlag
= createCleanupActiveFlag();
800 assert(!DominatingValue
<Address
>::needsSaving(ActiveFlag
) &&
801 "cleanup active flag should never need saving");
803 typedef std::tuple
<typename DominatingValue
<As
>::saved_type
...> SavedTuple
;
804 SavedTuple Saved
{saveValueInCond(A
)...};
806 typedef EHScopeStack::ConditionalCleanup
<T
, As
...> CleanupType
;
807 pushCleanupAfterFullExprWithActiveFlag
<CleanupType
>(Kind
, ActiveFlag
, Saved
);
810 template <class T
, class... As
>
811 void pushCleanupAfterFullExprWithActiveFlag(CleanupKind Kind
,
812 Address ActiveFlag
, As
... A
) {
813 LifetimeExtendedCleanupHeader Header
= {sizeof(T
), Kind
,
814 ActiveFlag
.isValid()};
816 size_t OldSize
= LifetimeExtendedCleanupStack
.size();
817 LifetimeExtendedCleanupStack
.resize(
818 LifetimeExtendedCleanupStack
.size() + sizeof(Header
) + Header
.Size
+
819 (Header
.IsConditional
? sizeof(ActiveFlag
) : 0));
821 static_assert(sizeof(Header
) % alignof(T
) == 0,
822 "Cleanup will be allocated on misaligned address");
823 char *Buffer
= &LifetimeExtendedCleanupStack
[OldSize
];
824 new (Buffer
) LifetimeExtendedCleanupHeader(Header
);
825 new (Buffer
+ sizeof(Header
)) T(A
...);
826 if (Header
.IsConditional
)
827 new (Buffer
+ sizeof(Header
) + sizeof(T
)) Address(ActiveFlag
);
830 /// Set up the last cleanup that was pushed as a conditional
831 /// full-expression cleanup.
832 void initFullExprCleanup() {
833 initFullExprCleanupWithFlag(createCleanupActiveFlag());
836 void initFullExprCleanupWithFlag(Address ActiveFlag
);
837 Address
createCleanupActiveFlag();
839 /// PushDestructorCleanup - Push a cleanup to call the
840 /// complete-object destructor of an object of the given type at the
841 /// given address. Does nothing if T is not a C++ class type with a
842 /// non-trivial destructor.
843 void PushDestructorCleanup(QualType T
, Address Addr
);
845 /// PushDestructorCleanup - Push a cleanup to call the
846 /// complete-object variant of the given destructor on the object at
847 /// the given address.
848 void PushDestructorCleanup(const CXXDestructorDecl
*Dtor
, QualType T
,
851 /// PopCleanupBlock - Will pop the cleanup entry on the stack and
852 /// process all branch fixups.
853 void PopCleanupBlock(bool FallThroughIsBranchThrough
= false);
855 /// DeactivateCleanupBlock - Deactivates the given cleanup block.
856 /// The block cannot be reactivated. Pops it if it's the top of the
859 /// \param DominatingIP - An instruction which is known to
860 /// dominate the current IP (if set) and which lies along
861 /// all paths of execution between the current IP and the
862 /// the point at which the cleanup comes into scope.
863 void DeactivateCleanupBlock(EHScopeStack::stable_iterator Cleanup
,
864 llvm::Instruction
*DominatingIP
);
866 /// ActivateCleanupBlock - Activates an initially-inactive cleanup.
867 /// Cannot be used to resurrect a deactivated cleanup.
869 /// \param DominatingIP - An instruction which is known to
870 /// dominate the current IP (if set) and which lies along
871 /// all paths of execution between the current IP and the
872 /// the point at which the cleanup comes into scope.
873 void ActivateCleanupBlock(EHScopeStack::stable_iterator Cleanup
,
874 llvm::Instruction
*DominatingIP
);
876 /// Enters a new scope for capturing cleanups, all of which
877 /// will be executed once the scope is exited.
878 class RunCleanupsScope
{
879 EHScopeStack::stable_iterator CleanupStackDepth
, OldCleanupScopeDepth
;
880 size_t LifetimeExtendedCleanupStackSize
;
881 bool OldDidCallStackSave
;
886 RunCleanupsScope(const RunCleanupsScope
&) = delete;
887 void operator=(const RunCleanupsScope
&) = delete;
890 CodeGenFunction
& CGF
;
893 /// Enter a new cleanup scope.
894 explicit RunCleanupsScope(CodeGenFunction
&CGF
)
895 : PerformCleanup(true), CGF(CGF
)
897 CleanupStackDepth
= CGF
.EHStack
.stable_begin();
898 LifetimeExtendedCleanupStackSize
=
899 CGF
.LifetimeExtendedCleanupStack
.size();
900 OldDidCallStackSave
= CGF
.DidCallStackSave
;
901 CGF
.DidCallStackSave
= false;
902 OldCleanupScopeDepth
= CGF
.CurrentCleanupScopeDepth
;
903 CGF
.CurrentCleanupScopeDepth
= CleanupStackDepth
;
906 /// Exit this cleanup scope, emitting any accumulated cleanups.
907 ~RunCleanupsScope() {
912 /// Determine whether this scope requires any cleanups.
913 bool requiresCleanups() const {
914 return CGF
.EHStack
.stable_begin() != CleanupStackDepth
;
917 /// Force the emission of cleanups now, instead of waiting
918 /// until this object is destroyed.
919 /// \param ValuesToReload - A list of values that need to be available at
920 /// the insertion point after cleanup emission. If cleanup emission created
921 /// a shared cleanup block, these value pointers will be rewritten.
922 /// Otherwise, they not will be modified.
923 void ForceCleanup(std::initializer_list
<llvm::Value
**> ValuesToReload
= {}) {
924 assert(PerformCleanup
&& "Already forced cleanup");
925 CGF
.DidCallStackSave
= OldDidCallStackSave
;
926 CGF
.PopCleanupBlocks(CleanupStackDepth
, LifetimeExtendedCleanupStackSize
,
928 PerformCleanup
= false;
929 CGF
.CurrentCleanupScopeDepth
= OldCleanupScopeDepth
;
933 // Cleanup stack depth of the RunCleanupsScope that was pushed most recently.
934 EHScopeStack::stable_iterator CurrentCleanupScopeDepth
=
935 EHScopeStack::stable_end();
937 class LexicalScope
: public RunCleanupsScope
{
939 SmallVector
<const LabelDecl
*, 4> Labels
;
940 LexicalScope
*ParentScope
;
942 LexicalScope(const LexicalScope
&) = delete;
943 void operator=(const LexicalScope
&) = delete;
946 /// Enter a new cleanup scope.
947 explicit LexicalScope(CodeGenFunction
&CGF
, SourceRange Range
)
948 : RunCleanupsScope(CGF
), Range(Range
), ParentScope(CGF
.CurLexicalScope
) {
949 CGF
.CurLexicalScope
= this;
950 if (CGDebugInfo
*DI
= CGF
.getDebugInfo())
951 DI
->EmitLexicalBlockStart(CGF
.Builder
, Range
.getBegin());
954 void addLabel(const LabelDecl
*label
) {
955 assert(PerformCleanup
&& "adding label to dead scope?");
956 Labels
.push_back(label
);
959 /// Exit this cleanup scope, emitting any accumulated
962 if (CGDebugInfo
*DI
= CGF
.getDebugInfo())
963 DI
->EmitLexicalBlockEnd(CGF
.Builder
, Range
.getEnd());
965 // If we should perform a cleanup, force them now. Note that
966 // this ends the cleanup scope before rescoping any labels.
967 if (PerformCleanup
) {
968 ApplyDebugLocation
DL(CGF
, Range
.getEnd());
973 /// Force the emission of cleanups now, instead of waiting
974 /// until this object is destroyed.
975 void ForceCleanup() {
976 CGF
.CurLexicalScope
= ParentScope
;
977 RunCleanupsScope::ForceCleanup();
983 bool hasLabels() const {
984 return !Labels
.empty();
987 void rescopeLabels();
990 typedef llvm::DenseMap
<const Decl
*, Address
> DeclMapTy
;
992 /// The class used to assign some variables some temporarily addresses.
994 DeclMapTy SavedLocals
;
995 DeclMapTy SavedTempAddresses
;
996 OMPMapVars(const OMPMapVars
&) = delete;
997 void operator=(const OMPMapVars
&) = delete;
1000 explicit OMPMapVars() = default;
1002 assert(SavedLocals
.empty() && "Did not restored original addresses.");
1005 /// Sets the address of the variable \p LocalVD to be \p TempAddr in
1006 /// function \p CGF.
1007 /// \return true if at least one variable was set already, false otherwise.
1008 bool setVarAddr(CodeGenFunction
&CGF
, const VarDecl
*LocalVD
,
1010 LocalVD
= LocalVD
->getCanonicalDecl();
1011 // Only save it once.
1012 if (SavedLocals
.count(LocalVD
)) return false;
1014 // Copy the existing local entry to SavedLocals.
1015 auto it
= CGF
.LocalDeclMap
.find(LocalVD
);
1016 if (it
!= CGF
.LocalDeclMap
.end())
1017 SavedLocals
.try_emplace(LocalVD
, it
->second
);
1019 SavedLocals
.try_emplace(LocalVD
, Address::invalid());
1021 // Generate the private entry.
1022 QualType VarTy
= LocalVD
->getType();
1023 if (VarTy
->isReferenceType()) {
1024 Address Temp
= CGF
.CreateMemTemp(VarTy
);
1025 CGF
.Builder
.CreateStore(TempAddr
.getPointer(), Temp
);
1028 SavedTempAddresses
.try_emplace(LocalVD
, TempAddr
);
1033 /// Applies new addresses to the list of the variables.
1034 /// \return true if at least one variable is using new address, false
1036 bool apply(CodeGenFunction
&CGF
) {
1037 copyInto(SavedTempAddresses
, CGF
.LocalDeclMap
);
1038 SavedTempAddresses
.clear();
1039 return !SavedLocals
.empty();
1042 /// Restores original addresses of the variables.
1043 void restore(CodeGenFunction
&CGF
) {
1044 if (!SavedLocals
.empty()) {
1045 copyInto(SavedLocals
, CGF
.LocalDeclMap
);
1046 SavedLocals
.clear();
1051 /// Copy all the entries in the source map over the corresponding
1052 /// entries in the destination, which must exist.
1053 static void copyInto(const DeclMapTy
&Src
, DeclMapTy
&Dest
) {
1054 for (auto &Pair
: Src
) {
1055 if (!Pair
.second
.isValid()) {
1056 Dest
.erase(Pair
.first
);
1060 auto I
= Dest
.find(Pair
.first
);
1061 if (I
!= Dest
.end())
1062 I
->second
= Pair
.second
;
1069 /// The scope used to remap some variables as private in the OpenMP loop body
1070 /// (or other captured region emitted without outlining), and to restore old
1071 /// vars back on exit.
1072 class OMPPrivateScope
: public RunCleanupsScope
{
1073 OMPMapVars MappedVars
;
1074 OMPPrivateScope(const OMPPrivateScope
&) = delete;
1075 void operator=(const OMPPrivateScope
&) = delete;
1078 /// Enter a new OpenMP private scope.
1079 explicit OMPPrivateScope(CodeGenFunction
&CGF
) : RunCleanupsScope(CGF
) {}
1081 /// Registers \p LocalVD variable as a private with \p Addr as the address
1082 /// of the corresponding private variable. \p
1083 /// PrivateGen is the address of the generated private variable.
1084 /// \return true if the variable is registered as private, false if it has
1085 /// been privatized already.
1086 bool addPrivate(const VarDecl
*LocalVD
, Address Addr
) {
1087 assert(PerformCleanup
&& "adding private to dead scope");
1088 return MappedVars
.setVarAddr(CGF
, LocalVD
, Addr
);
1091 /// Privatizes local variables previously registered as private.
1092 /// Registration is separate from the actual privatization to allow
1093 /// initializers use values of the original variables, not the private one.
1094 /// This is important, for example, if the private variable is a class
1095 /// variable initialized by a constructor that references other private
1096 /// variables. But at initialization original variables must be used, not
1098 /// \return true if at least one variable was privatized, false otherwise.
1099 bool Privatize() { return MappedVars
.apply(CGF
); }
1101 void ForceCleanup() {
1102 RunCleanupsScope::ForceCleanup();
1106 /// Exit scope - all the mapped variables are restored.
1107 ~OMPPrivateScope() {
1112 /// Checks if the global variable is captured in current function.
1113 bool isGlobalVarCaptured(const VarDecl
*VD
) const {
1114 VD
= VD
->getCanonicalDecl();
1115 return !VD
->isLocalVarDeclOrParm() && CGF
.LocalDeclMap
.count(VD
) > 0;
1118 /// Restore all mapped variables w/o clean up. This is usefully when we want
1119 /// to reference the original variables but don't want the clean up because
1120 /// that could emit lifetime end too early, causing backend issue #56913.
1121 void restoreMap() { MappedVars
.restore(CGF
); }
1124 /// Save/restore original map of previously emitted local vars in case when we
1125 /// need to duplicate emission of the same code several times in the same
1126 /// function for OpenMP code.
1127 class OMPLocalDeclMapRAII
{
1128 CodeGenFunction
&CGF
;
1132 OMPLocalDeclMapRAII(CodeGenFunction
&CGF
)
1133 : CGF(CGF
), SavedMap(CGF
.LocalDeclMap
) {}
1134 ~OMPLocalDeclMapRAII() { SavedMap
.swap(CGF
.LocalDeclMap
); }
1137 /// Takes the old cleanup stack size and emits the cleanup blocks
1138 /// that have been added.
1140 PopCleanupBlocks(EHScopeStack::stable_iterator OldCleanupStackSize
,
1141 std::initializer_list
<llvm::Value
**> ValuesToReload
= {});
1143 /// Takes the old cleanup stack size and emits the cleanup blocks
1144 /// that have been added, then adds all lifetime-extended cleanups from
1145 /// the given position to the stack.
1147 PopCleanupBlocks(EHScopeStack::stable_iterator OldCleanupStackSize
,
1148 size_t OldLifetimeExtendedStackSize
,
1149 std::initializer_list
<llvm::Value
**> ValuesToReload
= {});
1151 void ResolveBranchFixups(llvm::BasicBlock
*Target
);
1153 /// The given basic block lies in the current EH scope, but may be a
1154 /// target of a potentially scope-crossing jump; get a stable handle
1155 /// to which we can perform this jump later.
1156 JumpDest
getJumpDestInCurrentScope(llvm::BasicBlock
*Target
) {
1157 return JumpDest(Target
,
1158 EHStack
.getInnermostNormalCleanup(),
1159 NextCleanupDestIndex
++);
1162 /// The given basic block lies in the current EH scope, but may be a
1163 /// target of a potentially scope-crossing jump; get a stable handle
1164 /// to which we can perform this jump later.
1165 JumpDest
getJumpDestInCurrentScope(StringRef Name
= StringRef()) {
1166 return getJumpDestInCurrentScope(createBasicBlock(Name
));
1169 /// EmitBranchThroughCleanup - Emit a branch from the current insert
1170 /// block through the normal cleanup handling code (if any) and then
1171 /// on to \arg Dest.
1172 void EmitBranchThroughCleanup(JumpDest Dest
);
1174 /// isObviouslyBranchWithoutCleanups - Return true if a branch to the
1175 /// specified destination obviously has no cleanups to run. 'false' is always
1176 /// a conservatively correct answer for this method.
1177 bool isObviouslyBranchWithoutCleanups(JumpDest Dest
) const;
1179 /// popCatchScope - Pops the catch scope at the top of the EHScope
1180 /// stack, emitting any required code (other than the catch handlers
1182 void popCatchScope();
1184 llvm::BasicBlock
*getEHResumeBlock(bool isCleanup
);
1185 llvm::BasicBlock
*getEHDispatchBlock(EHScopeStack::stable_iterator scope
);
1187 getFuncletEHDispatchBlock(EHScopeStack::stable_iterator scope
);
1189 /// An object to manage conditionally-evaluated expressions.
1190 class ConditionalEvaluation
{
1191 llvm::BasicBlock
*StartBB
;
1194 ConditionalEvaluation(CodeGenFunction
&CGF
)
1195 : StartBB(CGF
.Builder
.GetInsertBlock()) {}
1197 void begin(CodeGenFunction
&CGF
) {
1198 assert(CGF
.OutermostConditional
!= this);
1199 if (!CGF
.OutermostConditional
)
1200 CGF
.OutermostConditional
= this;
1203 void end(CodeGenFunction
&CGF
) {
1204 assert(CGF
.OutermostConditional
!= nullptr);
1205 if (CGF
.OutermostConditional
== this)
1206 CGF
.OutermostConditional
= nullptr;
1209 /// Returns a block which will be executed prior to each
1210 /// evaluation of the conditional code.
1211 llvm::BasicBlock
*getStartingBlock() const {
1216 /// isInConditionalBranch - Return true if we're currently emitting
1217 /// one branch or the other of a conditional expression.
1218 bool isInConditionalBranch() const { return OutermostConditional
!= nullptr; }
1220 void setBeforeOutermostConditional(llvm::Value
*value
, Address addr
) {
1221 assert(isInConditionalBranch());
1222 llvm::BasicBlock
*block
= OutermostConditional
->getStartingBlock();
1223 auto store
= new llvm::StoreInst(value
, addr
.getPointer(), &block
->back());
1224 store
->setAlignment(addr
.getAlignment().getAsAlign());
1227 /// An RAII object to record that we're evaluating a statement
1229 class StmtExprEvaluation
{
1230 CodeGenFunction
&CGF
;
1232 /// We have to save the outermost conditional: cleanups in a
1233 /// statement expression aren't conditional just because the
1235 ConditionalEvaluation
*SavedOutermostConditional
;
1238 StmtExprEvaluation(CodeGenFunction
&CGF
)
1239 : CGF(CGF
), SavedOutermostConditional(CGF
.OutermostConditional
) {
1240 CGF
.OutermostConditional
= nullptr;
1243 ~StmtExprEvaluation() {
1244 CGF
.OutermostConditional
= SavedOutermostConditional
;
1245 CGF
.EnsureInsertPoint();
1249 /// An object which temporarily prevents a value from being
1250 /// destroyed by aggressive peephole optimizations that assume that
1251 /// all uses of a value have been realized in the IR.
1252 class PeepholeProtection
{
1253 llvm::Instruction
*Inst
= nullptr;
1254 friend class CodeGenFunction
;
1257 PeepholeProtection() = default;
1260 /// A non-RAII class containing all the information about a bound
1261 /// opaque value. OpaqueValueMapping, below, is a RAII wrapper for
1262 /// this which makes individual mappings very simple; using this
1263 /// class directly is useful when you have a variable number of
1264 /// opaque values or don't want the RAII functionality for some
1266 class OpaqueValueMappingData
{
1267 const OpaqueValueExpr
*OpaqueValue
;
1269 CodeGenFunction::PeepholeProtection Protection
;
1271 OpaqueValueMappingData(const OpaqueValueExpr
*ov
,
1273 : OpaqueValue(ov
), BoundLValue(boundLValue
) {}
1275 OpaqueValueMappingData() : OpaqueValue(nullptr) {}
1277 static bool shouldBindAsLValue(const Expr
*expr
) {
1278 // gl-values should be bound as l-values for obvious reasons.
1279 // Records should be bound as l-values because IR generation
1280 // always keeps them in memory. Expressions of function type
1281 // act exactly like l-values but are formally required to be
1283 return expr
->isGLValue() ||
1284 expr
->getType()->isFunctionType() ||
1285 hasAggregateEvaluationKind(expr
->getType());
1288 static OpaqueValueMappingData
bind(CodeGenFunction
&CGF
,
1289 const OpaqueValueExpr
*ov
,
1291 if (shouldBindAsLValue(ov
))
1292 return bind(CGF
, ov
, CGF
.EmitLValue(e
));
1293 return bind(CGF
, ov
, CGF
.EmitAnyExpr(e
));
1296 static OpaqueValueMappingData
bind(CodeGenFunction
&CGF
,
1297 const OpaqueValueExpr
*ov
,
1299 assert(shouldBindAsLValue(ov
));
1300 CGF
.OpaqueLValues
.insert(std::make_pair(ov
, lv
));
1301 return OpaqueValueMappingData(ov
, true);
1304 static OpaqueValueMappingData
bind(CodeGenFunction
&CGF
,
1305 const OpaqueValueExpr
*ov
,
1307 assert(!shouldBindAsLValue(ov
));
1308 CGF
.OpaqueRValues
.insert(std::make_pair(ov
, rv
));
1310 OpaqueValueMappingData
data(ov
, false);
1312 // Work around an extremely aggressive peephole optimization in
1313 // EmitScalarConversion which assumes that all other uses of a
1314 // value are extant.
1315 data
.Protection
= CGF
.protectFromPeepholes(rv
);
1320 bool isValid() const { return OpaqueValue
!= nullptr; }
1321 void clear() { OpaqueValue
= nullptr; }
1323 void unbind(CodeGenFunction
&CGF
) {
1324 assert(OpaqueValue
&& "no data to unbind!");
1327 CGF
.OpaqueLValues
.erase(OpaqueValue
);
1329 CGF
.OpaqueRValues
.erase(OpaqueValue
);
1330 CGF
.unprotectFromPeepholes(Protection
);
1335 /// An RAII object to set (and then clear) a mapping for an OpaqueValueExpr.
1336 class OpaqueValueMapping
{
1337 CodeGenFunction
&CGF
;
1338 OpaqueValueMappingData Data
;
1341 static bool shouldBindAsLValue(const Expr
*expr
) {
1342 return OpaqueValueMappingData::shouldBindAsLValue(expr
);
1345 /// Build the opaque value mapping for the given conditional
1346 /// operator if it's the GNU ?: extension. This is a common
1347 /// enough pattern that the convenience operator is really
1350 OpaqueValueMapping(CodeGenFunction
&CGF
,
1351 const AbstractConditionalOperator
*op
) : CGF(CGF
) {
1352 if (isa
<ConditionalOperator
>(op
))
1353 // Leave Data empty.
1356 const BinaryConditionalOperator
*e
= cast
<BinaryConditionalOperator
>(op
);
1357 Data
= OpaqueValueMappingData::bind(CGF
, e
->getOpaqueValue(),
1361 /// Build the opaque value mapping for an OpaqueValueExpr whose source
1362 /// expression is set to the expression the OVE represents.
1363 OpaqueValueMapping(CodeGenFunction
&CGF
, const OpaqueValueExpr
*OV
)
1366 assert(OV
->getSourceExpr() && "wrong form of OpaqueValueMapping used "
1367 "for OVE with no source expression");
1368 Data
= OpaqueValueMappingData::bind(CGF
, OV
, OV
->getSourceExpr());
1372 OpaqueValueMapping(CodeGenFunction
&CGF
,
1373 const OpaqueValueExpr
*opaqueValue
,
1375 : CGF(CGF
), Data(OpaqueValueMappingData::bind(CGF
, opaqueValue
, lvalue
)) {
1378 OpaqueValueMapping(CodeGenFunction
&CGF
,
1379 const OpaqueValueExpr
*opaqueValue
,
1381 : CGF(CGF
), Data(OpaqueValueMappingData::bind(CGF
, opaqueValue
, rvalue
)) {
1389 ~OpaqueValueMapping() {
1390 if (Data
.isValid()) Data
.unbind(CGF
);
1395 CGDebugInfo
*DebugInfo
;
1396 /// Used to create unique names for artificial VLA size debug info variables.
1397 unsigned VLAExprCounter
= 0;
1398 bool DisableDebugInfo
= false;
1400 /// DidCallStackSave - Whether llvm.stacksave has been called. Used to avoid
1401 /// calling llvm.stacksave for multiple VLAs in the same scope.
1402 bool DidCallStackSave
= false;
1404 /// IndirectBranch - The first time an indirect goto is seen we create a block
1405 /// with an indirect branch. Every time we see the address of a label taken,
1406 /// we add the label to the indirect goto. Every subsequent indirect goto is
1407 /// codegen'd as a jump to the IndirectBranch's basic block.
1408 llvm::IndirectBrInst
*IndirectBranch
= nullptr;
1410 /// LocalDeclMap - This keeps track of the LLVM allocas or globals for local C
1412 DeclMapTy LocalDeclMap
;
1414 // Keep track of the cleanups for callee-destructed parameters pushed to the
1415 // cleanup stack so that they can be deactivated later.
1416 llvm::DenseMap
<const ParmVarDecl
*, EHScopeStack::stable_iterator
>
1417 CalleeDestructedParamCleanups
;
1419 /// SizeArguments - If a ParmVarDecl had the pass_object_size attribute, this
1420 /// will contain a mapping from said ParmVarDecl to its implicit "object_size"
1422 llvm::SmallDenseMap
<const ParmVarDecl
*, const ImplicitParamDecl
*, 2>
1425 /// Track escaped local variables with auto storage. Used during SEH
1426 /// outlining to produce a call to llvm.localescape.
1427 llvm::DenseMap
<llvm::AllocaInst
*, int> EscapedLocals
;
1429 /// LabelMap - This keeps track of the LLVM basic block for each C label.
1430 llvm::DenseMap
<const LabelDecl
*, JumpDest
> LabelMap
;
1432 // BreakContinueStack - This keeps track of where break and continue
1433 // statements should jump to.
1434 struct BreakContinue
{
1435 BreakContinue(JumpDest Break
, JumpDest Continue
)
1436 : BreakBlock(Break
), ContinueBlock(Continue
) {}
1438 JumpDest BreakBlock
;
1439 JumpDest ContinueBlock
;
1441 SmallVector
<BreakContinue
, 8> BreakContinueStack
;
1443 /// Handles cancellation exit points in OpenMP-related constructs.
1444 class OpenMPCancelExitStack
{
1445 /// Tracks cancellation exit point and join point for cancel-related exit
1446 /// and normal exit.
1448 CancelExit() = default;
1449 CancelExit(OpenMPDirectiveKind Kind
, JumpDest ExitBlock
,
1451 : Kind(Kind
), ExitBlock(ExitBlock
), ContBlock(ContBlock
) {}
1452 OpenMPDirectiveKind Kind
= llvm::omp::OMPD_unknown
;
1453 /// true if the exit block has been emitted already by the special
1454 /// emitExit() call, false if the default codegen is used.
1455 bool HasBeenEmitted
= false;
1460 SmallVector
<CancelExit
, 8> Stack
;
1463 OpenMPCancelExitStack() : Stack(1) {}
1464 ~OpenMPCancelExitStack() = default;
1465 /// Fetches the exit block for the current OpenMP construct.
1466 JumpDest
getExitBlock() const { return Stack
.back().ExitBlock
; }
1467 /// Emits exit block with special codegen procedure specific for the related
1468 /// OpenMP construct + emits code for normal construct cleanup.
1469 void emitExit(CodeGenFunction
&CGF
, OpenMPDirectiveKind Kind
,
1470 const llvm::function_ref
<void(CodeGenFunction
&)> CodeGen
) {
1471 if (Stack
.back().Kind
== Kind
&& getExitBlock().isValid()) {
1472 assert(CGF
.getOMPCancelDestination(Kind
).isValid());
1473 assert(CGF
.HaveInsertPoint());
1474 assert(!Stack
.back().HasBeenEmitted
);
1475 auto IP
= CGF
.Builder
.saveAndClearIP();
1476 CGF
.EmitBlock(Stack
.back().ExitBlock
.getBlock());
1478 CGF
.EmitBranch(Stack
.back().ContBlock
.getBlock());
1479 CGF
.Builder
.restoreIP(IP
);
1480 Stack
.back().HasBeenEmitted
= true;
1484 /// Enter the cancel supporting \a Kind construct.
1485 /// \param Kind OpenMP directive that supports cancel constructs.
1486 /// \param HasCancel true, if the construct has inner cancel directive,
1487 /// false otherwise.
1488 void enter(CodeGenFunction
&CGF
, OpenMPDirectiveKind Kind
, bool HasCancel
) {
1489 Stack
.push_back({Kind
,
1490 HasCancel
? CGF
.getJumpDestInCurrentScope("cancel.exit")
1492 HasCancel
? CGF
.getJumpDestInCurrentScope("cancel.cont")
1495 /// Emits default exit point for the cancel construct (if the special one
1496 /// has not be used) + join point for cancel/normal exits.
1497 void exit(CodeGenFunction
&CGF
) {
1498 if (getExitBlock().isValid()) {
1499 assert(CGF
.getOMPCancelDestination(Stack
.back().Kind
).isValid());
1500 bool HaveIP
= CGF
.HaveInsertPoint();
1501 if (!Stack
.back().HasBeenEmitted
) {
1503 CGF
.EmitBranchThroughCleanup(Stack
.back().ContBlock
);
1504 CGF
.EmitBlock(Stack
.back().ExitBlock
.getBlock());
1505 CGF
.EmitBranchThroughCleanup(Stack
.back().ContBlock
);
1507 CGF
.EmitBlock(Stack
.back().ContBlock
.getBlock());
1509 CGF
.Builder
.CreateUnreachable();
1510 CGF
.Builder
.ClearInsertionPoint();
1516 OpenMPCancelExitStack OMPCancelStack
;
1518 /// Lower the Likelihood knowledge about the \p Cond via llvm.expect intrin.
1519 llvm::Value
*emitCondLikelihoodViaExpectIntrinsic(llvm::Value
*Cond
,
1520 Stmt::Likelihood LH
);
1524 /// Calculate branch weights appropriate for PGO data
1525 llvm::MDNode
*createProfileWeights(uint64_t TrueCount
,
1526 uint64_t FalseCount
) const;
1527 llvm::MDNode
*createProfileWeights(ArrayRef
<uint64_t> Weights
) const;
1528 llvm::MDNode
*createProfileWeightsForLoop(const Stmt
*Cond
,
1529 uint64_t LoopCount
) const;
1532 /// Increment the profiler's counter for the given statement by \p StepV.
1533 /// If \p StepV is null, the default increment is 1.
1534 void incrementProfileCounter(const Stmt
*S
, llvm::Value
*StepV
= nullptr) {
1535 if (CGM
.getCodeGenOpts().hasProfileClangInstr() &&
1536 !CurFn
->hasFnAttribute(llvm::Attribute::NoProfile
) &&
1537 !CurFn
->hasFnAttribute(llvm::Attribute::SkipProfile
))
1538 PGO
.emitCounterIncrement(Builder
, S
, StepV
);
1539 PGO
.setCurrentStmt(S
);
1542 /// Get the profiler's count for the given statement.
1543 uint64_t getProfileCount(const Stmt
*S
) {
1544 return PGO
.getStmtCount(S
).value_or(0);
1547 /// Set the profiler's current count.
1548 void setCurrentProfileCount(uint64_t Count
) {
1549 PGO
.setCurrentRegionCount(Count
);
1552 /// Get the profiler's current count. This is generally the count for the most
1553 /// recently incremented counter.
1554 uint64_t getCurrentProfileCount() {
1555 return PGO
.getCurrentRegionCount();
1560 /// SwitchInsn - This is nearest current switch instruction. It is null if
1561 /// current context is not in a switch.
1562 llvm::SwitchInst
*SwitchInsn
= nullptr;
1563 /// The branch weights of SwitchInsn when doing instrumentation based PGO.
1564 SmallVector
<uint64_t, 16> *SwitchWeights
= nullptr;
1566 /// The likelihood attributes of the SwitchCase.
1567 SmallVector
<Stmt::Likelihood
, 16> *SwitchLikelihood
= nullptr;
1569 /// CaseRangeBlock - This block holds if condition check for last case
1570 /// statement range in current switch instruction.
1571 llvm::BasicBlock
*CaseRangeBlock
= nullptr;
1573 /// OpaqueLValues - Keeps track of the current set of opaque value
1575 llvm::DenseMap
<const OpaqueValueExpr
*, LValue
> OpaqueLValues
;
1576 llvm::DenseMap
<const OpaqueValueExpr
*, RValue
> OpaqueRValues
;
1578 // VLASizeMap - This keeps track of the associated size for each VLA type.
1579 // We track this by the size expression rather than the type itself because
1580 // in certain situations, like a const qualifier applied to an VLA typedef,
1581 // multiple VLA types can share the same size expression.
1582 // FIXME: Maybe this could be a stack of maps that is pushed/popped as we
1583 // enter/leave scopes.
1584 llvm::DenseMap
<const Expr
*, llvm::Value
*> VLASizeMap
;
1586 /// A block containing a single 'unreachable' instruction. Created
1587 /// lazily by getUnreachableBlock().
1588 llvm::BasicBlock
*UnreachableBlock
= nullptr;
1590 /// Counts of the number return expressions in the function.
1591 unsigned NumReturnExprs
= 0;
1593 /// Count the number of simple (constant) return expressions in the function.
1594 unsigned NumSimpleReturnExprs
= 0;
1596 /// The last regular (non-return) debug location (breakpoint) in the function.
1597 SourceLocation LastStopPoint
;
1600 /// Source location information about the default argument or member
1601 /// initializer expression we're evaluating, if any.
1602 CurrentSourceLocExprScope CurSourceLocExprScope
;
1603 using SourceLocExprScopeGuard
=
1604 CurrentSourceLocExprScope::SourceLocExprScopeGuard
;
1606 /// A scope within which we are constructing the fields of an object which
1607 /// might use a CXXDefaultInitExpr. This stashes away a 'this' value to use
1608 /// if we need to evaluate a CXXDefaultInitExpr within the evaluation.
1609 class FieldConstructionScope
{
1611 FieldConstructionScope(CodeGenFunction
&CGF
, Address This
)
1612 : CGF(CGF
), OldCXXDefaultInitExprThis(CGF
.CXXDefaultInitExprThis
) {
1613 CGF
.CXXDefaultInitExprThis
= This
;
1615 ~FieldConstructionScope() {
1616 CGF
.CXXDefaultInitExprThis
= OldCXXDefaultInitExprThis
;
1620 CodeGenFunction
&CGF
;
1621 Address OldCXXDefaultInitExprThis
;
1624 /// The scope of a CXXDefaultInitExpr. Within this scope, the value of 'this'
1625 /// is overridden to be the object under construction.
1626 class CXXDefaultInitExprScope
{
1628 CXXDefaultInitExprScope(CodeGenFunction
&CGF
, const CXXDefaultInitExpr
*E
)
1629 : CGF(CGF
), OldCXXThisValue(CGF
.CXXThisValue
),
1630 OldCXXThisAlignment(CGF
.CXXThisAlignment
),
1631 SourceLocScope(E
, CGF
.CurSourceLocExprScope
) {
1632 CGF
.CXXThisValue
= CGF
.CXXDefaultInitExprThis
.getPointer();
1633 CGF
.CXXThisAlignment
= CGF
.CXXDefaultInitExprThis
.getAlignment();
1635 ~CXXDefaultInitExprScope() {
1636 CGF
.CXXThisValue
= OldCXXThisValue
;
1637 CGF
.CXXThisAlignment
= OldCXXThisAlignment
;
1641 CodeGenFunction
&CGF
;
1642 llvm::Value
*OldCXXThisValue
;
1643 CharUnits OldCXXThisAlignment
;
1644 SourceLocExprScopeGuard SourceLocScope
;
1647 struct CXXDefaultArgExprScope
: SourceLocExprScopeGuard
{
1648 CXXDefaultArgExprScope(CodeGenFunction
&CGF
, const CXXDefaultArgExpr
*E
)
1649 : SourceLocExprScopeGuard(E
, CGF
.CurSourceLocExprScope
) {}
1652 /// The scope of an ArrayInitLoopExpr. Within this scope, the value of the
1653 /// current loop index is overridden.
1654 class ArrayInitLoopExprScope
{
1656 ArrayInitLoopExprScope(CodeGenFunction
&CGF
, llvm::Value
*Index
)
1657 : CGF(CGF
), OldArrayInitIndex(CGF
.ArrayInitIndex
) {
1658 CGF
.ArrayInitIndex
= Index
;
1660 ~ArrayInitLoopExprScope() {
1661 CGF
.ArrayInitIndex
= OldArrayInitIndex
;
1665 CodeGenFunction
&CGF
;
1666 llvm::Value
*OldArrayInitIndex
;
1669 class InlinedInheritingConstructorScope
{
1671 InlinedInheritingConstructorScope(CodeGenFunction
&CGF
, GlobalDecl GD
)
1672 : CGF(CGF
), OldCurGD(CGF
.CurGD
), OldCurFuncDecl(CGF
.CurFuncDecl
),
1673 OldCurCodeDecl(CGF
.CurCodeDecl
),
1674 OldCXXABIThisDecl(CGF
.CXXABIThisDecl
),
1675 OldCXXABIThisValue(CGF
.CXXABIThisValue
),
1676 OldCXXThisValue(CGF
.CXXThisValue
),
1677 OldCXXABIThisAlignment(CGF
.CXXABIThisAlignment
),
1678 OldCXXThisAlignment(CGF
.CXXThisAlignment
),
1679 OldReturnValue(CGF
.ReturnValue
), OldFnRetTy(CGF
.FnRetTy
),
1680 OldCXXInheritedCtorInitExprArgs(
1681 std::move(CGF
.CXXInheritedCtorInitExprArgs
)) {
1683 CGF
.CurFuncDecl
= CGF
.CurCodeDecl
=
1684 cast
<CXXConstructorDecl
>(GD
.getDecl());
1685 CGF
.CXXABIThisDecl
= nullptr;
1686 CGF
.CXXABIThisValue
= nullptr;
1687 CGF
.CXXThisValue
= nullptr;
1688 CGF
.CXXABIThisAlignment
= CharUnits();
1689 CGF
.CXXThisAlignment
= CharUnits();
1690 CGF
.ReturnValue
= Address::invalid();
1691 CGF
.FnRetTy
= QualType();
1692 CGF
.CXXInheritedCtorInitExprArgs
.clear();
1694 ~InlinedInheritingConstructorScope() {
1695 CGF
.CurGD
= OldCurGD
;
1696 CGF
.CurFuncDecl
= OldCurFuncDecl
;
1697 CGF
.CurCodeDecl
= OldCurCodeDecl
;
1698 CGF
.CXXABIThisDecl
= OldCXXABIThisDecl
;
1699 CGF
.CXXABIThisValue
= OldCXXABIThisValue
;
1700 CGF
.CXXThisValue
= OldCXXThisValue
;
1701 CGF
.CXXABIThisAlignment
= OldCXXABIThisAlignment
;
1702 CGF
.CXXThisAlignment
= OldCXXThisAlignment
;
1703 CGF
.ReturnValue
= OldReturnValue
;
1704 CGF
.FnRetTy
= OldFnRetTy
;
1705 CGF
.CXXInheritedCtorInitExprArgs
=
1706 std::move(OldCXXInheritedCtorInitExprArgs
);
1710 CodeGenFunction
&CGF
;
1711 GlobalDecl OldCurGD
;
1712 const Decl
*OldCurFuncDecl
;
1713 const Decl
*OldCurCodeDecl
;
1714 ImplicitParamDecl
*OldCXXABIThisDecl
;
1715 llvm::Value
*OldCXXABIThisValue
;
1716 llvm::Value
*OldCXXThisValue
;
1717 CharUnits OldCXXABIThisAlignment
;
1718 CharUnits OldCXXThisAlignment
;
1719 Address OldReturnValue
;
1720 QualType OldFnRetTy
;
1721 CallArgList OldCXXInheritedCtorInitExprArgs
;
1724 // Helper class for the OpenMP IR Builder. Allows reusability of code used for
1725 // region body, and finalization codegen callbacks. This will class will also
1726 // contain privatization functions used by the privatization call backs
1728 // TODO: this is temporary class for things that are being moved out of
1729 // CGOpenMPRuntime, new versions of current CodeGenFunction methods, or
1730 // utility function for use with the OMPBuilder. Once that move to use the
1731 // OMPBuilder is done, everything here will either become part of CodeGenFunc.
1732 // directly, or a new helper class that will contain functions used by both
1733 // this and the OMPBuilder
1735 struct OMPBuilderCBHelpers
{
1737 OMPBuilderCBHelpers() = delete;
1738 OMPBuilderCBHelpers(const OMPBuilderCBHelpers
&) = delete;
1739 OMPBuilderCBHelpers
&operator=(const OMPBuilderCBHelpers
&) = delete;
1741 using InsertPointTy
= llvm::OpenMPIRBuilder::InsertPointTy
;
1743 /// Cleanup action for allocate support.
1744 class OMPAllocateCleanupTy final
: public EHScopeStack::Cleanup
{
1747 llvm::CallInst
*RTLFnCI
;
1750 OMPAllocateCleanupTy(llvm::CallInst
*RLFnCI
) : RTLFnCI(RLFnCI
) {
1751 RLFnCI
->removeFromParent();
1754 void Emit(CodeGenFunction
&CGF
, Flags
/*flags*/) override
{
1755 if (!CGF
.HaveInsertPoint())
1757 CGF
.Builder
.Insert(RTLFnCI
);
1761 /// Returns address of the threadprivate variable for the current
1762 /// thread. This Also create any necessary OMP runtime calls.
1764 /// \param VD VarDecl for Threadprivate variable.
1765 /// \param VDAddr Address of the Vardecl
1766 /// \param Loc The location where the barrier directive was encountered
1767 static Address
getAddrOfThreadPrivate(CodeGenFunction
&CGF
,
1768 const VarDecl
*VD
, Address VDAddr
,
1769 SourceLocation Loc
);
1771 /// Gets the OpenMP-specific address of the local variable /p VD.
1772 static Address
getAddressOfLocalVariable(CodeGenFunction
&CGF
,
1774 /// Get the platform-specific name separator.
1775 /// \param Parts different parts of the final name that needs separation
1776 /// \param FirstSeparator First separator used between the initial two
1777 /// parts of the name.
1778 /// \param Separator separator used between all of the rest consecutinve
1779 /// parts of the name
1780 static std::string
getNameWithSeparators(ArrayRef
<StringRef
> Parts
,
1781 StringRef FirstSeparator
= ".",
1782 StringRef Separator
= ".");
1783 /// Emit the Finalization for an OMP region
1784 /// \param CGF The Codegen function this belongs to
1785 /// \param IP Insertion point for generating the finalization code.
1786 static void FinalizeOMPRegion(CodeGenFunction
&CGF
, InsertPointTy IP
) {
1787 CGBuilderTy::InsertPointGuard
IPG(CGF
.Builder
);
1788 assert(IP
.getBlock()->end() != IP
.getPoint() &&
1789 "OpenMP IR Builder should cause terminated block!");
1791 llvm::BasicBlock
*IPBB
= IP
.getBlock();
1792 llvm::BasicBlock
*DestBB
= IPBB
->getUniqueSuccessor();
1793 assert(DestBB
&& "Finalization block should have one successor!");
1795 // erase and replace with cleanup branch.
1796 IPBB
->getTerminator()->eraseFromParent();
1797 CGF
.Builder
.SetInsertPoint(IPBB
);
1798 CodeGenFunction::JumpDest Dest
= CGF
.getJumpDestInCurrentScope(DestBB
);
1799 CGF
.EmitBranchThroughCleanup(Dest
);
1802 /// Emit the body of an OMP region
1803 /// \param CGF The Codegen function this belongs to
1804 /// \param RegionBodyStmt The body statement for the OpenMP region being
1806 /// \param AllocaIP Where to insert alloca instructions
1807 /// \param CodeGenIP Where to insert the region code
1808 /// \param RegionName Name to be used for new blocks
1809 static void EmitOMPInlinedRegionBody(CodeGenFunction
&CGF
,
1810 const Stmt
*RegionBodyStmt
,
1811 InsertPointTy AllocaIP
,
1812 InsertPointTy CodeGenIP
,
1815 static void EmitCaptureStmt(CodeGenFunction
&CGF
, InsertPointTy CodeGenIP
,
1816 llvm::BasicBlock
&FiniBB
, llvm::Function
*Fn
,
1817 ArrayRef
<llvm::Value
*> Args
) {
1818 llvm::BasicBlock
*CodeGenIPBB
= CodeGenIP
.getBlock();
1819 if (llvm::Instruction
*CodeGenIPBBTI
= CodeGenIPBB
->getTerminator())
1820 CodeGenIPBBTI
->eraseFromParent();
1822 CGF
.Builder
.SetInsertPoint(CodeGenIPBB
);
1824 if (Fn
->doesNotThrow())
1825 CGF
.EmitNounwindRuntimeCall(Fn
, Args
);
1827 CGF
.EmitRuntimeCall(Fn
, Args
);
1829 if (CGF
.Builder
.saveIP().isSet())
1830 CGF
.Builder
.CreateBr(&FiniBB
);
1833 /// Emit the body of an OMP region that will be outlined in
1834 /// OpenMPIRBuilder::finalize().
1835 /// \param CGF The Codegen function this belongs to
1836 /// \param RegionBodyStmt The body statement for the OpenMP region being
1838 /// \param AllocaIP Where to insert alloca instructions
1839 /// \param CodeGenIP Where to insert the region code
1840 /// \param RegionName Name to be used for new blocks
1841 static void EmitOMPOutlinedRegionBody(CodeGenFunction
&CGF
,
1842 const Stmt
*RegionBodyStmt
,
1843 InsertPointTy AllocaIP
,
1844 InsertPointTy CodeGenIP
,
1847 /// RAII for preserving necessary info during Outlined region body codegen.
1848 class OutlinedRegionBodyRAII
{
1850 llvm::AssertingVH
<llvm::Instruction
> OldAllocaIP
;
1851 CodeGenFunction::JumpDest OldReturnBlock
;
1852 CodeGenFunction
&CGF
;
1855 OutlinedRegionBodyRAII(CodeGenFunction
&cgf
, InsertPointTy
&AllocaIP
,
1856 llvm::BasicBlock
&RetBB
)
1858 assert(AllocaIP
.isSet() &&
1859 "Must specify Insertion point for allocas of outlined function");
1860 OldAllocaIP
= CGF
.AllocaInsertPt
;
1861 CGF
.AllocaInsertPt
= &*AllocaIP
.getPoint();
1863 OldReturnBlock
= CGF
.ReturnBlock
;
1864 CGF
.ReturnBlock
= CGF
.getJumpDestInCurrentScope(&RetBB
);
1867 ~OutlinedRegionBodyRAII() {
1868 CGF
.AllocaInsertPt
= OldAllocaIP
;
1869 CGF
.ReturnBlock
= OldReturnBlock
;
1873 /// RAII for preserving necessary info during inlined region body codegen.
1874 class InlinedRegionBodyRAII
{
1876 llvm::AssertingVH
<llvm::Instruction
> OldAllocaIP
;
1877 CodeGenFunction
&CGF
;
1880 InlinedRegionBodyRAII(CodeGenFunction
&cgf
, InsertPointTy
&AllocaIP
,
1881 llvm::BasicBlock
&FiniBB
)
1883 // Alloca insertion block should be in the entry block of the containing
1884 // function so it expects an empty AllocaIP in which case will reuse the
1885 // old alloca insertion point, or a new AllocaIP in the same block as
1887 assert((!AllocaIP
.isSet() ||
1888 CGF
.AllocaInsertPt
->getParent() == AllocaIP
.getBlock()) &&
1889 "Insertion point should be in the entry block of containing "
1891 OldAllocaIP
= CGF
.AllocaInsertPt
;
1892 if (AllocaIP
.isSet())
1893 CGF
.AllocaInsertPt
= &*AllocaIP
.getPoint();
1895 // TODO: Remove the call, after making sure the counter is not used by
1897 // Since this is an inlined region, it should not modify the
1898 // ReturnBlock, and should reuse the one for the enclosing outlined
1899 // region. So, the JumpDest being return by the function is discarded
1900 (void)CGF
.getJumpDestInCurrentScope(&FiniBB
);
1903 ~InlinedRegionBodyRAII() { CGF
.AllocaInsertPt
= OldAllocaIP
; }
1908 /// CXXThisDecl - When generating code for a C++ member function,
1909 /// this will hold the implicit 'this' declaration.
1910 ImplicitParamDecl
*CXXABIThisDecl
= nullptr;
1911 llvm::Value
*CXXABIThisValue
= nullptr;
1912 llvm::Value
*CXXThisValue
= nullptr;
1913 CharUnits CXXABIThisAlignment
;
1914 CharUnits CXXThisAlignment
;
1916 /// The value of 'this' to use when evaluating CXXDefaultInitExprs within
1917 /// this expression.
1918 Address CXXDefaultInitExprThis
= Address::invalid();
1920 /// The current array initialization index when evaluating an
1921 /// ArrayInitIndexExpr within an ArrayInitLoopExpr.
1922 llvm::Value
*ArrayInitIndex
= nullptr;
1924 /// The values of function arguments to use when evaluating
1925 /// CXXInheritedCtorInitExprs within this context.
1926 CallArgList CXXInheritedCtorInitExprArgs
;
1928 /// CXXStructorImplicitParamDecl - When generating code for a constructor or
1929 /// destructor, this will hold the implicit argument (e.g. VTT).
1930 ImplicitParamDecl
*CXXStructorImplicitParamDecl
= nullptr;
1931 llvm::Value
*CXXStructorImplicitParamValue
= nullptr;
1933 /// OutermostConditional - Points to the outermost active
1934 /// conditional control. This is used so that we know if a
1935 /// temporary should be destroyed conditionally.
1936 ConditionalEvaluation
*OutermostConditional
= nullptr;
1938 /// The current lexical scope.
1939 LexicalScope
*CurLexicalScope
= nullptr;
1941 /// The current source location that should be used for exception
1943 SourceLocation CurEHLocation
;
1945 /// BlockByrefInfos - For each __block variable, contains
1946 /// information about the layout of the variable.
1947 llvm::DenseMap
<const ValueDecl
*, BlockByrefInfo
> BlockByrefInfos
;
1949 /// Used by -fsanitize=nullability-return to determine whether the return
1950 /// value can be checked.
1951 llvm::Value
*RetValNullabilityPrecondition
= nullptr;
1953 /// Check if -fsanitize=nullability-return instrumentation is required for
1955 bool requiresReturnValueNullabilityCheck() const {
1956 return RetValNullabilityPrecondition
;
1959 /// Used to store precise source locations for return statements by the
1960 /// runtime return value checks.
1961 Address ReturnLocation
= Address::invalid();
1963 /// Check if the return value of this function requires sanitization.
1964 bool requiresReturnValueCheck() const;
1966 bool isInAllocaArgument(CGCXXABI
&ABI
, QualType Ty
);
1967 bool hasInAllocaArg(const CXXMethodDecl
*MD
);
1969 llvm::BasicBlock
*TerminateLandingPad
= nullptr;
1970 llvm::BasicBlock
*TerminateHandler
= nullptr;
1971 llvm::SmallVector
<llvm::BasicBlock
*, 2> TrapBBs
;
1973 /// Terminate funclets keyed by parent funclet pad.
1974 llvm::MapVector
<llvm::Value
*, llvm::BasicBlock
*> TerminateFunclets
;
1976 /// Largest vector width used in ths function. Will be used to create a
1977 /// function attribute.
1978 unsigned LargestVectorWidth
= 0;
1980 /// True if we need emit the life-time markers. This is initially set in
1981 /// the constructor, but could be overwritten to true if this is a coroutine.
1982 bool ShouldEmitLifetimeMarkers
;
1984 /// Add OpenCL kernel arg metadata and the kernel attribute metadata to
1985 /// the function metadata.
1986 void EmitKernelMetadata(const FunctionDecl
*FD
, llvm::Function
*Fn
);
1989 CodeGenFunction(CodeGenModule
&cgm
, bool suppressNewContext
=false);
1992 CodeGenTypes
&getTypes() const { return CGM
.getTypes(); }
1993 ASTContext
&getContext() const { return CGM
.getContext(); }
1994 CGDebugInfo
*getDebugInfo() {
1995 if (DisableDebugInfo
)
1999 void disableDebugInfo() { DisableDebugInfo
= true; }
2000 void enableDebugInfo() { DisableDebugInfo
= false; }
2002 bool shouldUseFusedARCCalls() {
2003 return CGM
.getCodeGenOpts().OptimizationLevel
== 0;
2006 const LangOptions
&getLangOpts() const { return CGM
.getLangOpts(); }
2008 /// Returns a pointer to the function's exception object and selector slot,
2009 /// which is assigned in every landing pad.
2010 Address
getExceptionSlot();
2011 Address
getEHSelectorSlot();
2013 /// Returns the contents of the function's exception object and selector
2015 llvm::Value
*getExceptionFromSlot();
2016 llvm::Value
*getSelectorFromSlot();
2018 Address
getNormalCleanupDestSlot();
2020 llvm::BasicBlock
*getUnreachableBlock() {
2021 if (!UnreachableBlock
) {
2022 UnreachableBlock
= createBasicBlock("unreachable");
2023 new llvm::UnreachableInst(getLLVMContext(), UnreachableBlock
);
2025 return UnreachableBlock
;
2028 llvm::BasicBlock
*getInvokeDest() {
2029 if (!EHStack
.requiresLandingPad()) return nullptr;
2030 return getInvokeDestImpl();
2033 bool currentFunctionUsesSEHTry() const { return !!CurSEHParent
; }
2035 const TargetInfo
&getTarget() const { return Target
; }
2036 llvm::LLVMContext
&getLLVMContext() { return CGM
.getLLVMContext(); }
2037 const TargetCodeGenInfo
&getTargetHooks() const {
2038 return CGM
.getTargetCodeGenInfo();
2041 //===--------------------------------------------------------------------===//
2043 //===--------------------------------------------------------------------===//
2045 typedef void Destroyer(CodeGenFunction
&CGF
, Address addr
, QualType ty
);
2047 void pushIrregularPartialArrayCleanup(llvm::Value
*arrayBegin
,
2048 Address arrayEndPointer
,
2049 QualType elementType
,
2050 CharUnits elementAlignment
,
2051 Destroyer
*destroyer
);
2052 void pushRegularPartialArrayCleanup(llvm::Value
*arrayBegin
,
2053 llvm::Value
*arrayEnd
,
2054 QualType elementType
,
2055 CharUnits elementAlignment
,
2056 Destroyer
*destroyer
);
2058 void pushDestroy(QualType::DestructionKind dtorKind
,
2059 Address addr
, QualType type
);
2060 void pushEHDestroy(QualType::DestructionKind dtorKind
,
2061 Address addr
, QualType type
);
2062 void pushDestroy(CleanupKind kind
, Address addr
, QualType type
,
2063 Destroyer
*destroyer
, bool useEHCleanupForArray
);
2064 void pushLifetimeExtendedDestroy(CleanupKind kind
, Address addr
,
2065 QualType type
, Destroyer
*destroyer
,
2066 bool useEHCleanupForArray
);
2067 void pushCallObjectDeleteCleanup(const FunctionDecl
*OperatorDelete
,
2068 llvm::Value
*CompletePtr
,
2069 QualType ElementType
);
2070 void pushStackRestore(CleanupKind kind
, Address SPMem
);
2071 void pushKmpcAllocFree(CleanupKind Kind
,
2072 std::pair
<llvm::Value
*, llvm::Value
*> AddrSizePair
);
2073 void emitDestroy(Address addr
, QualType type
, Destroyer
*destroyer
,
2074 bool useEHCleanupForArray
);
2075 llvm::Function
*generateDestroyHelper(Address addr
, QualType type
,
2076 Destroyer
*destroyer
,
2077 bool useEHCleanupForArray
,
2079 void emitArrayDestroy(llvm::Value
*begin
, llvm::Value
*end
,
2080 QualType elementType
, CharUnits elementAlign
,
2081 Destroyer
*destroyer
,
2082 bool checkZeroLength
, bool useEHCleanup
);
2084 Destroyer
*getDestroyer(QualType::DestructionKind destructionKind
);
2086 /// Determines whether an EH cleanup is required to destroy a type
2087 /// with the given destruction kind.
2088 bool needsEHCleanup(QualType::DestructionKind kind
) {
2090 case QualType::DK_none
:
2092 case QualType::DK_cxx_destructor
:
2093 case QualType::DK_objc_weak_lifetime
:
2094 case QualType::DK_nontrivial_c_struct
:
2095 return getLangOpts().Exceptions
;
2096 case QualType::DK_objc_strong_lifetime
:
2097 return getLangOpts().Exceptions
&&
2098 CGM
.getCodeGenOpts().ObjCAutoRefCountExceptions
;
2100 llvm_unreachable("bad destruction kind");
2103 CleanupKind
getCleanupKind(QualType::DestructionKind kind
) {
2104 return (needsEHCleanup(kind
) ? NormalAndEHCleanup
: NormalCleanup
);
2107 //===--------------------------------------------------------------------===//
2109 //===--------------------------------------------------------------------===//
2111 void GenerateObjCMethod(const ObjCMethodDecl
*OMD
);
2113 void StartObjCMethod(const ObjCMethodDecl
*MD
, const ObjCContainerDecl
*CD
);
2115 /// GenerateObjCGetter - Synthesize an Objective-C property getter function.
2116 void GenerateObjCGetter(ObjCImplementationDecl
*IMP
,
2117 const ObjCPropertyImplDecl
*PID
);
2118 void generateObjCGetterBody(const ObjCImplementationDecl
*classImpl
,
2119 const ObjCPropertyImplDecl
*propImpl
,
2120 const ObjCMethodDecl
*GetterMothodDecl
,
2121 llvm::Constant
*AtomicHelperFn
);
2123 void GenerateObjCCtorDtorMethod(ObjCImplementationDecl
*IMP
,
2124 ObjCMethodDecl
*MD
, bool ctor
);
2126 /// GenerateObjCSetter - Synthesize an Objective-C property setter function
2127 /// for the given property.
2128 void GenerateObjCSetter(ObjCImplementationDecl
*IMP
,
2129 const ObjCPropertyImplDecl
*PID
);
2130 void generateObjCSetterBody(const ObjCImplementationDecl
*classImpl
,
2131 const ObjCPropertyImplDecl
*propImpl
,
2132 llvm::Constant
*AtomicHelperFn
);
2134 //===--------------------------------------------------------------------===//
2136 //===--------------------------------------------------------------------===//
2138 /// Emit block literal.
2139 /// \return an LLVM value which is a pointer to a struct which contains
2140 /// information about the block, including the block invoke function, the
2141 /// captured variables, etc.
2142 llvm::Value
*EmitBlockLiteral(const BlockExpr
*);
2144 llvm::Function
*GenerateBlockFunction(GlobalDecl GD
,
2145 const CGBlockInfo
&Info
,
2146 const DeclMapTy
&ldm
,
2147 bool IsLambdaConversionToBlock
,
2148 bool BuildGlobalBlock
);
2150 /// Check if \p T is a C++ class that has a destructor that can throw.
2151 static bool cxxDestructorCanThrow(QualType T
);
2153 llvm::Constant
*GenerateCopyHelperFunction(const CGBlockInfo
&blockInfo
);
2154 llvm::Constant
*GenerateDestroyHelperFunction(const CGBlockInfo
&blockInfo
);
2155 llvm::Constant
*GenerateObjCAtomicSetterCopyHelperFunction(
2156 const ObjCPropertyImplDecl
*PID
);
2157 llvm::Constant
*GenerateObjCAtomicGetterCopyHelperFunction(
2158 const ObjCPropertyImplDecl
*PID
);
2159 llvm::Value
*EmitBlockCopyAndAutorelease(llvm::Value
*Block
, QualType Ty
);
2161 void BuildBlockRelease(llvm::Value
*DeclPtr
, BlockFieldFlags flags
,
2164 class AutoVarEmission
;
2166 void emitByrefStructureInit(const AutoVarEmission
&emission
);
2168 /// Enter a cleanup to destroy a __block variable. Note that this
2169 /// cleanup should be a no-op if the variable hasn't left the stack
2170 /// yet; if a cleanup is required for the variable itself, that needs
2171 /// to be done externally.
2173 /// \param Kind Cleanup kind.
2175 /// \param Addr When \p LoadBlockVarAddr is false, the address of the __block
2176 /// structure that will be passed to _Block_object_dispose. When
2177 /// \p LoadBlockVarAddr is true, the address of the field of the block
2178 /// structure that holds the address of the __block structure.
2180 /// \param Flags The flag that will be passed to _Block_object_dispose.
2182 /// \param LoadBlockVarAddr Indicates whether we need to emit a load from
2183 /// \p Addr to get the address of the __block structure.
2184 void enterByrefCleanup(CleanupKind Kind
, Address Addr
, BlockFieldFlags Flags
,
2185 bool LoadBlockVarAddr
, bool CanThrow
);
2187 void setBlockContextParameter(const ImplicitParamDecl
*D
, unsigned argNum
,
2190 Address
LoadBlockStruct();
2191 Address
GetAddrOfBlockDecl(const VarDecl
*var
);
2193 /// BuildBlockByrefAddress - Computes the location of the
2194 /// data in a variable which is declared as __block.
2195 Address
emitBlockByrefAddress(Address baseAddr
, const VarDecl
*V
,
2196 bool followForward
= true);
2197 Address
emitBlockByrefAddress(Address baseAddr
,
2198 const BlockByrefInfo
&info
,
2200 const llvm::Twine
&name
);
2202 const BlockByrefInfo
&getBlockByrefInfo(const VarDecl
*var
);
2204 QualType
BuildFunctionArgList(GlobalDecl GD
, FunctionArgList
&Args
);
2206 void GenerateCode(GlobalDecl GD
, llvm::Function
*Fn
,
2207 const CGFunctionInfo
&FnInfo
);
2209 /// Annotate the function with an attribute that disables TSan checking at
2211 void markAsIgnoreThreadCheckingAtRuntime(llvm::Function
*Fn
);
2213 /// Emit code for the start of a function.
2214 /// \param Loc The location to be associated with the function.
2215 /// \param StartLoc The location of the function body.
2216 void StartFunction(GlobalDecl GD
,
2219 const CGFunctionInfo
&FnInfo
,
2220 const FunctionArgList
&Args
,
2221 SourceLocation Loc
= SourceLocation(),
2222 SourceLocation StartLoc
= SourceLocation());
2224 static bool IsConstructorDelegationValid(const CXXConstructorDecl
*Ctor
);
2226 void EmitConstructorBody(FunctionArgList
&Args
);
2227 void EmitDestructorBody(FunctionArgList
&Args
);
2228 void emitImplicitAssignmentOperatorBody(FunctionArgList
&Args
);
2229 void EmitFunctionBody(const Stmt
*Body
);
2230 void EmitBlockWithFallThrough(llvm::BasicBlock
*BB
, const Stmt
*S
);
2232 void EmitForwardingCallToLambda(const CXXMethodDecl
*LambdaCallOperator
,
2233 CallArgList
&CallArgs
,
2234 const CGFunctionInfo
*CallOpFnInfo
= nullptr,
2235 llvm::Constant
*CallOpFn
= nullptr);
2236 void EmitLambdaBlockInvokeBody();
2237 void EmitLambdaStaticInvokeBody(const CXXMethodDecl
*MD
);
2238 void EmitLambdaDelegatingInvokeBody(const CXXMethodDecl
*MD
,
2239 CallArgList
&CallArgs
);
2240 void EmitLambdaInAllocaImplFn(const CXXMethodDecl
*CallOp
,
2241 const CGFunctionInfo
**ImplFnInfo
,
2242 llvm::Function
**ImplFn
);
2243 void EmitLambdaInAllocaCallOpBody(const CXXMethodDecl
*MD
);
2244 void EmitLambdaVLACapture(const VariableArrayType
*VAT
, LValue LV
) {
2245 EmitStoreThroughLValue(RValue::get(VLASizeMap
[VAT
->getSizeExpr()]), LV
);
2247 void EmitAsanPrologueOrEpilogue(bool Prologue
);
2249 /// Emit the unified return block, trying to avoid its emission when
2251 /// \return The debug location of the user written return statement if the
2252 /// return block is avoided.
2253 llvm::DebugLoc
EmitReturnBlock();
2255 /// FinishFunction - Complete IR generation of the current function. It is
2256 /// legal to call this function even if there is no current insertion point.
2257 void FinishFunction(SourceLocation EndLoc
=SourceLocation());
2259 void StartThunk(llvm::Function
*Fn
, GlobalDecl GD
,
2260 const CGFunctionInfo
&FnInfo
, bool IsUnprototyped
);
2262 void EmitCallAndReturnForThunk(llvm::FunctionCallee Callee
,
2263 const ThunkInfo
*Thunk
, bool IsUnprototyped
);
2267 /// Emit a musttail call for a thunk with a potentially adjusted this pointer.
2268 void EmitMustTailThunk(GlobalDecl GD
, llvm::Value
*AdjustedThisPtr
,
2269 llvm::FunctionCallee Callee
);
2271 /// Generate a thunk for the given method.
2272 void generateThunk(llvm::Function
*Fn
, const CGFunctionInfo
&FnInfo
,
2273 GlobalDecl GD
, const ThunkInfo
&Thunk
,
2274 bool IsUnprototyped
);
2276 llvm::Function
*GenerateVarArgsThunk(llvm::Function
*Fn
,
2277 const CGFunctionInfo
&FnInfo
,
2278 GlobalDecl GD
, const ThunkInfo
&Thunk
);
2280 void EmitCtorPrologue(const CXXConstructorDecl
*CD
, CXXCtorType Type
,
2281 FunctionArgList
&Args
);
2283 void EmitInitializerForField(FieldDecl
*Field
, LValue LHS
, Expr
*Init
);
2285 /// Struct with all information about dynamic [sub]class needed to set vptr.
2288 const CXXRecordDecl
*NearestVBase
;
2289 CharUnits OffsetFromNearestVBase
;
2290 const CXXRecordDecl
*VTableClass
;
2293 /// Initialize the vtable pointer of the given subobject.
2294 void InitializeVTablePointer(const VPtr
&vptr
);
2296 typedef llvm::SmallVector
<VPtr
, 4> VPtrsVector
;
2298 typedef llvm::SmallPtrSet
<const CXXRecordDecl
*, 4> VisitedVirtualBasesSetTy
;
2299 VPtrsVector
getVTablePointers(const CXXRecordDecl
*VTableClass
);
2301 void getVTablePointers(BaseSubobject Base
, const CXXRecordDecl
*NearestVBase
,
2302 CharUnits OffsetFromNearestVBase
,
2303 bool BaseIsNonVirtualPrimaryBase
,
2304 const CXXRecordDecl
*VTableClass
,
2305 VisitedVirtualBasesSetTy
&VBases
, VPtrsVector
&vptrs
);
2307 void InitializeVTablePointers(const CXXRecordDecl
*ClassDecl
);
2309 /// GetVTablePtr - Return the Value of the vtable pointer member pointed
2311 llvm::Value
*GetVTablePtr(Address This
, llvm::Type
*VTableTy
,
2312 const CXXRecordDecl
*VTableClass
);
2314 enum CFITypeCheckKind
{
2318 CFITCK_UnrelatedCast
,
2324 /// Derived is the presumed address of an object of type T after a
2325 /// cast. If T is a polymorphic class type, emit a check that the virtual
2326 /// table for Derived belongs to a class derived from T.
2327 void EmitVTablePtrCheckForCast(QualType T
, Address Derived
, bool MayBeNull
,
2328 CFITypeCheckKind TCK
, SourceLocation Loc
);
2330 /// EmitVTablePtrCheckForCall - Virtual method MD is being called via VTable.
2331 /// If vptr CFI is enabled, emit a check that VTable is valid.
2332 void EmitVTablePtrCheckForCall(const CXXRecordDecl
*RD
, llvm::Value
*VTable
,
2333 CFITypeCheckKind TCK
, SourceLocation Loc
);
2335 /// EmitVTablePtrCheck - Emit a check that VTable is a valid virtual table for
2336 /// RD using llvm.type.test.
2337 void EmitVTablePtrCheck(const CXXRecordDecl
*RD
, llvm::Value
*VTable
,
2338 CFITypeCheckKind TCK
, SourceLocation Loc
);
2340 /// If whole-program virtual table optimization is enabled, emit an assumption
2341 /// that VTable is a member of RD's type identifier. Or, if vptr CFI is
2342 /// enabled, emit a check that VTable is a member of RD's type identifier.
2343 void EmitTypeMetadataCodeForVCall(const CXXRecordDecl
*RD
,
2344 llvm::Value
*VTable
, SourceLocation Loc
);
2346 /// Returns whether we should perform a type checked load when loading a
2347 /// virtual function for virtual calls to members of RD. This is generally
2348 /// true when both vcall CFI and whole-program-vtables are enabled.
2349 bool ShouldEmitVTableTypeCheckedLoad(const CXXRecordDecl
*RD
);
2351 /// Emit a type checked load from the given vtable.
2352 llvm::Value
*EmitVTableTypeCheckedLoad(const CXXRecordDecl
*RD
,
2353 llvm::Value
*VTable
,
2354 llvm::Type
*VTableTy
,
2355 uint64_t VTableByteOffset
);
2357 /// EnterDtorCleanups - Enter the cleanups necessary to complete the
2358 /// given phase of destruction for a destructor. The end result
2359 /// should call destructors on members and base classes in reverse
2360 /// order of their construction.
2361 void EnterDtorCleanups(const CXXDestructorDecl
*Dtor
, CXXDtorType Type
);
2363 /// ShouldInstrumentFunction - Return true if the current function should be
2364 /// instrumented with __cyg_profile_func_* calls
2365 bool ShouldInstrumentFunction();
2367 /// ShouldSkipSanitizerInstrumentation - Return true if the current function
2368 /// should not be instrumented with sanitizers.
2369 bool ShouldSkipSanitizerInstrumentation();
2371 /// ShouldXRayInstrument - Return true if the current function should be
2372 /// instrumented with XRay nop sleds.
2373 bool ShouldXRayInstrumentFunction() const;
2375 /// AlwaysEmitXRayCustomEvents - Return true if we must unconditionally emit
2376 /// XRay custom event handling calls.
2377 bool AlwaysEmitXRayCustomEvents() const;
2379 /// AlwaysEmitXRayTypedEvents - Return true if clang must unconditionally emit
2380 /// XRay typed event handling calls.
2381 bool AlwaysEmitXRayTypedEvents() const;
2383 /// Return a type hash constant for a function instrumented by
2384 /// -fsanitize=function.
2385 llvm::ConstantInt
*getUBSanFunctionTypeHash(QualType T
) const;
2387 /// EmitFunctionProlog - Emit the target specific LLVM code to load the
2388 /// arguments for the given function. This is also responsible for naming the
2389 /// LLVM function arguments.
2390 void EmitFunctionProlog(const CGFunctionInfo
&FI
,
2392 const FunctionArgList
&Args
);
2394 /// EmitFunctionEpilog - Emit the target specific LLVM code to return the
2395 /// given temporary.
2396 void EmitFunctionEpilog(const CGFunctionInfo
&FI
, bool EmitRetDbgLoc
,
2397 SourceLocation EndLoc
);
2399 /// Emit a test that checks if the return value \p RV is nonnull.
2400 void EmitReturnValueCheck(llvm::Value
*RV
);
2402 /// EmitStartEHSpec - Emit the start of the exception spec.
2403 void EmitStartEHSpec(const Decl
*D
);
2405 /// EmitEndEHSpec - Emit the end of the exception spec.
2406 void EmitEndEHSpec(const Decl
*D
);
2408 /// getTerminateLandingPad - Return a landing pad that just calls terminate.
2409 llvm::BasicBlock
*getTerminateLandingPad();
2411 /// getTerminateLandingPad - Return a cleanup funclet that just calls
2413 llvm::BasicBlock
*getTerminateFunclet();
2415 /// getTerminateHandler - Return a handler (not a landing pad, just
2416 /// a catch handler) that just calls terminate. This is used when
2417 /// a terminate scope encloses a try.
2418 llvm::BasicBlock
*getTerminateHandler();
2420 llvm::Type
*ConvertTypeForMem(QualType T
);
2421 llvm::Type
*ConvertType(QualType T
);
2422 llvm::Type
*ConvertType(const TypeDecl
*T
) {
2423 return ConvertType(getContext().getTypeDeclType(T
));
2426 /// LoadObjCSelf - Load the value of self. This function is only valid while
2427 /// generating code for an Objective-C method.
2428 llvm::Value
*LoadObjCSelf();
2430 /// TypeOfSelfObject - Return type of object that this self represents.
2431 QualType
TypeOfSelfObject();
2433 /// getEvaluationKind - Return the TypeEvaluationKind of QualType \c T.
2434 static TypeEvaluationKind
getEvaluationKind(QualType T
);
2436 static bool hasScalarEvaluationKind(QualType T
) {
2437 return getEvaluationKind(T
) == TEK_Scalar
;
2440 static bool hasAggregateEvaluationKind(QualType T
) {
2441 return getEvaluationKind(T
) == TEK_Aggregate
;
2444 /// createBasicBlock - Create an LLVM basic block.
2445 llvm::BasicBlock
*createBasicBlock(const Twine
&name
= "",
2446 llvm::Function
*parent
= nullptr,
2447 llvm::BasicBlock
*before
= nullptr) {
2448 return llvm::BasicBlock::Create(getLLVMContext(), name
, parent
, before
);
2451 /// getBasicBlockForLabel - Return the LLVM basicblock that the specified
2453 JumpDest
getJumpDestForLabel(const LabelDecl
*S
);
2455 /// SimplifyForwardingBlocks - If the given basic block is only a branch to
2456 /// another basic block, simplify it. This assumes that no other code could
2457 /// potentially reference the basic block.
2458 void SimplifyForwardingBlocks(llvm::BasicBlock
*BB
);
2460 /// EmitBlock - Emit the given block \arg BB and set it as the insert point,
2461 /// adding a fall-through branch from the current insert block if
2462 /// necessary. It is legal to call this function even if there is no current
2463 /// insertion point.
2465 /// IsFinished - If true, indicates that the caller has finished emitting
2466 /// branches to the given block and does not expect to emit code into it. This
2467 /// means the block can be ignored if it is unreachable.
2468 void EmitBlock(llvm::BasicBlock
*BB
, bool IsFinished
=false);
2470 /// EmitBlockAfterUses - Emit the given block somewhere hopefully
2471 /// near its uses, and leave the insertion point in it.
2472 void EmitBlockAfterUses(llvm::BasicBlock
*BB
);
2474 /// EmitBranch - Emit a branch to the specified basic block from the current
2475 /// insert block, taking care to avoid creation of branches from dummy
2476 /// blocks. It is legal to call this function even if there is no current
2477 /// insertion point.
2479 /// This function clears the current insertion point. The caller should follow
2480 /// calls to this function with calls to Emit*Block prior to generation new
2482 void EmitBranch(llvm::BasicBlock
*Block
);
2484 /// HaveInsertPoint - True if an insertion point is defined. If not, this
2485 /// indicates that the current code being emitted is unreachable.
2486 bool HaveInsertPoint() const {
2487 return Builder
.GetInsertBlock() != nullptr;
2490 /// EnsureInsertPoint - Ensure that an insertion point is defined so that
2491 /// emitted IR has a place to go. Note that by definition, if this function
2492 /// creates a block then that block is unreachable; callers may do better to
2493 /// detect when no insertion point is defined and simply skip IR generation.
2494 void EnsureInsertPoint() {
2495 if (!HaveInsertPoint())
2496 EmitBlock(createBasicBlock());
2499 /// ErrorUnsupported - Print out an error that codegen doesn't support the
2500 /// specified stmt yet.
2501 void ErrorUnsupported(const Stmt
*S
, const char *Type
);
2503 //===--------------------------------------------------------------------===//
2505 //===--------------------------------------------------------------------===//
2507 LValue
MakeAddrLValue(Address Addr
, QualType T
,
2508 AlignmentSource Source
= AlignmentSource::Type
) {
2509 return LValue::MakeAddr(Addr
, T
, getContext(), LValueBaseInfo(Source
),
2510 CGM
.getTBAAAccessInfo(T
));
2513 LValue
MakeAddrLValue(Address Addr
, QualType T
, LValueBaseInfo BaseInfo
,
2514 TBAAAccessInfo TBAAInfo
) {
2515 return LValue::MakeAddr(Addr
, T
, getContext(), BaseInfo
, TBAAInfo
);
2518 LValue
MakeAddrLValue(llvm::Value
*V
, QualType T
, CharUnits Alignment
,
2519 AlignmentSource Source
= AlignmentSource::Type
) {
2520 Address
Addr(V
, ConvertTypeForMem(T
), Alignment
);
2521 return LValue::MakeAddr(Addr
, T
, getContext(), LValueBaseInfo(Source
),
2522 CGM
.getTBAAAccessInfo(T
));
2526 MakeAddrLValueWithoutTBAA(Address Addr
, QualType T
,
2527 AlignmentSource Source
= AlignmentSource::Type
) {
2528 return LValue::MakeAddr(Addr
, T
, getContext(), LValueBaseInfo(Source
),
2532 LValue
MakeNaturalAlignPointeeAddrLValue(llvm::Value
*V
, QualType T
);
2533 LValue
MakeNaturalAlignAddrLValue(llvm::Value
*V
, QualType T
);
2535 Address
EmitLoadOfReference(LValue RefLVal
,
2536 LValueBaseInfo
*PointeeBaseInfo
= nullptr,
2537 TBAAAccessInfo
*PointeeTBAAInfo
= nullptr);
2538 LValue
EmitLoadOfReferenceLValue(LValue RefLVal
);
2539 LValue
EmitLoadOfReferenceLValue(Address RefAddr
, QualType RefTy
,
2540 AlignmentSource Source
=
2541 AlignmentSource::Type
) {
2542 LValue RefLVal
= MakeAddrLValue(RefAddr
, RefTy
, LValueBaseInfo(Source
),
2543 CGM
.getTBAAAccessInfo(RefTy
));
2544 return EmitLoadOfReferenceLValue(RefLVal
);
2547 /// Load a pointer with type \p PtrTy stored at address \p Ptr.
2548 /// Note that \p PtrTy is the type of the loaded pointer, not the addresses
2549 /// it is loaded from.
2550 Address
EmitLoadOfPointer(Address Ptr
, const PointerType
*PtrTy
,
2551 LValueBaseInfo
*BaseInfo
= nullptr,
2552 TBAAAccessInfo
*TBAAInfo
= nullptr);
2553 LValue
EmitLoadOfPointerLValue(Address Ptr
, const PointerType
*PtrTy
);
2555 /// CreateTempAlloca - This creates an alloca and inserts it into the entry
2556 /// block if \p ArraySize is nullptr, otherwise inserts it at the current
2557 /// insertion point of the builder. The caller is responsible for setting an
2558 /// appropriate alignment on
2561 /// \p ArraySize is the number of array elements to be allocated if it
2564 /// LangAS::Default is the address space of pointers to local variables and
2565 /// temporaries, as exposed in the source language. In certain
2566 /// configurations, this is not the same as the alloca address space, and a
2567 /// cast is needed to lift the pointer from the alloca AS into
2568 /// LangAS::Default. This can happen when the target uses a restricted
2569 /// address space for the stack but the source language requires
2570 /// LangAS::Default to be a generic address space. The latter condition is
2571 /// common for most programming languages; OpenCL is an exception in that
2572 /// LangAS::Default is the private address space, which naturally maps
2575 /// Because the address of a temporary is often exposed to the program in
2576 /// various ways, this function will perform the cast. The original alloca
2577 /// instruction is returned through \p Alloca if it is not nullptr.
2579 /// The cast is not performaed in CreateTempAllocaWithoutCast. This is
2580 /// more efficient if the caller knows that the address will not be exposed.
2581 llvm::AllocaInst
*CreateTempAlloca(llvm::Type
*Ty
, const Twine
&Name
= "tmp",
2582 llvm::Value
*ArraySize
= nullptr);
2583 Address
CreateTempAlloca(llvm::Type
*Ty
, CharUnits align
,
2584 const Twine
&Name
= "tmp",
2585 llvm::Value
*ArraySize
= nullptr,
2586 Address
*Alloca
= nullptr);
2587 Address
CreateTempAllocaWithoutCast(llvm::Type
*Ty
, CharUnits align
,
2588 const Twine
&Name
= "tmp",
2589 llvm::Value
*ArraySize
= nullptr);
2591 /// CreateDefaultAlignedTempAlloca - This creates an alloca with the
2592 /// default ABI alignment of the given LLVM type.
2594 /// IMPORTANT NOTE: This is *not* generally the right alignment for
2595 /// any given AST type that happens to have been lowered to the
2596 /// given IR type. This should only ever be used for function-local,
2597 /// IR-driven manipulations like saving and restoring a value. Do
2598 /// not hand this address off to arbitrary IRGen routines, and especially
2599 /// do not pass it as an argument to a function that might expect a
2600 /// properly ABI-aligned value.
2601 Address
CreateDefaultAlignTempAlloca(llvm::Type
*Ty
,
2602 const Twine
&Name
= "tmp");
2604 /// CreateIRTemp - Create a temporary IR object of the given type, with
2605 /// appropriate alignment. This routine should only be used when an temporary
2606 /// value needs to be stored into an alloca (for example, to avoid explicit
2607 /// PHI construction), but the type is the IR type, not the type appropriate
2608 /// for storing in memory.
2610 /// That is, this is exactly equivalent to CreateMemTemp, but calling
2611 /// ConvertType instead of ConvertTypeForMem.
2612 Address
CreateIRTemp(QualType T
, const Twine
&Name
= "tmp");
2614 /// CreateMemTemp - Create a temporary memory object of the given type, with
2615 /// appropriate alignmen and cast it to the default address space. Returns
2616 /// the original alloca instruction by \p Alloca if it is not nullptr.
2617 Address
CreateMemTemp(QualType T
, const Twine
&Name
= "tmp",
2618 Address
*Alloca
= nullptr);
2619 Address
CreateMemTemp(QualType T
, CharUnits Align
, const Twine
&Name
= "tmp",
2620 Address
*Alloca
= nullptr);
2622 /// CreateMemTemp - Create a temporary memory object of the given type, with
2623 /// appropriate alignmen without casting it to the default address space.
2624 Address
CreateMemTempWithoutCast(QualType T
, const Twine
&Name
= "tmp");
2625 Address
CreateMemTempWithoutCast(QualType T
, CharUnits Align
,
2626 const Twine
&Name
= "tmp");
2628 /// CreateAggTemp - Create a temporary memory object for the given
2630 AggValueSlot
CreateAggTemp(QualType T
, const Twine
&Name
= "tmp",
2631 Address
*Alloca
= nullptr) {
2632 return AggValueSlot::forAddr(CreateMemTemp(T
, Name
, Alloca
),
2634 AggValueSlot::IsNotDestructed
,
2635 AggValueSlot::DoesNotNeedGCBarriers
,
2636 AggValueSlot::IsNotAliased
,
2637 AggValueSlot::DoesNotOverlap
);
2640 /// EvaluateExprAsBool - Perform the usual unary conversions on the specified
2641 /// expression and compare the result against zero, returning an Int1Ty value.
2642 llvm::Value
*EvaluateExprAsBool(const Expr
*E
);
2644 /// EmitIgnoredExpr - Emit an expression in a context which ignores the result.
2645 void EmitIgnoredExpr(const Expr
*E
);
2647 /// EmitAnyExpr - Emit code to compute the specified expression which can have
2648 /// any type. The result is returned as an RValue struct. If this is an
2649 /// aggregate expression, the aggloc/agglocvolatile arguments indicate where
2650 /// the result should be returned.
2652 /// \param ignoreResult True if the resulting value isn't used.
2653 RValue
EmitAnyExpr(const Expr
*E
,
2654 AggValueSlot aggSlot
= AggValueSlot::ignored(),
2655 bool ignoreResult
= false);
2657 // EmitVAListRef - Emit a "reference" to a va_list; this is either the address
2658 // or the value of the expression, depending on how va_list is defined.
2659 Address
EmitVAListRef(const Expr
*E
);
2661 /// Emit a "reference" to a __builtin_ms_va_list; this is
2662 /// always the value of the expression, because a __builtin_ms_va_list is a
2663 /// pointer to a char.
2664 Address
EmitMSVAListRef(const Expr
*E
);
2666 /// EmitAnyExprToTemp - Similarly to EmitAnyExpr(), however, the result will
2667 /// always be accessible even if no aggregate location is provided.
2668 RValue
EmitAnyExprToTemp(const Expr
*E
);
2670 /// EmitAnyExprToMem - Emits the code necessary to evaluate an
2671 /// arbitrary expression into the given memory location.
2672 void EmitAnyExprToMem(const Expr
*E
, Address Location
,
2673 Qualifiers Quals
, bool IsInitializer
);
2675 void EmitAnyExprToExn(const Expr
*E
, Address Addr
);
2677 /// EmitExprAsInit - Emits the code necessary to initialize a
2678 /// location in memory with the given initializer.
2679 void EmitExprAsInit(const Expr
*init
, const ValueDecl
*D
, LValue lvalue
,
2680 bool capturedByInit
);
2682 /// hasVolatileMember - returns true if aggregate type has a volatile
2684 bool hasVolatileMember(QualType T
) {
2685 if (const RecordType
*RT
= T
->getAs
<RecordType
>()) {
2686 const RecordDecl
*RD
= cast
<RecordDecl
>(RT
->getDecl());
2687 return RD
->hasVolatileMember();
2692 /// Determine whether a return value slot may overlap some other object.
2693 AggValueSlot::Overlap_t
getOverlapForReturnValue() {
2694 // FIXME: Assuming no overlap here breaks guaranteed copy elision for base
2695 // class subobjects. These cases may need to be revisited depending on the
2696 // resolution of the relevant core issue.
2697 return AggValueSlot::DoesNotOverlap
;
2700 /// Determine whether a field initialization may overlap some other object.
2701 AggValueSlot::Overlap_t
getOverlapForFieldInit(const FieldDecl
*FD
);
2703 /// Determine whether a base class initialization may overlap some other
2705 AggValueSlot::Overlap_t
getOverlapForBaseInit(const CXXRecordDecl
*RD
,
2706 const CXXRecordDecl
*BaseRD
,
2709 /// Emit an aggregate assignment.
2710 void EmitAggregateAssign(LValue Dest
, LValue Src
, QualType EltTy
) {
2711 bool IsVolatile
= hasVolatileMember(EltTy
);
2712 EmitAggregateCopy(Dest
, Src
, EltTy
, AggValueSlot::MayOverlap
, IsVolatile
);
2715 void EmitAggregateCopyCtor(LValue Dest
, LValue Src
,
2716 AggValueSlot::Overlap_t MayOverlap
) {
2717 EmitAggregateCopy(Dest
, Src
, Src
.getType(), MayOverlap
);
2720 /// EmitAggregateCopy - Emit an aggregate copy.
2722 /// \param isVolatile \c true iff either the source or the destination is
2724 /// \param MayOverlap Whether the tail padding of the destination might be
2725 /// occupied by some other object. More efficient code can often be
2726 /// generated if not.
2727 void EmitAggregateCopy(LValue Dest
, LValue Src
, QualType EltTy
,
2728 AggValueSlot::Overlap_t MayOverlap
,
2729 bool isVolatile
= false);
2731 /// GetAddrOfLocalVar - Return the address of a local variable.
2732 Address
GetAddrOfLocalVar(const VarDecl
*VD
) {
2733 auto it
= LocalDeclMap
.find(VD
);
2734 assert(it
!= LocalDeclMap
.end() &&
2735 "Invalid argument to GetAddrOfLocalVar(), no decl!");
2739 /// Given an opaque value expression, return its LValue mapping if it exists,
2740 /// otherwise create one.
2741 LValue
getOrCreateOpaqueLValueMapping(const OpaqueValueExpr
*e
);
2743 /// Given an opaque value expression, return its RValue mapping if it exists,
2744 /// otherwise create one.
2745 RValue
getOrCreateOpaqueRValueMapping(const OpaqueValueExpr
*e
);
2747 /// Get the index of the current ArrayInitLoopExpr, if any.
2748 llvm::Value
*getArrayInitIndex() { return ArrayInitIndex
; }
2750 /// getAccessedFieldNo - Given an encoded value and a result number, return
2751 /// the input field number being accessed.
2752 static unsigned getAccessedFieldNo(unsigned Idx
, const llvm::Constant
*Elts
);
2754 llvm::BlockAddress
*GetAddrOfLabel(const LabelDecl
*L
);
2755 llvm::BasicBlock
*GetIndirectGotoBlock();
2757 /// Check if \p E is a C++ "this" pointer wrapped in value-preserving casts.
2758 static bool IsWrappedCXXThis(const Expr
*E
);
2760 /// EmitNullInitialization - Generate code to set a value of the given type to
2761 /// null, If the type contains data member pointers, they will be initialized
2762 /// to -1 in accordance with the Itanium C++ ABI.
2763 void EmitNullInitialization(Address DestPtr
, QualType Ty
);
2765 /// Emits a call to an LLVM variable-argument intrinsic, either
2766 /// \c llvm.va_start or \c llvm.va_end.
2767 /// \param ArgValue A reference to the \c va_list as emitted by either
2768 /// \c EmitVAListRef or \c EmitMSVAListRef.
2769 /// \param IsStart If \c true, emits a call to \c llvm.va_start; otherwise,
2770 /// calls \c llvm.va_end.
2771 llvm::Value
*EmitVAStartEnd(llvm::Value
*ArgValue
, bool IsStart
);
2773 /// Generate code to get an argument from the passed in pointer
2774 /// and update it accordingly.
2775 /// \param VE The \c VAArgExpr for which to generate code.
2776 /// \param VAListAddr Receives a reference to the \c va_list as emitted by
2777 /// either \c EmitVAListRef or \c EmitMSVAListRef.
2778 /// \returns A pointer to the argument.
2779 // FIXME: We should be able to get rid of this method and use the va_arg
2780 // instruction in LLVM instead once it works well enough.
2781 Address
EmitVAArg(VAArgExpr
*VE
, Address
&VAListAddr
);
2783 /// emitArrayLength - Compute the length of an array, even if it's a
2784 /// VLA, and drill down to the base element type.
2785 llvm::Value
*emitArrayLength(const ArrayType
*arrayType
,
2789 /// EmitVLASize - Capture all the sizes for the VLA expressions in
2790 /// the given variably-modified type and store them in the VLASizeMap.
2792 /// This function can be called with a null (unreachable) insert point.
2793 void EmitVariablyModifiedType(QualType Ty
);
2795 struct VlaSizePair
{
2796 llvm::Value
*NumElts
;
2799 VlaSizePair(llvm::Value
*NE
, QualType T
) : NumElts(NE
), Type(T
) {}
2802 /// Return the number of elements for a single dimension
2803 /// for the given array type.
2804 VlaSizePair
getVLAElements1D(const VariableArrayType
*vla
);
2805 VlaSizePair
getVLAElements1D(QualType vla
);
2807 /// Returns an LLVM value that corresponds to the size,
2808 /// in non-variably-sized elements, of a variable length array type,
2809 /// plus that largest non-variably-sized element type. Assumes that
2810 /// the type has already been emitted with EmitVariablyModifiedType.
2811 VlaSizePair
getVLASize(const VariableArrayType
*vla
);
2812 VlaSizePair
getVLASize(QualType vla
);
2814 /// LoadCXXThis - Load the value of 'this'. This function is only valid while
2815 /// generating code for an C++ member function.
2816 llvm::Value
*LoadCXXThis() {
2817 assert(CXXThisValue
&& "no 'this' value for this function");
2818 return CXXThisValue
;
2820 Address
LoadCXXThisAddress();
2822 /// LoadCXXVTT - Load the VTT parameter to base constructors/destructors have
2824 // FIXME: Every place that calls LoadCXXVTT is something
2825 // that needs to be abstracted properly.
2826 llvm::Value
*LoadCXXVTT() {
2827 assert(CXXStructorImplicitParamValue
&& "no VTT value for this function");
2828 return CXXStructorImplicitParamValue
;
2831 /// GetAddressOfBaseOfCompleteClass - Convert the given pointer to a
2832 /// complete class to the given direct base.
2834 GetAddressOfDirectBaseInCompleteClass(Address Value
,
2835 const CXXRecordDecl
*Derived
,
2836 const CXXRecordDecl
*Base
,
2837 bool BaseIsVirtual
);
2839 static bool ShouldNullCheckClassCastValue(const CastExpr
*Cast
);
2841 /// GetAddressOfBaseClass - This function will add the necessary delta to the
2842 /// load of 'this' and returns address of the base class.
2843 Address
GetAddressOfBaseClass(Address Value
,
2844 const CXXRecordDecl
*Derived
,
2845 CastExpr::path_const_iterator PathBegin
,
2846 CastExpr::path_const_iterator PathEnd
,
2847 bool NullCheckValue
, SourceLocation Loc
);
2849 Address
GetAddressOfDerivedClass(Address Value
,
2850 const CXXRecordDecl
*Derived
,
2851 CastExpr::path_const_iterator PathBegin
,
2852 CastExpr::path_const_iterator PathEnd
,
2853 bool NullCheckValue
);
2855 /// GetVTTParameter - Return the VTT parameter that should be passed to a
2856 /// base constructor/destructor with virtual bases.
2857 /// FIXME: VTTs are Itanium ABI-specific, so the definition should move
2858 /// to ItaniumCXXABI.cpp together with all the references to VTT.
2859 llvm::Value
*GetVTTParameter(GlobalDecl GD
, bool ForVirtualBase
,
2862 void EmitDelegateCXXConstructorCall(const CXXConstructorDecl
*Ctor
,
2863 CXXCtorType CtorType
,
2864 const FunctionArgList
&Args
,
2865 SourceLocation Loc
);
2866 // It's important not to confuse this and the previous function. Delegating
2867 // constructors are the C++0x feature. The constructor delegate optimization
2868 // is used to reduce duplication in the base and complete consturctors where
2869 // they are substantially the same.
2870 void EmitDelegatingCXXConstructorCall(const CXXConstructorDecl
*Ctor
,
2871 const FunctionArgList
&Args
);
2873 /// Emit a call to an inheriting constructor (that is, one that invokes a
2874 /// constructor inherited from a base class) by inlining its definition. This
2875 /// is necessary if the ABI does not support forwarding the arguments to the
2876 /// base class constructor (because they're variadic or similar).
2877 void EmitInlinedInheritingCXXConstructorCall(const CXXConstructorDecl
*Ctor
,
2878 CXXCtorType CtorType
,
2879 bool ForVirtualBase
,
2883 /// Emit a call to a constructor inherited from a base class, passing the
2884 /// current constructor's arguments along unmodified (without even making
2886 void EmitInheritedCXXConstructorCall(const CXXConstructorDecl
*D
,
2887 bool ForVirtualBase
, Address This
,
2888 bool InheritedFromVBase
,
2889 const CXXInheritedCtorInitExpr
*E
);
2891 void EmitCXXConstructorCall(const CXXConstructorDecl
*D
, CXXCtorType Type
,
2892 bool ForVirtualBase
, bool Delegating
,
2893 AggValueSlot ThisAVS
, const CXXConstructExpr
*E
);
2895 void EmitCXXConstructorCall(const CXXConstructorDecl
*D
, CXXCtorType Type
,
2896 bool ForVirtualBase
, bool Delegating
,
2897 Address This
, CallArgList
&Args
,
2898 AggValueSlot::Overlap_t Overlap
,
2899 SourceLocation Loc
, bool NewPointerIsChecked
);
2901 /// Emit assumption load for all bases. Requires to be called only on
2902 /// most-derived class and not under construction of the object.
2903 void EmitVTableAssumptionLoads(const CXXRecordDecl
*ClassDecl
, Address This
);
2905 /// Emit assumption that vptr load == global vtable.
2906 void EmitVTableAssumptionLoad(const VPtr
&vptr
, Address This
);
2908 void EmitSynthesizedCXXCopyCtorCall(const CXXConstructorDecl
*D
,
2909 Address This
, Address Src
,
2910 const CXXConstructExpr
*E
);
2912 void EmitCXXAggrConstructorCall(const CXXConstructorDecl
*D
,
2913 const ArrayType
*ArrayTy
,
2915 const CXXConstructExpr
*E
,
2916 bool NewPointerIsChecked
,
2917 bool ZeroInitialization
= false);
2919 void EmitCXXAggrConstructorCall(const CXXConstructorDecl
*D
,
2920 llvm::Value
*NumElements
,
2922 const CXXConstructExpr
*E
,
2923 bool NewPointerIsChecked
,
2924 bool ZeroInitialization
= false);
2926 static Destroyer destroyCXXObject
;
2928 void EmitCXXDestructorCall(const CXXDestructorDecl
*D
, CXXDtorType Type
,
2929 bool ForVirtualBase
, bool Delegating
, Address This
,
2932 void EmitNewArrayInitializer(const CXXNewExpr
*E
, QualType elementType
,
2933 llvm::Type
*ElementTy
, Address NewPtr
,
2934 llvm::Value
*NumElements
,
2935 llvm::Value
*AllocSizeWithoutCookie
);
2937 void EmitCXXTemporary(const CXXTemporary
*Temporary
, QualType TempType
,
2940 void EmitSehCppScopeBegin();
2941 void EmitSehCppScopeEnd();
2942 void EmitSehTryScopeBegin();
2943 void EmitSehTryScopeEnd();
2945 llvm::Value
*EmitLifetimeStart(llvm::TypeSize Size
, llvm::Value
*Addr
);
2946 void EmitLifetimeEnd(llvm::Value
*Size
, llvm::Value
*Addr
);
2948 llvm::Value
*EmitCXXNewExpr(const CXXNewExpr
*E
);
2949 void EmitCXXDeleteExpr(const CXXDeleteExpr
*E
);
2951 void EmitDeleteCall(const FunctionDecl
*DeleteFD
, llvm::Value
*Ptr
,
2952 QualType DeleteTy
, llvm::Value
*NumElements
= nullptr,
2953 CharUnits CookieSize
= CharUnits());
2955 RValue
EmitBuiltinNewDeleteCall(const FunctionProtoType
*Type
,
2956 const CallExpr
*TheCallExpr
, bool IsDelete
);
2958 llvm::Value
*EmitCXXTypeidExpr(const CXXTypeidExpr
*E
);
2959 llvm::Value
*EmitDynamicCast(Address V
, const CXXDynamicCastExpr
*DCE
);
2960 Address
EmitCXXUuidofExpr(const CXXUuidofExpr
*E
);
2962 /// Situations in which we might emit a check for the suitability of a
2963 /// pointer or glvalue. Needs to be kept in sync with ubsan_handlers.cpp in
2965 enum TypeCheckKind
{
2966 /// Checking the operand of a load. Must be suitably sized and aligned.
2968 /// Checking the destination of a store. Must be suitably sized and aligned.
2970 /// Checking the bound value in a reference binding. Must be suitably sized
2971 /// and aligned, but is not required to refer to an object (until the
2972 /// reference is used), per core issue 453.
2973 TCK_ReferenceBinding
,
2974 /// Checking the object expression in a non-static data member access. Must
2975 /// be an object within its lifetime.
2977 /// Checking the 'this' pointer for a call to a non-static member function.
2978 /// Must be an object within its lifetime.
2980 /// Checking the 'this' pointer for a constructor call.
2981 TCK_ConstructorCall
,
2982 /// Checking the operand of a static_cast to a derived pointer type. Must be
2983 /// null or an object within its lifetime.
2984 TCK_DowncastPointer
,
2985 /// Checking the operand of a static_cast to a derived reference type. Must
2986 /// be an object within its lifetime.
2987 TCK_DowncastReference
,
2988 /// Checking the operand of a cast to a base object. Must be suitably sized
2991 /// Checking the operand of a cast to a virtual base object. Must be an
2992 /// object within its lifetime.
2993 TCK_UpcastToVirtualBase
,
2994 /// Checking the value assigned to a _Nonnull pointer. Must not be null.
2996 /// Checking the operand of a dynamic_cast or a typeid expression. Must be
2997 /// null or an object within its lifetime.
2998 TCK_DynamicOperation
3001 /// Determine whether the pointer type check \p TCK permits null pointers.
3002 static bool isNullPointerAllowed(TypeCheckKind TCK
);
3004 /// Determine whether the pointer type check \p TCK requires a vptr check.
3005 static bool isVptrCheckRequired(TypeCheckKind TCK
, QualType Ty
);
3007 /// Whether any type-checking sanitizers are enabled. If \c false,
3008 /// calls to EmitTypeCheck can be skipped.
3009 bool sanitizePerformTypeCheck() const;
3011 /// Emit a check that \p V is the address of storage of the
3012 /// appropriate size and alignment for an object of type \p Type
3013 /// (or if ArraySize is provided, for an array of that bound).
3014 void EmitTypeCheck(TypeCheckKind TCK
, SourceLocation Loc
, llvm::Value
*V
,
3015 QualType Type
, CharUnits Alignment
= CharUnits::Zero(),
3016 SanitizerSet SkippedChecks
= SanitizerSet(),
3017 llvm::Value
*ArraySize
= nullptr);
3019 /// Emit a check that \p Base points into an array object, which
3020 /// we can access at index \p Index. \p Accessed should be \c false if we
3021 /// this expression is used as an lvalue, for instance in "&Arr[Idx]".
3022 void EmitBoundsCheck(const Expr
*E
, const Expr
*Base
, llvm::Value
*Index
,
3023 QualType IndexType
, bool Accessed
);
3025 /// Find the FieldDecl specified in a FAM's "counted_by" attribute. Returns
3026 /// \p nullptr if either the attribute or the field doesn't exist.
3027 FieldDecl
*FindCountedByField(
3029 LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel
);
3031 llvm::Value
*EmitScalarPrePostIncDec(const UnaryOperator
*E
, LValue LV
,
3032 bool isInc
, bool isPre
);
3033 ComplexPairTy
EmitComplexPrePostIncDec(const UnaryOperator
*E
, LValue LV
,
3034 bool isInc
, bool isPre
);
3036 /// Converts Location to a DebugLoc, if debug information is enabled.
3037 llvm::DebugLoc
SourceLocToDebugLoc(SourceLocation Location
);
3039 /// Get the record field index as represented in debug info.
3040 unsigned getDebugInfoFIndex(const RecordDecl
*Rec
, unsigned FieldIndex
);
3043 //===--------------------------------------------------------------------===//
3044 // Declaration Emission
3045 //===--------------------------------------------------------------------===//
3047 /// EmitDecl - Emit a declaration.
3049 /// This function can be called with a null (unreachable) insert point.
3050 void EmitDecl(const Decl
&D
);
3052 /// EmitVarDecl - Emit a local variable declaration.
3054 /// This function can be called with a null (unreachable) insert point.
3055 void EmitVarDecl(const VarDecl
&D
);
3057 void EmitScalarInit(const Expr
*init
, const ValueDecl
*D
, LValue lvalue
,
3058 bool capturedByInit
);
3060 typedef void SpecialInitFn(CodeGenFunction
&Init
, const VarDecl
&D
,
3061 llvm::Value
*Address
);
3063 /// Determine whether the given initializer is trivial in the sense
3064 /// that it requires no code to be generated.
3065 bool isTrivialInitializer(const Expr
*Init
);
3067 /// EmitAutoVarDecl - Emit an auto variable declaration.
3069 /// This function can be called with a null (unreachable) insert point.
3070 void EmitAutoVarDecl(const VarDecl
&D
);
3072 class AutoVarEmission
{
3073 friend class CodeGenFunction
;
3075 const VarDecl
*Variable
;
3077 /// The address of the alloca for languages with explicit address space
3078 /// (e.g. OpenCL) or alloca casted to generic pointer for address space
3079 /// agnostic languages (e.g. C++). Invalid if the variable was emitted
3080 /// as a global constant.
3083 llvm::Value
*NRVOFlag
;
3085 /// True if the variable is a __block variable that is captured by an
3087 bool IsEscapingByRef
;
3089 /// True if the variable is of aggregate type and has a constant
3091 bool IsConstantAggregate
;
3093 /// Non-null if we should use lifetime annotations.
3094 llvm::Value
*SizeForLifetimeMarkers
;
3096 /// Address with original alloca instruction. Invalid if the variable was
3097 /// emitted as a global constant.
3101 AutoVarEmission(Invalid
)
3102 : Variable(nullptr), Addr(Address::invalid()),
3103 AllocaAddr(Address::invalid()) {}
3105 AutoVarEmission(const VarDecl
&variable
)
3106 : Variable(&variable
), Addr(Address::invalid()), NRVOFlag(nullptr),
3107 IsEscapingByRef(false), IsConstantAggregate(false),
3108 SizeForLifetimeMarkers(nullptr), AllocaAddr(Address::invalid()) {}
3110 bool wasEmittedAsGlobal() const { return !Addr
.isValid(); }
3113 static AutoVarEmission
invalid() { return AutoVarEmission(Invalid()); }
3115 bool useLifetimeMarkers() const {
3116 return SizeForLifetimeMarkers
!= nullptr;
3118 llvm::Value
*getSizeForLifetimeMarkers() const {
3119 assert(useLifetimeMarkers());
3120 return SizeForLifetimeMarkers
;
3123 /// Returns the raw, allocated address, which is not necessarily
3124 /// the address of the object itself. It is casted to default
3125 /// address space for address space agnostic languages.
3126 Address
getAllocatedAddress() const {
3130 /// Returns the address for the original alloca instruction.
3131 Address
getOriginalAllocatedAddress() const { return AllocaAddr
; }
3133 /// Returns the address of the object within this declaration.
3134 /// Note that this does not chase the forwarding pointer for
3136 Address
getObjectAddress(CodeGenFunction
&CGF
) const {
3137 if (!IsEscapingByRef
) return Addr
;
3139 return CGF
.emitBlockByrefAddress(Addr
, Variable
, /*forward*/ false);
3142 AutoVarEmission
EmitAutoVarAlloca(const VarDecl
&var
);
3143 void EmitAutoVarInit(const AutoVarEmission
&emission
);
3144 void EmitAutoVarCleanups(const AutoVarEmission
&emission
);
3145 void emitAutoVarTypeCleanup(const AutoVarEmission
&emission
,
3146 QualType::DestructionKind dtorKind
);
3148 /// Emits the alloca and debug information for the size expressions for each
3149 /// dimension of an array. It registers the association of its (1-dimensional)
3150 /// QualTypes and size expression's debug node, so that CGDebugInfo can
3151 /// reference this node when creating the DISubrange object to describe the
3153 void EmitAndRegisterVariableArrayDimensions(CGDebugInfo
*DI
,
3155 bool EmitDebugInfo
);
3157 void EmitStaticVarDecl(const VarDecl
&D
,
3158 llvm::GlobalValue::LinkageTypes Linkage
);
3162 llvm::Type
*ElementType
;
3164 ParamValue(llvm::Value
*V
, llvm::Type
*T
, unsigned A
)
3165 : Value(V
), ElementType(T
), Alignment(A
) {}
3167 static ParamValue
forDirect(llvm::Value
*value
) {
3168 return ParamValue(value
, nullptr, 0);
3170 static ParamValue
forIndirect(Address addr
) {
3171 assert(!addr
.getAlignment().isZero());
3172 return ParamValue(addr
.getPointer(), addr
.getElementType(),
3173 addr
.getAlignment().getQuantity());
3176 bool isIndirect() const { return Alignment
!= 0; }
3177 llvm::Value
*getAnyValue() const { return Value
; }
3179 llvm::Value
*getDirectValue() const {
3180 assert(!isIndirect());
3184 Address
getIndirectAddress() const {
3185 assert(isIndirect());
3186 return Address(Value
, ElementType
, CharUnits::fromQuantity(Alignment
),
3191 /// EmitParmDecl - Emit a ParmVarDecl or an ImplicitParamDecl.
3192 void EmitParmDecl(const VarDecl
&D
, ParamValue Arg
, unsigned ArgNo
);
3194 /// protectFromPeepholes - Protect a value that we're intending to
3195 /// store to the side, but which will probably be used later, from
3196 /// aggressive peepholing optimizations that might delete it.
3198 /// Pass the result to unprotectFromPeepholes to declare that
3199 /// protection is no longer required.
3201 /// There's no particular reason why this shouldn't apply to
3202 /// l-values, it's just that no existing peepholes work on pointers.
3203 PeepholeProtection
protectFromPeepholes(RValue rvalue
);
3204 void unprotectFromPeepholes(PeepholeProtection protection
);
3206 void emitAlignmentAssumptionCheck(llvm::Value
*Ptr
, QualType Ty
,
3208 SourceLocation AssumptionLoc
,
3209 llvm::Value
*Alignment
,
3210 llvm::Value
*OffsetValue
,
3211 llvm::Value
*TheCheck
,
3212 llvm::Instruction
*Assumption
);
3214 void emitAlignmentAssumption(llvm::Value
*PtrValue
, QualType Ty
,
3215 SourceLocation Loc
, SourceLocation AssumptionLoc
,
3216 llvm::Value
*Alignment
,
3217 llvm::Value
*OffsetValue
= nullptr);
3219 void emitAlignmentAssumption(llvm::Value
*PtrValue
, const Expr
*E
,
3220 SourceLocation AssumptionLoc
,
3221 llvm::Value
*Alignment
,
3222 llvm::Value
*OffsetValue
= nullptr);
3224 //===--------------------------------------------------------------------===//
3225 // Statement Emission
3226 //===--------------------------------------------------------------------===//
3228 /// EmitStopPoint - Emit a debug stoppoint if we are emitting debug info.
3229 void EmitStopPoint(const Stmt
*S
);
3231 /// EmitStmt - Emit the code for the statement \arg S. It is legal to call
3232 /// this function even if there is no current insertion point.
3234 /// This function may clear the current insertion point; callers should use
3235 /// EnsureInsertPoint if they wish to subsequently generate code without first
3236 /// calling EmitBlock, EmitBranch, or EmitStmt.
3237 void EmitStmt(const Stmt
*S
, ArrayRef
<const Attr
*> Attrs
= std::nullopt
);
3239 /// EmitSimpleStmt - Try to emit a "simple" statement which does not
3240 /// necessarily require an insertion point or debug information; typically
3241 /// because the statement amounts to a jump or a container of other
3244 /// \return True if the statement was handled.
3245 bool EmitSimpleStmt(const Stmt
*S
, ArrayRef
<const Attr
*> Attrs
);
3247 Address
EmitCompoundStmt(const CompoundStmt
&S
, bool GetLast
= false,
3248 AggValueSlot AVS
= AggValueSlot::ignored());
3249 Address
EmitCompoundStmtWithoutScope(const CompoundStmt
&S
,
3250 bool GetLast
= false,
3252 AggValueSlot::ignored());
3254 /// EmitLabel - Emit the block for the given label. It is legal to call this
3255 /// function even if there is no current insertion point.
3256 void EmitLabel(const LabelDecl
*D
); // helper for EmitLabelStmt.
3258 void EmitLabelStmt(const LabelStmt
&S
);
3259 void EmitAttributedStmt(const AttributedStmt
&S
);
3260 void EmitGotoStmt(const GotoStmt
&S
);
3261 void EmitIndirectGotoStmt(const IndirectGotoStmt
&S
);
3262 void EmitIfStmt(const IfStmt
&S
);
3264 void EmitWhileStmt(const WhileStmt
&S
,
3265 ArrayRef
<const Attr
*> Attrs
= std::nullopt
);
3266 void EmitDoStmt(const DoStmt
&S
, ArrayRef
<const Attr
*> Attrs
= std::nullopt
);
3267 void EmitForStmt(const ForStmt
&S
,
3268 ArrayRef
<const Attr
*> Attrs
= std::nullopt
);
3269 void EmitReturnStmt(const ReturnStmt
&S
);
3270 void EmitDeclStmt(const DeclStmt
&S
);
3271 void EmitBreakStmt(const BreakStmt
&S
);
3272 void EmitContinueStmt(const ContinueStmt
&S
);
3273 void EmitSwitchStmt(const SwitchStmt
&S
);
3274 void EmitDefaultStmt(const DefaultStmt
&S
, ArrayRef
<const Attr
*> Attrs
);
3275 void EmitCaseStmt(const CaseStmt
&S
, ArrayRef
<const Attr
*> Attrs
);
3276 void EmitCaseStmtRange(const CaseStmt
&S
, ArrayRef
<const Attr
*> Attrs
);
3277 void EmitAsmStmt(const AsmStmt
&S
);
3279 void EmitObjCForCollectionStmt(const ObjCForCollectionStmt
&S
);
3280 void EmitObjCAtTryStmt(const ObjCAtTryStmt
&S
);
3281 void EmitObjCAtThrowStmt(const ObjCAtThrowStmt
&S
);
3282 void EmitObjCAtSynchronizedStmt(const ObjCAtSynchronizedStmt
&S
);
3283 void EmitObjCAutoreleasePoolStmt(const ObjCAutoreleasePoolStmt
&S
);
3285 void EmitCoroutineBody(const CoroutineBodyStmt
&S
);
3286 void EmitCoreturnStmt(const CoreturnStmt
&S
);
3287 RValue
EmitCoawaitExpr(const CoawaitExpr
&E
,
3288 AggValueSlot aggSlot
= AggValueSlot::ignored(),
3289 bool ignoreResult
= false);
3290 LValue
EmitCoawaitLValue(const CoawaitExpr
*E
);
3291 RValue
EmitCoyieldExpr(const CoyieldExpr
&E
,
3292 AggValueSlot aggSlot
= AggValueSlot::ignored(),
3293 bool ignoreResult
= false);
3294 LValue
EmitCoyieldLValue(const CoyieldExpr
*E
);
3295 RValue
EmitCoroutineIntrinsic(const CallExpr
*E
, unsigned int IID
);
3297 void EnterCXXTryStmt(const CXXTryStmt
&S
, bool IsFnTryBlock
= false);
3298 void ExitCXXTryStmt(const CXXTryStmt
&S
, bool IsFnTryBlock
= false);
3300 void EmitCXXTryStmt(const CXXTryStmt
&S
);
3301 void EmitSEHTryStmt(const SEHTryStmt
&S
);
3302 void EmitSEHLeaveStmt(const SEHLeaveStmt
&S
);
3303 void EnterSEHTryStmt(const SEHTryStmt
&S
);
3304 void ExitSEHTryStmt(const SEHTryStmt
&S
);
3305 void VolatilizeTryBlocks(llvm::BasicBlock
*BB
,
3306 llvm::SmallPtrSet
<llvm::BasicBlock
*, 10> &V
);
3308 void pushSEHCleanup(CleanupKind kind
,
3309 llvm::Function
*FinallyFunc
);
3310 void startOutlinedSEHHelper(CodeGenFunction
&ParentCGF
, bool IsFilter
,
3311 const Stmt
*OutlinedStmt
);
3313 llvm::Function
*GenerateSEHFilterFunction(CodeGenFunction
&ParentCGF
,
3314 const SEHExceptStmt
&Except
);
3316 llvm::Function
*GenerateSEHFinallyFunction(CodeGenFunction
&ParentCGF
,
3317 const SEHFinallyStmt
&Finally
);
3319 void EmitSEHExceptionCodeSave(CodeGenFunction
&ParentCGF
,
3320 llvm::Value
*ParentFP
,
3321 llvm::Value
*EntryEBP
);
3322 llvm::Value
*EmitSEHExceptionCode();
3323 llvm::Value
*EmitSEHExceptionInfo();
3324 llvm::Value
*EmitSEHAbnormalTermination();
3326 /// Emit simple code for OpenMP directives in Simd-only mode.
3327 void EmitSimpleOMPExecutableDirective(const OMPExecutableDirective
&D
);
3329 /// Scan the outlined statement for captures from the parent function. For
3330 /// each capture, mark the capture as escaped and emit a call to
3331 /// llvm.localrecover. Insert the localrecover result into the LocalDeclMap.
3332 void EmitCapturedLocals(CodeGenFunction
&ParentCGF
, const Stmt
*OutlinedStmt
,
3335 /// Recovers the address of a local in a parent function. ParentVar is the
3336 /// address of the variable used in the immediate parent function. It can
3337 /// either be an alloca or a call to llvm.localrecover if there are nested
3338 /// outlined functions. ParentFP is the frame pointer of the outermost parent
3340 Address
recoverAddrOfEscapedLocal(CodeGenFunction
&ParentCGF
,
3342 llvm::Value
*ParentFP
);
3344 void EmitCXXForRangeStmt(const CXXForRangeStmt
&S
,
3345 ArrayRef
<const Attr
*> Attrs
= std::nullopt
);
3347 /// Controls insertion of cancellation exit blocks in worksharing constructs.
3348 class OMPCancelStackRAII
{
3349 CodeGenFunction
&CGF
;
3352 OMPCancelStackRAII(CodeGenFunction
&CGF
, OpenMPDirectiveKind Kind
,
3355 CGF
.OMPCancelStack
.enter(CGF
, Kind
, HasCancel
);
3357 ~OMPCancelStackRAII() { CGF
.OMPCancelStack
.exit(CGF
); }
3360 /// Returns calculated size of the specified type.
3361 llvm::Value
*getTypeSize(QualType Ty
);
3362 LValue
InitCapturedStruct(const CapturedStmt
&S
);
3363 llvm::Function
*EmitCapturedStmt(const CapturedStmt
&S
, CapturedRegionKind K
);
3364 llvm::Function
*GenerateCapturedStmtFunction(const CapturedStmt
&S
);
3365 Address
GenerateCapturedStmtArgument(const CapturedStmt
&S
);
3366 llvm::Function
*GenerateOpenMPCapturedStmtFunction(const CapturedStmt
&S
,
3367 SourceLocation Loc
);
3368 void GenerateOpenMPCapturedVars(const CapturedStmt
&S
,
3369 SmallVectorImpl
<llvm::Value
*> &CapturedVars
);
3370 void emitOMPSimpleStore(LValue LVal
, RValue RVal
, QualType RValTy
,
3371 SourceLocation Loc
);
3372 /// Perform element by element copying of arrays with type \a
3373 /// OriginalType from \a SrcAddr to \a DestAddr using copying procedure
3374 /// generated by \a CopyGen.
3376 /// \param DestAddr Address of the destination array.
3377 /// \param SrcAddr Address of the source array.
3378 /// \param OriginalType Type of destination and source arrays.
3379 /// \param CopyGen Copying procedure that copies value of single array element
3380 /// to another single array element.
3381 void EmitOMPAggregateAssign(
3382 Address DestAddr
, Address SrcAddr
, QualType OriginalType
,
3383 const llvm::function_ref
<void(Address
, Address
)> CopyGen
);
3384 /// Emit proper copying of data from one variable to another.
3386 /// \param OriginalType Original type of the copied variables.
3387 /// \param DestAddr Destination address.
3388 /// \param SrcAddr Source address.
3389 /// \param DestVD Destination variable used in \a CopyExpr (for arrays, has
3390 /// type of the base array element).
3391 /// \param SrcVD Source variable used in \a CopyExpr (for arrays, has type of
3392 /// the base array element).
3393 /// \param Copy Actual copygin expression for copying data from \a SrcVD to \a
3395 void EmitOMPCopy(QualType OriginalType
,
3396 Address DestAddr
, Address SrcAddr
,
3397 const VarDecl
*DestVD
, const VarDecl
*SrcVD
,
3399 /// Emit atomic update code for constructs: \a X = \a X \a BO \a E or
3400 /// \a X = \a E \a BO \a E.
3402 /// \param X Value to be updated.
3403 /// \param E Update value.
3404 /// \param BO Binary operation for update operation.
3405 /// \param IsXLHSInRHSPart true if \a X is LHS in RHS part of the update
3406 /// expression, false otherwise.
3407 /// \param AO Atomic ordering of the generated atomic instructions.
3408 /// \param CommonGen Code generator for complex expressions that cannot be
3409 /// expressed through atomicrmw instruction.
3410 /// \returns <true, OldAtomicValue> if simple 'atomicrmw' instruction was
3411 /// generated, <false, RValue::get(nullptr)> otherwise.
3412 std::pair
<bool, RValue
> EmitOMPAtomicSimpleUpdateExpr(
3413 LValue X
, RValue E
, BinaryOperatorKind BO
, bool IsXLHSInRHSPart
,
3414 llvm::AtomicOrdering AO
, SourceLocation Loc
,
3415 const llvm::function_ref
<RValue(RValue
)> CommonGen
);
3416 bool EmitOMPFirstprivateClause(const OMPExecutableDirective
&D
,
3417 OMPPrivateScope
&PrivateScope
);
3418 void EmitOMPPrivateClause(const OMPExecutableDirective
&D
,
3419 OMPPrivateScope
&PrivateScope
);
3420 void EmitOMPUseDevicePtrClause(
3421 const OMPUseDevicePtrClause
&C
, OMPPrivateScope
&PrivateScope
,
3422 const llvm::DenseMap
<const ValueDecl
*, llvm::Value
*>
3423 CaptureDeviceAddrMap
);
3424 void EmitOMPUseDeviceAddrClause(
3425 const OMPUseDeviceAddrClause
&C
, OMPPrivateScope
&PrivateScope
,
3426 const llvm::DenseMap
<const ValueDecl
*, llvm::Value
*>
3427 CaptureDeviceAddrMap
);
3428 /// Emit code for copyin clause in \a D directive. The next code is
3429 /// generated at the start of outlined functions for directives:
3431 /// threadprivate_var1 = master_threadprivate_var1;
3432 /// operator=(threadprivate_var2, master_threadprivate_var2);
3434 /// __kmpc_barrier(&loc, global_tid);
3437 /// \param D OpenMP directive possibly with 'copyin' clause(s).
3438 /// \returns true if at least one copyin variable is found, false otherwise.
3439 bool EmitOMPCopyinClause(const OMPExecutableDirective
&D
);
3440 /// Emit initial code for lastprivate variables. If some variable is
3441 /// not also firstprivate, then the default initialization is used. Otherwise
3442 /// initialization of this variable is performed by EmitOMPFirstprivateClause
3445 /// \param D Directive that may have 'lastprivate' directives.
3446 /// \param PrivateScope Private scope for capturing lastprivate variables for
3447 /// proper codegen in internal captured statement.
3449 /// \returns true if there is at least one lastprivate variable, false
3451 bool EmitOMPLastprivateClauseInit(const OMPExecutableDirective
&D
,
3452 OMPPrivateScope
&PrivateScope
);
3453 /// Emit final copying of lastprivate values to original variables at
3454 /// the end of the worksharing or simd directive.
3456 /// \param D Directive that has at least one 'lastprivate' directives.
3457 /// \param IsLastIterCond Boolean condition that must be set to 'i1 true' if
3458 /// it is the last iteration of the loop code in associated directive, or to
3459 /// 'i1 false' otherwise. If this item is nullptr, no final check is required.
3460 void EmitOMPLastprivateClauseFinal(const OMPExecutableDirective
&D
,
3462 llvm::Value
*IsLastIterCond
= nullptr);
3463 /// Emit initial code for linear clauses.
3464 void EmitOMPLinearClause(const OMPLoopDirective
&D
,
3465 CodeGenFunction::OMPPrivateScope
&PrivateScope
);
3466 /// Emit final code for linear clauses.
3467 /// \param CondGen Optional conditional code for final part of codegen for
3469 void EmitOMPLinearClauseFinal(
3470 const OMPLoopDirective
&D
,
3471 const llvm::function_ref
<llvm::Value
*(CodeGenFunction
&)> CondGen
);
3472 /// Emit initial code for reduction variables. Creates reduction copies
3473 /// and initializes them with the values according to OpenMP standard.
3475 /// \param D Directive (possibly) with the 'reduction' clause.
3476 /// \param PrivateScope Private scope for capturing reduction variables for
3477 /// proper codegen in internal captured statement.
3479 void EmitOMPReductionClauseInit(const OMPExecutableDirective
&D
,
3480 OMPPrivateScope
&PrivateScope
,
3481 bool ForInscan
= false);
3482 /// Emit final update of reduction values to original variables at
3483 /// the end of the directive.
3485 /// \param D Directive that has at least one 'reduction' directives.
3486 /// \param ReductionKind The kind of reduction to perform.
3487 void EmitOMPReductionClauseFinal(const OMPExecutableDirective
&D
,
3488 const OpenMPDirectiveKind ReductionKind
);
3489 /// Emit initial code for linear variables. Creates private copies
3490 /// and initializes them with the values according to OpenMP standard.
3492 /// \param D Directive (possibly) with the 'linear' clause.
3493 /// \return true if at least one linear variable is found that should be
3494 /// initialized with the value of the original variable, false otherwise.
3495 bool EmitOMPLinearClauseInit(const OMPLoopDirective
&D
);
3497 typedef const llvm::function_ref
<void(CodeGenFunction
& /*CGF*/,
3498 llvm::Function
* /*OutlinedFn*/,
3499 const OMPTaskDataTy
& /*Data*/)>
3501 void EmitOMPTaskBasedDirective(const OMPExecutableDirective
&S
,
3502 const OpenMPDirectiveKind CapturedRegion
,
3503 const RegionCodeGenTy
&BodyGen
,
3504 const TaskGenTy
&TaskGen
, OMPTaskDataTy
&Data
);
3505 struct OMPTargetDataInfo
{
3506 Address BasePointersArray
= Address::invalid();
3507 Address PointersArray
= Address::invalid();
3508 Address SizesArray
= Address::invalid();
3509 Address MappersArray
= Address::invalid();
3510 unsigned NumberOfTargetItems
= 0;
3511 explicit OMPTargetDataInfo() = default;
3512 OMPTargetDataInfo(Address BasePointersArray
, Address PointersArray
,
3513 Address SizesArray
, Address MappersArray
,
3514 unsigned NumberOfTargetItems
)
3515 : BasePointersArray(BasePointersArray
), PointersArray(PointersArray
),
3516 SizesArray(SizesArray
), MappersArray(MappersArray
),
3517 NumberOfTargetItems(NumberOfTargetItems
) {}
3519 void EmitOMPTargetTaskBasedDirective(const OMPExecutableDirective
&S
,
3520 const RegionCodeGenTy
&BodyGen
,
3521 OMPTargetDataInfo
&InputInfo
);
3522 void processInReduction(const OMPExecutableDirective
&S
,
3523 OMPTaskDataTy
&Data
,
3524 CodeGenFunction
&CGF
,
3525 const CapturedStmt
*CS
,
3526 OMPPrivateScope
&Scope
);
3527 void EmitOMPMetaDirective(const OMPMetaDirective
&S
);
3528 void EmitOMPParallelDirective(const OMPParallelDirective
&S
);
3529 void EmitOMPSimdDirective(const OMPSimdDirective
&S
);
3530 void EmitOMPTileDirective(const OMPTileDirective
&S
);
3531 void EmitOMPUnrollDirective(const OMPUnrollDirective
&S
);
3532 void EmitOMPForDirective(const OMPForDirective
&S
);
3533 void EmitOMPForSimdDirective(const OMPForSimdDirective
&S
);
3534 void EmitOMPSectionsDirective(const OMPSectionsDirective
&S
);
3535 void EmitOMPSectionDirective(const OMPSectionDirective
&S
);
3536 void EmitOMPSingleDirective(const OMPSingleDirective
&S
);
3537 void EmitOMPMasterDirective(const OMPMasterDirective
&S
);
3538 void EmitOMPMaskedDirective(const OMPMaskedDirective
&S
);
3539 void EmitOMPCriticalDirective(const OMPCriticalDirective
&S
);
3540 void EmitOMPParallelForDirective(const OMPParallelForDirective
&S
);
3541 void EmitOMPParallelForSimdDirective(const OMPParallelForSimdDirective
&S
);
3542 void EmitOMPParallelSectionsDirective(const OMPParallelSectionsDirective
&S
);
3543 void EmitOMPParallelMasterDirective(const OMPParallelMasterDirective
&S
);
3544 void EmitOMPTaskDirective(const OMPTaskDirective
&S
);
3545 void EmitOMPTaskyieldDirective(const OMPTaskyieldDirective
&S
);
3546 void EmitOMPErrorDirective(const OMPErrorDirective
&S
);
3547 void EmitOMPBarrierDirective(const OMPBarrierDirective
&S
);
3548 void EmitOMPTaskwaitDirective(const OMPTaskwaitDirective
&S
);
3549 void EmitOMPTaskgroupDirective(const OMPTaskgroupDirective
&S
);
3550 void EmitOMPFlushDirective(const OMPFlushDirective
&S
);
3551 void EmitOMPDepobjDirective(const OMPDepobjDirective
&S
);
3552 void EmitOMPScanDirective(const OMPScanDirective
&S
);
3553 void EmitOMPOrderedDirective(const OMPOrderedDirective
&S
);
3554 void EmitOMPAtomicDirective(const OMPAtomicDirective
&S
);
3555 void EmitOMPTargetDirective(const OMPTargetDirective
&S
);
3556 void EmitOMPTargetDataDirective(const OMPTargetDataDirective
&S
);
3557 void EmitOMPTargetEnterDataDirective(const OMPTargetEnterDataDirective
&S
);
3558 void EmitOMPTargetExitDataDirective(const OMPTargetExitDataDirective
&S
);
3559 void EmitOMPTargetUpdateDirective(const OMPTargetUpdateDirective
&S
);
3560 void EmitOMPTargetParallelDirective(const OMPTargetParallelDirective
&S
);
3562 EmitOMPTargetParallelForDirective(const OMPTargetParallelForDirective
&S
);
3563 void EmitOMPTeamsDirective(const OMPTeamsDirective
&S
);
3565 EmitOMPCancellationPointDirective(const OMPCancellationPointDirective
&S
);
3566 void EmitOMPCancelDirective(const OMPCancelDirective
&S
);
3567 void EmitOMPTaskLoopBasedDirective(const OMPLoopDirective
&S
);
3568 void EmitOMPTaskLoopDirective(const OMPTaskLoopDirective
&S
);
3569 void EmitOMPTaskLoopSimdDirective(const OMPTaskLoopSimdDirective
&S
);
3570 void EmitOMPMasterTaskLoopDirective(const OMPMasterTaskLoopDirective
&S
);
3572 EmitOMPMasterTaskLoopSimdDirective(const OMPMasterTaskLoopSimdDirective
&S
);
3573 void EmitOMPParallelMasterTaskLoopDirective(
3574 const OMPParallelMasterTaskLoopDirective
&S
);
3575 void EmitOMPParallelMasterTaskLoopSimdDirective(
3576 const OMPParallelMasterTaskLoopSimdDirective
&S
);
3577 void EmitOMPDistributeDirective(const OMPDistributeDirective
&S
);
3578 void EmitOMPDistributeParallelForDirective(
3579 const OMPDistributeParallelForDirective
&S
);
3580 void EmitOMPDistributeParallelForSimdDirective(
3581 const OMPDistributeParallelForSimdDirective
&S
);
3582 void EmitOMPDistributeSimdDirective(const OMPDistributeSimdDirective
&S
);
3583 void EmitOMPTargetParallelForSimdDirective(
3584 const OMPTargetParallelForSimdDirective
&S
);
3585 void EmitOMPTargetSimdDirective(const OMPTargetSimdDirective
&S
);
3586 void EmitOMPTeamsDistributeDirective(const OMPTeamsDistributeDirective
&S
);
3588 EmitOMPTeamsDistributeSimdDirective(const OMPTeamsDistributeSimdDirective
&S
);
3589 void EmitOMPTeamsDistributeParallelForSimdDirective(
3590 const OMPTeamsDistributeParallelForSimdDirective
&S
);
3591 void EmitOMPTeamsDistributeParallelForDirective(
3592 const OMPTeamsDistributeParallelForDirective
&S
);
3593 void EmitOMPTargetTeamsDirective(const OMPTargetTeamsDirective
&S
);
3594 void EmitOMPTargetTeamsDistributeDirective(
3595 const OMPTargetTeamsDistributeDirective
&S
);
3596 void EmitOMPTargetTeamsDistributeParallelForDirective(
3597 const OMPTargetTeamsDistributeParallelForDirective
&S
);
3598 void EmitOMPTargetTeamsDistributeParallelForSimdDirective(
3599 const OMPTargetTeamsDistributeParallelForSimdDirective
&S
);
3600 void EmitOMPTargetTeamsDistributeSimdDirective(
3601 const OMPTargetTeamsDistributeSimdDirective
&S
);
3602 void EmitOMPGenericLoopDirective(const OMPGenericLoopDirective
&S
);
3603 void EmitOMPParallelGenericLoopDirective(const OMPLoopDirective
&S
);
3604 void EmitOMPTargetParallelGenericLoopDirective(
3605 const OMPTargetParallelGenericLoopDirective
&S
);
3606 void EmitOMPTargetTeamsGenericLoopDirective(
3607 const OMPTargetTeamsGenericLoopDirective
&S
);
3608 void EmitOMPTeamsGenericLoopDirective(const OMPTeamsGenericLoopDirective
&S
);
3609 void EmitOMPInteropDirective(const OMPInteropDirective
&S
);
3610 void EmitOMPParallelMaskedDirective(const OMPParallelMaskedDirective
&S
);
3612 /// Emit device code for the target directive.
3613 static void EmitOMPTargetDeviceFunction(CodeGenModule
&CGM
,
3614 StringRef ParentName
,
3615 const OMPTargetDirective
&S
);
3617 EmitOMPTargetParallelDeviceFunction(CodeGenModule
&CGM
, StringRef ParentName
,
3618 const OMPTargetParallelDirective
&S
);
3619 /// Emit device code for the target parallel for directive.
3620 static void EmitOMPTargetParallelForDeviceFunction(
3621 CodeGenModule
&CGM
, StringRef ParentName
,
3622 const OMPTargetParallelForDirective
&S
);
3623 /// Emit device code for the target parallel for simd directive.
3624 static void EmitOMPTargetParallelForSimdDeviceFunction(
3625 CodeGenModule
&CGM
, StringRef ParentName
,
3626 const OMPTargetParallelForSimdDirective
&S
);
3627 /// Emit device code for the target teams directive.
3629 EmitOMPTargetTeamsDeviceFunction(CodeGenModule
&CGM
, StringRef ParentName
,
3630 const OMPTargetTeamsDirective
&S
);
3631 /// Emit device code for the target teams distribute directive.
3632 static void EmitOMPTargetTeamsDistributeDeviceFunction(
3633 CodeGenModule
&CGM
, StringRef ParentName
,
3634 const OMPTargetTeamsDistributeDirective
&S
);
3635 /// Emit device code for the target teams distribute simd directive.
3636 static void EmitOMPTargetTeamsDistributeSimdDeviceFunction(
3637 CodeGenModule
&CGM
, StringRef ParentName
,
3638 const OMPTargetTeamsDistributeSimdDirective
&S
);
3639 /// Emit device code for the target simd directive.
3640 static void EmitOMPTargetSimdDeviceFunction(CodeGenModule
&CGM
,
3641 StringRef ParentName
,
3642 const OMPTargetSimdDirective
&S
);
3643 /// Emit device code for the target teams distribute parallel for simd
3645 static void EmitOMPTargetTeamsDistributeParallelForSimdDeviceFunction(
3646 CodeGenModule
&CGM
, StringRef ParentName
,
3647 const OMPTargetTeamsDistributeParallelForSimdDirective
&S
);
3649 /// Emit device code for the target teams loop directive.
3650 static void EmitOMPTargetTeamsGenericLoopDeviceFunction(
3651 CodeGenModule
&CGM
, StringRef ParentName
,
3652 const OMPTargetTeamsGenericLoopDirective
&S
);
3654 /// Emit device code for the target parallel loop directive.
3655 static void EmitOMPTargetParallelGenericLoopDeviceFunction(
3656 CodeGenModule
&CGM
, StringRef ParentName
,
3657 const OMPTargetParallelGenericLoopDirective
&S
);
3659 static void EmitOMPTargetTeamsDistributeParallelForDeviceFunction(
3660 CodeGenModule
&CGM
, StringRef ParentName
,
3661 const OMPTargetTeamsDistributeParallelForDirective
&S
);
3663 /// Emit the Stmt \p S and return its topmost canonical loop, if any.
3664 /// TODO: The \p Depth paramter is not yet implemented and must be 1. In the
3665 /// future it is meant to be the number of loops expected in the loop nests
3666 /// (usually specified by the "collapse" clause) that are collapsed to a
3667 /// single loop by this function.
3668 llvm::CanonicalLoopInfo
*EmitOMPCollapsedCanonicalLoopNest(const Stmt
*S
,
3671 /// Emit an OMPCanonicalLoop using the OpenMPIRBuilder.
3672 void EmitOMPCanonicalLoop(const OMPCanonicalLoop
*S
);
3674 /// Emit inner loop of the worksharing/simd construct.
3676 /// \param S Directive, for which the inner loop must be emitted.
3677 /// \param RequiresCleanup true, if directive has some associated private
3679 /// \param LoopCond Bollean condition for loop continuation.
3680 /// \param IncExpr Increment expression for loop control variable.
3681 /// \param BodyGen Generator for the inner body of the inner loop.
3682 /// \param PostIncGen Genrator for post-increment code (required for ordered
3683 /// loop directvies).
3684 void EmitOMPInnerLoop(
3685 const OMPExecutableDirective
&S
, bool RequiresCleanup
,
3686 const Expr
*LoopCond
, const Expr
*IncExpr
,
3687 const llvm::function_ref
<void(CodeGenFunction
&)> BodyGen
,
3688 const llvm::function_ref
<void(CodeGenFunction
&)> PostIncGen
);
3690 JumpDest
getOMPCancelDestination(OpenMPDirectiveKind Kind
);
3691 /// Emit initial code for loop counters of loop-based directives.
3692 void EmitOMPPrivateLoopCounters(const OMPLoopDirective
&S
,
3693 OMPPrivateScope
&LoopScope
);
3695 /// Helper for the OpenMP loop directives.
3696 void EmitOMPLoopBody(const OMPLoopDirective
&D
, JumpDest LoopExit
);
3698 /// Emit code for the worksharing loop-based directive.
3699 /// \return true, if this construct has any lastprivate clause, false -
3701 bool EmitOMPWorksharingLoop(const OMPLoopDirective
&S
, Expr
*EUB
,
3702 const CodeGenLoopBoundsTy
&CodeGenLoopBounds
,
3703 const CodeGenDispatchBoundsTy
&CGDispatchBounds
);
3705 /// Emit code for the distribute loop-based directive.
3706 void EmitOMPDistributeLoop(const OMPLoopDirective
&S
,
3707 const CodeGenLoopTy
&CodeGenLoop
, Expr
*IncExpr
);
3709 /// Helpers for the OpenMP loop directives.
3710 void EmitOMPSimdInit(const OMPLoopDirective
&D
);
3711 void EmitOMPSimdFinal(
3712 const OMPLoopDirective
&D
,
3713 const llvm::function_ref
<llvm::Value
*(CodeGenFunction
&)> CondGen
);
3715 /// Emits the lvalue for the expression with possibly captured variable.
3716 LValue
EmitOMPSharedLValue(const Expr
*E
);
3719 /// Helpers for blocks.
3720 llvm::Value
*EmitBlockLiteral(const CGBlockInfo
&Info
);
3722 /// struct with the values to be passed to the OpenMP loop-related functions
3723 struct OMPLoopArguments
{
3724 /// loop lower bound
3725 Address LB
= Address::invalid();
3726 /// loop upper bound
3727 Address UB
= Address::invalid();
3729 Address ST
= Address::invalid();
3730 /// isLastIteration argument for runtime functions
3731 Address IL
= Address::invalid();
3732 /// Chunk value generated by sema
3733 llvm::Value
*Chunk
= nullptr;
3734 /// EnsureUpperBound
3735 Expr
*EUB
= nullptr;
3736 /// IncrementExpression
3737 Expr
*IncExpr
= nullptr;
3738 /// Loop initialization
3739 Expr
*Init
= nullptr;
3740 /// Loop exit condition
3741 Expr
*Cond
= nullptr;
3742 /// Update of LB after a whole chunk has been executed
3743 Expr
*NextLB
= nullptr;
3744 /// Update of UB after a whole chunk has been executed
3745 Expr
*NextUB
= nullptr;
3746 OMPLoopArguments() = default;
3747 OMPLoopArguments(Address LB
, Address UB
, Address ST
, Address IL
,
3748 llvm::Value
*Chunk
= nullptr, Expr
*EUB
= nullptr,
3749 Expr
*IncExpr
= nullptr, Expr
*Init
= nullptr,
3750 Expr
*Cond
= nullptr, Expr
*NextLB
= nullptr,
3751 Expr
*NextUB
= nullptr)
3752 : LB(LB
), UB(UB
), ST(ST
), IL(IL
), Chunk(Chunk
), EUB(EUB
),
3753 IncExpr(IncExpr
), Init(Init
), Cond(Cond
), NextLB(NextLB
),
3756 void EmitOMPOuterLoop(bool DynamicOrOrdered
, bool IsMonotonic
,
3757 const OMPLoopDirective
&S
, OMPPrivateScope
&LoopScope
,
3758 const OMPLoopArguments
&LoopArgs
,
3759 const CodeGenLoopTy
&CodeGenLoop
,
3760 const CodeGenOrderedTy
&CodeGenOrdered
);
3761 void EmitOMPForOuterLoop(const OpenMPScheduleTy
&ScheduleKind
,
3762 bool IsMonotonic
, const OMPLoopDirective
&S
,
3763 OMPPrivateScope
&LoopScope
, bool Ordered
,
3764 const OMPLoopArguments
&LoopArgs
,
3765 const CodeGenDispatchBoundsTy
&CGDispatchBounds
);
3766 void EmitOMPDistributeOuterLoop(OpenMPDistScheduleClauseKind ScheduleKind
,
3767 const OMPLoopDirective
&S
,
3768 OMPPrivateScope
&LoopScope
,
3769 const OMPLoopArguments
&LoopArgs
,
3770 const CodeGenLoopTy
&CodeGenLoopContent
);
3771 /// Emit code for sections directive.
3772 void EmitSections(const OMPExecutableDirective
&S
);
3776 //===--------------------------------------------------------------------===//
3777 // LValue Expression Emission
3778 //===--------------------------------------------------------------------===//
3780 /// Create a check that a scalar RValue is non-null.
3781 llvm::Value
*EmitNonNullRValueCheck(RValue RV
, QualType T
);
3783 /// GetUndefRValue - Get an appropriate 'undef' rvalue for the given type.
3784 RValue
GetUndefRValue(QualType Ty
);
3786 /// EmitUnsupportedRValue - Emit a dummy r-value using the type of E
3787 /// and issue an ErrorUnsupported style diagnostic (using the
3789 RValue
EmitUnsupportedRValue(const Expr
*E
,
3792 /// EmitUnsupportedLValue - Emit a dummy l-value using the type of E and issue
3793 /// an ErrorUnsupported style diagnostic (using the provided Name).
3794 LValue
EmitUnsupportedLValue(const Expr
*E
,
3797 /// EmitLValue - Emit code to compute a designator that specifies the location
3798 /// of the expression.
3800 /// This can return one of two things: a simple address or a bitfield
3801 /// reference. In either case, the LLVM Value* in the LValue structure is
3802 /// guaranteed to be an LLVM pointer type.
3804 /// If this returns a bitfield reference, nothing about the pointee type of
3805 /// the LLVM value is known: For example, it may not be a pointer to an
3808 /// If this returns a normal address, and if the lvalue's C type is fixed
3809 /// size, this method guarantees that the returned pointer type will point to
3810 /// an LLVM type of the same size of the lvalue's type. If the lvalue has a
3811 /// variable length type, this is not possible.
3813 LValue
EmitLValue(const Expr
*E
,
3814 KnownNonNull_t IsKnownNonNull
= NotKnownNonNull
);
3817 LValue
EmitLValueHelper(const Expr
*E
, KnownNonNull_t IsKnownNonNull
);
3820 /// Same as EmitLValue but additionally we generate checking code to
3821 /// guard against undefined behavior. This is only suitable when we know
3822 /// that the address will be used to access the object.
3823 LValue
EmitCheckedLValue(const Expr
*E
, TypeCheckKind TCK
);
3825 RValue
convertTempToRValue(Address addr
, QualType type
,
3826 SourceLocation Loc
);
3828 void EmitAtomicInit(Expr
*E
, LValue lvalue
);
3830 bool LValueIsSuitableForInlineAtomic(LValue Src
);
3832 RValue
EmitAtomicLoad(LValue LV
, SourceLocation SL
,
3833 AggValueSlot Slot
= AggValueSlot::ignored());
3835 RValue
EmitAtomicLoad(LValue lvalue
, SourceLocation loc
,
3836 llvm::AtomicOrdering AO
, bool IsVolatile
= false,
3837 AggValueSlot slot
= AggValueSlot::ignored());
3839 void EmitAtomicStore(RValue rvalue
, LValue lvalue
, bool isInit
);
3841 void EmitAtomicStore(RValue rvalue
, LValue lvalue
, llvm::AtomicOrdering AO
,
3842 bool IsVolatile
, bool isInit
);
3844 std::pair
<RValue
, llvm::Value
*> EmitAtomicCompareExchange(
3845 LValue Obj
, RValue Expected
, RValue Desired
, SourceLocation Loc
,
3846 llvm::AtomicOrdering Success
=
3847 llvm::AtomicOrdering::SequentiallyConsistent
,
3848 llvm::AtomicOrdering Failure
=
3849 llvm::AtomicOrdering::SequentiallyConsistent
,
3850 bool IsWeak
= false, AggValueSlot Slot
= AggValueSlot::ignored());
3852 void EmitAtomicUpdate(LValue LVal
, llvm::AtomicOrdering AO
,
3853 const llvm::function_ref
<RValue(RValue
)> &UpdateOp
,
3856 /// EmitToMemory - Change a scalar value from its value
3857 /// representation to its in-memory representation.
3858 llvm::Value
*EmitToMemory(llvm::Value
*Value
, QualType Ty
);
3860 /// EmitFromMemory - Change a scalar value from its memory
3861 /// representation to its value representation.
3862 llvm::Value
*EmitFromMemory(llvm::Value
*Value
, QualType Ty
);
3864 /// Check if the scalar \p Value is within the valid range for the given
3867 /// Returns true if a check is needed (even if the range is unknown).
3868 bool EmitScalarRangeCheck(llvm::Value
*Value
, QualType Ty
,
3869 SourceLocation Loc
);
3871 /// EmitLoadOfScalar - Load a scalar value from an address, taking
3872 /// care to appropriately convert from the memory representation to
3873 /// the LLVM value representation.
3874 llvm::Value
*EmitLoadOfScalar(Address Addr
, bool Volatile
, QualType Ty
,
3876 AlignmentSource Source
= AlignmentSource::Type
,
3877 bool isNontemporal
= false) {
3878 return EmitLoadOfScalar(Addr
, Volatile
, Ty
, Loc
, LValueBaseInfo(Source
),
3879 CGM
.getTBAAAccessInfo(Ty
), isNontemporal
);
3882 llvm::Value
*EmitLoadOfScalar(Address Addr
, bool Volatile
, QualType Ty
,
3883 SourceLocation Loc
, LValueBaseInfo BaseInfo
,
3884 TBAAAccessInfo TBAAInfo
,
3885 bool isNontemporal
= false);
3887 /// EmitLoadOfScalar - Load a scalar value from an address, taking
3888 /// care to appropriately convert from the memory representation to
3889 /// the LLVM value representation. The l-value must be a simple
3891 llvm::Value
*EmitLoadOfScalar(LValue lvalue
, SourceLocation Loc
);
3893 /// EmitStoreOfScalar - Store a scalar value to an address, taking
3894 /// care to appropriately convert from the memory representation to
3895 /// the LLVM value representation.
3896 void EmitStoreOfScalar(llvm::Value
*Value
, Address Addr
,
3897 bool Volatile
, QualType Ty
,
3898 AlignmentSource Source
= AlignmentSource::Type
,
3899 bool isInit
= false, bool isNontemporal
= false) {
3900 EmitStoreOfScalar(Value
, Addr
, Volatile
, Ty
, LValueBaseInfo(Source
),
3901 CGM
.getTBAAAccessInfo(Ty
), isInit
, isNontemporal
);
3904 void EmitStoreOfScalar(llvm::Value
*Value
, Address Addr
,
3905 bool Volatile
, QualType Ty
,
3906 LValueBaseInfo BaseInfo
, TBAAAccessInfo TBAAInfo
,
3907 bool isInit
= false, bool isNontemporal
= false);
3909 /// EmitStoreOfScalar - Store a scalar value to an address, taking
3910 /// care to appropriately convert from the memory representation to
3911 /// the LLVM value representation. The l-value must be a simple
3912 /// l-value. The isInit flag indicates whether this is an initialization.
3913 /// If so, atomic qualifiers are ignored and the store is always non-atomic.
3914 void EmitStoreOfScalar(llvm::Value
*value
, LValue lvalue
, bool isInit
=false);
3916 /// EmitLoadOfLValue - Given an expression that represents a value lvalue,
3917 /// this method emits the address of the lvalue, then loads the result as an
3918 /// rvalue, returning the rvalue.
3919 RValue
EmitLoadOfLValue(LValue V
, SourceLocation Loc
);
3920 RValue
EmitLoadOfExtVectorElementLValue(LValue V
);
3921 RValue
EmitLoadOfBitfieldLValue(LValue LV
, SourceLocation Loc
);
3922 RValue
EmitLoadOfGlobalRegLValue(LValue LV
);
3924 /// EmitStoreThroughLValue - Store the specified rvalue into the specified
3925 /// lvalue, where both are guaranteed to the have the same type, and that type
3927 void EmitStoreThroughLValue(RValue Src
, LValue Dst
, bool isInit
= false);
3928 void EmitStoreThroughExtVectorComponentLValue(RValue Src
, LValue Dst
);
3929 void EmitStoreThroughGlobalRegLValue(RValue Src
, LValue Dst
);
3931 /// EmitStoreThroughBitfieldLValue - Store Src into Dst with same constraints
3932 /// as EmitStoreThroughLValue.
3934 /// \param Result [out] - If non-null, this will be set to a Value* for the
3935 /// bit-field contents after the store, appropriate for use as the result of
3936 /// an assignment to the bit-field.
3937 void EmitStoreThroughBitfieldLValue(RValue Src
, LValue Dst
,
3938 llvm::Value
**Result
=nullptr);
3940 /// Emit an l-value for an assignment (simple or compound) of complex type.
3941 LValue
EmitComplexAssignmentLValue(const BinaryOperator
*E
);
3942 LValue
EmitComplexCompoundAssignmentLValue(const CompoundAssignOperator
*E
);
3943 LValue
EmitScalarCompoundAssignWithComplex(const CompoundAssignOperator
*E
,
3944 llvm::Value
*&Result
);
3946 // Note: only available for agg return types
3947 LValue
EmitBinaryOperatorLValue(const BinaryOperator
*E
);
3948 LValue
EmitCompoundAssignmentLValue(const CompoundAssignOperator
*E
);
3949 // Note: only available for agg return types
3950 LValue
EmitCallExprLValue(const CallExpr
*E
);
3951 // Note: only available for agg return types
3952 LValue
EmitVAArgExprLValue(const VAArgExpr
*E
);
3953 LValue
EmitDeclRefLValue(const DeclRefExpr
*E
);
3954 LValue
EmitStringLiteralLValue(const StringLiteral
*E
);
3955 LValue
EmitObjCEncodeExprLValue(const ObjCEncodeExpr
*E
);
3956 LValue
EmitPredefinedLValue(const PredefinedExpr
*E
);
3957 LValue
EmitUnaryOpLValue(const UnaryOperator
*E
);
3958 LValue
EmitArraySubscriptExpr(const ArraySubscriptExpr
*E
,
3959 bool Accessed
= false);
3960 LValue
EmitMatrixSubscriptExpr(const MatrixSubscriptExpr
*E
);
3961 LValue
EmitOMPArraySectionExpr(const OMPArraySectionExpr
*E
,
3962 bool IsLowerBound
= true);
3963 LValue
EmitExtVectorElementExpr(const ExtVectorElementExpr
*E
);
3964 LValue
EmitMemberExpr(const MemberExpr
*E
);
3965 LValue
EmitObjCIsaExpr(const ObjCIsaExpr
*E
);
3966 LValue
EmitCompoundLiteralLValue(const CompoundLiteralExpr
*E
);
3967 LValue
EmitInitListLValue(const InitListExpr
*E
);
3968 void EmitIgnoredConditionalOperator(const AbstractConditionalOperator
*E
);
3969 LValue
EmitConditionalOperatorLValue(const AbstractConditionalOperator
*E
);
3970 LValue
EmitCastLValue(const CastExpr
*E
);
3971 LValue
EmitMaterializeTemporaryExpr(const MaterializeTemporaryExpr
*E
);
3972 LValue
EmitOpaqueValueLValue(const OpaqueValueExpr
*e
);
3974 Address
EmitExtVectorElementLValue(LValue V
);
3976 RValue
EmitRValueForField(LValue LV
, const FieldDecl
*FD
, SourceLocation Loc
);
3978 Address
EmitArrayToPointerDecay(const Expr
*Array
,
3979 LValueBaseInfo
*BaseInfo
= nullptr,
3980 TBAAAccessInfo
*TBAAInfo
= nullptr);
3982 class ConstantEmission
{
3983 llvm::PointerIntPair
<llvm::Constant
*, 1, bool> ValueAndIsReference
;
3984 ConstantEmission(llvm::Constant
*C
, bool isReference
)
3985 : ValueAndIsReference(C
, isReference
) {}
3987 ConstantEmission() {}
3988 static ConstantEmission
forReference(llvm::Constant
*C
) {
3989 return ConstantEmission(C
, true);
3991 static ConstantEmission
forValue(llvm::Constant
*C
) {
3992 return ConstantEmission(C
, false);
3995 explicit operator bool() const {
3996 return ValueAndIsReference
.getOpaqueValue() != nullptr;
3999 bool isReference() const { return ValueAndIsReference
.getInt(); }
4000 LValue
getReferenceLValue(CodeGenFunction
&CGF
, Expr
*refExpr
) const {
4001 assert(isReference());
4002 return CGF
.MakeNaturalAlignAddrLValue(ValueAndIsReference
.getPointer(),
4003 refExpr
->getType());
4006 llvm::Constant
*getValue() const {
4007 assert(!isReference());
4008 return ValueAndIsReference
.getPointer();
4012 ConstantEmission
tryEmitAsConstant(DeclRefExpr
*refExpr
);
4013 ConstantEmission
tryEmitAsConstant(const MemberExpr
*ME
);
4014 llvm::Value
*emitScalarConstant(const ConstantEmission
&Constant
, Expr
*E
);
4016 RValue
EmitPseudoObjectRValue(const PseudoObjectExpr
*e
,
4017 AggValueSlot slot
= AggValueSlot::ignored());
4018 LValue
EmitPseudoObjectLValue(const PseudoObjectExpr
*e
);
4020 llvm::Value
*EmitIvarOffset(const ObjCInterfaceDecl
*Interface
,
4021 const ObjCIvarDecl
*Ivar
);
4022 llvm::Value
*EmitIvarOffsetAsPointerDiff(const ObjCInterfaceDecl
*Interface
,
4023 const ObjCIvarDecl
*Ivar
);
4024 LValue
EmitLValueForField(LValue Base
, const FieldDecl
* Field
);
4025 LValue
EmitLValueForLambdaField(const FieldDecl
*Field
);
4026 LValue
EmitLValueForLambdaField(const FieldDecl
*Field
,
4027 llvm::Value
*ThisValue
);
4029 /// EmitLValueForFieldInitialization - Like EmitLValueForField, except that
4030 /// if the Field is a reference, this will return the address of the reference
4031 /// and not the address of the value stored in the reference.
4032 LValue
EmitLValueForFieldInitialization(LValue Base
,
4033 const FieldDecl
* Field
);
4035 LValue
EmitLValueForIvar(QualType ObjectTy
,
4036 llvm::Value
* Base
, const ObjCIvarDecl
*Ivar
,
4037 unsigned CVRQualifiers
);
4039 LValue
EmitCXXConstructLValue(const CXXConstructExpr
*E
);
4040 LValue
EmitCXXBindTemporaryLValue(const CXXBindTemporaryExpr
*E
);
4041 LValue
EmitCXXTypeidLValue(const CXXTypeidExpr
*E
);
4042 LValue
EmitCXXUuidofLValue(const CXXUuidofExpr
*E
);
4044 LValue
EmitObjCMessageExprLValue(const ObjCMessageExpr
*E
);
4045 LValue
EmitObjCIvarRefLValue(const ObjCIvarRefExpr
*E
);
4046 LValue
EmitStmtExprLValue(const StmtExpr
*E
);
4047 LValue
EmitPointerToDataMemberBinaryExpr(const BinaryOperator
*E
);
4048 LValue
EmitObjCSelectorLValue(const ObjCSelectorExpr
*E
);
4049 void EmitDeclRefExprDbgValue(const DeclRefExpr
*E
, const APValue
&Init
);
4051 //===--------------------------------------------------------------------===//
4052 // Scalar Expression Emission
4053 //===--------------------------------------------------------------------===//
4055 /// EmitCall - Generate a call of the given function, expecting the given
4056 /// result type, and using the given argument list which specifies both the
4057 /// LLVM arguments and the types they were derived from.
4058 RValue
EmitCall(const CGFunctionInfo
&CallInfo
, const CGCallee
&Callee
,
4059 ReturnValueSlot ReturnValue
, const CallArgList
&Args
,
4060 llvm::CallBase
**callOrInvoke
, bool IsMustTail
,
4061 SourceLocation Loc
);
4062 RValue
EmitCall(const CGFunctionInfo
&CallInfo
, const CGCallee
&Callee
,
4063 ReturnValueSlot ReturnValue
, const CallArgList
&Args
,
4064 llvm::CallBase
**callOrInvoke
= nullptr,
4065 bool IsMustTail
= false) {
4066 return EmitCall(CallInfo
, Callee
, ReturnValue
, Args
, callOrInvoke
,
4067 IsMustTail
, SourceLocation());
4069 RValue
EmitCall(QualType FnType
, const CGCallee
&Callee
, const CallExpr
*E
,
4070 ReturnValueSlot ReturnValue
, llvm::Value
*Chain
= nullptr);
4071 RValue
EmitCallExpr(const CallExpr
*E
,
4072 ReturnValueSlot ReturnValue
= ReturnValueSlot());
4073 RValue
EmitSimpleCallExpr(const CallExpr
*E
, ReturnValueSlot ReturnValue
);
4074 CGCallee
EmitCallee(const Expr
*E
);
4076 void checkTargetFeatures(const CallExpr
*E
, const FunctionDecl
*TargetDecl
);
4077 void checkTargetFeatures(SourceLocation Loc
, const FunctionDecl
*TargetDecl
);
4079 llvm::CallInst
*EmitRuntimeCall(llvm::FunctionCallee callee
,
4080 const Twine
&name
= "");
4081 llvm::CallInst
*EmitRuntimeCall(llvm::FunctionCallee callee
,
4082 ArrayRef
<llvm::Value
*> args
,
4083 const Twine
&name
= "");
4084 llvm::CallInst
*EmitNounwindRuntimeCall(llvm::FunctionCallee callee
,
4085 const Twine
&name
= "");
4086 llvm::CallInst
*EmitNounwindRuntimeCall(llvm::FunctionCallee callee
,
4087 ArrayRef
<llvm::Value
*> args
,
4088 const Twine
&name
= "");
4090 SmallVector
<llvm::OperandBundleDef
, 1>
4091 getBundlesForFunclet(llvm::Value
*Callee
);
4093 llvm::CallBase
*EmitCallOrInvoke(llvm::FunctionCallee Callee
,
4094 ArrayRef
<llvm::Value
*> Args
,
4095 const Twine
&Name
= "");
4096 llvm::CallBase
*EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee
,
4097 ArrayRef
<llvm::Value
*> args
,
4098 const Twine
&name
= "");
4099 llvm::CallBase
*EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee
,
4100 const Twine
&name
= "");
4101 void EmitNoreturnRuntimeCallOrInvoke(llvm::FunctionCallee callee
,
4102 ArrayRef
<llvm::Value
*> args
);
4104 CGCallee
BuildAppleKextVirtualCall(const CXXMethodDecl
*MD
,
4105 NestedNameSpecifier
*Qual
,
4108 CGCallee
BuildAppleKextVirtualDestructorCall(const CXXDestructorDecl
*DD
,
4110 const CXXRecordDecl
*RD
);
4112 // Return the copy constructor name with the prefix "__copy_constructor_"
4114 static std::string
getNonTrivialCopyConstructorStr(QualType QT
,
4115 CharUnits Alignment
,
4119 // Return the destructor name with the prefix "__destructor_" removed.
4120 static std::string
getNonTrivialDestructorStr(QualType QT
,
4121 CharUnits Alignment
,
4125 // These functions emit calls to the special functions of non-trivial C
4127 void defaultInitNonTrivialCStructVar(LValue Dst
);
4128 void callCStructDefaultConstructor(LValue Dst
);
4129 void callCStructDestructor(LValue Dst
);
4130 void callCStructCopyConstructor(LValue Dst
, LValue Src
);
4131 void callCStructMoveConstructor(LValue Dst
, LValue Src
);
4132 void callCStructCopyAssignmentOperator(LValue Dst
, LValue Src
);
4133 void callCStructMoveAssignmentOperator(LValue Dst
, LValue Src
);
4136 EmitCXXMemberOrOperatorCall(const CXXMethodDecl
*Method
,
4137 const CGCallee
&Callee
,
4138 ReturnValueSlot ReturnValue
, llvm::Value
*This
,
4139 llvm::Value
*ImplicitParam
,
4140 QualType ImplicitParamTy
, const CallExpr
*E
,
4141 CallArgList
*RtlArgs
);
4142 RValue
EmitCXXDestructorCall(GlobalDecl Dtor
, const CGCallee
&Callee
,
4143 llvm::Value
*This
, QualType ThisTy
,
4144 llvm::Value
*ImplicitParam
,
4145 QualType ImplicitParamTy
, const CallExpr
*E
);
4146 RValue
EmitCXXMemberCallExpr(const CXXMemberCallExpr
*E
,
4147 ReturnValueSlot ReturnValue
);
4148 RValue
EmitCXXMemberOrOperatorMemberCallExpr(const CallExpr
*CE
,
4149 const CXXMethodDecl
*MD
,
4150 ReturnValueSlot ReturnValue
,
4152 NestedNameSpecifier
*Qualifier
,
4153 bool IsArrow
, const Expr
*Base
);
4154 // Compute the object pointer.
4155 Address
EmitCXXMemberDataPointerAddress(const Expr
*E
, Address base
,
4156 llvm::Value
*memberPtr
,
4157 const MemberPointerType
*memberPtrType
,
4158 LValueBaseInfo
*BaseInfo
= nullptr,
4159 TBAAAccessInfo
*TBAAInfo
= nullptr);
4160 RValue
EmitCXXMemberPointerCallExpr(const CXXMemberCallExpr
*E
,
4161 ReturnValueSlot ReturnValue
);
4163 RValue
EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr
*E
,
4164 const CXXMethodDecl
*MD
,
4165 ReturnValueSlot ReturnValue
);
4166 RValue
EmitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr
*E
);
4168 RValue
EmitCUDAKernelCallExpr(const CUDAKernelCallExpr
*E
,
4169 ReturnValueSlot ReturnValue
);
4171 RValue
EmitNVPTXDevicePrintfCallExpr(const CallExpr
*E
);
4172 RValue
EmitAMDGPUDevicePrintfCallExpr(const CallExpr
*E
);
4173 RValue
EmitOpenMPDevicePrintfCallExpr(const CallExpr
*E
);
4175 RValue
EmitBuiltinExpr(const GlobalDecl GD
, unsigned BuiltinID
,
4176 const CallExpr
*E
, ReturnValueSlot ReturnValue
);
4178 RValue
emitRotate(const CallExpr
*E
, bool IsRotateRight
);
4180 /// Emit IR for __builtin_os_log_format.
4181 RValue
emitBuiltinOSLogFormat(const CallExpr
&E
);
4183 /// Emit IR for __builtin_is_aligned.
4184 RValue
EmitBuiltinIsAligned(const CallExpr
*E
);
4185 /// Emit IR for __builtin_align_up/__builtin_align_down.
4186 RValue
EmitBuiltinAlignTo(const CallExpr
*E
, bool AlignUp
);
4188 llvm::Function
*generateBuiltinOSLogHelperFunction(
4189 const analyze_os_log::OSLogBufferLayout
&Layout
,
4190 CharUnits BufferAlignment
);
4192 RValue
EmitBlockCallExpr(const CallExpr
*E
, ReturnValueSlot ReturnValue
);
4194 /// EmitTargetBuiltinExpr - Emit the given builtin call. Returns 0 if the call
4195 /// is unhandled by the current target.
4196 llvm::Value
*EmitTargetBuiltinExpr(unsigned BuiltinID
, const CallExpr
*E
,
4197 ReturnValueSlot ReturnValue
);
4199 llvm::Value
*EmitAArch64CompareBuiltinExpr(llvm::Value
*Op
, llvm::Type
*Ty
,
4200 const llvm::CmpInst::Predicate Fp
,
4201 const llvm::CmpInst::Predicate Ip
,
4202 const llvm::Twine
&Name
= "");
4203 llvm::Value
*EmitARMBuiltinExpr(unsigned BuiltinID
, const CallExpr
*E
,
4204 ReturnValueSlot ReturnValue
,
4205 llvm::Triple::ArchType Arch
);
4206 llvm::Value
*EmitARMMVEBuiltinExpr(unsigned BuiltinID
, const CallExpr
*E
,
4207 ReturnValueSlot ReturnValue
,
4208 llvm::Triple::ArchType Arch
);
4209 llvm::Value
*EmitARMCDEBuiltinExpr(unsigned BuiltinID
, const CallExpr
*E
,
4210 ReturnValueSlot ReturnValue
,
4211 llvm::Triple::ArchType Arch
);
4212 llvm::Value
*EmitCMSEClearRecord(llvm::Value
*V
, llvm::IntegerType
*ITy
,
4214 llvm::Value
*EmitCMSEClearRecord(llvm::Value
*V
, llvm::ArrayType
*ATy
,
4217 llvm::Value
*EmitCommonNeonBuiltinExpr(unsigned BuiltinID
,
4218 unsigned LLVMIntrinsic
,
4219 unsigned AltLLVMIntrinsic
,
4220 const char *NameHint
,
4223 SmallVectorImpl
<llvm::Value
*> &Ops
,
4224 Address PtrOp0
, Address PtrOp1
,
4225 llvm::Triple::ArchType Arch
);
4227 llvm::Function
*LookupNeonLLVMIntrinsic(unsigned IntrinsicID
,
4228 unsigned Modifier
, llvm::Type
*ArgTy
,
4230 llvm::Value
*EmitNeonCall(llvm::Function
*F
,
4231 SmallVectorImpl
<llvm::Value
*> &O
,
4233 unsigned shift
= 0, bool rightshift
= false);
4234 llvm::Value
*EmitNeonSplat(llvm::Value
*V
, llvm::Constant
*Idx
,
4235 const llvm::ElementCount
&Count
);
4236 llvm::Value
*EmitNeonSplat(llvm::Value
*V
, llvm::Constant
*Idx
);
4237 llvm::Value
*EmitNeonShiftVector(llvm::Value
*V
, llvm::Type
*Ty
,
4238 bool negateForRightShift
);
4239 llvm::Value
*EmitNeonRShiftImm(llvm::Value
*Vec
, llvm::Value
*Amt
,
4240 llvm::Type
*Ty
, bool usgn
, const char *name
);
4241 llvm::Value
*vectorWrapScalar16(llvm::Value
*Op
);
4242 /// SVEBuiltinMemEltTy - Returns the memory element type for this memory
4243 /// access builtin. Only required if it can't be inferred from the base
4244 /// pointer operand.
4245 llvm::Type
*SVEBuiltinMemEltTy(const SVETypeFlags
&TypeFlags
);
4247 SmallVector
<llvm::Type
*, 2>
4248 getSVEOverloadTypes(const SVETypeFlags
&TypeFlags
, llvm::Type
*ReturnType
,
4249 ArrayRef
<llvm::Value
*> Ops
);
4250 llvm::Type
*getEltType(const SVETypeFlags
&TypeFlags
);
4251 llvm::ScalableVectorType
*getSVEType(const SVETypeFlags
&TypeFlags
);
4252 llvm::ScalableVectorType
*getSVEPredType(const SVETypeFlags
&TypeFlags
);
4253 llvm::Value
*EmitSVETupleSetOrGet(const SVETypeFlags
&TypeFlags
,
4254 llvm::Type
*ReturnType
,
4255 ArrayRef
<llvm::Value
*> Ops
);
4256 llvm::Value
*EmitSVETupleCreate(const SVETypeFlags
&TypeFlags
,
4257 llvm::Type
*ReturnType
,
4258 ArrayRef
<llvm::Value
*> Ops
);
4259 llvm::Value
*EmitSVEAllTruePred(const SVETypeFlags
&TypeFlags
);
4260 llvm::Value
*EmitSVEDupX(llvm::Value
*Scalar
);
4261 llvm::Value
*EmitSVEDupX(llvm::Value
*Scalar
, llvm::Type
*Ty
);
4262 llvm::Value
*EmitSVEReinterpret(llvm::Value
*Val
, llvm::Type
*Ty
);
4263 llvm::Value
*EmitSVEPMull(const SVETypeFlags
&TypeFlags
,
4264 llvm::SmallVectorImpl
<llvm::Value
*> &Ops
,
4265 unsigned BuiltinID
);
4266 llvm::Value
*EmitSVEMovl(const SVETypeFlags
&TypeFlags
,
4267 llvm::ArrayRef
<llvm::Value
*> Ops
,
4268 unsigned BuiltinID
);
4269 llvm::Value
*EmitSVEPredicateCast(llvm::Value
*Pred
,
4270 llvm::ScalableVectorType
*VTy
);
4271 llvm::Value
*EmitSVEGatherLoad(const SVETypeFlags
&TypeFlags
,
4272 llvm::SmallVectorImpl
<llvm::Value
*> &Ops
,
4274 llvm::Value
*EmitSVEScatterStore(const SVETypeFlags
&TypeFlags
,
4275 llvm::SmallVectorImpl
<llvm::Value
*> &Ops
,
4277 llvm::Value
*EmitSVEMaskedLoad(const CallExpr
*, llvm::Type
*ReturnTy
,
4278 SmallVectorImpl
<llvm::Value
*> &Ops
,
4279 unsigned BuiltinID
, bool IsZExtReturn
);
4280 llvm::Value
*EmitSVEMaskedStore(const CallExpr
*,
4281 SmallVectorImpl
<llvm::Value
*> &Ops
,
4282 unsigned BuiltinID
);
4283 llvm::Value
*EmitSVEPrefetchLoad(const SVETypeFlags
&TypeFlags
,
4284 SmallVectorImpl
<llvm::Value
*> &Ops
,
4285 unsigned BuiltinID
);
4286 llvm::Value
*EmitSVEGatherPrefetch(const SVETypeFlags
&TypeFlags
,
4287 SmallVectorImpl
<llvm::Value
*> &Ops
,
4289 llvm::Value
*EmitSVEStructLoad(const SVETypeFlags
&TypeFlags
,
4290 SmallVectorImpl
<llvm::Value
*> &Ops
,
4292 llvm::Value
*EmitSVEStructStore(const SVETypeFlags
&TypeFlags
,
4293 SmallVectorImpl
<llvm::Value
*> &Ops
,
4295 /// FormSVEBuiltinResult - Returns the struct of scalable vectors as a wider
4296 /// vector. It extracts the scalable vector from the struct and inserts into
4297 /// the wider vector. This avoids the error when allocating space in llvm
4298 /// for struct of scalable vectors if a function returns struct.
4299 llvm::Value
*FormSVEBuiltinResult(llvm::Value
*Call
);
4300 llvm::Value
*EmitAArch64SVEBuiltinExpr(unsigned BuiltinID
, const CallExpr
*E
);
4302 llvm::Value
*EmitSMELd1St1(const SVETypeFlags
&TypeFlags
,
4303 llvm::SmallVectorImpl
<llvm::Value
*> &Ops
,
4305 llvm::Value
*EmitSMEReadWrite(const SVETypeFlags
&TypeFlags
,
4306 llvm::SmallVectorImpl
<llvm::Value
*> &Ops
,
4308 llvm::Value
*EmitSMEZero(const SVETypeFlags
&TypeFlags
,
4309 llvm::SmallVectorImpl
<llvm::Value
*> &Ops
,
4311 llvm::Value
*EmitSMELdrStr(const SVETypeFlags
&TypeFlags
,
4312 llvm::SmallVectorImpl
<llvm::Value
*> &Ops
,
4314 llvm::Value
*EmitAArch64SMEBuiltinExpr(unsigned BuiltinID
, const CallExpr
*E
);
4316 llvm::Value
*EmitAArch64BuiltinExpr(unsigned BuiltinID
, const CallExpr
*E
,
4317 llvm::Triple::ArchType Arch
);
4318 llvm::Value
*EmitBPFBuiltinExpr(unsigned BuiltinID
, const CallExpr
*E
);
4320 llvm::Value
*BuildVector(ArrayRef
<llvm::Value
*> Ops
);
4321 llvm::Value
*EmitX86BuiltinExpr(unsigned BuiltinID
, const CallExpr
*E
);
4322 llvm::Value
*EmitPPCBuiltinExpr(unsigned BuiltinID
, const CallExpr
*E
);
4323 llvm::Value
*EmitAMDGPUBuiltinExpr(unsigned BuiltinID
, const CallExpr
*E
);
4324 llvm::Value
*EmitSystemZBuiltinExpr(unsigned BuiltinID
, const CallExpr
*E
);
4325 llvm::Value
*EmitNVPTXBuiltinExpr(unsigned BuiltinID
, const CallExpr
*E
);
4326 llvm::Value
*EmitWebAssemblyBuiltinExpr(unsigned BuiltinID
,
4328 llvm::Value
*EmitHexagonBuiltinExpr(unsigned BuiltinID
, const CallExpr
*E
);
4329 llvm::Value
*EmitRISCVBuiltinExpr(unsigned BuiltinID
, const CallExpr
*E
,
4330 ReturnValueSlot ReturnValue
);
4331 void ProcessOrderScopeAMDGCN(llvm::Value
*Order
, llvm::Value
*Scope
,
4332 llvm::AtomicOrdering
&AO
,
4333 llvm::SyncScope::ID
&SSID
);
4335 enum class MSVCIntrin
;
4336 llvm::Value
*EmitMSVCBuiltinExpr(MSVCIntrin BuiltinID
, const CallExpr
*E
);
4338 llvm::Value
*EmitBuiltinAvailable(const VersionTuple
&Version
);
4340 llvm::Value
*EmitObjCProtocolExpr(const ObjCProtocolExpr
*E
);
4341 llvm::Value
*EmitObjCStringLiteral(const ObjCStringLiteral
*E
);
4342 llvm::Value
*EmitObjCBoxedExpr(const ObjCBoxedExpr
*E
);
4343 llvm::Value
*EmitObjCArrayLiteral(const ObjCArrayLiteral
*E
);
4344 llvm::Value
*EmitObjCDictionaryLiteral(const ObjCDictionaryLiteral
*E
);
4345 llvm::Value
*EmitObjCCollectionLiteral(const Expr
*E
,
4346 const ObjCMethodDecl
*MethodWithObjects
);
4347 llvm::Value
*EmitObjCSelectorExpr(const ObjCSelectorExpr
*E
);
4348 RValue
EmitObjCMessageExpr(const ObjCMessageExpr
*E
,
4349 ReturnValueSlot Return
= ReturnValueSlot());
4351 /// Retrieves the default cleanup kind for an ARC cleanup.
4352 /// Except under -fobjc-arc-eh, ARC cleanups are normal-only.
4353 CleanupKind
getARCCleanupKind() {
4354 return CGM
.getCodeGenOpts().ObjCAutoRefCountExceptions
4355 ? NormalAndEHCleanup
: NormalCleanup
;
4359 void EmitARCInitWeak(Address addr
, llvm::Value
*value
);
4360 void EmitARCDestroyWeak(Address addr
);
4361 llvm::Value
*EmitARCLoadWeak(Address addr
);
4362 llvm::Value
*EmitARCLoadWeakRetained(Address addr
);
4363 llvm::Value
*EmitARCStoreWeak(Address addr
, llvm::Value
*value
, bool ignored
);
4364 void emitARCCopyAssignWeak(QualType Ty
, Address DstAddr
, Address SrcAddr
);
4365 void emitARCMoveAssignWeak(QualType Ty
, Address DstAddr
, Address SrcAddr
);
4366 void EmitARCCopyWeak(Address dst
, Address src
);
4367 void EmitARCMoveWeak(Address dst
, Address src
);
4368 llvm::Value
*EmitARCRetainAutorelease(QualType type
, llvm::Value
*value
);
4369 llvm::Value
*EmitARCRetainAutoreleaseNonBlock(llvm::Value
*value
);
4370 llvm::Value
*EmitARCStoreStrong(LValue lvalue
, llvm::Value
*value
,
4371 bool resultIgnored
);
4372 llvm::Value
*EmitARCStoreStrongCall(Address addr
, llvm::Value
*value
,
4373 bool resultIgnored
);
4374 llvm::Value
*EmitARCRetain(QualType type
, llvm::Value
*value
);
4375 llvm::Value
*EmitARCRetainNonBlock(llvm::Value
*value
);
4376 llvm::Value
*EmitARCRetainBlock(llvm::Value
*value
, bool mandatory
);
4377 void EmitARCDestroyStrong(Address addr
, ARCPreciseLifetime_t precise
);
4378 void EmitARCRelease(llvm::Value
*value
, ARCPreciseLifetime_t precise
);
4379 llvm::Value
*EmitARCAutorelease(llvm::Value
*value
);
4380 llvm::Value
*EmitARCAutoreleaseReturnValue(llvm::Value
*value
);
4381 llvm::Value
*EmitARCRetainAutoreleaseReturnValue(llvm::Value
*value
);
4382 llvm::Value
*EmitARCRetainAutoreleasedReturnValue(llvm::Value
*value
);
4383 llvm::Value
*EmitARCUnsafeClaimAutoreleasedReturnValue(llvm::Value
*value
);
4385 llvm::Value
*EmitObjCAutorelease(llvm::Value
*value
, llvm::Type
*returnType
);
4386 llvm::Value
*EmitObjCRetainNonBlock(llvm::Value
*value
,
4387 llvm::Type
*returnType
);
4388 void EmitObjCRelease(llvm::Value
*value
, ARCPreciseLifetime_t precise
);
4390 std::pair
<LValue
,llvm::Value
*>
4391 EmitARCStoreAutoreleasing(const BinaryOperator
*e
);
4392 std::pair
<LValue
,llvm::Value
*>
4393 EmitARCStoreStrong(const BinaryOperator
*e
, bool ignored
);
4394 std::pair
<LValue
,llvm::Value
*>
4395 EmitARCStoreUnsafeUnretained(const BinaryOperator
*e
, bool ignored
);
4397 llvm::Value
*EmitObjCAlloc(llvm::Value
*value
,
4398 llvm::Type
*returnType
);
4399 llvm::Value
*EmitObjCAllocWithZone(llvm::Value
*value
,
4400 llvm::Type
*returnType
);
4401 llvm::Value
*EmitObjCAllocInit(llvm::Value
*value
, llvm::Type
*resultType
);
4403 llvm::Value
*EmitObjCThrowOperand(const Expr
*expr
);
4404 llvm::Value
*EmitObjCConsumeObject(QualType T
, llvm::Value
*Ptr
);
4405 llvm::Value
*EmitObjCExtendObjectLifetime(QualType T
, llvm::Value
*Ptr
);
4407 llvm::Value
*EmitARCExtendBlockObject(const Expr
*expr
);
4408 llvm::Value
*EmitARCReclaimReturnedObject(const Expr
*e
,
4409 bool allowUnsafeClaim
);
4410 llvm::Value
*EmitARCRetainScalarExpr(const Expr
*expr
);
4411 llvm::Value
*EmitARCRetainAutoreleaseScalarExpr(const Expr
*expr
);
4412 llvm::Value
*EmitARCUnsafeUnretainedScalarExpr(const Expr
*expr
);
4414 void EmitARCIntrinsicUse(ArrayRef
<llvm::Value
*> values
);
4416 void EmitARCNoopIntrinsicUse(ArrayRef
<llvm::Value
*> values
);
4418 static Destroyer destroyARCStrongImprecise
;
4419 static Destroyer destroyARCStrongPrecise
;
4420 static Destroyer destroyARCWeak
;
4421 static Destroyer emitARCIntrinsicUse
;
4422 static Destroyer destroyNonTrivialCStruct
;
4424 void EmitObjCAutoreleasePoolPop(llvm::Value
*Ptr
);
4425 llvm::Value
*EmitObjCAutoreleasePoolPush();
4426 llvm::Value
*EmitObjCMRRAutoreleasePoolPush();
4427 void EmitObjCAutoreleasePoolCleanup(llvm::Value
*Ptr
);
4428 void EmitObjCMRRAutoreleasePoolPop(llvm::Value
*Ptr
);
4430 /// Emits a reference binding to the passed in expression.
4431 RValue
EmitReferenceBindingToExpr(const Expr
*E
);
4433 //===--------------------------------------------------------------------===//
4434 // Expression Emission
4435 //===--------------------------------------------------------------------===//
4437 // Expressions are broken into three classes: scalar, complex, aggregate.
4439 /// EmitScalarExpr - Emit the computation of the specified expression of LLVM
4440 /// scalar type, returning the result.
4441 llvm::Value
*EmitScalarExpr(const Expr
*E
, bool IgnoreResultAssign
= false);
4443 /// Emit a conversion from the specified type to the specified destination
4444 /// type, both of which are LLVM scalar types.
4445 llvm::Value
*EmitScalarConversion(llvm::Value
*Src
, QualType SrcTy
,
4446 QualType DstTy
, SourceLocation Loc
);
4448 /// Emit a conversion from the specified complex type to the specified
4449 /// destination type, where the destination type is an LLVM scalar type.
4450 llvm::Value
*EmitComplexToScalarConversion(ComplexPairTy Src
, QualType SrcTy
,
4452 SourceLocation Loc
);
4454 /// EmitAggExpr - Emit the computation of the specified expression
4455 /// of aggregate type. The result is computed into the given slot,
4456 /// which may be null to indicate that the value is not needed.
4457 void EmitAggExpr(const Expr
*E
, AggValueSlot AS
);
4459 /// EmitAggExprToLValue - Emit the computation of the specified expression of
4460 /// aggregate type into a temporary LValue.
4461 LValue
EmitAggExprToLValue(const Expr
*E
);
4463 /// Build all the stores needed to initialize an aggregate at Dest with the
4465 void EmitAggregateStore(llvm::Value
*Val
, Address Dest
, bool DestIsVolatile
);
4467 /// EmitExtendGCLifetime - Given a pointer to an Objective-C object,
4468 /// make sure it survives garbage collection until this point.
4469 void EmitExtendGCLifetime(llvm::Value
*object
);
4471 /// EmitComplexExpr - Emit the computation of the specified expression of
4472 /// complex type, returning the result.
4473 ComplexPairTy
EmitComplexExpr(const Expr
*E
,
4474 bool IgnoreReal
= false,
4475 bool IgnoreImag
= false);
4477 /// EmitComplexExprIntoLValue - Emit the given expression of complex
4478 /// type and place its result into the specified l-value.
4479 void EmitComplexExprIntoLValue(const Expr
*E
, LValue dest
, bool isInit
);
4481 /// EmitStoreOfComplex - Store a complex number into the specified l-value.
4482 void EmitStoreOfComplex(ComplexPairTy V
, LValue dest
, bool isInit
);
4484 /// EmitLoadOfComplex - Load a complex number from the specified l-value.
4485 ComplexPairTy
EmitLoadOfComplex(LValue src
, SourceLocation loc
);
4487 ComplexPairTy
EmitPromotedComplexExpr(const Expr
*E
, QualType PromotionType
);
4488 llvm::Value
*EmitPromotedScalarExpr(const Expr
*E
, QualType PromotionType
);
4489 ComplexPairTy
EmitPromotedValue(ComplexPairTy result
, QualType PromotionType
);
4490 ComplexPairTy
EmitUnPromotedValue(ComplexPairTy result
, QualType PromotionType
);
4492 Address
emitAddrOfRealComponent(Address
complex, QualType complexType
);
4493 Address
emitAddrOfImagComponent(Address
complex, QualType complexType
);
4495 /// AddInitializerToStaticVarDecl - Add the initializer for 'D' to the
4496 /// global variable that has already been created for it. If the initializer
4497 /// has a different type than GV does, this may free GV and return a different
4498 /// one. Otherwise it just returns GV.
4499 llvm::GlobalVariable
*
4500 AddInitializerToStaticVarDecl(const VarDecl
&D
,
4501 llvm::GlobalVariable
*GV
);
4503 // Emit an @llvm.invariant.start call for the given memory region.
4504 void EmitInvariantStart(llvm::Constant
*Addr
, CharUnits Size
);
4506 /// EmitCXXGlobalVarDeclInit - Create the initializer for a C++
4507 /// variable with global storage.
4508 void EmitCXXGlobalVarDeclInit(const VarDecl
&D
, llvm::GlobalVariable
*GV
,
4511 llvm::Function
*createAtExitStub(const VarDecl
&VD
, llvm::FunctionCallee Dtor
,
4512 llvm::Constant
*Addr
);
4514 llvm::Function
*createTLSAtExitStub(const VarDecl
&VD
,
4515 llvm::FunctionCallee Dtor
,
4516 llvm::Constant
*Addr
,
4517 llvm::FunctionCallee
&AtExit
);
4519 /// Call atexit() with a function that passes the given argument to
4520 /// the given function.
4521 void registerGlobalDtorWithAtExit(const VarDecl
&D
, llvm::FunctionCallee fn
,
4522 llvm::Constant
*addr
);
4524 /// Call atexit() with function dtorStub.
4525 void registerGlobalDtorWithAtExit(llvm::Constant
*dtorStub
);
4527 /// Call unatexit() with function dtorStub.
4528 llvm::Value
*unregisterGlobalDtorWithUnAtExit(llvm::Constant
*dtorStub
);
4530 /// Emit code in this function to perform a guarded variable
4531 /// initialization. Guarded initializations are used when it's not
4532 /// possible to prove that an initialization will be done exactly
4533 /// once, e.g. with a static local variable or a static data member
4534 /// of a class template.
4535 void EmitCXXGuardedInit(const VarDecl
&D
, llvm::GlobalVariable
*DeclPtr
,
4538 enum class GuardKind
{ VariableGuard
, TlsGuard
};
4540 /// Emit a branch to select whether or not to perform guarded initialization.
4541 void EmitCXXGuardedInitBranch(llvm::Value
*NeedsInit
,
4542 llvm::BasicBlock
*InitBlock
,
4543 llvm::BasicBlock
*NoInitBlock
,
4544 GuardKind Kind
, const VarDecl
*D
);
4546 /// GenerateCXXGlobalInitFunc - Generates code for initializing global
4549 GenerateCXXGlobalInitFunc(llvm::Function
*Fn
,
4550 ArrayRef
<llvm::Function
*> CXXThreadLocals
,
4551 ConstantAddress Guard
= ConstantAddress::invalid());
4553 /// GenerateCXXGlobalCleanUpFunc - Generates code for cleaning up global
4555 void GenerateCXXGlobalCleanUpFunc(
4557 ArrayRef
<std::tuple
<llvm::FunctionType
*, llvm::WeakTrackingVH
,
4559 DtorsOrStermFinalizers
);
4561 void GenerateCXXGlobalVarDeclInitFunc(llvm::Function
*Fn
,
4563 llvm::GlobalVariable
*Addr
,
4566 void EmitCXXConstructExpr(const CXXConstructExpr
*E
, AggValueSlot Dest
);
4568 void EmitSynthesizedCXXCopyCtor(Address Dest
, Address Src
, const Expr
*Exp
);
4570 void EmitCXXThrowExpr(const CXXThrowExpr
*E
, bool KeepInsertionPoint
= true);
4572 RValue
EmitAtomicExpr(AtomicExpr
*E
);
4574 //===--------------------------------------------------------------------===//
4575 // Annotations Emission
4576 //===--------------------------------------------------------------------===//
4578 /// Emit an annotation call (intrinsic).
4579 llvm::Value
*EmitAnnotationCall(llvm::Function
*AnnotationFn
,
4580 llvm::Value
*AnnotatedVal
,
4581 StringRef AnnotationStr
,
4582 SourceLocation Location
,
4583 const AnnotateAttr
*Attr
);
4585 /// Emit local annotations for the local variable V, declared by D.
4586 void EmitVarAnnotations(const VarDecl
*D
, llvm::Value
*V
);
4588 /// Emit field annotations for the given field & value. Returns the
4589 /// annotation result.
4590 Address
EmitFieldAnnotations(const FieldDecl
*D
, Address V
);
4592 //===--------------------------------------------------------------------===//
4594 //===--------------------------------------------------------------------===//
4596 /// ContainsLabel - Return true if the statement contains a label in it. If
4597 /// this statement is not executed normally, it not containing a label means
4598 /// that we can just remove the code.
4599 static bool ContainsLabel(const Stmt
*S
, bool IgnoreCaseStmts
= false);
4601 /// containsBreak - Return true if the statement contains a break out of it.
4602 /// If the statement (recursively) contains a switch or loop with a break
4603 /// inside of it, this is fine.
4604 static bool containsBreak(const Stmt
*S
);
4606 /// Determine if the given statement might introduce a declaration into the
4607 /// current scope, by being a (possibly-labelled) DeclStmt.
4608 static bool mightAddDeclToScope(const Stmt
*S
);
4610 /// ConstantFoldsToSimpleInteger - If the specified expression does not fold
4611 /// to a constant, or if it does but contains a label, return false. If it
4612 /// constant folds return true and set the boolean result in Result.
4613 bool ConstantFoldsToSimpleInteger(const Expr
*Cond
, bool &Result
,
4614 bool AllowLabels
= false);
4616 /// ConstantFoldsToSimpleInteger - If the specified expression does not fold
4617 /// to a constant, or if it does but contains a label, return false. If it
4618 /// constant folds return true and set the folded value.
4619 bool ConstantFoldsToSimpleInteger(const Expr
*Cond
, llvm::APSInt
&Result
,
4620 bool AllowLabels
= false);
4622 /// isInstrumentedCondition - Determine whether the given condition is an
4623 /// instrumentable condition (i.e. no "&&" or "||").
4624 static bool isInstrumentedCondition(const Expr
*C
);
4626 /// EmitBranchToCounterBlock - Emit a conditional branch to a new block that
4627 /// increments a profile counter based on the semantics of the given logical
4628 /// operator opcode. This is used to instrument branch condition coverage
4629 /// for logical operators.
4630 void EmitBranchToCounterBlock(const Expr
*Cond
, BinaryOperator::Opcode LOp
,
4631 llvm::BasicBlock
*TrueBlock
,
4632 llvm::BasicBlock
*FalseBlock
,
4633 uint64_t TrueCount
= 0,
4634 Stmt::Likelihood LH
= Stmt::LH_None
,
4635 const Expr
*CntrIdx
= nullptr);
4637 /// EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g. for an
4638 /// if statement) to the specified blocks. Based on the condition, this might
4639 /// try to simplify the codegen of the conditional based on the branch.
4640 /// TrueCount should be the number of times we expect the condition to
4641 /// evaluate to true based on PGO data.
4642 void EmitBranchOnBoolExpr(const Expr
*Cond
, llvm::BasicBlock
*TrueBlock
,
4643 llvm::BasicBlock
*FalseBlock
, uint64_t TrueCount
,
4644 Stmt::Likelihood LH
= Stmt::LH_None
);
4646 /// Given an assignment `*LHS = RHS`, emit a test that checks if \p RHS is
4647 /// nonnull, if \p LHS is marked _Nonnull.
4648 void EmitNullabilityCheck(LValue LHS
, llvm::Value
*RHS
, SourceLocation Loc
);
4650 /// An enumeration which makes it easier to specify whether or not an
4651 /// operation is a subtraction.
4652 enum { NotSubtraction
= false, IsSubtraction
= true };
4654 /// Same as IRBuilder::CreateInBoundsGEP, but additionally emits a check to
4655 /// detect undefined behavior when the pointer overflow sanitizer is enabled.
4656 /// \p SignedIndices indicates whether any of the GEP indices are signed.
4657 /// \p IsSubtraction indicates whether the expression used to form the GEP
4658 /// is a subtraction.
4659 llvm::Value
*EmitCheckedInBoundsGEP(llvm::Type
*ElemTy
, llvm::Value
*Ptr
,
4660 ArrayRef
<llvm::Value
*> IdxList
,
4664 const Twine
&Name
= "");
4666 /// Specifies which type of sanitizer check to apply when handling a
4667 /// particular builtin.
4668 enum BuiltinCheckKind
{
4673 /// Emits an argument for a call to a builtin. If the builtin sanitizer is
4674 /// enabled, a runtime check specified by \p Kind is also emitted.
4675 llvm::Value
*EmitCheckedArgForBuiltin(const Expr
*E
, BuiltinCheckKind Kind
);
4677 /// Emit a description of a type in a format suitable for passing to
4678 /// a runtime sanitizer handler.
4679 llvm::Constant
*EmitCheckTypeDescriptor(QualType T
);
4681 /// Convert a value into a format suitable for passing to a runtime
4682 /// sanitizer handler.
4683 llvm::Value
*EmitCheckValue(llvm::Value
*V
);
4685 /// Emit a description of a source location in a format suitable for
4686 /// passing to a runtime sanitizer handler.
4687 llvm::Constant
*EmitCheckSourceLocation(SourceLocation Loc
);
4689 void EmitKCFIOperandBundle(const CGCallee
&Callee
,
4690 SmallVectorImpl
<llvm::OperandBundleDef
> &Bundles
);
4692 /// Create a basic block that will either trap or call a handler function in
4693 /// the UBSan runtime with the provided arguments, and create a conditional
4695 void EmitCheck(ArrayRef
<std::pair
<llvm::Value
*, SanitizerMask
>> Checked
,
4696 SanitizerHandler Check
, ArrayRef
<llvm::Constant
*> StaticArgs
,
4697 ArrayRef
<llvm::Value
*> DynamicArgs
);
4699 /// Emit a slow path cross-DSO CFI check which calls __cfi_slowpath
4700 /// if Cond if false.
4701 void EmitCfiSlowPathCheck(SanitizerMask Kind
, llvm::Value
*Cond
,
4702 llvm::ConstantInt
*TypeId
, llvm::Value
*Ptr
,
4703 ArrayRef
<llvm::Constant
*> StaticArgs
);
4705 /// Emit a reached-unreachable diagnostic if \p Loc is valid and runtime
4706 /// checking is enabled. Otherwise, just emit an unreachable instruction.
4707 void EmitUnreachable(SourceLocation Loc
);
4709 /// Create a basic block that will call the trap intrinsic, and emit a
4710 /// conditional branch to it, for the -ftrapv checks.
4711 void EmitTrapCheck(llvm::Value
*Checked
, SanitizerHandler CheckHandlerID
);
4713 /// Emit a call to trap or debugtrap and attach function attribute
4714 /// "trap-func-name" if specified.
4715 llvm::CallInst
*EmitTrapCall(llvm::Intrinsic::ID IntrID
);
4717 /// Emit a stub for the cross-DSO CFI check function.
4718 void EmitCfiCheckStub();
4720 /// Emit a cross-DSO CFI failure handling function.
4721 void EmitCfiCheckFail();
4723 /// Create a check for a function parameter that may potentially be
4724 /// declared as non-null.
4725 void EmitNonNullArgCheck(RValue RV
, QualType ArgType
, SourceLocation ArgLoc
,
4726 AbstractCallee AC
, unsigned ParmNum
);
4728 /// EmitCallArg - Emit a single call argument.
4729 void EmitCallArg(CallArgList
&args
, const Expr
*E
, QualType ArgType
);
4731 /// EmitDelegateCallArg - We are performing a delegate call; that
4732 /// is, the current function is delegating to another one. Produce
4733 /// a r-value suitable for passing the given parameter.
4734 void EmitDelegateCallArg(CallArgList
&args
, const VarDecl
*param
,
4735 SourceLocation loc
);
4737 /// SetFPAccuracy - Set the minimum required accuracy of the given floating
4738 /// point operation, expressed as the maximum relative error in ulp.
4739 void SetFPAccuracy(llvm::Value
*Val
, float Accuracy
);
4741 /// Set the minimum required accuracy of the given sqrt operation
4742 /// based on CodeGenOpts.
4743 void SetSqrtFPAccuracy(llvm::Value
*Val
);
4745 /// Set the minimum required accuracy of the given sqrt operation based on
4747 void SetDivFPAccuracy(llvm::Value
*Val
);
4749 /// Set the codegen fast-math flags.
4750 void SetFastMathFlags(FPOptions FPFeatures
);
4752 // Truncate or extend a boolean vector to the requested number of elements.
4753 llvm::Value
*emitBoolVecConversion(llvm::Value
*SrcVec
,
4754 unsigned NumElementsDst
,
4755 const llvm::Twine
&Name
= "");
4758 llvm::MDNode
*getRangeForLoadFromType(QualType Ty
);
4759 void EmitReturnOfRValue(RValue RV
, QualType Ty
);
4761 void deferPlaceholderReplacement(llvm::Instruction
*Old
, llvm::Value
*New
);
4763 llvm::SmallVector
<std::pair
<llvm::WeakTrackingVH
, llvm::Value
*>, 4>
4764 DeferredReplacements
;
4766 /// Set the address of a local variable.
4767 void setAddrOfLocalVar(const VarDecl
*VD
, Address Addr
) {
4768 assert(!LocalDeclMap
.count(VD
) && "Decl already exists in LocalDeclMap!");
4769 LocalDeclMap
.insert({VD
, Addr
});
4772 /// ExpandTypeFromArgs - Reconstruct a structure of type \arg Ty
4773 /// from function arguments into \arg Dst. See ABIArgInfo::Expand.
4775 /// \param AI - The first function argument of the expansion.
4776 void ExpandTypeFromArgs(QualType Ty
, LValue Dst
,
4777 llvm::Function::arg_iterator
&AI
);
4779 /// ExpandTypeToArgs - Expand an CallArg \arg Arg, with the LLVM type for \arg
4780 /// Ty, into individual arguments on the provided vector \arg IRCallArgs,
4781 /// starting at index \arg IRCallArgPos. See ABIArgInfo::Expand.
4782 void ExpandTypeToArgs(QualType Ty
, CallArg Arg
, llvm::FunctionType
*IRFuncTy
,
4783 SmallVectorImpl
<llvm::Value
*> &IRCallArgs
,
4784 unsigned &IRCallArgPos
);
4786 std::pair
<llvm::Value
*, llvm::Type
*>
4787 EmitAsmInput(const TargetInfo::ConstraintInfo
&Info
, const Expr
*InputExpr
,
4788 std::string
&ConstraintStr
);
4790 std::pair
<llvm::Value
*, llvm::Type
*>
4791 EmitAsmInputLValue(const TargetInfo::ConstraintInfo
&Info
, LValue InputValue
,
4792 QualType InputType
, std::string
&ConstraintStr
,
4793 SourceLocation Loc
);
4795 /// Attempts to statically evaluate the object size of E. If that
4796 /// fails, emits code to figure the size of E out for us. This is
4797 /// pass_object_size aware.
4799 /// If EmittedExpr is non-null, this will use that instead of re-emitting E.
4800 llvm::Value
*evaluateOrEmitBuiltinObjectSize(const Expr
*E
, unsigned Type
,
4801 llvm::IntegerType
*ResType
,
4802 llvm::Value
*EmittedE
,
4805 /// Emits the size of E, as required by __builtin_object_size. This
4806 /// function is aware of pass_object_size parameters, and will act accordingly
4807 /// if E is a parameter with the pass_object_size attribute.
4808 llvm::Value
*emitBuiltinObjectSize(const Expr
*E
, unsigned Type
,
4809 llvm::IntegerType
*ResType
,
4810 llvm::Value
*EmittedE
,
4813 void emitZeroOrPatternForAutoVarInit(QualType type
, const VarDecl
&D
,
4817 enum class EvaluationOrder
{
4818 ///! No language constraints on evaluation order.
4820 ///! Language semantics require left-to-right evaluation.
4822 ///! Language semantics require right-to-left evaluation.
4826 // Wrapper for function prototype sources. Wraps either a FunctionProtoType or
4827 // an ObjCMethodDecl.
4828 struct PrototypeWrapper
{
4829 llvm::PointerUnion
<const FunctionProtoType
*, const ObjCMethodDecl
*> P
;
4831 PrototypeWrapper(const FunctionProtoType
*FT
) : P(FT
) {}
4832 PrototypeWrapper(const ObjCMethodDecl
*MD
) : P(MD
) {}
4835 void EmitCallArgs(CallArgList
&Args
, PrototypeWrapper Prototype
,
4836 llvm::iterator_range
<CallExpr::const_arg_iterator
> ArgRange
,
4837 AbstractCallee AC
= AbstractCallee(),
4838 unsigned ParamsToSkip
= 0,
4839 EvaluationOrder Order
= EvaluationOrder::Default
);
4841 /// EmitPointerWithAlignment - Given an expression with a pointer type,
4842 /// emit the value and compute our best estimate of the alignment of the
4845 /// \param BaseInfo - If non-null, this will be initialized with
4846 /// information about the source of the alignment and the may-alias
4847 /// attribute. Note that this function will conservatively fall back on
4848 /// the type when it doesn't recognize the expression and may-alias will
4849 /// be set to false.
4851 /// One reasonable way to use this information is when there's a language
4852 /// guarantee that the pointer must be aligned to some stricter value, and
4853 /// we're simply trying to ensure that sufficiently obvious uses of under-
4854 /// aligned objects don't get miscompiled; for example, a placement new
4855 /// into the address of a local variable. In such a case, it's quite
4856 /// reasonable to just ignore the returned alignment when it isn't from an
4857 /// explicit source.
4859 EmitPointerWithAlignment(const Expr
*Addr
, LValueBaseInfo
*BaseInfo
= nullptr,
4860 TBAAAccessInfo
*TBAAInfo
= nullptr,
4861 KnownNonNull_t IsKnownNonNull
= NotKnownNonNull
);
4863 /// If \p E references a parameter with pass_object_size info or a constant
4864 /// array size modifier, emit the object size divided by the size of \p EltTy.
4865 /// Otherwise return null.
4866 llvm::Value
*LoadPassedObjectSize(const Expr
*E
, QualType EltTy
);
4868 void EmitSanitizerStatReport(llvm::SanitizerStatKind SSK
);
4870 struct MultiVersionResolverOption
{
4871 llvm::Function
*Function
;
4873 StringRef Architecture
;
4874 llvm::SmallVector
<StringRef
, 8> Features
;
4876 Conds(StringRef Arch
, ArrayRef
<StringRef
> Feats
)
4877 : Architecture(Arch
), Features(Feats
.begin(), Feats
.end()) {}
4880 MultiVersionResolverOption(llvm::Function
*F
, StringRef Arch
,
4881 ArrayRef
<StringRef
> Feats
)
4882 : Function(F
), Conditions(Arch
, Feats
) {}
4885 // Emits the body of a multiversion function's resolver. Assumes that the
4886 // options are already sorted in the proper order, with the 'default' option
4887 // last (if it exists).
4888 void EmitMultiVersionResolver(llvm::Function
*Resolver
,
4889 ArrayRef
<MultiVersionResolverOption
> Options
);
4891 EmitX86MultiVersionResolver(llvm::Function
*Resolver
,
4892 ArrayRef
<MultiVersionResolverOption
> Options
);
4894 EmitAArch64MultiVersionResolver(llvm::Function
*Resolver
,
4895 ArrayRef
<MultiVersionResolverOption
> Options
);
4898 QualType
getVarArgType(const Expr
*Arg
);
4900 void EmitDeclMetadata();
4902 BlockByrefHelpers
*buildByrefHelpers(llvm::StructType
&byrefType
,
4903 const AutoVarEmission
&emission
);
4905 void AddObjCARCExceptionMetadata(llvm::Instruction
*Inst
);
4907 llvm::Value
*GetValueForARMHint(unsigned BuiltinID
);
4908 llvm::Value
*EmitX86CpuIs(const CallExpr
*E
);
4909 llvm::Value
*EmitX86CpuIs(StringRef CPUStr
);
4910 llvm::Value
*EmitX86CpuSupports(const CallExpr
*E
);
4911 llvm::Value
*EmitX86CpuSupports(ArrayRef
<StringRef
> FeatureStrs
);
4912 llvm::Value
*EmitX86CpuSupports(std::array
<uint32_t, 4> FeatureMask
);
4913 llvm::Value
*EmitX86CpuInit();
4914 llvm::Value
*FormX86ResolverCondition(const MultiVersionResolverOption
&RO
);
4915 llvm::Value
*EmitAArch64CpuInit();
4917 FormAArch64ResolverCondition(const MultiVersionResolverOption
&RO
);
4918 llvm::Value
*EmitAArch64CpuSupports(ArrayRef
<StringRef
> FeatureStrs
);
4922 inline DominatingLLVMValue::saved_type
4923 DominatingLLVMValue::save(CodeGenFunction
&CGF
, llvm::Value
*value
) {
4924 if (!needsSaving(value
)) return saved_type(value
, false);
4926 // Otherwise, we need an alloca.
4927 auto align
= CharUnits::fromQuantity(
4928 CGF
.CGM
.getDataLayout().getPrefTypeAlign(value
->getType()));
4930 CGF
.CreateTempAlloca(value
->getType(), align
, "cond-cleanup.save");
4931 CGF
.Builder
.CreateStore(value
, alloca
);
4933 return saved_type(alloca
.getPointer(), true);
4936 inline llvm::Value
*DominatingLLVMValue::restore(CodeGenFunction
&CGF
,
4938 // If the value says it wasn't saved, trust that it's still dominating.
4939 if (!value
.getInt()) return value
.getPointer();
4941 // Otherwise, it should be an alloca instruction, as set up in save().
4942 auto alloca
= cast
<llvm::AllocaInst
>(value
.getPointer());
4943 return CGF
.Builder
.CreateAlignedLoad(alloca
->getAllocatedType(), alloca
,
4944 alloca
->getAlign());
4947 } // end namespace CodeGen
4949 // Map the LangOption for floating point exception behavior into
4950 // the corresponding enum in the IR.
4951 llvm::fp::ExceptionBehavior
4952 ToConstrainedExceptMD(LangOptions::FPExceptionModeKind Kind
);
4953 } // end namespace clang