1f22ef01cSRoman Divacky //===--- CGExpr.cpp - Emit LLVM Code from Expressions ---------------------===//
2f22ef01cSRoman Divacky //
3f22ef01cSRoman Divacky //                     The LLVM Compiler Infrastructure
4f22ef01cSRoman Divacky //
5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source
6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details.
7f22ef01cSRoman Divacky //
8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
9f22ef01cSRoman Divacky //
10f22ef01cSRoman Divacky // This contains code to emit Expr nodes as LLVM code.
11f22ef01cSRoman Divacky //
12f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
13f22ef01cSRoman Divacky 
14e580952dSDimitry Andric #include "CGCXXABI.h"
15139f7f9bSDimitry Andric #include "CGCall.h"
16e7145dcbSDimitry Andric #include "CGCleanup.h"
173b0f4066SDimitry Andric #include "CGDebugInfo.h"
18f22ef01cSRoman Divacky #include "CGObjCRuntime.h"
1939d628a0SDimitry Andric #include "CGOpenMPRuntime.h"
20139f7f9bSDimitry Andric #include "CGRecordLayout.h"
21e7145dcbSDimitry Andric #include "CodeGenFunction.h"
22139f7f9bSDimitry Andric #include "CodeGenModule.h"
239a199699SDimitry Andric #include "ConstantEmitter.h"
246122f3e6SDimitry Andric #include "TargetInfo.h"
25f22ef01cSRoman Divacky #include "clang/AST/ASTContext.h"
2659d1ed5bSDimitry Andric #include "clang/AST/Attr.h"
2739d628a0SDimitry Andric #include "clang/AST/DeclObjC.h"
2844290647SDimitry Andric #include "clang/AST/NSAPI.h"
29ffd1746dSEd Schouten #include "clang/Frontend/CodeGenOptions.h"
303861d79fSDimitry Andric #include "llvm/ADT/Hashing.h"
3139d628a0SDimitry Andric #include "llvm/ADT/StringExtras.h"
32139f7f9bSDimitry Andric #include "llvm/IR/DataLayout.h"
33139f7f9bSDimitry Andric #include "llvm/IR/Intrinsics.h"
34139f7f9bSDimitry Andric #include "llvm/IR/LLVMContext.h"
35139f7f9bSDimitry Andric #include "llvm/IR/MDBuilder.h"
36139f7f9bSDimitry Andric #include "llvm/Support/ConvertUTF.h"
3733956c43SDimitry Andric #include "llvm/Support/MathExtras.h"
38e7145dcbSDimitry Andric #include "llvm/Support/Path.h"
39e7145dcbSDimitry Andric #include "llvm/Transforms/Utils/SanitizerStats.h"
40139f7f9bSDimitry Andric 
4144290647SDimitry Andric #include <string>
4244290647SDimitry Andric 
43f22ef01cSRoman Divacky using namespace clang;
44f22ef01cSRoman Divacky using namespace CodeGen;
45f22ef01cSRoman Divacky 
46f22ef01cSRoman Divacky //===--------------------------------------------------------------------===//
47f22ef01cSRoman Divacky //                        Miscellaneous Helper Methods
48f22ef01cSRoman Divacky //===--------------------------------------------------------------------===//
49f22ef01cSRoman Divacky 
502754fe60SDimitry Andric llvm::Value *CodeGenFunction::EmitCastToVoidPtr(llvm::Value *value) {
512754fe60SDimitry Andric   unsigned addressSpace =
522754fe60SDimitry Andric       cast<llvm::PointerType>(value->getType())->getAddressSpace();
532754fe60SDimitry Andric 
546122f3e6SDimitry Andric   llvm::PointerType *destType = Int8PtrTy;
552754fe60SDimitry Andric   if (addressSpace)
562754fe60SDimitry Andric     destType = llvm::Type::getInt8PtrTy(getLLVMContext(), addressSpace);
572754fe60SDimitry Andric 
582754fe60SDimitry Andric   if (value->getType() == destType) return value;
592754fe60SDimitry Andric   return Builder.CreateBitCast(value, destType);
602754fe60SDimitry Andric }
612754fe60SDimitry Andric 
62f22ef01cSRoman Divacky /// CreateTempAlloca - This creates a alloca and inserts it into the entry
63f22ef01cSRoman Divacky /// block.
640623d748SDimitry Andric Address CodeGenFunction::CreateTempAlloca(llvm::Type *Ty, CharUnits Align,
65edd7eaddSDimitry Andric                                           const Twine &Name,
66edd7eaddSDimitry Andric                                           llvm::Value *ArraySize,
67edd7eaddSDimitry Andric                                           bool CastToDefaultAddrSpace) {
68edd7eaddSDimitry Andric   auto Alloca = CreateTempAlloca(Ty, Name, ArraySize);
690623d748SDimitry Andric   Alloca->setAlignment(Align.getQuantity());
70edd7eaddSDimitry Andric   llvm::Value *V = Alloca;
71edd7eaddSDimitry Andric   // Alloca always returns a pointer in alloca address space, which may
72edd7eaddSDimitry Andric   // be different from the type defined by the language. For example,
73edd7eaddSDimitry Andric   // in C++ the auto variables are in the default address space. Therefore
74edd7eaddSDimitry Andric   // cast alloca to the default address space when necessary.
75edd7eaddSDimitry Andric   if (CastToDefaultAddrSpace && getASTAllocaAddressSpace() != LangAS::Default) {
76edd7eaddSDimitry Andric     auto DestAddrSpace = getContext().getTargetAddressSpace(LangAS::Default);
779a199699SDimitry Andric     llvm::IRBuilderBase::InsertPointGuard IPG(Builder);
789a199699SDimitry Andric     // When ArraySize is nullptr, alloca is inserted at AllocaInsertPt,
799a199699SDimitry Andric     // otherwise alloca is inserted at the current insertion point of the
809a199699SDimitry Andric     // builder.
819a199699SDimitry Andric     if (!ArraySize)
82b40b48b8SDimitry Andric       Builder.SetInsertPoint(AllocaInsertPt);
83edd7eaddSDimitry Andric     V = getTargetHooks().performAddrSpaceCast(
84edd7eaddSDimitry Andric         *this, V, getASTAllocaAddressSpace(), LangAS::Default,
85edd7eaddSDimitry Andric         Ty->getPointerTo(DestAddrSpace), /*non-null*/ true);
860623d748SDimitry Andric   }
870623d748SDimitry Andric 
88edd7eaddSDimitry Andric   return Address(V, Align);
89edd7eaddSDimitry Andric }
90edd7eaddSDimitry Andric 
91edd7eaddSDimitry Andric /// CreateTempAlloca - This creates an alloca and inserts it into the entry
92edd7eaddSDimitry Andric /// block if \p ArraySize is nullptr, otherwise inserts it at the current
93edd7eaddSDimitry Andric /// insertion point of the builder.
946122f3e6SDimitry Andric llvm::AllocaInst *CodeGenFunction::CreateTempAlloca(llvm::Type *Ty,
95edd7eaddSDimitry Andric                                                     const Twine &Name,
96edd7eaddSDimitry Andric                                                     llvm::Value *ArraySize) {
97edd7eaddSDimitry Andric   if (ArraySize)
98edd7eaddSDimitry Andric     return Builder.CreateAlloca(Ty, ArraySize, Name);
9920e90f04SDimitry Andric   return new llvm::AllocaInst(Ty, CGM.getDataLayout().getAllocaAddrSpace(),
100edd7eaddSDimitry Andric                               ArraySize, Name, AllocaInsertPt);
101f22ef01cSRoman Divacky }
102f22ef01cSRoman Divacky 
1030623d748SDimitry Andric /// CreateDefaultAlignTempAlloca - This creates an alloca with the
1040623d748SDimitry Andric /// default alignment of the corresponding LLVM type, which is *not*
1050623d748SDimitry Andric /// guaranteed to be related in any way to the expected alignment of
1060623d748SDimitry Andric /// an AST type that might have been lowered to Ty.
1070623d748SDimitry Andric Address CodeGenFunction::CreateDefaultAlignTempAlloca(llvm::Type *Ty,
1080623d748SDimitry Andric                                                       const Twine &Name) {
1090623d748SDimitry Andric   CharUnits Align =
1100623d748SDimitry Andric     CharUnits::fromQuantity(CGM.getDataLayout().getABITypeAlignment(Ty));
1110623d748SDimitry Andric   return CreateTempAlloca(Ty, Align, Name);
1120623d748SDimitry Andric }
1130623d748SDimitry Andric 
1140623d748SDimitry Andric void CodeGenFunction::InitTempAlloca(Address Var, llvm::Value *Init) {
1150623d748SDimitry Andric   assert(isa<llvm::AllocaInst>(Var.getPointer()));
1160623d748SDimitry Andric   auto *Store = new llvm::StoreInst(Init, Var.getPointer());
1170623d748SDimitry Andric   Store->setAlignment(Var.getAlignment().getQuantity());
118f22ef01cSRoman Divacky   llvm::BasicBlock *Block = AllocaInsertPt->getParent();
1190623d748SDimitry Andric   Block->getInstList().insertAfter(AllocaInsertPt->getIterator(), Store);
120f22ef01cSRoman Divacky }
121f22ef01cSRoman Divacky 
1220623d748SDimitry Andric Address CodeGenFunction::CreateIRTemp(QualType Ty, const Twine &Name) {
123f22ef01cSRoman Divacky   CharUnits Align = getContext().getTypeAlignInChars(Ty);
1240623d748SDimitry Andric   return CreateTempAlloca(ConvertType(Ty), Align, Name);
125f22ef01cSRoman Divacky }
126f22ef01cSRoman Divacky 
127edd7eaddSDimitry Andric Address CodeGenFunction::CreateMemTemp(QualType Ty, const Twine &Name,
128edd7eaddSDimitry Andric                                        bool CastToDefaultAddrSpace) {
129f22ef01cSRoman Divacky   // FIXME: Should we prefer the preferred type alignment here?
130edd7eaddSDimitry Andric   return CreateMemTemp(Ty, getContext().getTypeAlignInChars(Ty), Name,
131edd7eaddSDimitry Andric                        CastToDefaultAddrSpace);
1320623d748SDimitry Andric }
1330623d748SDimitry Andric 
1340623d748SDimitry Andric Address CodeGenFunction::CreateMemTemp(QualType Ty, CharUnits Align,
135edd7eaddSDimitry Andric                                        const Twine &Name,
136edd7eaddSDimitry Andric                                        bool CastToDefaultAddrSpace) {
137edd7eaddSDimitry Andric   return CreateTempAlloca(ConvertTypeForMem(Ty), Align, Name, nullptr,
138edd7eaddSDimitry Andric                           CastToDefaultAddrSpace);
139f22ef01cSRoman Divacky }
140f22ef01cSRoman Divacky 
141f22ef01cSRoman Divacky /// EvaluateExprAsBool - Perform the usual unary conversions on the specified
142f22ef01cSRoman Divacky /// expression and compare the result against zero, returning an Int1Ty value.
143f22ef01cSRoman Divacky llvm::Value *CodeGenFunction::EvaluateExprAsBool(const Expr *E) {
14459d1ed5bSDimitry Andric   PGO.setCurrentStmt(E);
145e580952dSDimitry Andric   if (const MemberPointerType *MPT = E->getType()->getAs<MemberPointerType>()) {
146e580952dSDimitry Andric     llvm::Value *MemPtr = EmitScalarExpr(E);
1472754fe60SDimitry Andric     return CGM.getCXXABI().EmitMemberPointerIsNotNull(*this, MemPtr, MPT);
148f22ef01cSRoman Divacky   }
149e580952dSDimitry Andric 
150e580952dSDimitry Andric   QualType BoolTy = getContext().BoolTy;
1510623d748SDimitry Andric   SourceLocation Loc = E->getExprLoc();
152f22ef01cSRoman Divacky   if (!E->getType()->isAnyComplexType())
1530623d748SDimitry Andric     return EmitScalarConversion(EmitScalarExpr(E), E->getType(), BoolTy, Loc);
154f22ef01cSRoman Divacky 
1550623d748SDimitry Andric   return EmitComplexToScalarConversion(EmitComplexExpr(E), E->getType(), BoolTy,
1560623d748SDimitry Andric                                        Loc);
157f22ef01cSRoman Divacky }
158f22ef01cSRoman Divacky 
1592754fe60SDimitry Andric /// EmitIgnoredExpr - Emit code to compute the specified expression,
1602754fe60SDimitry Andric /// ignoring the result.
1612754fe60SDimitry Andric void CodeGenFunction::EmitIgnoredExpr(const Expr *E) {
1622754fe60SDimitry Andric   if (E->isRValue())
1632754fe60SDimitry Andric     return (void) EmitAnyExpr(E, AggValueSlot::ignored(), true);
1642754fe60SDimitry Andric 
1652754fe60SDimitry Andric   // Just emit it as an l-value and drop the result.
1662754fe60SDimitry Andric   EmitLValue(E);
1672754fe60SDimitry Andric }
1682754fe60SDimitry Andric 
1692754fe60SDimitry Andric /// EmitAnyExpr - Emit code to compute the specified expression which
1702754fe60SDimitry Andric /// can have any type.  The result is returned as an RValue struct.
1712754fe60SDimitry Andric /// If this is an aggregate expression, AggSlot indicates where the
172f22ef01cSRoman Divacky /// result should be returned.
1737ae0e2c9SDimitry Andric RValue CodeGenFunction::EmitAnyExpr(const Expr *E,
1747ae0e2c9SDimitry Andric                                     AggValueSlot aggSlot,
1757ae0e2c9SDimitry Andric                                     bool ignoreResult) {
176139f7f9bSDimitry Andric   switch (getEvaluationKind(E->getType())) {
177139f7f9bSDimitry Andric   case TEK_Scalar:
1787ae0e2c9SDimitry Andric     return RValue::get(EmitScalarExpr(E, ignoreResult));
179139f7f9bSDimitry Andric   case TEK_Complex:
1807ae0e2c9SDimitry Andric     return RValue::getComplex(EmitComplexExpr(E, ignoreResult, ignoreResult));
181139f7f9bSDimitry Andric   case TEK_Aggregate:
1827ae0e2c9SDimitry Andric     if (!ignoreResult && aggSlot.isIgnored())
1837ae0e2c9SDimitry Andric       aggSlot = CreateAggTemp(E->getType(), "agg-temp");
1847ae0e2c9SDimitry Andric     EmitAggExpr(E, aggSlot);
1857ae0e2c9SDimitry Andric     return aggSlot.asRValue();
186f22ef01cSRoman Divacky   }
187139f7f9bSDimitry Andric   llvm_unreachable("bad evaluation kind");
188139f7f9bSDimitry Andric }
189f22ef01cSRoman Divacky 
190f22ef01cSRoman Divacky /// EmitAnyExprToTemp - Similary to EmitAnyExpr(), however, the result will
191f22ef01cSRoman Divacky /// always be accessible even if no aggregate location is provided.
1922754fe60SDimitry Andric RValue CodeGenFunction::EmitAnyExprToTemp(const Expr *E) {
1932754fe60SDimitry Andric   AggValueSlot AggSlot = AggValueSlot::ignored();
194f22ef01cSRoman Divacky 
195139f7f9bSDimitry Andric   if (hasAggregateEvaluationKind(E->getType()))
1962754fe60SDimitry Andric     AggSlot = CreateAggTemp(E->getType(), "agg.tmp");
1972754fe60SDimitry Andric   return EmitAnyExpr(E, AggSlot);
198f22ef01cSRoman Divacky }
199f22ef01cSRoman Divacky 
200f22ef01cSRoman Divacky /// EmitAnyExprToMem - Evaluate an expression into a given memory
201f22ef01cSRoman Divacky /// location.
202f22ef01cSRoman Divacky void CodeGenFunction::EmitAnyExprToMem(const Expr *E,
2030623d748SDimitry Andric                                        Address Location,
20417a519f9SDimitry Andric                                        Qualifiers Quals,
205f22ef01cSRoman Divacky                                        bool IsInit) {
206dff0c46cSDimitry Andric   // FIXME: This function should take an LValue as an argument.
207139f7f9bSDimitry Andric   switch (getEvaluationKind(E->getType())) {
208139f7f9bSDimitry Andric   case TEK_Complex:
2090623d748SDimitry Andric     EmitComplexExprIntoLValue(E, MakeAddrLValue(Location, E->getType()),
210139f7f9bSDimitry Andric                               /*isInit*/ false);
211139f7f9bSDimitry Andric     return;
212139f7f9bSDimitry Andric 
213139f7f9bSDimitry Andric   case TEK_Aggregate: {
2140623d748SDimitry Andric     EmitAggExpr(E, AggValueSlot::forAddr(Location, Quals,
2156122f3e6SDimitry Andric                                          AggValueSlot::IsDestructed_t(IsInit),
2166122f3e6SDimitry Andric                                          AggValueSlot::DoesNotNeedGCBarriers,
2176122f3e6SDimitry Andric                                          AggValueSlot::IsAliased_t(!IsInit)));
218139f7f9bSDimitry Andric     return;
219139f7f9bSDimitry Andric   }
220139f7f9bSDimitry Andric 
221139f7f9bSDimitry Andric   case TEK_Scalar: {
222f22ef01cSRoman Divacky     RValue RV = RValue::get(EmitScalarExpr(E, /*Ignore*/ false));
223e580952dSDimitry Andric     LValue LV = MakeAddrLValue(Location, E->getType());
22417a519f9SDimitry Andric     EmitStoreThroughLValue(RV, LV);
225139f7f9bSDimitry Andric     return;
226f22ef01cSRoman Divacky   }
227f22ef01cSRoman Divacky   }
228139f7f9bSDimitry Andric   llvm_unreachable("bad evaluation kind");
229139f7f9bSDimitry Andric }
230f22ef01cSRoman Divacky 
231f785676fSDimitry Andric static void
232f785676fSDimitry Andric pushTemporaryCleanup(CodeGenFunction &CGF, const MaterializeTemporaryExpr *M,
2330623d748SDimitry Andric                      const Expr *E, Address ReferenceTemporary) {
23417a519f9SDimitry Andric   // Objective-C++ ARC:
23517a519f9SDimitry Andric   //   If we are binding a reference to a temporary that has ownership, we
23617a519f9SDimitry Andric   //   need to perform retain/release operations on the temporary.
237f785676fSDimitry Andric   //
238f785676fSDimitry Andric   // FIXME: This should be looking at E, not M.
2390623d748SDimitry Andric   if (auto Lifetime = M->getType().getObjCLifetime()) {
2400623d748SDimitry Andric     switch (Lifetime) {
24117a519f9SDimitry Andric     case Qualifiers::OCL_None:
24217a519f9SDimitry Andric     case Qualifiers::OCL_ExplicitNone:
243f785676fSDimitry Andric       // Carry on to normal cleanup handling.
244f785676fSDimitry Andric       break;
245f785676fSDimitry Andric 
24617a519f9SDimitry Andric     case Qualifiers::OCL_Autoreleasing:
247f785676fSDimitry Andric       // Nothing to do; cleaned up by an autorelease pool.
248f785676fSDimitry Andric       return;
24917a519f9SDimitry Andric 
250f785676fSDimitry Andric     case Qualifiers::OCL_Strong:
25117a519f9SDimitry Andric     case Qualifiers::OCL_Weak:
252f785676fSDimitry Andric       switch (StorageDuration Duration = M->getStorageDuration()) {
253f785676fSDimitry Andric       case SD_Static:
254f785676fSDimitry Andric         // Note: we intentionally do not register a cleanup to release
255f785676fSDimitry Andric         // the object on program termination.
256f785676fSDimitry Andric         return;
257f785676fSDimitry Andric 
258f785676fSDimitry Andric       case SD_Thread:
259f785676fSDimitry Andric         // FIXME: We should probably register a cleanup in this case.
260f785676fSDimitry Andric         return;
261f785676fSDimitry Andric 
262f785676fSDimitry Andric       case SD_Automatic:
263f785676fSDimitry Andric       case SD_FullExpression:
264f785676fSDimitry Andric         CodeGenFunction::Destroyer *Destroy;
265f785676fSDimitry Andric         CleanupKind CleanupKind;
266f785676fSDimitry Andric         if (Lifetime == Qualifiers::OCL_Strong) {
267f785676fSDimitry Andric           const ValueDecl *VD = M->getExtendingDecl();
268f785676fSDimitry Andric           bool Precise =
269f785676fSDimitry Andric               VD && isa<VarDecl>(VD) && VD->hasAttr<ObjCPreciseLifetimeAttr>();
270f785676fSDimitry Andric           CleanupKind = CGF.getARCCleanupKind();
271f785676fSDimitry Andric           Destroy = Precise ? &CodeGenFunction::destroyARCStrongPrecise
272f785676fSDimitry Andric                             : &CodeGenFunction::destroyARCStrongImprecise;
273f785676fSDimitry Andric         } else {
274f785676fSDimitry Andric           // __weak objects always get EH cleanups; otherwise, exceptions
275f785676fSDimitry Andric           // could cause really nasty crashes instead of mere leaks.
276f785676fSDimitry Andric           CleanupKind = NormalAndEHCleanup;
277f785676fSDimitry Andric           Destroy = &CodeGenFunction::destroyARCWeak;
278f785676fSDimitry Andric         }
279f785676fSDimitry Andric         if (Duration == SD_FullExpression)
280f785676fSDimitry Andric           CGF.pushDestroy(CleanupKind, ReferenceTemporary,
2810623d748SDimitry Andric                           M->getType(), *Destroy,
282f785676fSDimitry Andric                           CleanupKind & EHCleanup);
283f785676fSDimitry Andric         else
284f785676fSDimitry Andric           CGF.pushLifetimeExtendedDestroy(CleanupKind, ReferenceTemporary,
2850623d748SDimitry Andric                                           M->getType(),
286f785676fSDimitry Andric                                           *Destroy, CleanupKind & EHCleanup);
287f785676fSDimitry Andric         return;
288f785676fSDimitry Andric 
289f785676fSDimitry Andric       case SD_Dynamic:
290f785676fSDimitry Andric         llvm_unreachable("temporary cannot have dynamic storage duration");
291f785676fSDimitry Andric       }
292f785676fSDimitry Andric       llvm_unreachable("unknown storage duration");
293f785676fSDimitry Andric     }
29417a519f9SDimitry Andric   }
29517a519f9SDimitry Andric 
29659d1ed5bSDimitry Andric   CXXDestructorDecl *ReferenceTemporaryDtor = nullptr;
297f785676fSDimitry Andric   if (const RecordType *RT =
298139f7f9bSDimitry Andric           E->getType()->getBaseElementTypeUnsafe()->getAs<RecordType>()) {
299284c1978SDimitry Andric     // Get the destructor for the reference temporary.
30059d1ed5bSDimitry Andric     auto *ClassDecl = cast<CXXRecordDecl>(RT->getDecl());
301ffd1746dSEd Schouten     if (!ClassDecl->hasTrivialDestructor())
302ffd1746dSEd Schouten       ReferenceTemporaryDtor = ClassDecl->getDestructor();
303f22ef01cSRoman Divacky   }
304f785676fSDimitry Andric 
305f785676fSDimitry Andric   if (!ReferenceTemporaryDtor)
306f785676fSDimitry Andric     return;
307f785676fSDimitry Andric 
308f785676fSDimitry Andric   // Call the destructor for the temporary.
309f785676fSDimitry Andric   switch (M->getStorageDuration()) {
310f785676fSDimitry Andric   case SD_Static:
311f785676fSDimitry Andric   case SD_Thread: {
312f785676fSDimitry Andric     llvm::Constant *CleanupFn;
313f785676fSDimitry Andric     llvm::Constant *CleanupArg;
314f785676fSDimitry Andric     if (E->getType()->isArrayType()) {
315f785676fSDimitry Andric       CleanupFn = CodeGenFunction(CGF.CGM).generateDestroyHelper(
3160623d748SDimitry Andric           ReferenceTemporary, E->getType(),
317f785676fSDimitry Andric           CodeGenFunction::destroyCXXObject, CGF.getLangOpts().Exceptions,
318f785676fSDimitry Andric           dyn_cast_or_null<VarDecl>(M->getExtendingDecl()));
319f785676fSDimitry Andric       CleanupArg = llvm::Constant::getNullValue(CGF.Int8PtrTy);
320f785676fSDimitry Andric     } else {
32139d628a0SDimitry Andric       CleanupFn = CGF.CGM.getAddrOfCXXStructor(ReferenceTemporaryDtor,
32239d628a0SDimitry Andric                                                StructorType::Complete);
3230623d748SDimitry Andric       CleanupArg = cast<llvm::Constant>(ReferenceTemporary.getPointer());
324f785676fSDimitry Andric     }
325f785676fSDimitry Andric     CGF.CGM.getCXXABI().registerGlobalDtor(
326f785676fSDimitry Andric         CGF, *cast<VarDecl>(M->getExtendingDecl()), CleanupFn, CleanupArg);
327f785676fSDimitry Andric     break;
328f22ef01cSRoman Divacky   }
329f22ef01cSRoman Divacky 
330f785676fSDimitry Andric   case SD_FullExpression:
331f785676fSDimitry Andric     CGF.pushDestroy(NormalAndEHCleanup, ReferenceTemporary, E->getType(),
332f785676fSDimitry Andric                     CodeGenFunction::destroyCXXObject,
333f785676fSDimitry Andric                     CGF.getLangOpts().Exceptions);
334f785676fSDimitry Andric     break;
33517a519f9SDimitry Andric 
336f785676fSDimitry Andric   case SD_Automatic:
337f785676fSDimitry Andric     CGF.pushLifetimeExtendedDestroy(NormalAndEHCleanup,
338f785676fSDimitry Andric                                     ReferenceTemporary, E->getType(),
339f785676fSDimitry Andric                                     CodeGenFunction::destroyCXXObject,
340f785676fSDimitry Andric                                     CGF.getLangOpts().Exceptions);
341f785676fSDimitry Andric     break;
342f785676fSDimitry Andric 
343f785676fSDimitry Andric   case SD_Dynamic:
344f785676fSDimitry Andric     llvm_unreachable("temporary cannot have dynamic storage duration");
345f785676fSDimitry Andric   }
346f785676fSDimitry Andric }
347f785676fSDimitry Andric 
348c4394386SDimitry Andric static Address createReferenceTemporary(CodeGenFunction &CGF,
349c4394386SDimitry Andric                                         const MaterializeTemporaryExpr *M,
350c4394386SDimitry Andric                                         const Expr *Inner) {
351c4394386SDimitry Andric   auto &TCG = CGF.getTargetHooks();
352f785676fSDimitry Andric   switch (M->getStorageDuration()) {
353f785676fSDimitry Andric   case SD_FullExpression:
35433956c43SDimitry Andric   case SD_Automatic: {
35533956c43SDimitry Andric     // If we have a constant temporary array or record try to promote it into a
35633956c43SDimitry Andric     // constant global under the same rules a normal constant would've been
35733956c43SDimitry Andric     // promoted. This is easier on the optimizer and generally emits fewer
35833956c43SDimitry Andric     // instructions.
35933956c43SDimitry Andric     QualType Ty = Inner->getType();
36033956c43SDimitry Andric     if (CGF.CGM.getCodeGenOpts().MergeAllConstants &&
36133956c43SDimitry Andric         (Ty->isArrayType() || Ty->isRecordType()) &&
36233956c43SDimitry Andric         CGF.CGM.isTypeConstant(Ty, true))
3639a199699SDimitry Andric       if (auto Init = ConstantEmitter(CGF).tryEmitAbstract(Inner, Ty)) {
364c4394386SDimitry Andric         if (auto AddrSpace = CGF.getTarget().getConstantAddressSpace()) {
365c4394386SDimitry Andric           auto AS = AddrSpace.getValue();
36633956c43SDimitry Andric           auto *GV = new llvm::GlobalVariable(
36733956c43SDimitry Andric               CGF.CGM.getModule(), Init->getType(), /*isConstant=*/true,
368c4394386SDimitry Andric               llvm::GlobalValue::PrivateLinkage, Init, ".ref.tmp", nullptr,
369c4394386SDimitry Andric               llvm::GlobalValue::NotThreadLocal,
370c4394386SDimitry Andric               CGF.getContext().getTargetAddressSpace(AS));
3710623d748SDimitry Andric           CharUnits alignment = CGF.getContext().getTypeAlignInChars(Ty);
3720623d748SDimitry Andric           GV->setAlignment(alignment.getQuantity());
373c4394386SDimitry Andric           llvm::Constant *C = GV;
374c4394386SDimitry Andric           if (AS != LangAS::Default)
375c4394386SDimitry Andric             C = TCG.performAddrSpaceCast(
376c4394386SDimitry Andric                 CGF.CGM, GV, AS, LangAS::Default,
377c4394386SDimitry Andric                 GV->getValueType()->getPointerTo(
378c4394386SDimitry Andric                     CGF.getContext().getTargetAddressSpace(LangAS::Default)));
37933956c43SDimitry Andric           // FIXME: Should we put the new global into a COMDAT?
380c4394386SDimitry Andric           return Address(C, alignment);
381c4394386SDimitry Andric         }
38233956c43SDimitry Andric       }
38333956c43SDimitry Andric     return CGF.CreateMemTemp(Ty, "ref.tmp");
38433956c43SDimitry Andric   }
385f785676fSDimitry Andric   case SD_Thread:
386f785676fSDimitry Andric   case SD_Static:
387f785676fSDimitry Andric     return CGF.CGM.GetAddrOfGlobalTemporary(M, Inner);
388f785676fSDimitry Andric 
389f785676fSDimitry Andric   case SD_Dynamic:
390f785676fSDimitry Andric     llvm_unreachable("temporary can't have dynamic storage duration");
391f785676fSDimitry Andric   }
392f785676fSDimitry Andric   llvm_unreachable("unknown storage duration");
393f785676fSDimitry Andric }
394f785676fSDimitry Andric 
39539d628a0SDimitry Andric LValue CodeGenFunction::
39639d628a0SDimitry Andric EmitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *M) {
397f785676fSDimitry Andric   const Expr *E = M->GetTemporaryExpr();
398f785676fSDimitry Andric 
39939d628a0SDimitry Andric     // FIXME: ideally this would use EmitAnyExprToMem, however, we cannot do so
40039d628a0SDimitry Andric     // as that will cause the lifetime adjustment to be lost for ARC
4010623d748SDimitry Andric   auto ownership = M->getType().getObjCLifetime();
4020623d748SDimitry Andric   if (ownership != Qualifiers::OCL_None &&
4030623d748SDimitry Andric       ownership != Qualifiers::OCL_ExplicitNone) {
4040623d748SDimitry Andric     Address Object = createReferenceTemporary(*this, M, E);
4050623d748SDimitry Andric     if (auto *Var = dyn_cast<llvm::GlobalVariable>(Object.getPointer())) {
4060623d748SDimitry Andric       Object = Address(llvm::ConstantExpr::getBitCast(Var,
4070623d748SDimitry Andric                            ConvertTypeForMem(E->getType())
4080623d748SDimitry Andric                              ->getPointerTo(Object.getAddressSpace())),
4090623d748SDimitry Andric                        Object.getAlignment());
410e7145dcbSDimitry Andric 
411e7145dcbSDimitry Andric       // createReferenceTemporary will promote the temporary to a global with a
412e7145dcbSDimitry Andric       // constant initializer if it can.  It can only do this to a value of
413e7145dcbSDimitry Andric       // ARC-manageable type if the value is global and therefore "immune" to
414e7145dcbSDimitry Andric       // ref-counting operations.  Therefore we have no need to emit either a
415e7145dcbSDimitry Andric       // dynamic initialization or a cleanup and we can just return the address
416e7145dcbSDimitry Andric       // of the temporary.
417e7145dcbSDimitry Andric       if (Var->hasInitializer())
4189a199699SDimitry Andric         return MakeAddrLValue(Object, M->getType(), AlignmentSource::Decl);
419e7145dcbSDimitry Andric 
420f785676fSDimitry Andric       Var->setInitializer(CGM.EmitNullConstant(E->getType()));
421f785676fSDimitry Andric     }
4220623d748SDimitry Andric     LValue RefTempDst = MakeAddrLValue(Object, M->getType(),
4239a199699SDimitry Andric                                        AlignmentSource::Decl);
424f785676fSDimitry Andric 
42539d628a0SDimitry Andric     switch (getEvaluationKind(E->getType())) {
42639d628a0SDimitry Andric     default: llvm_unreachable("expected scalar or aggregate expression");
42739d628a0SDimitry Andric     case TEK_Scalar:
428f785676fSDimitry Andric       EmitScalarInit(E, M->getExtendingDecl(), RefTempDst, false);
42939d628a0SDimitry Andric       break;
43039d628a0SDimitry Andric     case TEK_Aggregate: {
4310623d748SDimitry Andric       EmitAggExpr(E, AggValueSlot::forAddr(Object,
43239d628a0SDimitry Andric                                            E->getType().getQualifiers(),
43339d628a0SDimitry Andric                                            AggValueSlot::IsDestructed,
43439d628a0SDimitry Andric                                            AggValueSlot::DoesNotNeedGCBarriers,
43539d628a0SDimitry Andric                                            AggValueSlot::IsNotAliased));
43639d628a0SDimitry Andric       break;
43739d628a0SDimitry Andric     }
43839d628a0SDimitry Andric     }
439f785676fSDimitry Andric 
440f785676fSDimitry Andric     pushTemporaryCleanup(*this, M, E, Object);
441f785676fSDimitry Andric     return RefTempDst;
442f785676fSDimitry Andric   }
443f785676fSDimitry Andric 
444f785676fSDimitry Andric   SmallVector<const Expr *, 2> CommaLHSs;
445f785676fSDimitry Andric   SmallVector<SubobjectAdjustment, 2> Adjustments;
446f785676fSDimitry Andric   E = E->skipRValueSubobjectAdjustments(CommaLHSs, Adjustments);
447f785676fSDimitry Andric 
44839d628a0SDimitry Andric   for (const auto &Ignored : CommaLHSs)
44939d628a0SDimitry Andric     EmitIgnoredExpr(Ignored);
450f785676fSDimitry Andric 
45159d1ed5bSDimitry Andric   if (const auto *opaque = dyn_cast<OpaqueValueExpr>(E)) {
452f785676fSDimitry Andric     if (opaque->getType()->isRecordType()) {
453f785676fSDimitry Andric       assert(Adjustments.empty());
454f785676fSDimitry Andric       return EmitOpaqueValueLValue(opaque);
455f785676fSDimitry Andric     }
456f785676fSDimitry Andric   }
457f785676fSDimitry Andric 
458f785676fSDimitry Andric   // Create and initialize the reference temporary.
4590623d748SDimitry Andric   Address Object = createReferenceTemporary(*this, M, E);
460c4394386SDimitry Andric   if (auto *Var = dyn_cast<llvm::GlobalVariable>(
461c4394386SDimitry Andric           Object.getPointer()->stripPointerCasts())) {
4620623d748SDimitry Andric     Object = Address(llvm::ConstantExpr::getBitCast(
463c4394386SDimitry Andric                          cast<llvm::Constant>(Object.getPointer()),
464c4394386SDimitry Andric                          ConvertTypeForMem(E->getType())->getPointerTo()),
4650623d748SDimitry Andric                      Object.getAlignment());
46633956c43SDimitry Andric     // If the temporary is a global and has a constant initializer or is a
46733956c43SDimitry Andric     // constant temporary that we promoted to a global, we may have already
46833956c43SDimitry Andric     // initialized it.
469f785676fSDimitry Andric     if (!Var->hasInitializer()) {
470f785676fSDimitry Andric       Var->setInitializer(CGM.EmitNullConstant(E->getType()));
471f785676fSDimitry Andric       EmitAnyExprToMem(E, Object, Qualifiers(), /*IsInit*/true);
472f785676fSDimitry Andric     }
473f785676fSDimitry Andric   } else {
474e7145dcbSDimitry Andric     switch (M->getStorageDuration()) {
475e7145dcbSDimitry Andric     case SD_Automatic:
476e7145dcbSDimitry Andric     case SD_FullExpression:
477e7145dcbSDimitry Andric       if (auto *Size = EmitLifetimeStart(
478e7145dcbSDimitry Andric               CGM.getDataLayout().getTypeAllocSize(Object.getElementType()),
479e7145dcbSDimitry Andric               Object.getPointer())) {
480e7145dcbSDimitry Andric         if (M->getStorageDuration() == SD_Automatic)
481e7145dcbSDimitry Andric           pushCleanupAfterFullExpr<CallLifetimeEnd>(NormalEHLifetimeMarker,
482e7145dcbSDimitry Andric                                                     Object, Size);
483e7145dcbSDimitry Andric         else
484e7145dcbSDimitry Andric           pushFullExprCleanup<CallLifetimeEnd>(NormalEHLifetimeMarker, Object,
485e7145dcbSDimitry Andric                                                Size);
486e7145dcbSDimitry Andric       }
487e7145dcbSDimitry Andric       break;
488e7145dcbSDimitry Andric     default:
489e7145dcbSDimitry Andric       break;
490e7145dcbSDimitry Andric     }
491f785676fSDimitry Andric     EmitAnyExprToMem(E, Object, Qualifiers(), /*IsInit*/true);
492f785676fSDimitry Andric   }
493f785676fSDimitry Andric   pushTemporaryCleanup(*this, M, E, Object);
494f785676fSDimitry Andric 
495f785676fSDimitry Andric   // Perform derived-to-base casts and/or field accesses, to get from the
496f785676fSDimitry Andric   // temporary object we created (and, potentially, for which we extended
497f785676fSDimitry Andric   // the lifetime) to the subobject we're binding the reference to.
498f22ef01cSRoman Divacky   for (unsigned I = Adjustments.size(); I != 0; --I) {
499f22ef01cSRoman Divacky     SubobjectAdjustment &Adjustment = Adjustments[I-1];
500f22ef01cSRoman Divacky     switch (Adjustment.Kind) {
501f22ef01cSRoman Divacky     case SubobjectAdjustment::DerivedToBaseAdjustment:
502ffd1746dSEd Schouten       Object =
503f785676fSDimitry Andric           GetAddressOfBaseClass(Object, Adjustment.DerivedToBase.DerivedClass,
504e580952dSDimitry Andric                                 Adjustment.DerivedToBase.BasePath->path_begin(),
505e580952dSDimitry Andric                                 Adjustment.DerivedToBase.BasePath->path_end(),
50639d628a0SDimitry Andric                                 /*NullCheckValue=*/ false, E->getExprLoc());
507f22ef01cSRoman Divacky       break;
508f22ef01cSRoman Divacky 
509f22ef01cSRoman Divacky     case SubobjectAdjustment::FieldAdjustment: {
5109a199699SDimitry Andric       LValue LV = MakeAddrLValue(Object, E->getType(), AlignmentSource::Decl);
511f785676fSDimitry Andric       LV = EmitLValueForField(LV, Adjustment.Field);
512f785676fSDimitry Andric       assert(LV.isSimple() &&
513f785676fSDimitry Andric              "materialized temporary field is not a simple lvalue");
514f22ef01cSRoman Divacky       Object = LV.getAddress();
515f22ef01cSRoman Divacky       break;
516f22ef01cSRoman Divacky     }
517f22ef01cSRoman Divacky 
5187ae0e2c9SDimitry Andric     case SubobjectAdjustment::MemberPointerAdjustment: {
519f785676fSDimitry Andric       llvm::Value *Ptr = EmitScalarExpr(Adjustment.Ptr.RHS);
5200623d748SDimitry Andric       Object = EmitCXXMemberDataPointerAddress(E, Object, Ptr,
5210623d748SDimitry Andric                                                Adjustment.Ptr.MPT);
5227ae0e2c9SDimitry Andric       break;
5237ae0e2c9SDimitry Andric     }
524f22ef01cSRoman Divacky     }
525f22ef01cSRoman Divacky   }
526f22ef01cSRoman Divacky 
5279a199699SDimitry Andric   return MakeAddrLValue(Object, M->getType(), AlignmentSource::Decl);
528f22ef01cSRoman Divacky }
529f22ef01cSRoman Divacky 
530ffd1746dSEd Schouten RValue
531f785676fSDimitry Andric CodeGenFunction::EmitReferenceBindingToExpr(const Expr *E) {
532f785676fSDimitry Andric   // Emit the expression as an lvalue.
533f785676fSDimitry Andric   LValue LV = EmitLValue(E);
534f785676fSDimitry Andric   assert(LV.isSimple());
5350623d748SDimitry Andric   llvm::Value *Value = LV.getPointer();
536f785676fSDimitry Andric 
53759d1ed5bSDimitry Andric   if (sanitizePerformTypeCheck() && !E->getType()->isFunctionType()) {
5383861d79fSDimitry Andric     // C++11 [dcl.ref]p5 (as amended by core issue 453):
5393861d79fSDimitry Andric     //   If a glvalue to which a reference is directly bound designates neither
5403861d79fSDimitry Andric     //   an existing object or function of an appropriate type nor a region of
5413861d79fSDimitry Andric     //   storage of suitable size and alignment to contain an object of the
5423861d79fSDimitry Andric     //   reference's type, the behavior is undefined.
5433861d79fSDimitry Andric     QualType Ty = E->getType();
5443861d79fSDimitry Andric     EmitTypeCheck(TCK_ReferenceBinding, E->getExprLoc(), Value, Ty);
5453861d79fSDimitry Andric   }
546ffd1746dSEd Schouten 
547ffd1746dSEd Schouten   return RValue::get(Value);
548f22ef01cSRoman Divacky }
549f22ef01cSRoman Divacky 
550f22ef01cSRoman Divacky 
551f22ef01cSRoman Divacky /// getAccessedFieldNo - Given an encoded value and a result number, return the
552f22ef01cSRoman Divacky /// input field number being accessed.
553f22ef01cSRoman Divacky unsigned CodeGenFunction::getAccessedFieldNo(unsigned Idx,
554f22ef01cSRoman Divacky                                              const llvm::Constant *Elts) {
555dff0c46cSDimitry Andric   return cast<llvm::ConstantInt>(Elts->getAggregateElement(Idx))
556dff0c46cSDimitry Andric       ->getZExtValue();
557f22ef01cSRoman Divacky }
558f22ef01cSRoman Divacky 
5593861d79fSDimitry Andric /// Emit the hash_16_bytes function from include/llvm/ADT/Hashing.h.
5603861d79fSDimitry Andric static llvm::Value *emitHash16Bytes(CGBuilderTy &Builder, llvm::Value *Low,
5613861d79fSDimitry Andric                                     llvm::Value *High) {
5623861d79fSDimitry Andric   llvm::Value *KMul = Builder.getInt64(0x9ddfea08eb382d69ULL);
5633861d79fSDimitry Andric   llvm::Value *K47 = Builder.getInt64(47);
5643861d79fSDimitry Andric   llvm::Value *A0 = Builder.CreateMul(Builder.CreateXor(Low, High), KMul);
5653861d79fSDimitry Andric   llvm::Value *A1 = Builder.CreateXor(Builder.CreateLShr(A0, K47), A0);
5663861d79fSDimitry Andric   llvm::Value *B0 = Builder.CreateMul(Builder.CreateXor(High, A1), KMul);
5673861d79fSDimitry Andric   llvm::Value *B1 = Builder.CreateXor(Builder.CreateLShr(B0, K47), B0);
5683861d79fSDimitry Andric   return Builder.CreateMul(B1, KMul);
5693861d79fSDimitry Andric }
5703861d79fSDimitry Andric 
5719a199699SDimitry Andric bool CodeGenFunction::isNullPointerAllowed(TypeCheckKind TCK) {
5729a199699SDimitry Andric   return TCK == TCK_DowncastPointer || TCK == TCK_Upcast ||
573fe4fed2eSDimitry Andric          TCK == TCK_UpcastToVirtualBase || TCK == TCK_DynamicOperation;
5749a199699SDimitry Andric }
5759a199699SDimitry Andric 
5769a199699SDimitry Andric bool CodeGenFunction::isVptrCheckRequired(TypeCheckKind TCK, QualType Ty) {
5779a199699SDimitry Andric   CXXRecordDecl *RD = Ty->getAsCXXRecordDecl();
5789a199699SDimitry Andric   return (RD && RD->hasDefinition() && RD->isDynamicClass()) &&
5799a199699SDimitry Andric          (TCK == TCK_MemberAccess || TCK == TCK_MemberCall ||
5809a199699SDimitry Andric           TCK == TCK_DowncastPointer || TCK == TCK_DowncastReference ||
581fe4fed2eSDimitry Andric           TCK == TCK_UpcastToVirtualBase || TCK == TCK_DynamicOperation);
5829a199699SDimitry Andric }
5839a199699SDimitry Andric 
58459d1ed5bSDimitry Andric bool CodeGenFunction::sanitizePerformTypeCheck() const {
58539d628a0SDimitry Andric   return SanOpts.has(SanitizerKind::Null) |
58639d628a0SDimitry Andric          SanOpts.has(SanitizerKind::Alignment) |
58739d628a0SDimitry Andric          SanOpts.has(SanitizerKind::ObjectSize) |
58839d628a0SDimitry Andric          SanOpts.has(SanitizerKind::Vptr);
58959d1ed5bSDimitry Andric }
59059d1ed5bSDimitry Andric 
5913861d79fSDimitry Andric void CodeGenFunction::EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc,
5920623d748SDimitry Andric                                     llvm::Value *Ptr, QualType Ty,
59320e90f04SDimitry Andric                                     CharUnits Alignment,
59420e90f04SDimitry Andric                                     SanitizerSet SkippedChecks) {
59559d1ed5bSDimitry Andric   if (!sanitizePerformTypeCheck())
596f22ef01cSRoman Divacky     return;
597f22ef01cSRoman Divacky 
5983861d79fSDimitry Andric   // Don't check pointers outside the default address space. The null check
5993861d79fSDimitry Andric   // isn't correct, the object-size check isn't supported by LLVM, and we can't
6003861d79fSDimitry Andric   // communicate the addresses to the runtime handler for the vptr check.
6010623d748SDimitry Andric   if (Ptr->getType()->getPointerAddressSpace())
6023861d79fSDimitry Andric     return;
603f22ef01cSRoman Divacky 
60424d58133SDimitry Andric   // Don't check pointers to volatile data. The behavior here is implementation-
60524d58133SDimitry Andric   // defined.
60624d58133SDimitry Andric   if (Ty.isVolatileQualified())
60724d58133SDimitry Andric     return;
60824d58133SDimitry Andric 
60959d1ed5bSDimitry Andric   SanitizerScope SanScope(this);
6103861d79fSDimitry Andric 
61133956c43SDimitry Andric   SmallVector<std::pair<llvm::Value *, SanitizerMask>, 3> Checks;
61259d1ed5bSDimitry Andric   llvm::BasicBlock *Done = nullptr;
61359d1ed5bSDimitry Andric 
61451690af2SDimitry Andric   // Quickly determine whether we have a pointer to an alloca. It's possible
61551690af2SDimitry Andric   // to skip null checks, and some alignment checks, for these pointers. This
61651690af2SDimitry Andric   // can reduce compile-time significantly.
61751690af2SDimitry Andric   auto PtrToAlloca =
61851690af2SDimitry Andric       dyn_cast<llvm::AllocaInst>(Ptr->stripPointerCastsNoFollowAliases());
61951690af2SDimitry Andric 
6209a199699SDimitry Andric   llvm::Value *True = llvm::ConstantInt::getTrue(getLLVMContext());
6219a199699SDimitry Andric   llvm::Value *IsNonNull = nullptr;
6229a199699SDimitry Andric   bool IsGuaranteedNonNull =
6239a199699SDimitry Andric       SkippedChecks.has(SanitizerKind::Null) || PtrToAlloca;
6249a199699SDimitry Andric   bool AllowNullPointers = isNullPointerAllowed(TCK);
62539d628a0SDimitry Andric   if ((SanOpts.has(SanitizerKind::Null) || AllowNullPointers) &&
6269a199699SDimitry Andric       !IsGuaranteedNonNull) {
6273861d79fSDimitry Andric     // The glvalue must not be an empty glvalue.
6289a199699SDimitry Andric     IsNonNull = Builder.CreateIsNotNull(Ptr);
629139f7f9bSDimitry Andric 
6306bc11b14SDimitry Andric     // The IR builder can constant-fold the null check if the pointer points to
6316bc11b14SDimitry Andric     // a constant.
6329a199699SDimitry Andric     IsGuaranteedNonNull = IsNonNull == True;
6336bc11b14SDimitry Andric 
6346bc11b14SDimitry Andric     // Skip the null check if the pointer is known to be non-null.
6359a199699SDimitry Andric     if (!IsGuaranteedNonNull) {
63639d628a0SDimitry Andric       if (AllowNullPointers) {
63739d628a0SDimitry Andric         // When performing pointer casts, it's OK if the value is null.
638139f7f9bSDimitry Andric         // Skip the remaining checks in that case.
639139f7f9bSDimitry Andric         Done = createBasicBlock("null");
640139f7f9bSDimitry Andric         llvm::BasicBlock *Rest = createBasicBlock("not.null");
64139d628a0SDimitry Andric         Builder.CreateCondBr(IsNonNull, Rest, Done);
642139f7f9bSDimitry Andric         EmitBlock(Rest);
64339d628a0SDimitry Andric       } else {
64439d628a0SDimitry Andric         Checks.push_back(std::make_pair(IsNonNull, SanitizerKind::Null));
645139f7f9bSDimitry Andric       }
6463861d79fSDimitry Andric     }
6476bc11b14SDimitry Andric   }
6483861d79fSDimitry Andric 
64920e90f04SDimitry Andric   if (SanOpts.has(SanitizerKind::ObjectSize) &&
65020e90f04SDimitry Andric       !SkippedChecks.has(SanitizerKind::ObjectSize) &&
65120e90f04SDimitry Andric       !Ty->isIncompleteType()) {
6523861d79fSDimitry Andric     uint64_t Size = getContext().getTypeSizeInChars(Ty).getQuantity();
6533861d79fSDimitry Andric 
6543861d79fSDimitry Andric     // The glvalue must refer to a large enough storage region.
6553861d79fSDimitry Andric     // FIXME: If Address Sanitizer is enabled, insert dynamic instrumentation
6563861d79fSDimitry Andric     //        to check this.
657f785676fSDimitry Andric     // FIXME: Get object address space
658f785676fSDimitry Andric     llvm::Type *Tys[2] = { IntPtrTy, Int8PtrTy };
659f785676fSDimitry Andric     llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::objectsize, Tys);
6607ae0e2c9SDimitry Andric     llvm::Value *Min = Builder.getFalse();
66120e90f04SDimitry Andric     llvm::Value *NullIsUnknown = Builder.getFalse();
6620623d748SDimitry Andric     llvm::Value *CastAddr = Builder.CreateBitCast(Ptr, Int8PtrTy);
66320e90f04SDimitry Andric     llvm::Value *LargeEnough = Builder.CreateICmpUGE(
66420e90f04SDimitry Andric         Builder.CreateCall(F, {CastAddr, Min, NullIsUnknown}),
6653861d79fSDimitry Andric         llvm::ConstantInt::get(IntPtrTy, Size));
66639d628a0SDimitry Andric     Checks.push_back(std::make_pair(LargeEnough, SanitizerKind::ObjectSize));
6673861d79fSDimitry Andric   }
6683861d79fSDimitry Andric 
6693861d79fSDimitry Andric   uint64_t AlignVal = 0;
6709a199699SDimitry Andric   llvm::Value *PtrAsInt = nullptr;
6713861d79fSDimitry Andric 
67220e90f04SDimitry Andric   if (SanOpts.has(SanitizerKind::Alignment) &&
67320e90f04SDimitry Andric       !SkippedChecks.has(SanitizerKind::Alignment)) {
6743861d79fSDimitry Andric     AlignVal = Alignment.getQuantity();
6753861d79fSDimitry Andric     if (!Ty->isIncompleteType() && !AlignVal)
6763861d79fSDimitry Andric       AlignVal = getContext().getTypeAlignInChars(Ty).getQuantity();
6773861d79fSDimitry Andric 
6783861d79fSDimitry Andric     // The glvalue must be suitably aligned.
67951690af2SDimitry Andric     if (AlignVal > 1 &&
68051690af2SDimitry Andric         (!PtrToAlloca || PtrToAlloca->getAlignment() < AlignVal)) {
6819a199699SDimitry Andric       PtrAsInt = Builder.CreatePtrToInt(Ptr, IntPtrTy);
6829a199699SDimitry Andric       llvm::Value *Align = Builder.CreateAnd(
6839a199699SDimitry Andric           PtrAsInt, llvm::ConstantInt::get(IntPtrTy, AlignVal - 1));
6843861d79fSDimitry Andric       llvm::Value *Aligned =
6853861d79fSDimitry Andric           Builder.CreateICmpEQ(Align, llvm::ConstantInt::get(IntPtrTy, 0));
6869a199699SDimitry Andric       if (Aligned != True)
68739d628a0SDimitry Andric         Checks.push_back(std::make_pair(Aligned, SanitizerKind::Alignment));
6883861d79fSDimitry Andric     }
6893861d79fSDimitry Andric   }
6903861d79fSDimitry Andric 
69139d628a0SDimitry Andric   if (Checks.size() > 0) {
69295ec533aSDimitry Andric     // Make sure we're not losing information. Alignment needs to be a power of
69395ec533aSDimitry Andric     // 2
69495ec533aSDimitry Andric     assert(!AlignVal || (uint64_t)1 << llvm::Log2_64(AlignVal) == AlignVal);
6953861d79fSDimitry Andric     llvm::Constant *StaticData[] = {
69695ec533aSDimitry Andric         EmitCheckSourceLocation(Loc), EmitCheckTypeDescriptor(Ty),
69795ec533aSDimitry Andric         llvm::ConstantInt::get(Int8Ty, AlignVal ? llvm::Log2_64(AlignVal) : 1),
69895ec533aSDimitry Andric         llvm::ConstantInt::get(Int8Ty, TCK)};
6999a199699SDimitry Andric     EmitCheck(Checks, SanitizerHandler::TypeMismatch, StaticData,
7009a199699SDimitry Andric               PtrAsInt ? PtrAsInt : Ptr);
7013861d79fSDimitry Andric   }
7023861d79fSDimitry Andric 
7033861d79fSDimitry Andric   // If possible, check that the vptr indicates that there is a subobject of
7043861d79fSDimitry Andric   // type Ty at offset zero within this object.
705139f7f9bSDimitry Andric   //
706139f7f9bSDimitry Andric   // C++11 [basic.life]p5,6:
707139f7f9bSDimitry Andric   //   [For storage which does not refer to an object within its lifetime]
708139f7f9bSDimitry Andric   //   The program has undefined behavior if:
709139f7f9bSDimitry Andric   //    -- the [pointer or glvalue] is used to access a non-static data member
710139f7f9bSDimitry Andric   //       or call a non-static member function
71139d628a0SDimitry Andric   if (SanOpts.has(SanitizerKind::Vptr) &&
7129a199699SDimitry Andric       !SkippedChecks.has(SanitizerKind::Vptr) && isVptrCheckRequired(TCK, Ty)) {
7139a199699SDimitry Andric     // Ensure that the pointer is non-null before loading it. If there is no
7149a199699SDimitry Andric     // compile-time guarantee, reuse the run-time null check or emit a new one.
7159a199699SDimitry Andric     if (!IsGuaranteedNonNull) {
7169a199699SDimitry Andric       if (!IsNonNull)
7179a199699SDimitry Andric         IsNonNull = Builder.CreateIsNotNull(Ptr);
7189a199699SDimitry Andric       if (!Done)
7199a199699SDimitry Andric         Done = createBasicBlock("vptr.null");
7209a199699SDimitry Andric       llvm::BasicBlock *VptrNotNull = createBasicBlock("vptr.not.null");
7219a199699SDimitry Andric       Builder.CreateCondBr(IsNonNull, VptrNotNull, Done);
7229a199699SDimitry Andric       EmitBlock(VptrNotNull);
7239a199699SDimitry Andric     }
7249a199699SDimitry Andric 
7253861d79fSDimitry Andric     // Compute a hash of the mangled name of the type.
7263861d79fSDimitry Andric     //
7273861d79fSDimitry Andric     // FIXME: This is not guaranteed to be deterministic! Move to a
7283861d79fSDimitry Andric     //        fingerprinting mechanism once LLVM provides one. For the time
7293861d79fSDimitry Andric     //        being the implementation happens to be deterministic.
730139f7f9bSDimitry Andric     SmallString<64> MangledName;
7313861d79fSDimitry Andric     llvm::raw_svector_ostream Out(MangledName);
7323861d79fSDimitry Andric     CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty.getUnqualifiedType(),
7333861d79fSDimitry Andric                                                      Out);
73459d1ed5bSDimitry Andric 
73559d1ed5bSDimitry Andric     // Blacklist based on the mangled type.
73639d628a0SDimitry Andric     if (!CGM.getContext().getSanitizerBlacklist().isBlacklistedType(
7379a199699SDimitry Andric             SanitizerKind::Vptr, Out.str())) {
7383861d79fSDimitry Andric       llvm::hash_code TypeHash = hash_value(Out.str());
7393861d79fSDimitry Andric 
7403861d79fSDimitry Andric       // Load the vptr, and compute hash_16_bytes(TypeHash, vptr).
7413861d79fSDimitry Andric       llvm::Value *Low = llvm::ConstantInt::get(Int64Ty, TypeHash);
7423861d79fSDimitry Andric       llvm::Type *VPtrTy = llvm::PointerType::get(IntPtrTy, 0);
7430623d748SDimitry Andric       Address VPtrAddr(Builder.CreateBitCast(Ptr, VPtrTy), getPointerAlign());
7443861d79fSDimitry Andric       llvm::Value *VPtrVal = Builder.CreateLoad(VPtrAddr);
7453861d79fSDimitry Andric       llvm::Value *High = Builder.CreateZExt(VPtrVal, Int64Ty);
7463861d79fSDimitry Andric 
7473861d79fSDimitry Andric       llvm::Value *Hash = emitHash16Bytes(Builder, Low, High);
7483861d79fSDimitry Andric       Hash = Builder.CreateTrunc(Hash, IntPtrTy);
7493861d79fSDimitry Andric 
7503861d79fSDimitry Andric       // Look the hash up in our cache.
7513861d79fSDimitry Andric       const int CacheSize = 128;
7523861d79fSDimitry Andric       llvm::Type *HashTable = llvm::ArrayType::get(IntPtrTy, CacheSize);
7533861d79fSDimitry Andric       llvm::Value *Cache = CGM.CreateRuntimeVariable(HashTable,
7543861d79fSDimitry Andric                                                      "__ubsan_vptr_type_cache");
7553861d79fSDimitry Andric       llvm::Value *Slot = Builder.CreateAnd(Hash,
7563861d79fSDimitry Andric                                             llvm::ConstantInt::get(IntPtrTy,
7573861d79fSDimitry Andric                                                                    CacheSize-1));
7583861d79fSDimitry Andric       llvm::Value *Indices[] = { Builder.getInt32(0), Slot };
7593861d79fSDimitry Andric       llvm::Value *CacheVal =
7600623d748SDimitry Andric         Builder.CreateAlignedLoad(Builder.CreateInBoundsGEP(Cache, Indices),
7610623d748SDimitry Andric                                   getPointerAlign());
7623861d79fSDimitry Andric 
7633861d79fSDimitry Andric       // If the hash isn't in the cache, call a runtime handler to perform the
7643861d79fSDimitry Andric       // hard work of checking whether the vptr is for an object of the right
7653861d79fSDimitry Andric       // type. This will either fill in the cache and return, or produce a
7663861d79fSDimitry Andric       // diagnostic.
76739d628a0SDimitry Andric       llvm::Value *EqualHash = Builder.CreateICmpEQ(CacheVal, Hash);
7683861d79fSDimitry Andric       llvm::Constant *StaticData[] = {
7693861d79fSDimitry Andric         EmitCheckSourceLocation(Loc),
7703861d79fSDimitry Andric         EmitCheckTypeDescriptor(Ty),
7713861d79fSDimitry Andric         CGM.GetAddrOfRTTIDescriptor(Ty.getUnqualifiedType()),
7723861d79fSDimitry Andric         llvm::ConstantInt::get(Int8Ty, TCK)
7733861d79fSDimitry Andric       };
7740623d748SDimitry Andric       llvm::Value *DynamicData[] = { Ptr, Hash };
77539d628a0SDimitry Andric       EmitCheck(std::make_pair(EqualHash, SanitizerKind::Vptr),
77644290647SDimitry Andric                 SanitizerHandler::DynamicTypeCacheMiss, StaticData,
77744290647SDimitry Andric                 DynamicData);
7783861d79fSDimitry Andric     }
77959d1ed5bSDimitry Andric   }
780139f7f9bSDimitry Andric 
781139f7f9bSDimitry Andric   if (Done) {
782139f7f9bSDimitry Andric     Builder.CreateBr(Done);
783139f7f9bSDimitry Andric     EmitBlock(Done);
784139f7f9bSDimitry Andric   }
785139f7f9bSDimitry Andric }
786139f7f9bSDimitry Andric 
787139f7f9bSDimitry Andric /// Determine whether this expression refers to a flexible array member in a
788139f7f9bSDimitry Andric /// struct. We disable array bounds checks for such members.
789139f7f9bSDimitry Andric static bool isFlexibleArrayMemberExpr(const Expr *E) {
790139f7f9bSDimitry Andric   // For compatibility with existing code, we treat arrays of length 0 or
791139f7f9bSDimitry Andric   // 1 as flexible array members.
792139f7f9bSDimitry Andric   const ArrayType *AT = E->getType()->castAsArrayTypeUnsafe();
79359d1ed5bSDimitry Andric   if (const auto *CAT = dyn_cast<ConstantArrayType>(AT)) {
794139f7f9bSDimitry Andric     if (CAT->getSize().ugt(1))
795139f7f9bSDimitry Andric       return false;
796139f7f9bSDimitry Andric   } else if (!isa<IncompleteArrayType>(AT))
797139f7f9bSDimitry Andric     return false;
798139f7f9bSDimitry Andric 
799139f7f9bSDimitry Andric   E = E->IgnoreParens();
800139f7f9bSDimitry Andric 
801139f7f9bSDimitry Andric   // A flexible array member must be the last member in the class.
80259d1ed5bSDimitry Andric   if (const auto *ME = dyn_cast<MemberExpr>(E)) {
803139f7f9bSDimitry Andric     // FIXME: If the base type of the member expr is not FD->getParent(),
804139f7f9bSDimitry Andric     // this should not be treated as a flexible array member access.
80559d1ed5bSDimitry Andric     if (const auto *FD = dyn_cast<FieldDecl>(ME->getMemberDecl())) {
806139f7f9bSDimitry Andric       RecordDecl::field_iterator FI(
807139f7f9bSDimitry Andric           DeclContext::decl_iterator(const_cast<FieldDecl *>(FD)));
808139f7f9bSDimitry Andric       return ++FI == FD->getParent()->field_end();
809139f7f9bSDimitry Andric     }
81044290647SDimitry Andric   } else if (const auto *IRE = dyn_cast<ObjCIvarRefExpr>(E)) {
81144290647SDimitry Andric     return IRE->getDecl()->getNextIvar() == nullptr;
812139f7f9bSDimitry Andric   }
813139f7f9bSDimitry Andric 
814139f7f9bSDimitry Andric   return false;
815139f7f9bSDimitry Andric }
816139f7f9bSDimitry Andric 
8179a199699SDimitry Andric llvm::Value *CodeGenFunction::LoadPassedObjectSize(const Expr *E,
8189a199699SDimitry Andric                                                    QualType EltTy) {
8199a199699SDimitry Andric   ASTContext &C = getContext();
8209a199699SDimitry Andric   uint64_t EltSize = C.getTypeSizeInChars(EltTy).getQuantity();
8219a199699SDimitry Andric   if (!EltSize)
8229a199699SDimitry Andric     return nullptr;
8239a199699SDimitry Andric 
8249a199699SDimitry Andric   auto *ArrayDeclRef = dyn_cast<DeclRefExpr>(E->IgnoreParenImpCasts());
8259a199699SDimitry Andric   if (!ArrayDeclRef)
8269a199699SDimitry Andric     return nullptr;
8279a199699SDimitry Andric 
8289a199699SDimitry Andric   auto *ParamDecl = dyn_cast<ParmVarDecl>(ArrayDeclRef->getDecl());
8299a199699SDimitry Andric   if (!ParamDecl)
8309a199699SDimitry Andric     return nullptr;
8319a199699SDimitry Andric 
8329a199699SDimitry Andric   auto *POSAttr = ParamDecl->getAttr<PassObjectSizeAttr>();
8339a199699SDimitry Andric   if (!POSAttr)
8349a199699SDimitry Andric     return nullptr;
8359a199699SDimitry Andric 
8369a199699SDimitry Andric   // Don't load the size if it's a lower bound.
8379a199699SDimitry Andric   int POSType = POSAttr->getType();
8389a199699SDimitry Andric   if (POSType != 0 && POSType != 1)
8399a199699SDimitry Andric     return nullptr;
8409a199699SDimitry Andric 
8419a199699SDimitry Andric   // Find the implicit size parameter.
8429a199699SDimitry Andric   auto PassedSizeIt = SizeArguments.find(ParamDecl);
8439a199699SDimitry Andric   if (PassedSizeIt == SizeArguments.end())
8449a199699SDimitry Andric     return nullptr;
8459a199699SDimitry Andric 
8469a199699SDimitry Andric   const ImplicitParamDecl *PassedSizeDecl = PassedSizeIt->second;
8479a199699SDimitry Andric   assert(LocalDeclMap.count(PassedSizeDecl) && "Passed size not loadable");
8489a199699SDimitry Andric   Address AddrOfSize = LocalDeclMap.find(PassedSizeDecl)->second;
8499a199699SDimitry Andric   llvm::Value *SizeInBytes = EmitLoadOfScalar(AddrOfSize, /*Volatile=*/false,
8509a199699SDimitry Andric                                               C.getSizeType(), E->getExprLoc());
8519a199699SDimitry Andric   llvm::Value *SizeOfElement =
8529a199699SDimitry Andric       llvm::ConstantInt::get(SizeInBytes->getType(), EltSize);
8539a199699SDimitry Andric   return Builder.CreateUDiv(SizeInBytes, SizeOfElement);
8549a199699SDimitry Andric }
8559a199699SDimitry Andric 
856139f7f9bSDimitry Andric /// If Base is known to point to the start of an array, return the length of
857139f7f9bSDimitry Andric /// that array. Return 0 if the length cannot be determined.
858139f7f9bSDimitry Andric static llvm::Value *getArrayIndexingBound(
859139f7f9bSDimitry Andric     CodeGenFunction &CGF, const Expr *Base, QualType &IndexedType) {
860139f7f9bSDimitry Andric   // For the vector indexing extension, the bound is the number of elements.
861139f7f9bSDimitry Andric   if (const VectorType *VT = Base->getType()->getAs<VectorType>()) {
862139f7f9bSDimitry Andric     IndexedType = Base->getType();
863139f7f9bSDimitry Andric     return CGF.Builder.getInt32(VT->getNumElements());
864139f7f9bSDimitry Andric   }
865139f7f9bSDimitry Andric 
866139f7f9bSDimitry Andric   Base = Base->IgnoreParens();
867139f7f9bSDimitry Andric 
86859d1ed5bSDimitry Andric   if (const auto *CE = dyn_cast<CastExpr>(Base)) {
869139f7f9bSDimitry Andric     if (CE->getCastKind() == CK_ArrayToPointerDecay &&
870139f7f9bSDimitry Andric         !isFlexibleArrayMemberExpr(CE->getSubExpr())) {
871139f7f9bSDimitry Andric       IndexedType = CE->getSubExpr()->getType();
872139f7f9bSDimitry Andric       const ArrayType *AT = IndexedType->castAsArrayTypeUnsafe();
87359d1ed5bSDimitry Andric       if (const auto *CAT = dyn_cast<ConstantArrayType>(AT))
874139f7f9bSDimitry Andric         return CGF.Builder.getInt(CAT->getSize());
87559d1ed5bSDimitry Andric       else if (const auto *VAT = dyn_cast<VariableArrayType>(AT))
876139f7f9bSDimitry Andric         return CGF.getVLASize(VAT).first;
8779a199699SDimitry Andric       // Ignore pass_object_size here. It's not applicable on decayed pointers.
878139f7f9bSDimitry Andric     }
879139f7f9bSDimitry Andric   }
880139f7f9bSDimitry Andric 
8819a199699SDimitry Andric   QualType EltTy{Base->getType()->getPointeeOrArrayElementType(), 0};
8829a199699SDimitry Andric   if (llvm::Value *POS = CGF.LoadPassedObjectSize(Base, EltTy)) {
8839a199699SDimitry Andric     IndexedType = Base->getType();
8849a199699SDimitry Andric     return POS;
8859a199699SDimitry Andric   }
8869a199699SDimitry Andric 
88759d1ed5bSDimitry Andric   return nullptr;
888139f7f9bSDimitry Andric }
889139f7f9bSDimitry Andric 
890139f7f9bSDimitry Andric void CodeGenFunction::EmitBoundsCheck(const Expr *E, const Expr *Base,
891139f7f9bSDimitry Andric                                       llvm::Value *Index, QualType IndexType,
892139f7f9bSDimitry Andric                                       bool Accessed) {
89339d628a0SDimitry Andric   assert(SanOpts.has(SanitizerKind::ArrayBounds) &&
894f785676fSDimitry Andric          "should not be called unless adding bounds checks");
89559d1ed5bSDimitry Andric   SanitizerScope SanScope(this);
896139f7f9bSDimitry Andric 
897139f7f9bSDimitry Andric   QualType IndexedType;
898139f7f9bSDimitry Andric   llvm::Value *Bound = getArrayIndexingBound(*this, Base, IndexedType);
899139f7f9bSDimitry Andric   if (!Bound)
900139f7f9bSDimitry Andric     return;
901139f7f9bSDimitry Andric 
902139f7f9bSDimitry Andric   bool IndexSigned = IndexType->isSignedIntegerOrEnumerationType();
903139f7f9bSDimitry Andric   llvm::Value *IndexVal = Builder.CreateIntCast(Index, SizeTy, IndexSigned);
904139f7f9bSDimitry Andric   llvm::Value *BoundVal = Builder.CreateIntCast(Bound, SizeTy, false);
905139f7f9bSDimitry Andric 
906139f7f9bSDimitry Andric   llvm::Constant *StaticData[] = {
907139f7f9bSDimitry Andric     EmitCheckSourceLocation(E->getExprLoc()),
908139f7f9bSDimitry Andric     EmitCheckTypeDescriptor(IndexedType),
909139f7f9bSDimitry Andric     EmitCheckTypeDescriptor(IndexType)
910139f7f9bSDimitry Andric   };
911139f7f9bSDimitry Andric   llvm::Value *Check = Accessed ? Builder.CreateICmpULT(IndexVal, BoundVal)
912139f7f9bSDimitry Andric                                 : Builder.CreateICmpULE(IndexVal, BoundVal);
91344290647SDimitry Andric   EmitCheck(std::make_pair(Check, SanitizerKind::ArrayBounds),
91444290647SDimitry Andric             SanitizerHandler::OutOfBounds, StaticData, Index);
915f22ef01cSRoman Divacky }
916f22ef01cSRoman Divacky 
917f22ef01cSRoman Divacky 
918f22ef01cSRoman Divacky CodeGenFunction::ComplexPairTy CodeGenFunction::
919f22ef01cSRoman Divacky EmitComplexPrePostIncDec(const UnaryOperator *E, LValue LV,
920f22ef01cSRoman Divacky                          bool isInc, bool isPre) {
921f785676fSDimitry Andric   ComplexPairTy InVal = EmitLoadOfComplex(LV, E->getExprLoc());
922f22ef01cSRoman Divacky 
923f22ef01cSRoman Divacky   llvm::Value *NextVal;
924f22ef01cSRoman Divacky   if (isa<llvm::IntegerType>(InVal.first->getType())) {
925f22ef01cSRoman Divacky     uint64_t AmountVal = isInc ? 1 : -1;
926f22ef01cSRoman Divacky     NextVal = llvm::ConstantInt::get(InVal.first->getType(), AmountVal, true);
927f22ef01cSRoman Divacky 
928f22ef01cSRoman Divacky     // Add the inc/dec to the real part.
929f22ef01cSRoman Divacky     NextVal = Builder.CreateAdd(InVal.first, NextVal, isInc ? "inc" : "dec");
930f22ef01cSRoman Divacky   } else {
931f22ef01cSRoman Divacky     QualType ElemTy = E->getType()->getAs<ComplexType>()->getElementType();
932f22ef01cSRoman Divacky     llvm::APFloat FVal(getContext().getFloatTypeSemantics(ElemTy), 1);
933f22ef01cSRoman Divacky     if (!isInc)
934f22ef01cSRoman Divacky       FVal.changeSign();
935f22ef01cSRoman Divacky     NextVal = llvm::ConstantFP::get(getLLVMContext(), FVal);
936f22ef01cSRoman Divacky 
937f22ef01cSRoman Divacky     // Add the inc/dec to the real part.
938f22ef01cSRoman Divacky     NextVal = Builder.CreateFAdd(InVal.first, NextVal, isInc ? "inc" : "dec");
939f22ef01cSRoman Divacky   }
940f22ef01cSRoman Divacky 
941f22ef01cSRoman Divacky   ComplexPairTy IncVal(NextVal, InVal.second);
942f22ef01cSRoman Divacky 
943f22ef01cSRoman Divacky   // Store the updated result through the lvalue.
944139f7f9bSDimitry Andric   EmitStoreOfComplex(IncVal, LV, /*init*/ false);
945f22ef01cSRoman Divacky 
946f22ef01cSRoman Divacky   // If this is a postinc, return the value read from memory, otherwise use the
947f22ef01cSRoman Divacky   // updated value.
948f22ef01cSRoman Divacky   return isPre ? IncVal : InVal;
949f22ef01cSRoman Divacky }
950f22ef01cSRoman Divacky 
9510623d748SDimitry Andric void CodeGenModule::EmitExplicitCastExprType(const ExplicitCastExpr *E,
9520623d748SDimitry Andric                                              CodeGenFunction *CGF) {
9530623d748SDimitry Andric   // Bind VLAs in the cast type.
9540623d748SDimitry Andric   if (CGF && E->getType()->isVariablyModifiedType())
9550623d748SDimitry Andric     CGF->EmitVariablyModifiedType(E->getType());
9560623d748SDimitry Andric 
9570623d748SDimitry Andric   if (CGDebugInfo *DI = getModuleDebugInfo())
9580623d748SDimitry Andric     DI->EmitExplicitCastType(E->getType());
9590623d748SDimitry Andric }
9600623d748SDimitry Andric 
961f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
962f22ef01cSRoman Divacky //                         LValue Expression Emission
963f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
964f22ef01cSRoman Divacky 
9650623d748SDimitry Andric /// EmitPointerWithAlignment - Given an expression of pointer type, try to
9660623d748SDimitry Andric /// derive a more accurate bound on the alignment of the pointer.
9670623d748SDimitry Andric Address CodeGenFunction::EmitPointerWithAlignment(const Expr *E,
9689a199699SDimitry Andric                                                   LValueBaseInfo *BaseInfo,
9699a199699SDimitry Andric                                                   TBAAAccessInfo *TBAAInfo) {
9700623d748SDimitry Andric   // We allow this with ObjC object pointers because of fragile ABIs.
9710623d748SDimitry Andric   assert(E->getType()->isPointerType() ||
9720623d748SDimitry Andric          E->getType()->isObjCObjectPointerType());
9730623d748SDimitry Andric   E = E->IgnoreParens();
9740623d748SDimitry Andric 
9750623d748SDimitry Andric   // Casts:
9760623d748SDimitry Andric   if (const CastExpr *CE = dyn_cast<CastExpr>(E)) {
9770623d748SDimitry Andric     if (const auto *ECE = dyn_cast<ExplicitCastExpr>(CE))
9780623d748SDimitry Andric       CGM.EmitExplicitCastExprType(ECE, this);
9790623d748SDimitry Andric 
9800623d748SDimitry Andric     switch (CE->getCastKind()) {
9810623d748SDimitry Andric     // Non-converting casts (but not C's implicit conversion from void*).
9820623d748SDimitry Andric     case CK_BitCast:
9830623d748SDimitry Andric     case CK_NoOp:
9849a199699SDimitry Andric     case CK_AddressSpaceConversion:
9850623d748SDimitry Andric       if (auto PtrTy = CE->getSubExpr()->getType()->getAs<PointerType>()) {
9860623d748SDimitry Andric         if (PtrTy->getPointeeType()->isVoidType())
9870623d748SDimitry Andric           break;
9880623d748SDimitry Andric 
9899a199699SDimitry Andric         LValueBaseInfo InnerBaseInfo;
9909a199699SDimitry Andric         TBAAAccessInfo InnerTBAAInfo;
9919a199699SDimitry Andric         Address Addr = EmitPointerWithAlignment(CE->getSubExpr(),
9929a199699SDimitry Andric                                                 &InnerBaseInfo,
9939a199699SDimitry Andric                                                 &InnerTBAAInfo);
9949a199699SDimitry Andric         if (BaseInfo) *BaseInfo = InnerBaseInfo;
9959a199699SDimitry Andric         if (TBAAInfo) *TBAAInfo = InnerTBAAInfo;
9960623d748SDimitry Andric 
9979a199699SDimitry Andric         if (isa<ExplicitCastExpr>(CE)) {
9989a199699SDimitry Andric           LValueBaseInfo TargetTypeBaseInfo;
9999a199699SDimitry Andric           TBAAAccessInfo TargetTypeTBAAInfo;
1000d8866befSDimitry Andric           CharUnits Align = getNaturalPointeeTypeAlignment(E->getType(),
10019a199699SDimitry Andric                                                            &TargetTypeBaseInfo,
10029a199699SDimitry Andric                                                            &TargetTypeTBAAInfo);
10039a199699SDimitry Andric           if (TBAAInfo)
10049a199699SDimitry Andric             *TBAAInfo = CGM.mergeTBAAInfoForCast(*TBAAInfo,
10059a199699SDimitry Andric                                                  TargetTypeTBAAInfo);
10069a199699SDimitry Andric           // If the source l-value is opaque, honor the alignment of the
10079a199699SDimitry Andric           // casted-to type.
10089a199699SDimitry Andric           if (InnerBaseInfo.getAlignmentSource() != AlignmentSource::Decl) {
1009d8866befSDimitry Andric             if (BaseInfo)
10109a199699SDimitry Andric               BaseInfo->mergeForCast(TargetTypeBaseInfo);
1011d8866befSDimitry Andric             Addr = Address(Addr.getPointer(), Align);
10120623d748SDimitry Andric           }
10139a199699SDimitry Andric         }
10140623d748SDimitry Andric 
1015e7145dcbSDimitry Andric         if (SanOpts.has(SanitizerKind::CFIUnrelatedCast) &&
1016e7145dcbSDimitry Andric             CE->getCastKind() == CK_BitCast) {
10170623d748SDimitry Andric           if (auto PT = E->getType()->getAs<PointerType>())
10180623d748SDimitry Andric             EmitVTablePtrCheckForCast(PT->getPointeeType(), Addr.getPointer(),
10190623d748SDimitry Andric                                       /*MayBeNull=*/true,
10200623d748SDimitry Andric                                       CodeGenFunction::CFITCK_UnrelatedCast,
10210623d748SDimitry Andric                                       CE->getLocStart());
10220623d748SDimitry Andric         }
10239a199699SDimitry Andric         return CE->getCastKind() != CK_AddressSpaceConversion
10249a199699SDimitry Andric                    ? Builder.CreateBitCast(Addr, ConvertType(E->getType()))
10259a199699SDimitry Andric                    : Builder.CreateAddrSpaceCast(Addr,
10269a199699SDimitry Andric                                                  ConvertType(E->getType()));
10270623d748SDimitry Andric       }
10280623d748SDimitry Andric       break;
10290623d748SDimitry Andric 
10300623d748SDimitry Andric     // Array-to-pointer decay.
10310623d748SDimitry Andric     case CK_ArrayToPointerDecay:
10329a199699SDimitry Andric       return EmitArrayToPointerDecay(CE->getSubExpr(), BaseInfo, TBAAInfo);
10330623d748SDimitry Andric 
10340623d748SDimitry Andric     // Derived-to-base conversions.
10350623d748SDimitry Andric     case CK_UncheckedDerivedToBase:
10360623d748SDimitry Andric     case CK_DerivedToBase: {
10379a199699SDimitry Andric       Address Addr = EmitPointerWithAlignment(CE->getSubExpr(), BaseInfo,
10389a199699SDimitry Andric                                               TBAAInfo);
10390623d748SDimitry Andric       auto Derived = CE->getSubExpr()->getType()->getPointeeCXXRecordDecl();
10400623d748SDimitry Andric       return GetAddressOfBaseClass(Addr, Derived,
10410623d748SDimitry Andric                                    CE->path_begin(), CE->path_end(),
10420623d748SDimitry Andric                                    ShouldNullCheckClassCastValue(CE),
10430623d748SDimitry Andric                                    CE->getExprLoc());
10440623d748SDimitry Andric     }
10450623d748SDimitry Andric 
10460623d748SDimitry Andric     // TODO: Is there any reason to treat base-to-derived conversions
10470623d748SDimitry Andric     // specially?
10480623d748SDimitry Andric     default:
10490623d748SDimitry Andric       break;
10500623d748SDimitry Andric     }
10510623d748SDimitry Andric   }
10520623d748SDimitry Andric 
10530623d748SDimitry Andric   // Unary &.
10540623d748SDimitry Andric   if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(E)) {
10550623d748SDimitry Andric     if (UO->getOpcode() == UO_AddrOf) {
10560623d748SDimitry Andric       LValue LV = EmitLValue(UO->getSubExpr());
1057d8866befSDimitry Andric       if (BaseInfo) *BaseInfo = LV.getBaseInfo();
10589a199699SDimitry Andric       if (TBAAInfo) *TBAAInfo = LV.getTBAAInfo();
10590623d748SDimitry Andric       return LV.getAddress();
10600623d748SDimitry Andric     }
10610623d748SDimitry Andric   }
10620623d748SDimitry Andric 
10630623d748SDimitry Andric   // TODO: conditional operators, comma.
10640623d748SDimitry Andric 
10650623d748SDimitry Andric   // Otherwise, use the alignment of the type.
10669a199699SDimitry Andric   CharUnits Align = getNaturalPointeeTypeAlignment(E->getType(), BaseInfo,
10679a199699SDimitry Andric                                                    TBAAInfo);
10680623d748SDimitry Andric   return Address(EmitScalarExpr(E), Align);
10690623d748SDimitry Andric }
10700623d748SDimitry Andric 
1071f22ef01cSRoman Divacky RValue CodeGenFunction::GetUndefRValue(QualType Ty) {
1072f22ef01cSRoman Divacky   if (Ty->isVoidType())
107359d1ed5bSDimitry Andric     return RValue::get(nullptr);
1074f22ef01cSRoman Divacky 
1075139f7f9bSDimitry Andric   switch (getEvaluationKind(Ty)) {
1076139f7f9bSDimitry Andric   case TEK_Complex: {
1077139f7f9bSDimitry Andric     llvm::Type *EltTy =
1078139f7f9bSDimitry Andric       ConvertType(Ty->castAs<ComplexType>()->getElementType());
1079f22ef01cSRoman Divacky     llvm::Value *U = llvm::UndefValue::get(EltTy);
1080f22ef01cSRoman Divacky     return RValue::getComplex(std::make_pair(U, U));
1081f22ef01cSRoman Divacky   }
1082f22ef01cSRoman Divacky 
1083e580952dSDimitry Andric   // If this is a use of an undefined aggregate type, the aggregate must have an
1084e580952dSDimitry Andric   // identifiable address.  Just because the contents of the value are undefined
1085e580952dSDimitry Andric   // doesn't mean that the address can't be taken and compared.
1086139f7f9bSDimitry Andric   case TEK_Aggregate: {
10870623d748SDimitry Andric     Address DestPtr = CreateMemTemp(Ty, "undef.agg.tmp");
1088e580952dSDimitry Andric     return RValue::getAggregate(DestPtr);
1089f22ef01cSRoman Divacky   }
1090f22ef01cSRoman Divacky 
1091139f7f9bSDimitry Andric   case TEK_Scalar:
1092f22ef01cSRoman Divacky     return RValue::get(llvm::UndefValue::get(ConvertType(Ty)));
1093f22ef01cSRoman Divacky   }
1094139f7f9bSDimitry Andric   llvm_unreachable("bad evaluation kind");
1095139f7f9bSDimitry Andric }
1096f22ef01cSRoman Divacky 
1097f22ef01cSRoman Divacky RValue CodeGenFunction::EmitUnsupportedRValue(const Expr *E,
1098f22ef01cSRoman Divacky                                               const char *Name) {
1099f22ef01cSRoman Divacky   ErrorUnsupported(E, Name);
1100f22ef01cSRoman Divacky   return GetUndefRValue(E->getType());
1101f22ef01cSRoman Divacky }
1102f22ef01cSRoman Divacky 
1103f22ef01cSRoman Divacky LValue CodeGenFunction::EmitUnsupportedLValue(const Expr *E,
1104f22ef01cSRoman Divacky                                               const char *Name) {
1105f22ef01cSRoman Divacky   ErrorUnsupported(E, Name);
1106f22ef01cSRoman Divacky   llvm::Type *Ty = llvm::PointerType::getUnqual(ConvertType(E->getType()));
11070623d748SDimitry Andric   return MakeAddrLValue(Address(llvm::UndefValue::get(Ty), CharUnits::One()),
11080623d748SDimitry Andric                         E->getType());
1109f22ef01cSRoman Divacky }
1110f22ef01cSRoman Divacky 
111120e90f04SDimitry Andric bool CodeGenFunction::IsWrappedCXXThis(const Expr *Obj) {
111220e90f04SDimitry Andric   const Expr *Base = Obj;
111320e90f04SDimitry Andric   while (!isa<CXXThisExpr>(Base)) {
111420e90f04SDimitry Andric     // The result of a dynamic_cast can be null.
111520e90f04SDimitry Andric     if (isa<CXXDynamicCastExpr>(Base))
111620e90f04SDimitry Andric       return false;
111720e90f04SDimitry Andric 
111820e90f04SDimitry Andric     if (const auto *CE = dyn_cast<CastExpr>(Base)) {
111920e90f04SDimitry Andric       Base = CE->getSubExpr();
112020e90f04SDimitry Andric     } else if (const auto *PE = dyn_cast<ParenExpr>(Base)) {
112120e90f04SDimitry Andric       Base = PE->getSubExpr();
112220e90f04SDimitry Andric     } else if (const auto *UO = dyn_cast<UnaryOperator>(Base)) {
112320e90f04SDimitry Andric       if (UO->getOpcode() == UO_Extension)
112420e90f04SDimitry Andric         Base = UO->getSubExpr();
112520e90f04SDimitry Andric       else
112620e90f04SDimitry Andric         return false;
112720e90f04SDimitry Andric     } else {
112820e90f04SDimitry Andric       return false;
112920e90f04SDimitry Andric     }
113020e90f04SDimitry Andric   }
113120e90f04SDimitry Andric   return true;
113220e90f04SDimitry Andric }
113320e90f04SDimitry Andric 
11343861d79fSDimitry Andric LValue CodeGenFunction::EmitCheckedLValue(const Expr *E, TypeCheckKind TCK) {
1135139f7f9bSDimitry Andric   LValue LV;
113639d628a0SDimitry Andric   if (SanOpts.has(SanitizerKind::ArrayBounds) && isa<ArraySubscriptExpr>(E))
1137139f7f9bSDimitry Andric     LV = EmitArraySubscriptExpr(cast<ArraySubscriptExpr>(E), /*Accessed*/true);
1138139f7f9bSDimitry Andric   else
1139139f7f9bSDimitry Andric     LV = EmitLValue(E);
114020e90f04SDimitry Andric   if (!isa<DeclRefExpr>(E) && !LV.isBitField() && LV.isSimple()) {
114120e90f04SDimitry Andric     SanitizerSet SkippedChecks;
114220e90f04SDimitry Andric     if (const auto *ME = dyn_cast<MemberExpr>(E)) {
114320e90f04SDimitry Andric       bool IsBaseCXXThis = IsWrappedCXXThis(ME->getBase());
114420e90f04SDimitry Andric       if (IsBaseCXXThis)
114520e90f04SDimitry Andric         SkippedChecks.set(SanitizerKind::Alignment, true);
114620e90f04SDimitry Andric       if (IsBaseCXXThis || isa<DeclRefExpr>(ME->getBase()))
114720e90f04SDimitry Andric         SkippedChecks.set(SanitizerKind::Null, true);
114820e90f04SDimitry Andric     }
11490623d748SDimitry Andric     EmitTypeCheck(TCK, E->getExprLoc(), LV.getPointer(),
115020e90f04SDimitry Andric                   E->getType(), LV.getAlignment(), SkippedChecks);
115120e90f04SDimitry Andric   }
1152f22ef01cSRoman Divacky   return LV;
1153f22ef01cSRoman Divacky }
1154f22ef01cSRoman Divacky 
1155f22ef01cSRoman Divacky /// EmitLValue - Emit code to compute a designator that specifies the location
1156f22ef01cSRoman Divacky /// of the expression.
1157f22ef01cSRoman Divacky ///
1158f22ef01cSRoman Divacky /// This can return one of two things: a simple address or a bitfield reference.
1159f22ef01cSRoman Divacky /// In either case, the LLVM Value* in the LValue structure is guaranteed to be
1160f22ef01cSRoman Divacky /// an LLVM pointer type.
1161f22ef01cSRoman Divacky ///
1162f22ef01cSRoman Divacky /// If this returns a bitfield reference, nothing about the pointee type of the
1163f22ef01cSRoman Divacky /// LLVM value is known: For example, it may not be a pointer to an integer.
1164f22ef01cSRoman Divacky ///
1165f22ef01cSRoman Divacky /// If this returns a normal address, and if the lvalue's C type is fixed size,
1166f22ef01cSRoman Divacky /// this method guarantees that the returned pointer type will point to an LLVM
1167f22ef01cSRoman Divacky /// type of the same size of the lvalue's type.  If the lvalue has a variable
1168f22ef01cSRoman Divacky /// length type, this is not possible.
1169f22ef01cSRoman Divacky ///
1170f22ef01cSRoman Divacky LValue CodeGenFunction::EmitLValue(const Expr *E) {
117133956c43SDimitry Andric   ApplyDebugLocation DL(*this, E);
1172f22ef01cSRoman Divacky   switch (E->getStmtClass()) {
1173f22ef01cSRoman Divacky   default: return EmitUnsupportedLValue(E, "l-value expression");
1174f22ef01cSRoman Divacky 
1175dff0c46cSDimitry Andric   case Expr::ObjCPropertyRefExprClass:
1176dff0c46cSDimitry Andric     llvm_unreachable("cannot emit a property reference directly");
1177dff0c46cSDimitry Andric 
1178ffd1746dSEd Schouten   case Expr::ObjCSelectorExprClass:
1179ffd1746dSEd Schouten     return EmitObjCSelectorLValue(cast<ObjCSelectorExpr>(E));
1180f22ef01cSRoman Divacky   case Expr::ObjCIsaExprClass:
1181f22ef01cSRoman Divacky     return EmitObjCIsaExpr(cast<ObjCIsaExpr>(E));
1182f22ef01cSRoman Divacky   case Expr::BinaryOperatorClass:
1183f22ef01cSRoman Divacky     return EmitBinaryOperatorLValue(cast<BinaryOperator>(E));
118433956c43SDimitry Andric   case Expr::CompoundAssignOperatorClass: {
118533956c43SDimitry Andric     QualType Ty = E->getType();
118633956c43SDimitry Andric     if (const AtomicType *AT = Ty->getAs<AtomicType>())
118733956c43SDimitry Andric       Ty = AT->getValueType();
118833956c43SDimitry Andric     if (!Ty->isAnyComplexType())
11892754fe60SDimitry Andric       return EmitCompoundAssignmentLValue(cast<CompoundAssignOperator>(E));
11902754fe60SDimitry Andric     return EmitComplexCompoundAssignmentLValue(cast<CompoundAssignOperator>(E));
119133956c43SDimitry Andric   }
1192f22ef01cSRoman Divacky   case Expr::CallExprClass:
1193f22ef01cSRoman Divacky   case Expr::CXXMemberCallExprClass:
1194f22ef01cSRoman Divacky   case Expr::CXXOperatorCallExprClass:
1195dff0c46cSDimitry Andric   case Expr::UserDefinedLiteralClass:
1196f22ef01cSRoman Divacky     return EmitCallExprLValue(cast<CallExpr>(E));
1197f22ef01cSRoman Divacky   case Expr::VAArgExprClass:
1198f22ef01cSRoman Divacky     return EmitVAArgExprLValue(cast<VAArgExpr>(E));
1199f22ef01cSRoman Divacky   case Expr::DeclRefExprClass:
1200f22ef01cSRoman Divacky     return EmitDeclRefLValue(cast<DeclRefExpr>(E));
12016122f3e6SDimitry Andric   case Expr::ParenExprClass:
12026122f3e6SDimitry Andric     return EmitLValue(cast<ParenExpr>(E)->getSubExpr());
12033b0f4066SDimitry Andric   case Expr::GenericSelectionExprClass:
12043b0f4066SDimitry Andric     return EmitLValue(cast<GenericSelectionExpr>(E)->getResultExpr());
1205f22ef01cSRoman Divacky   case Expr::PredefinedExprClass:
1206f22ef01cSRoman Divacky     return EmitPredefinedLValue(cast<PredefinedExpr>(E));
1207f22ef01cSRoman Divacky   case Expr::StringLiteralClass:
1208f22ef01cSRoman Divacky     return EmitStringLiteralLValue(cast<StringLiteral>(E));
1209f22ef01cSRoman Divacky   case Expr::ObjCEncodeExprClass:
1210f22ef01cSRoman Divacky     return EmitObjCEncodeExprLValue(cast<ObjCEncodeExpr>(E));
1211dff0c46cSDimitry Andric   case Expr::PseudoObjectExprClass:
1212dff0c46cSDimitry Andric     return EmitPseudoObjectLValue(cast<PseudoObjectExpr>(E));
1213dff0c46cSDimitry Andric   case Expr::InitListExprClass:
12147ae0e2c9SDimitry Andric     return EmitInitListLValue(cast<InitListExpr>(E));
1215f22ef01cSRoman Divacky   case Expr::CXXTemporaryObjectExprClass:
1216f22ef01cSRoman Divacky   case Expr::CXXConstructExprClass:
1217f22ef01cSRoman Divacky     return EmitCXXConstructLValue(cast<CXXConstructExpr>(E));
1218f22ef01cSRoman Divacky   case Expr::CXXBindTemporaryExprClass:
1219f22ef01cSRoman Divacky     return EmitCXXBindTemporaryLValue(cast<CXXBindTemporaryExpr>(E));
12203861d79fSDimitry Andric   case Expr::CXXUuidofExprClass:
12213861d79fSDimitry Andric     return EmitCXXUuidofLValue(cast<CXXUuidofExpr>(E));
1222dff0c46cSDimitry Andric   case Expr::LambdaExprClass:
1223dff0c46cSDimitry Andric     return EmitLambdaLValue(cast<LambdaExpr>(E));
1224dff0c46cSDimitry Andric 
1225dff0c46cSDimitry Andric   case Expr::ExprWithCleanupsClass: {
122659d1ed5bSDimitry Andric     const auto *cleanups = cast<ExprWithCleanups>(E);
1227dff0c46cSDimitry Andric     enterFullExpression(cleanups);
1228dff0c46cSDimitry Andric     RunCleanupsScope Scope(*this);
122920e90f04SDimitry Andric     LValue LV = EmitLValue(cleanups->getSubExpr());
123020e90f04SDimitry Andric     if (LV.isSimple()) {
123120e90f04SDimitry Andric       // Defend against branches out of gnu statement expressions surrounded by
123220e90f04SDimitry Andric       // cleanups.
123320e90f04SDimitry Andric       llvm::Value *V = LV.getPointer();
123420e90f04SDimitry Andric       Scope.ForceCleanup({&V});
123520e90f04SDimitry Andric       return LValue::MakeAddr(Address(V, LV.getAlignment()), LV.getType(),
12369a199699SDimitry Andric                               getContext(), LV.getBaseInfo(), LV.getTBAAInfo());
123720e90f04SDimitry Andric     }
123820e90f04SDimitry Andric     // FIXME: Is it possible to create an ExprWithCleanups that produces a
123920e90f04SDimitry Andric     // bitfield lvalue or some other non-simple lvalue?
124020e90f04SDimitry Andric     return LV;
1241dff0c46cSDimitry Andric   }
1242dff0c46cSDimitry Andric 
1243f22ef01cSRoman Divacky   case Expr::CXXDefaultArgExprClass:
1244f22ef01cSRoman Divacky     return EmitLValue(cast<CXXDefaultArgExpr>(E)->getExpr());
1245284c1978SDimitry Andric   case Expr::CXXDefaultInitExprClass: {
1246284c1978SDimitry Andric     CXXDefaultInitExprScope Scope(*this);
1247284c1978SDimitry Andric     return EmitLValue(cast<CXXDefaultInitExpr>(E)->getExpr());
1248284c1978SDimitry Andric   }
1249f22ef01cSRoman Divacky   case Expr::CXXTypeidExprClass:
1250f22ef01cSRoman Divacky     return EmitCXXTypeidLValue(cast<CXXTypeidExpr>(E));
1251f22ef01cSRoman Divacky 
1252f22ef01cSRoman Divacky   case Expr::ObjCMessageExprClass:
1253f22ef01cSRoman Divacky     return EmitObjCMessageExprLValue(cast<ObjCMessageExpr>(E));
1254f22ef01cSRoman Divacky   case Expr::ObjCIvarRefExprClass:
1255f22ef01cSRoman Divacky     return EmitObjCIvarRefLValue(cast<ObjCIvarRefExpr>(E));
1256f22ef01cSRoman Divacky   case Expr::StmtExprClass:
1257f22ef01cSRoman Divacky     return EmitStmtExprLValue(cast<StmtExpr>(E));
1258f22ef01cSRoman Divacky   case Expr::UnaryOperatorClass:
1259f22ef01cSRoman Divacky     return EmitUnaryOpLValue(cast<UnaryOperator>(E));
1260f22ef01cSRoman Divacky   case Expr::ArraySubscriptExprClass:
1261f22ef01cSRoman Divacky     return EmitArraySubscriptExpr(cast<ArraySubscriptExpr>(E));
12620623d748SDimitry Andric   case Expr::OMPArraySectionExprClass:
12630623d748SDimitry Andric     return EmitOMPArraySectionExpr(cast<OMPArraySectionExpr>(E));
1264f22ef01cSRoman Divacky   case Expr::ExtVectorElementExprClass:
1265f22ef01cSRoman Divacky     return EmitExtVectorElementExpr(cast<ExtVectorElementExpr>(E));
1266f22ef01cSRoman Divacky   case Expr::MemberExprClass:
1267f22ef01cSRoman Divacky     return EmitMemberExpr(cast<MemberExpr>(E));
1268f22ef01cSRoman Divacky   case Expr::CompoundLiteralExprClass:
1269f22ef01cSRoman Divacky     return EmitCompoundLiteralLValue(cast<CompoundLiteralExpr>(E));
1270f22ef01cSRoman Divacky   case Expr::ConditionalOperatorClass:
1271f22ef01cSRoman Divacky     return EmitConditionalOperatorLValue(cast<ConditionalOperator>(E));
12722754fe60SDimitry Andric   case Expr::BinaryConditionalOperatorClass:
12732754fe60SDimitry Andric     return EmitConditionalOperatorLValue(cast<BinaryConditionalOperator>(E));
1274f22ef01cSRoman Divacky   case Expr::ChooseExprClass:
1275f785676fSDimitry Andric     return EmitLValue(cast<ChooseExpr>(E)->getChosenSubExpr());
12762754fe60SDimitry Andric   case Expr::OpaqueValueExprClass:
12772754fe60SDimitry Andric     return EmitOpaqueValueLValue(cast<OpaqueValueExpr>(E));
127817a519f9SDimitry Andric   case Expr::SubstNonTypeTemplateParmExprClass:
127917a519f9SDimitry Andric     return EmitLValue(cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement());
1280f22ef01cSRoman Divacky   case Expr::ImplicitCastExprClass:
1281f22ef01cSRoman Divacky   case Expr::CStyleCastExprClass:
1282f22ef01cSRoman Divacky   case Expr::CXXFunctionalCastExprClass:
1283f22ef01cSRoman Divacky   case Expr::CXXStaticCastExprClass:
1284f22ef01cSRoman Divacky   case Expr::CXXDynamicCastExprClass:
1285f22ef01cSRoman Divacky   case Expr::CXXReinterpretCastExprClass:
1286f22ef01cSRoman Divacky   case Expr::CXXConstCastExprClass:
128717a519f9SDimitry Andric   case Expr::ObjCBridgedCastExprClass:
1288f22ef01cSRoman Divacky     return EmitCastLValue(cast<CastExpr>(E));
128917a519f9SDimitry Andric 
129017a519f9SDimitry Andric   case Expr::MaterializeTemporaryExprClass:
129117a519f9SDimitry Andric     return EmitMaterializeTemporaryExpr(cast<MaterializeTemporaryExpr>(E));
129224d58133SDimitry Andric 
129324d58133SDimitry Andric   case Expr::CoawaitExprClass:
129424d58133SDimitry Andric     return EmitCoawaitLValue(cast<CoawaitExpr>(E));
129524d58133SDimitry Andric   case Expr::CoyieldExprClass:
129624d58133SDimitry Andric     return EmitCoyieldLValue(cast<CoyieldExpr>(E));
1297f22ef01cSRoman Divacky   }
1298f22ef01cSRoman Divacky }
1299f22ef01cSRoman Divacky 
1300dff0c46cSDimitry Andric /// Given an object of the given canonical type, can we safely copy a
1301dff0c46cSDimitry Andric /// value out of it based on its initializer?
1302dff0c46cSDimitry Andric static bool isConstantEmittableObjectType(QualType type) {
1303dff0c46cSDimitry Andric   assert(type.isCanonical());
1304dff0c46cSDimitry Andric   assert(!type->isReferenceType());
1305dff0c46cSDimitry Andric 
1306dff0c46cSDimitry Andric   // Must be const-qualified but non-volatile.
1307dff0c46cSDimitry Andric   Qualifiers qs = type.getLocalQualifiers();
1308dff0c46cSDimitry Andric   if (!qs.hasConst() || qs.hasVolatile()) return false;
1309dff0c46cSDimitry Andric 
1310dff0c46cSDimitry Andric   // Otherwise, all object types satisfy this except C++ classes with
1311dff0c46cSDimitry Andric   // mutable subobjects or non-trivial copy/destroy behavior.
131259d1ed5bSDimitry Andric   if (const auto *RT = dyn_cast<RecordType>(type))
131359d1ed5bSDimitry Andric     if (const auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl()))
1314dff0c46cSDimitry Andric       if (RD->hasMutableFields() || !RD->isTrivial())
1315dff0c46cSDimitry Andric         return false;
1316dff0c46cSDimitry Andric 
1317dff0c46cSDimitry Andric   return true;
1318dff0c46cSDimitry Andric }
1319dff0c46cSDimitry Andric 
1320dff0c46cSDimitry Andric /// Can we constant-emit a load of a reference to a variable of the
1321dff0c46cSDimitry Andric /// given type?  This is different from predicates like
1322dff0c46cSDimitry Andric /// Decl::isUsableInConstantExpressions because we do want it to apply
1323dff0c46cSDimitry Andric /// in situations that don't necessarily satisfy the language's rules
1324dff0c46cSDimitry Andric /// for this (e.g. C++'s ODR-use rules).  For example, we want to able
1325dff0c46cSDimitry Andric /// to do this with const float variables even if those variables
1326dff0c46cSDimitry Andric /// aren't marked 'constexpr'.
1327dff0c46cSDimitry Andric enum ConstantEmissionKind {
1328dff0c46cSDimitry Andric   CEK_None,
1329dff0c46cSDimitry Andric   CEK_AsReferenceOnly,
1330dff0c46cSDimitry Andric   CEK_AsValueOrReference,
1331dff0c46cSDimitry Andric   CEK_AsValueOnly
1332dff0c46cSDimitry Andric };
1333dff0c46cSDimitry Andric static ConstantEmissionKind checkVarTypeForConstantEmission(QualType type) {
1334dff0c46cSDimitry Andric   type = type.getCanonicalType();
133559d1ed5bSDimitry Andric   if (const auto *ref = dyn_cast<ReferenceType>(type)) {
1336dff0c46cSDimitry Andric     if (isConstantEmittableObjectType(ref->getPointeeType()))
1337dff0c46cSDimitry Andric       return CEK_AsValueOrReference;
1338dff0c46cSDimitry Andric     return CEK_AsReferenceOnly;
1339dff0c46cSDimitry Andric   }
1340dff0c46cSDimitry Andric   if (isConstantEmittableObjectType(type))
1341dff0c46cSDimitry Andric     return CEK_AsValueOnly;
1342dff0c46cSDimitry Andric   return CEK_None;
1343dff0c46cSDimitry Andric }
1344dff0c46cSDimitry Andric 
1345dff0c46cSDimitry Andric /// Try to emit a reference to the given value without producing it as
1346dff0c46cSDimitry Andric /// an l-value.  This is actually more than an optimization: we can't
1347dff0c46cSDimitry Andric /// produce an l-value for variables that we never actually captured
1348dff0c46cSDimitry Andric /// in a block or lambda, which means const int variables or constexpr
1349dff0c46cSDimitry Andric /// literals or similar.
1350dff0c46cSDimitry Andric CodeGenFunction::ConstantEmission
1351dff0c46cSDimitry Andric CodeGenFunction::tryEmitAsConstant(DeclRefExpr *refExpr) {
1352dff0c46cSDimitry Andric   ValueDecl *value = refExpr->getDecl();
1353dff0c46cSDimitry Andric 
1354dff0c46cSDimitry Andric   // The value needs to be an enum constant or a constant variable.
1355dff0c46cSDimitry Andric   ConstantEmissionKind CEK;
1356dff0c46cSDimitry Andric   if (isa<ParmVarDecl>(value)) {
1357dff0c46cSDimitry Andric     CEK = CEK_None;
135859d1ed5bSDimitry Andric   } else if (auto *var = dyn_cast<VarDecl>(value)) {
1359dff0c46cSDimitry Andric     CEK = checkVarTypeForConstantEmission(var->getType());
1360dff0c46cSDimitry Andric   } else if (isa<EnumConstantDecl>(value)) {
1361dff0c46cSDimitry Andric     CEK = CEK_AsValueOnly;
1362dff0c46cSDimitry Andric   } else {
1363dff0c46cSDimitry Andric     CEK = CEK_None;
1364dff0c46cSDimitry Andric   }
1365dff0c46cSDimitry Andric   if (CEK == CEK_None) return ConstantEmission();
1366dff0c46cSDimitry Andric 
1367dff0c46cSDimitry Andric   Expr::EvalResult result;
1368dff0c46cSDimitry Andric   bool resultIsReference;
1369dff0c46cSDimitry Andric   QualType resultType;
1370dff0c46cSDimitry Andric 
1371dff0c46cSDimitry Andric   // It's best to evaluate all the way as an r-value if that's permitted.
1372dff0c46cSDimitry Andric   if (CEK != CEK_AsReferenceOnly &&
1373dff0c46cSDimitry Andric       refExpr->EvaluateAsRValue(result, getContext())) {
1374dff0c46cSDimitry Andric     resultIsReference = false;
1375dff0c46cSDimitry Andric     resultType = refExpr->getType();
1376dff0c46cSDimitry Andric 
1377dff0c46cSDimitry Andric   // Otherwise, try to evaluate as an l-value.
1378dff0c46cSDimitry Andric   } else if (CEK != CEK_AsValueOnly &&
1379dff0c46cSDimitry Andric              refExpr->EvaluateAsLValue(result, getContext())) {
1380dff0c46cSDimitry Andric     resultIsReference = true;
1381dff0c46cSDimitry Andric     resultType = value->getType();
1382dff0c46cSDimitry Andric 
1383dff0c46cSDimitry Andric   // Failure.
1384dff0c46cSDimitry Andric   } else {
1385dff0c46cSDimitry Andric     return ConstantEmission();
1386dff0c46cSDimitry Andric   }
1387dff0c46cSDimitry Andric 
1388dff0c46cSDimitry Andric   // In any case, if the initializer has side-effects, abandon ship.
1389dff0c46cSDimitry Andric   if (result.HasSideEffects)
1390dff0c46cSDimitry Andric     return ConstantEmission();
1391dff0c46cSDimitry Andric 
1392dff0c46cSDimitry Andric   // Emit as a constant.
13939a199699SDimitry Andric   auto C = ConstantEmitter(*this).emitAbstract(refExpr->getLocation(),
13949a199699SDimitry Andric                                                result.Val, resultType);
1395dff0c46cSDimitry Andric 
1396dff0c46cSDimitry Andric   // Make sure we emit a debug reference to the global variable.
1397dff0c46cSDimitry Andric   // This should probably fire even for
1398dff0c46cSDimitry Andric   if (isa<VarDecl>(value)) {
1399dff0c46cSDimitry Andric     if (!getContext().DeclMustBeEmitted(cast<VarDecl>(value)))
140044290647SDimitry Andric       EmitDeclRefExprDbgValue(refExpr, result.Val);
1401dff0c46cSDimitry Andric   } else {
1402dff0c46cSDimitry Andric     assert(isa<EnumConstantDecl>(value));
140344290647SDimitry Andric     EmitDeclRefExprDbgValue(refExpr, result.Val);
1404dff0c46cSDimitry Andric   }
1405dff0c46cSDimitry Andric 
1406dff0c46cSDimitry Andric   // If we emitted a reference constant, we need to dereference that.
1407dff0c46cSDimitry Andric   if (resultIsReference)
1408dff0c46cSDimitry Andric     return ConstantEmission::forReference(C);
1409dff0c46cSDimitry Andric 
1410dff0c46cSDimitry Andric   return ConstantEmission::forValue(C);
1411dff0c46cSDimitry Andric }
1412dff0c46cSDimitry Andric 
14139a199699SDimitry Andric static DeclRefExpr *tryToConvertMemberExprToDeclRefExpr(CodeGenFunction &CGF,
14149a199699SDimitry Andric                                                         const MemberExpr *ME) {
14159a199699SDimitry Andric   if (auto *VD = dyn_cast<VarDecl>(ME->getMemberDecl())) {
14169a199699SDimitry Andric     // Try to emit static variable member expressions as DREs.
14179a199699SDimitry Andric     return DeclRefExpr::Create(
14189a199699SDimitry Andric         CGF.getContext(), NestedNameSpecifierLoc(), SourceLocation(), VD,
14199a199699SDimitry Andric         /*RefersToEnclosingVariableOrCapture=*/false, ME->getExprLoc(),
14209a199699SDimitry Andric         ME->getType(), ME->getValueKind());
14219a199699SDimitry Andric   }
14229a199699SDimitry Andric   return nullptr;
14239a199699SDimitry Andric }
14249a199699SDimitry Andric 
14259a199699SDimitry Andric CodeGenFunction::ConstantEmission
14269a199699SDimitry Andric CodeGenFunction::tryEmitAsConstant(const MemberExpr *ME) {
14279a199699SDimitry Andric   if (DeclRefExpr *DRE = tryToConvertMemberExprToDeclRefExpr(*this, ME))
14289a199699SDimitry Andric     return tryEmitAsConstant(DRE);
14299a199699SDimitry Andric   return ConstantEmission();
14309a199699SDimitry Andric }
14319a199699SDimitry Andric 
1432f785676fSDimitry Andric llvm::Value *CodeGenFunction::EmitLoadOfScalar(LValue lvalue,
1433f785676fSDimitry Andric                                                SourceLocation Loc) {
143417a519f9SDimitry Andric   return EmitLoadOfScalar(lvalue.getAddress(), lvalue.isVolatile(),
1435d8866befSDimitry Andric                           lvalue.getType(), Loc, lvalue.getBaseInfo(),
14369a199699SDimitry Andric                           lvalue.getTBAAInfo(), lvalue.isNontemporal());
1437dff0c46cSDimitry Andric }
1438dff0c46cSDimitry Andric 
1439dff0c46cSDimitry Andric static bool hasBooleanRepresentation(QualType Ty) {
1440dff0c46cSDimitry Andric   if (Ty->isBooleanType())
1441dff0c46cSDimitry Andric     return true;
1442dff0c46cSDimitry Andric 
1443dff0c46cSDimitry Andric   if (const EnumType *ET = Ty->getAs<EnumType>())
1444dff0c46cSDimitry Andric     return ET->getDecl()->getIntegerType()->isBooleanType();
1445dff0c46cSDimitry Andric 
1446dff0c46cSDimitry Andric   if (const AtomicType *AT = Ty->getAs<AtomicType>())
1447dff0c46cSDimitry Andric     return hasBooleanRepresentation(AT->getValueType());
1448dff0c46cSDimitry Andric 
1449dff0c46cSDimitry Andric   return false;
1450dff0c46cSDimitry Andric }
1451dff0c46cSDimitry Andric 
1452139f7f9bSDimitry Andric static bool getRangeForType(CodeGenFunction &CGF, QualType Ty,
1453139f7f9bSDimitry Andric                             llvm::APInt &Min, llvm::APInt &End,
145444290647SDimitry Andric                             bool StrictEnums, bool IsBool) {
1455dff0c46cSDimitry Andric   const EnumType *ET = Ty->getAs<EnumType>();
1456139f7f9bSDimitry Andric   bool IsRegularCPlusPlusEnum = CGF.getLangOpts().CPlusPlus && StrictEnums &&
1457139f7f9bSDimitry Andric                                 ET && !ET->getDecl()->isFixed();
1458dff0c46cSDimitry Andric   if (!IsBool && !IsRegularCPlusPlusEnum)
1459139f7f9bSDimitry Andric     return false;
1460dff0c46cSDimitry Andric 
1461dff0c46cSDimitry Andric   if (IsBool) {
1462139f7f9bSDimitry Andric     Min = llvm::APInt(CGF.getContext().getTypeSize(Ty), 0);
1463139f7f9bSDimitry Andric     End = llvm::APInt(CGF.getContext().getTypeSize(Ty), 2);
1464dff0c46cSDimitry Andric   } else {
1465dff0c46cSDimitry Andric     const EnumDecl *ED = ET->getDecl();
1466139f7f9bSDimitry Andric     llvm::Type *LTy = CGF.ConvertTypeForMem(ED->getIntegerType());
1467dff0c46cSDimitry Andric     unsigned Bitwidth = LTy->getScalarSizeInBits();
1468dff0c46cSDimitry Andric     unsigned NumNegativeBits = ED->getNumNegativeBits();
1469dff0c46cSDimitry Andric     unsigned NumPositiveBits = ED->getNumPositiveBits();
1470dff0c46cSDimitry Andric 
1471dff0c46cSDimitry Andric     if (NumNegativeBits) {
1472dff0c46cSDimitry Andric       unsigned NumBits = std::max(NumNegativeBits, NumPositiveBits + 1);
1473dff0c46cSDimitry Andric       assert(NumBits <= Bitwidth);
1474dff0c46cSDimitry Andric       End = llvm::APInt(Bitwidth, 1) << (NumBits - 1);
1475dff0c46cSDimitry Andric       Min = -End;
1476dff0c46cSDimitry Andric     } else {
1477dff0c46cSDimitry Andric       assert(NumPositiveBits <= Bitwidth);
1478dff0c46cSDimitry Andric       End = llvm::APInt(Bitwidth, 1) << NumPositiveBits;
1479dff0c46cSDimitry Andric       Min = llvm::APInt(Bitwidth, 0);
1480dff0c46cSDimitry Andric     }
1481dff0c46cSDimitry Andric   }
1482139f7f9bSDimitry Andric   return true;
1483139f7f9bSDimitry Andric }
1484139f7f9bSDimitry Andric 
1485139f7f9bSDimitry Andric llvm::MDNode *CodeGenFunction::getRangeForLoadFromType(QualType Ty) {
1486139f7f9bSDimitry Andric   llvm::APInt Min, End;
148744290647SDimitry Andric   if (!getRangeForType(*this, Ty, Min, End, CGM.getCodeGenOpts().StrictEnums,
148844290647SDimitry Andric                        hasBooleanRepresentation(Ty)))
148959d1ed5bSDimitry Andric     return nullptr;
1490dff0c46cSDimitry Andric 
1491cb4dff85SDimitry Andric   llvm::MDBuilder MDHelper(getLLVMContext());
1492cb4dff85SDimitry Andric   return MDHelper.createRange(Min, End);
149317a519f9SDimitry Andric }
149417a519f9SDimitry Andric 
149520e90f04SDimitry Andric bool CodeGenFunction::EmitScalarRangeCheck(llvm::Value *Value, QualType Ty,
149620e90f04SDimitry Andric                                            SourceLocation Loc) {
149720e90f04SDimitry Andric   bool HasBoolCheck = SanOpts.has(SanitizerKind::Bool);
149820e90f04SDimitry Andric   bool HasEnumCheck = SanOpts.has(SanitizerKind::Enum);
149920e90f04SDimitry Andric   if (!HasBoolCheck && !HasEnumCheck)
150020e90f04SDimitry Andric     return false;
150120e90f04SDimitry Andric 
150220e90f04SDimitry Andric   bool IsBool = hasBooleanRepresentation(Ty) ||
150320e90f04SDimitry Andric                 NSAPI(CGM.getContext()).isObjCBOOLType(Ty);
150420e90f04SDimitry Andric   bool NeedsBoolCheck = HasBoolCheck && IsBool;
150520e90f04SDimitry Andric   bool NeedsEnumCheck = HasEnumCheck && Ty->getAs<EnumType>();
150620e90f04SDimitry Andric   if (!NeedsBoolCheck && !NeedsEnumCheck)
150720e90f04SDimitry Andric     return false;
150820e90f04SDimitry Andric 
150920e90f04SDimitry Andric   // Single-bit booleans don't need to be checked. Special-case this to avoid
151020e90f04SDimitry Andric   // a bit width mismatch when handling bitfield values. This is handled by
151120e90f04SDimitry Andric   // EmitFromMemory for the non-bitfield case.
151220e90f04SDimitry Andric   if (IsBool &&
151320e90f04SDimitry Andric       cast<llvm::IntegerType>(Value->getType())->getBitWidth() == 1)
151420e90f04SDimitry Andric     return false;
151520e90f04SDimitry Andric 
151620e90f04SDimitry Andric   llvm::APInt Min, End;
151720e90f04SDimitry Andric   if (!getRangeForType(*this, Ty, Min, End, /*StrictEnums=*/true, IsBool))
151820e90f04SDimitry Andric     return true;
151920e90f04SDimitry Andric 
15209a199699SDimitry Andric   auto &Ctx = getLLVMContext();
152120e90f04SDimitry Andric   SanitizerScope SanScope(this);
152220e90f04SDimitry Andric   llvm::Value *Check;
152320e90f04SDimitry Andric   --End;
152420e90f04SDimitry Andric   if (!Min) {
15259a199699SDimitry Andric     Check = Builder.CreateICmpULE(Value, llvm::ConstantInt::get(Ctx, End));
152620e90f04SDimitry Andric   } else {
15279a199699SDimitry Andric     llvm::Value *Upper =
15289a199699SDimitry Andric         Builder.CreateICmpSLE(Value, llvm::ConstantInt::get(Ctx, End));
15299a199699SDimitry Andric     llvm::Value *Lower =
15309a199699SDimitry Andric         Builder.CreateICmpSGE(Value, llvm::ConstantInt::get(Ctx, Min));
153120e90f04SDimitry Andric     Check = Builder.CreateAnd(Upper, Lower);
153220e90f04SDimitry Andric   }
153320e90f04SDimitry Andric   llvm::Constant *StaticArgs[] = {EmitCheckSourceLocation(Loc),
153420e90f04SDimitry Andric                                   EmitCheckTypeDescriptor(Ty)};
153520e90f04SDimitry Andric   SanitizerMask Kind =
153620e90f04SDimitry Andric       NeedsEnumCheck ? SanitizerKind::Enum : SanitizerKind::Bool;
153720e90f04SDimitry Andric   EmitCheck(std::make_pair(Check, Kind), SanitizerHandler::LoadInvalidValue,
153820e90f04SDimitry Andric             StaticArgs, EmitCheckValue(Value));
153920e90f04SDimitry Andric   return true;
154020e90f04SDimitry Andric }
154120e90f04SDimitry Andric 
15420623d748SDimitry Andric llvm::Value *CodeGenFunction::EmitLoadOfScalar(Address Addr, bool Volatile,
15430623d748SDimitry Andric                                                QualType Ty,
1544f785676fSDimitry Andric                                                SourceLocation Loc,
1545d8866befSDimitry Andric                                                LValueBaseInfo BaseInfo,
15469a199699SDimitry Andric                                                TBAAAccessInfo TBAAInfo,
15470623d748SDimitry Andric                                                bool isNontemporal) {
154820e90f04SDimitry Andric   if (!CGM.getCodeGenOpts().PreserveVec3Type) {
15497ae0e2c9SDimitry Andric     // For better performance, handle vector loads differently.
15507ae0e2c9SDimitry Andric     if (Ty->isVectorType()) {
15510623d748SDimitry Andric       const llvm::Type *EltTy = Addr.getElementType();
15527ae0e2c9SDimitry Andric 
155359d1ed5bSDimitry Andric       const auto *VTy = cast<llvm::VectorType>(EltTy);
15547ae0e2c9SDimitry Andric 
15550623d748SDimitry Andric       // Handle vectors of size 3 like size 4 for better performance.
15567ae0e2c9SDimitry Andric       if (VTy->getNumElements() == 3) {
15577ae0e2c9SDimitry Andric 
15587ae0e2c9SDimitry Andric         // Bitcast to vec4 type.
155920e90f04SDimitry Andric         llvm::VectorType *vec4Ty =
156020e90f04SDimitry Andric             llvm::VectorType::get(VTy->getElementType(), 4);
15610623d748SDimitry Andric         Address Cast = Builder.CreateElementBitCast(Addr, vec4Ty, "castToVec4");
15627ae0e2c9SDimitry Andric         // Now load value.
15630623d748SDimitry Andric         llvm::Value *V = Builder.CreateLoad(Cast, Volatile, "loadVec4");
15647ae0e2c9SDimitry Andric 
15657ae0e2c9SDimitry Andric         // Shuffle vector to get vec3.
15660623d748SDimitry Andric         V = Builder.CreateShuffleVector(V, llvm::UndefValue::get(vec4Ty),
15670623d748SDimitry Andric                                         {0, 1, 2}, "extractVec");
15687ae0e2c9SDimitry Andric         return EmitFromMemory(V, Ty);
15697ae0e2c9SDimitry Andric       }
15707ae0e2c9SDimitry Andric     }
157120e90f04SDimitry Andric   }
15727ae0e2c9SDimitry Andric 
1573139f7f9bSDimitry Andric   // Atomic operations have to be done on integral types.
1574e7145dcbSDimitry Andric   LValue AtomicLValue =
1575d8866befSDimitry Andric       LValue::MakeAddr(Addr, Ty, getContext(), BaseInfo, TBAAInfo);
1576e7145dcbSDimitry Andric   if (Ty->isAtomicType() || LValueIsSuitableForInlineAtomic(AtomicLValue)) {
1577e7145dcbSDimitry Andric     return EmitAtomicLoad(AtomicLValue, Loc).getScalarVal();
1578139f7f9bSDimitry Andric   }
1579139f7f9bSDimitry Andric 
15800623d748SDimitry Andric   llvm::LoadInst *Load = Builder.CreateLoad(Addr, Volatile);
15810623d748SDimitry Andric   if (isNontemporal) {
15820623d748SDimitry Andric     llvm::MDNode *Node = llvm::MDNode::get(
15830623d748SDimitry Andric         Load->getContext(), llvm::ConstantAsMetadata::get(Builder.getInt32(1)));
15840623d748SDimitry Andric     Load->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node);
15850623d748SDimitry Andric   }
15869a199699SDimitry Andric 
15879a199699SDimitry Andric   CGM.DecorateInstructionWithTBAA(Load, TBAAInfo);
1588dff0c46cSDimitry Andric 
158920e90f04SDimitry Andric   if (EmitScalarRangeCheck(Load, Ty, Loc)) {
159020e90f04SDimitry Andric     // In order to prevent the optimizer from throwing away the check, don't
159120e90f04SDimitry Andric     // attach range metadata to the load.
1592139f7f9bSDimitry Andric   } else if (CGM.getCodeGenOpts().OptimizationLevel > 0)
1593dff0c46cSDimitry Andric     if (llvm::MDNode *RangeInfo = getRangeForLoadFromType(Ty))
1594dff0c46cSDimitry Andric       Load->setMetadata(llvm::LLVMContext::MD_range, RangeInfo);
1595f22ef01cSRoman Divacky 
15962754fe60SDimitry Andric   return EmitFromMemory(Load, Ty);
15972754fe60SDimitry Andric }
1598f22ef01cSRoman Divacky 
15992754fe60SDimitry Andric llvm::Value *CodeGenFunction::EmitToMemory(llvm::Value *Value, QualType Ty) {
16002754fe60SDimitry Andric   // Bool has a different representation in memory than in registers.
1601dff0c46cSDimitry Andric   if (hasBooleanRepresentation(Ty)) {
16022754fe60SDimitry Andric     // This should really always be an i1, but sometimes it's already
16032754fe60SDimitry Andric     // an i8, and it's awkward to track those cases down.
16042754fe60SDimitry Andric     if (Value->getType()->isIntegerTy(1))
1605139f7f9bSDimitry Andric       return Builder.CreateZExt(Value, ConvertTypeForMem(Ty), "frombool");
1606139f7f9bSDimitry Andric     assert(Value->getType()->isIntegerTy(getContext().getTypeSize(Ty)) &&
1607139f7f9bSDimitry Andric            "wrong value rep of bool");
16082754fe60SDimitry Andric   }
16092754fe60SDimitry Andric 
16102754fe60SDimitry Andric   return Value;
16112754fe60SDimitry Andric }
16122754fe60SDimitry Andric 
16132754fe60SDimitry Andric llvm::Value *CodeGenFunction::EmitFromMemory(llvm::Value *Value, QualType Ty) {
16142754fe60SDimitry Andric   // Bool has a different representation in memory than in registers.
1615dff0c46cSDimitry Andric   if (hasBooleanRepresentation(Ty)) {
1616139f7f9bSDimitry Andric     assert(Value->getType()->isIntegerTy(getContext().getTypeSize(Ty)) &&
1617139f7f9bSDimitry Andric            "wrong value rep of bool");
16182754fe60SDimitry Andric     return Builder.CreateTrunc(Value, Builder.getInt1Ty(), "tobool");
16192754fe60SDimitry Andric   }
16202754fe60SDimitry Andric 
16212754fe60SDimitry Andric   return Value;
1622f22ef01cSRoman Divacky }
1623f22ef01cSRoman Divacky 
16240623d748SDimitry Andric void CodeGenFunction::EmitStoreOfScalar(llvm::Value *Value, Address Addr,
16250623d748SDimitry Andric                                         bool Volatile, QualType Ty,
1626d8866befSDimitry Andric                                         LValueBaseInfo BaseInfo,
16279a199699SDimitry Andric                                         TBAAAccessInfo TBAAInfo,
16289a199699SDimitry Andric                                         bool isInit, bool isNontemporal) {
162920e90f04SDimitry Andric   if (!CGM.getCodeGenOpts().PreserveVec3Type) {
16307ae0e2c9SDimitry Andric     // Handle vectors differently to get better performance.
16317ae0e2c9SDimitry Andric     if (Ty->isVectorType()) {
16327ae0e2c9SDimitry Andric       llvm::Type *SrcTy = Value->getType();
16336d97bb29SDimitry Andric       auto *VecTy = dyn_cast<llvm::VectorType>(SrcTy);
16347ae0e2c9SDimitry Andric       // Handle vec3 special.
16356d97bb29SDimitry Andric       if (VecTy && VecTy->getNumElements() == 3) {
16367ae0e2c9SDimitry Andric         // Our source is a vec3, do a shuffle vector to make it a vec4.
16370623d748SDimitry Andric         llvm::Constant *Mask[] = {Builder.getInt32(0), Builder.getInt32(1),
16380623d748SDimitry Andric                                   Builder.getInt32(2),
16390623d748SDimitry Andric                                   llvm::UndefValue::get(Builder.getInt32Ty())};
16407ae0e2c9SDimitry Andric         llvm::Value *MaskV = llvm::ConstantVector::get(Mask);
164120e90f04SDimitry Andric         Value = Builder.CreateShuffleVector(Value, llvm::UndefValue::get(VecTy),
16427ae0e2c9SDimitry Andric                                             MaskV, "extractVec");
16437ae0e2c9SDimitry Andric         SrcTy = llvm::VectorType::get(VecTy->getElementType(), 4);
16447ae0e2c9SDimitry Andric       }
16450623d748SDimitry Andric       if (Addr.getElementType() != SrcTy) {
16460623d748SDimitry Andric         Addr = Builder.CreateElementBitCast(Addr, SrcTy, "storetmp");
16477ae0e2c9SDimitry Andric       }
16487ae0e2c9SDimitry Andric     }
164920e90f04SDimitry Andric   }
16507ae0e2c9SDimitry Andric 
16512754fe60SDimitry Andric   Value = EmitToMemory(Value, Ty);
165217a519f9SDimitry Andric 
1653e7145dcbSDimitry Andric   LValue AtomicLValue =
1654d8866befSDimitry Andric       LValue::MakeAddr(Addr, Ty, getContext(), BaseInfo, TBAAInfo);
165533956c43SDimitry Andric   if (Ty->isAtomicType() ||
1656e7145dcbSDimitry Andric       (!isInit && LValueIsSuitableForInlineAtomic(AtomicLValue))) {
1657e7145dcbSDimitry Andric     EmitAtomicStore(RValue::get(Value), AtomicLValue, isInit);
1658139f7f9bSDimitry Andric     return;
1659139f7f9bSDimitry Andric   }
1660139f7f9bSDimitry Andric 
1661e580952dSDimitry Andric   llvm::StoreInst *Store = Builder.CreateStore(Value, Addr, Volatile);
16620623d748SDimitry Andric   if (isNontemporal) {
16630623d748SDimitry Andric     llvm::MDNode *Node =
16640623d748SDimitry Andric         llvm::MDNode::get(Store->getContext(),
16650623d748SDimitry Andric                           llvm::ConstantAsMetadata::get(Builder.getInt32(1)));
16660623d748SDimitry Andric     Store->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node);
16670623d748SDimitry Andric   }
16689a199699SDimitry Andric 
16699a199699SDimitry Andric   CGM.DecorateInstructionWithTBAA(Store, TBAAInfo);
1670f22ef01cSRoman Divacky }
1671f22ef01cSRoman Divacky 
1672dff0c46cSDimitry Andric void CodeGenFunction::EmitStoreOfScalar(llvm::Value *value, LValue lvalue,
1673dff0c46cSDimitry Andric                                         bool isInit) {
167417a519f9SDimitry Andric   EmitStoreOfScalar(value, lvalue.getAddress(), lvalue.isVolatile(),
1675d8866befSDimitry Andric                     lvalue.getType(), lvalue.getBaseInfo(),
16769a199699SDimitry Andric                     lvalue.getTBAAInfo(), isInit, lvalue.isNontemporal());
167717a519f9SDimitry Andric }
167817a519f9SDimitry Andric 
1679f22ef01cSRoman Divacky /// EmitLoadOfLValue - Given an expression that represents a value lvalue, this
1680f22ef01cSRoman Divacky /// method emits the address of the lvalue, then loads the result as an rvalue,
1681f22ef01cSRoman Divacky /// returning the rvalue.
1682f785676fSDimitry Andric RValue CodeGenFunction::EmitLoadOfLValue(LValue LV, SourceLocation Loc) {
1683f22ef01cSRoman Divacky   if (LV.isObjCWeak()) {
1684f22ef01cSRoman Divacky     // load of a __weak object.
16850623d748SDimitry Andric     Address AddrWeakObj = LV.getAddress();
1686f22ef01cSRoman Divacky     return RValue::get(CGM.getObjCRuntime().EmitObjCWeakRead(*this,
1687f22ef01cSRoman Divacky                                                              AddrWeakObj));
1688f22ef01cSRoman Divacky   }
1689139f7f9bSDimitry Andric   if (LV.getQuals().getObjCLifetime() == Qualifiers::OCL_Weak) {
16900623d748SDimitry Andric     // In MRC mode, we do a load+autorelease.
16910623d748SDimitry Andric     if (!getLangOpts().ObjCAutoRefCount) {
16920623d748SDimitry Andric       return RValue::get(EmitARCLoadWeak(LV.getAddress()));
16930623d748SDimitry Andric     }
16940623d748SDimitry Andric 
16950623d748SDimitry Andric     // In ARC mode, we load retained and then consume the value.
1696139f7f9bSDimitry Andric     llvm::Value *Object = EmitARCLoadWeakRetained(LV.getAddress());
1697139f7f9bSDimitry Andric     Object = EmitObjCConsumeObject(LV.getType(), Object);
1698139f7f9bSDimitry Andric     return RValue::get(Object);
1699139f7f9bSDimitry Andric   }
1700f22ef01cSRoman Divacky 
1701f22ef01cSRoman Divacky   if (LV.isSimple()) {
170217a519f9SDimitry Andric     assert(!LV.getType()->isFunctionType());
1703e580952dSDimitry Andric 
1704e580952dSDimitry Andric     // Everything needs a load.
1705f785676fSDimitry Andric     return RValue::get(EmitLoadOfScalar(LV, Loc));
1706f22ef01cSRoman Divacky   }
1707f22ef01cSRoman Divacky 
1708f22ef01cSRoman Divacky   if (LV.isVectorElt()) {
17090623d748SDimitry Andric     llvm::LoadInst *Load = Builder.CreateLoad(LV.getVectorAddress(),
17106122f3e6SDimitry Andric                                               LV.isVolatileQualified());
1711dff0c46cSDimitry Andric     return RValue::get(Builder.CreateExtractElement(Load, LV.getVectorIdx(),
1712f22ef01cSRoman Divacky                                                     "vecext"));
1713f22ef01cSRoman Divacky   }
1714f22ef01cSRoman Divacky 
1715f22ef01cSRoman Divacky   // If this is a reference to a subset of the elements of a vector, either
1716f22ef01cSRoman Divacky   // shuffle the input or extract/insert them as appropriate.
1717f22ef01cSRoman Divacky   if (LV.isExtVectorElt())
171817a519f9SDimitry Andric     return EmitLoadOfExtVectorElementLValue(LV);
1719f22ef01cSRoman Divacky 
172059d1ed5bSDimitry Andric   // Global Register variables always invoke intrinsics
172159d1ed5bSDimitry Andric   if (LV.isGlobalReg())
172259d1ed5bSDimitry Andric     return EmitLoadOfGlobalRegLValue(LV);
172359d1ed5bSDimitry Andric 
1724dff0c46cSDimitry Andric   assert(LV.isBitField() && "Unknown LValue type!");
172520e90f04SDimitry Andric   return EmitLoadOfBitfieldLValue(LV, Loc);
1726f22ef01cSRoman Divacky }
1727f22ef01cSRoman Divacky 
172820e90f04SDimitry Andric RValue CodeGenFunction::EmitLoadOfBitfieldLValue(LValue LV,
172920e90f04SDimitry Andric                                                  SourceLocation Loc) {
1730f22ef01cSRoman Divacky   const CGBitFieldInfo &Info = LV.getBitFieldInfo();
1731f22ef01cSRoman Divacky 
1732f22ef01cSRoman Divacky   // Get the output type.
17336122f3e6SDimitry Andric   llvm::Type *ResLTy = ConvertType(LV.getType());
1734f22ef01cSRoman Divacky 
17350623d748SDimitry Andric   Address Ptr = LV.getBitFieldAddress();
17360623d748SDimitry Andric   llvm::Value *Val = Builder.CreateLoad(Ptr, LV.isVolatileQualified(), "bf.load");
1737f22ef01cSRoman Divacky 
1738139f7f9bSDimitry Andric   if (Info.IsSigned) {
1739139f7f9bSDimitry Andric     assert(static_cast<unsigned>(Info.Offset + Info.Size) <= Info.StorageSize);
1740139f7f9bSDimitry Andric     unsigned HighBits = Info.StorageSize - Info.Offset - Info.Size;
1741139f7f9bSDimitry Andric     if (HighBits)
1742139f7f9bSDimitry Andric       Val = Builder.CreateShl(Val, HighBits, "bf.shl");
1743139f7f9bSDimitry Andric     if (Info.Offset + HighBits)
1744139f7f9bSDimitry Andric       Val = Builder.CreateAShr(Val, Info.Offset + HighBits, "bf.ashr");
1745139f7f9bSDimitry Andric   } else {
1746139f7f9bSDimitry Andric     if (Info.Offset)
1747139f7f9bSDimitry Andric       Val = Builder.CreateLShr(Val, Info.Offset, "bf.lshr");
1748139f7f9bSDimitry Andric     if (static_cast<unsigned>(Info.Offset) + Info.Size < Info.StorageSize)
1749139f7f9bSDimitry Andric       Val = Builder.CreateAnd(Val, llvm::APInt::getLowBitsSet(Info.StorageSize,
1750139f7f9bSDimitry Andric                                                               Info.Size),
1751f22ef01cSRoman Divacky                               "bf.clear");
1752f22ef01cSRoman Divacky   }
1753139f7f9bSDimitry Andric   Val = Builder.CreateIntCast(Val, ResLTy, Info.IsSigned, "bf.cast");
175420e90f04SDimitry Andric   EmitScalarRangeCheck(Val, LV.getType(), Loc);
1755139f7f9bSDimitry Andric   return RValue::get(Val);
1756f22ef01cSRoman Divacky }
1757f22ef01cSRoman Divacky 
1758f22ef01cSRoman Divacky // If this is a reference to a subset of the elements of a vector, create an
1759f22ef01cSRoman Divacky // appropriate shufflevector.
176017a519f9SDimitry Andric RValue CodeGenFunction::EmitLoadOfExtVectorElementLValue(LValue LV) {
17610623d748SDimitry Andric   llvm::Value *Vec = Builder.CreateLoad(LV.getExtVectorAddress(),
17626122f3e6SDimitry Andric                                         LV.isVolatileQualified());
1763f22ef01cSRoman Divacky 
1764f22ef01cSRoman Divacky   const llvm::Constant *Elts = LV.getExtVectorElts();
1765f22ef01cSRoman Divacky 
1766f22ef01cSRoman Divacky   // If the result of the expression is a non-vector type, we must be extracting
1767f22ef01cSRoman Divacky   // a single element.  Just codegen as an extractelement.
176817a519f9SDimitry Andric   const VectorType *ExprVT = LV.getType()->getAs<VectorType>();
1769f22ef01cSRoman Divacky   if (!ExprVT) {
1770f22ef01cSRoman Divacky     unsigned InIdx = getAccessedFieldNo(0, Elts);
177159d1ed5bSDimitry Andric     llvm::Value *Elt = llvm::ConstantInt::get(SizeTy, InIdx);
17726122f3e6SDimitry Andric     return RValue::get(Builder.CreateExtractElement(Vec, Elt));
1773f22ef01cSRoman Divacky   }
1774f22ef01cSRoman Divacky 
1775f22ef01cSRoman Divacky   // Always use shuffle vector to try to retain the original program structure
1776f22ef01cSRoman Divacky   unsigned NumResultElts = ExprVT->getNumElements();
1777f22ef01cSRoman Divacky 
17786122f3e6SDimitry Andric   SmallVector<llvm::Constant*, 4> Mask;
1779dff0c46cSDimitry Andric   for (unsigned i = 0; i != NumResultElts; ++i)
1780dff0c46cSDimitry Andric     Mask.push_back(Builder.getInt32(getAccessedFieldNo(i, Elts)));
1781f22ef01cSRoman Divacky 
17822754fe60SDimitry Andric   llvm::Value *MaskV = llvm::ConstantVector::get(Mask);
17832754fe60SDimitry Andric   Vec = Builder.CreateShuffleVector(Vec, llvm::UndefValue::get(Vec->getType()),
17846122f3e6SDimitry Andric                                     MaskV);
1785f22ef01cSRoman Divacky   return RValue::get(Vec);
1786f22ef01cSRoman Divacky }
1787f22ef01cSRoman Divacky 
178839d628a0SDimitry Andric /// @brief Generates lvalue for partial ext_vector access.
17890623d748SDimitry Andric Address CodeGenFunction::EmitExtVectorElementLValue(LValue LV) {
17900623d748SDimitry Andric   Address VectorAddress = LV.getExtVectorAddress();
179139d628a0SDimitry Andric   const VectorType *ExprVT = LV.getType()->getAs<VectorType>();
179239d628a0SDimitry Andric   QualType EQT = ExprVT->getElementType();
179339d628a0SDimitry Andric   llvm::Type *VectorElementTy = CGM.getTypes().ConvertType(EQT);
179439d628a0SDimitry Andric 
17950623d748SDimitry Andric   Address CastToPointerElement =
17960623d748SDimitry Andric     Builder.CreateElementBitCast(VectorAddress, VectorElementTy,
17970623d748SDimitry Andric                                  "conv.ptr.element");
179839d628a0SDimitry Andric 
179939d628a0SDimitry Andric   const llvm::Constant *Elts = LV.getExtVectorElts();
180039d628a0SDimitry Andric   unsigned ix = getAccessedFieldNo(0, Elts);
180139d628a0SDimitry Andric 
18020623d748SDimitry Andric   Address VectorBasePtrPlusIx =
18030623d748SDimitry Andric     Builder.CreateConstInBoundsGEP(CastToPointerElement, ix,
18040623d748SDimitry Andric                                    getContext().getTypeSizeInChars(EQT),
18050623d748SDimitry Andric                                    "vector.elt");
180639d628a0SDimitry Andric 
180739d628a0SDimitry Andric   return VectorBasePtrPlusIx;
180839d628a0SDimitry Andric }
180939d628a0SDimitry Andric 
181059d1ed5bSDimitry Andric /// @brief Load of global gamed gegisters are always calls to intrinsics.
181159d1ed5bSDimitry Andric RValue CodeGenFunction::EmitLoadOfGlobalRegLValue(LValue LV) {
181259d1ed5bSDimitry Andric   assert((LV.getType()->isIntegerType() || LV.getType()->isPointerType()) &&
181359d1ed5bSDimitry Andric          "Bad type for register variable");
181439d628a0SDimitry Andric   llvm::MDNode *RegName = cast<llvm::MDNode>(
181539d628a0SDimitry Andric       cast<llvm::MetadataAsValue>(LV.getGlobalReg())->getMetadata());
181659d1ed5bSDimitry Andric 
181759d1ed5bSDimitry Andric   // We accept integer and pointer types only
181859d1ed5bSDimitry Andric   llvm::Type *OrigTy = CGM.getTypes().ConvertType(LV.getType());
181959d1ed5bSDimitry Andric   llvm::Type *Ty = OrigTy;
182059d1ed5bSDimitry Andric   if (OrigTy->isPointerTy())
182159d1ed5bSDimitry Andric     Ty = CGM.getTypes().getDataLayout().getIntPtrType(OrigTy);
182259d1ed5bSDimitry Andric   llvm::Type *Types[] = { Ty };
182359d1ed5bSDimitry Andric 
182459d1ed5bSDimitry Andric   llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::read_register, Types);
182539d628a0SDimitry Andric   llvm::Value *Call = Builder.CreateCall(
182639d628a0SDimitry Andric       F, llvm::MetadataAsValue::get(Ty->getContext(), RegName));
182759d1ed5bSDimitry Andric   if (OrigTy->isPointerTy())
182859d1ed5bSDimitry Andric     Call = Builder.CreateIntToPtr(Call, OrigTy);
182959d1ed5bSDimitry Andric   return RValue::get(Call);
183059d1ed5bSDimitry Andric }
1831f22ef01cSRoman Divacky 
1832f22ef01cSRoman Divacky 
1833f22ef01cSRoman Divacky /// EmitStoreThroughLValue - Store the specified rvalue into the specified
1834f22ef01cSRoman Divacky /// lvalue, where both are guaranteed to the have the same type, and that type
1835f22ef01cSRoman Divacky /// is 'Ty'.
1836f785676fSDimitry Andric void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst,
1837f785676fSDimitry Andric                                              bool isInit) {
1838f22ef01cSRoman Divacky   if (!Dst.isSimple()) {
1839f22ef01cSRoman Divacky     if (Dst.isVectorElt()) {
1840f22ef01cSRoman Divacky       // Read/modify/write the vector, inserting the new element.
18410623d748SDimitry Andric       llvm::Value *Vec = Builder.CreateLoad(Dst.getVectorAddress(),
18426122f3e6SDimitry Andric                                             Dst.isVolatileQualified());
1843f22ef01cSRoman Divacky       Vec = Builder.CreateInsertElement(Vec, Src.getScalarVal(),
1844f22ef01cSRoman Divacky                                         Dst.getVectorIdx(), "vecins");
18450623d748SDimitry Andric       Builder.CreateStore(Vec, Dst.getVectorAddress(),
1846dff0c46cSDimitry Andric                           Dst.isVolatileQualified());
1847f22ef01cSRoman Divacky       return;
1848f22ef01cSRoman Divacky     }
1849f22ef01cSRoman Divacky 
1850f22ef01cSRoman Divacky     // If this is an update of extended vector elements, insert them as
1851f22ef01cSRoman Divacky     // appropriate.
1852f22ef01cSRoman Divacky     if (Dst.isExtVectorElt())
185317a519f9SDimitry Andric       return EmitStoreThroughExtVectorComponentLValue(Src, Dst);
1854f22ef01cSRoman Divacky 
185559d1ed5bSDimitry Andric     if (Dst.isGlobalReg())
185659d1ed5bSDimitry Andric       return EmitStoreThroughGlobalRegLValue(Src, Dst);
185759d1ed5bSDimitry Andric 
1858dff0c46cSDimitry Andric     assert(Dst.isBitField() && "Unknown LValue type");
185917a519f9SDimitry Andric     return EmitStoreThroughBitfieldLValue(Src, Dst);
1860f22ef01cSRoman Divacky   }
1861f22ef01cSRoman Divacky 
186217a519f9SDimitry Andric   // There's special magic for assigning into an ARC-qualified l-value.
186317a519f9SDimitry Andric   if (Qualifiers::ObjCLifetime Lifetime = Dst.getQuals().getObjCLifetime()) {
186417a519f9SDimitry Andric     switch (Lifetime) {
186517a519f9SDimitry Andric     case Qualifiers::OCL_None:
186617a519f9SDimitry Andric       llvm_unreachable("present but none");
186717a519f9SDimitry Andric 
186817a519f9SDimitry Andric     case Qualifiers::OCL_ExplicitNone:
186917a519f9SDimitry Andric       // nothing special
187017a519f9SDimitry Andric       break;
187117a519f9SDimitry Andric 
187217a519f9SDimitry Andric     case Qualifiers::OCL_Strong:
187344290647SDimitry Andric       if (isInit) {
187444290647SDimitry Andric         Src = RValue::get(EmitARCRetain(Dst.getType(), Src.getScalarVal()));
187544290647SDimitry Andric         break;
187644290647SDimitry Andric       }
187717a519f9SDimitry Andric       EmitARCStoreStrong(Dst, Src.getScalarVal(), /*ignore*/ true);
187817a519f9SDimitry Andric       return;
187917a519f9SDimitry Andric 
188017a519f9SDimitry Andric     case Qualifiers::OCL_Weak:
188144290647SDimitry Andric       if (isInit)
188244290647SDimitry Andric         // Initialize and then skip the primitive store.
188344290647SDimitry Andric         EmitARCInitWeak(Dst.getAddress(), Src.getScalarVal());
188444290647SDimitry Andric       else
188517a519f9SDimitry Andric         EmitARCStoreWeak(Dst.getAddress(), Src.getScalarVal(), /*ignore*/ true);
188617a519f9SDimitry Andric       return;
188717a519f9SDimitry Andric 
188817a519f9SDimitry Andric     case Qualifiers::OCL_Autoreleasing:
188917a519f9SDimitry Andric       Src = RValue::get(EmitObjCExtendObjectLifetime(Dst.getType(),
189017a519f9SDimitry Andric                                                      Src.getScalarVal()));
189117a519f9SDimitry Andric       // fall into the normal path
189217a519f9SDimitry Andric       break;
189317a519f9SDimitry Andric     }
189417a519f9SDimitry Andric   }
189517a519f9SDimitry Andric 
1896f22ef01cSRoman Divacky   if (Dst.isObjCWeak() && !Dst.isNonGC()) {
1897f22ef01cSRoman Divacky     // load of a __weak object.
18980623d748SDimitry Andric     Address LvalueDst = Dst.getAddress();
1899f22ef01cSRoman Divacky     llvm::Value *src = Src.getScalarVal();
1900f22ef01cSRoman Divacky      CGM.getObjCRuntime().EmitObjCWeakAssign(*this, src, LvalueDst);
1901f22ef01cSRoman Divacky     return;
1902f22ef01cSRoman Divacky   }
1903f22ef01cSRoman Divacky 
1904f22ef01cSRoman Divacky   if (Dst.isObjCStrong() && !Dst.isNonGC()) {
1905f22ef01cSRoman Divacky     // load of a __strong object.
19060623d748SDimitry Andric     Address LvalueDst = Dst.getAddress();
1907f22ef01cSRoman Divacky     llvm::Value *src = Src.getScalarVal();
1908f22ef01cSRoman Divacky     if (Dst.isObjCIvar()) {
1909f22ef01cSRoman Divacky       assert(Dst.getBaseIvarExp() && "BaseIvarExp is NULL");
19100623d748SDimitry Andric       llvm::Type *ResultType = IntPtrTy;
19110623d748SDimitry Andric       Address dst = EmitPointerWithAlignment(Dst.getBaseIvarExp());
19120623d748SDimitry Andric       llvm::Value *RHS = dst.getPointer();
1913f22ef01cSRoman Divacky       RHS = Builder.CreatePtrToInt(RHS, ResultType, "sub.ptr.rhs.cast");
1914f22ef01cSRoman Divacky       llvm::Value *LHS =
19150623d748SDimitry Andric         Builder.CreatePtrToInt(LvalueDst.getPointer(), ResultType,
19160623d748SDimitry Andric                                "sub.ptr.lhs.cast");
1917f22ef01cSRoman Divacky       llvm::Value *BytesBetween = Builder.CreateSub(LHS, RHS, "ivar.offset");
1918f22ef01cSRoman Divacky       CGM.getObjCRuntime().EmitObjCIvarAssign(*this, src, dst,
1919f22ef01cSRoman Divacky                                               BytesBetween);
1920e580952dSDimitry Andric     } else if (Dst.isGlobalObjCRef()) {
1921e580952dSDimitry Andric       CGM.getObjCRuntime().EmitObjCGlobalAssign(*this, src, LvalueDst,
1922e580952dSDimitry Andric                                                 Dst.isThreadLocalRef());
1923e580952dSDimitry Andric     }
1924f22ef01cSRoman Divacky     else
1925f22ef01cSRoman Divacky       CGM.getObjCRuntime().EmitObjCStrongCastAssign(*this, src, LvalueDst);
1926f22ef01cSRoman Divacky     return;
1927f22ef01cSRoman Divacky   }
1928f22ef01cSRoman Divacky 
1929f22ef01cSRoman Divacky   assert(Src.isScalar() && "Can't emit an agg store with this method");
1930dff0c46cSDimitry Andric   EmitStoreOfScalar(Src.getScalarVal(), Dst, isInit);
1931f22ef01cSRoman Divacky }
1932f22ef01cSRoman Divacky 
1933f22ef01cSRoman Divacky void CodeGenFunction::EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst,
1934f22ef01cSRoman Divacky                                                      llvm::Value **Result) {
1935f22ef01cSRoman Divacky   const CGBitFieldInfo &Info = Dst.getBitFieldInfo();
19366122f3e6SDimitry Andric   llvm::Type *ResLTy = ConvertTypeForMem(Dst.getType());
19370623d748SDimitry Andric   Address Ptr = Dst.getBitFieldAddress();
1938f22ef01cSRoman Divacky 
1939f22ef01cSRoman Divacky   // Get the source value, truncated to the width of the bit-field.
1940f22ef01cSRoman Divacky   llvm::Value *SrcVal = Src.getScalarVal();
1941f22ef01cSRoman Divacky 
1942139f7f9bSDimitry Andric   // Cast the source to the storage type and shift it into place.
19430623d748SDimitry Andric   SrcVal = Builder.CreateIntCast(SrcVal, Ptr.getElementType(),
1944139f7f9bSDimitry Andric                                  /*IsSigned=*/false);
1945139f7f9bSDimitry Andric   llvm::Value *MaskedVal = SrcVal;
1946f22ef01cSRoman Divacky 
1947139f7f9bSDimitry Andric   // See if there are other bits in the bitfield's storage we'll need to load
1948139f7f9bSDimitry Andric   // and mask together with source before storing.
1949139f7f9bSDimitry Andric   if (Info.StorageSize != Info.Size) {
1950139f7f9bSDimitry Andric     assert(Info.StorageSize > Info.Size && "Invalid bitfield size.");
19510623d748SDimitry Andric     llvm::Value *Val =
19520623d748SDimitry Andric       Builder.CreateLoad(Ptr, Dst.isVolatileQualified(), "bf.load");
1953139f7f9bSDimitry Andric 
1954139f7f9bSDimitry Andric     // Mask the source value as needed.
1955139f7f9bSDimitry Andric     if (!hasBooleanRepresentation(Dst.getType()))
1956139f7f9bSDimitry Andric       SrcVal = Builder.CreateAnd(SrcVal,
1957139f7f9bSDimitry Andric                                  llvm::APInt::getLowBitsSet(Info.StorageSize,
1958139f7f9bSDimitry Andric                                                             Info.Size),
1959f22ef01cSRoman Divacky                                  "bf.value");
1960139f7f9bSDimitry Andric     MaskedVal = SrcVal;
1961139f7f9bSDimitry Andric     if (Info.Offset)
1962139f7f9bSDimitry Andric       SrcVal = Builder.CreateShl(SrcVal, Info.Offset, "bf.shl");
1963139f7f9bSDimitry Andric 
1964139f7f9bSDimitry Andric     // Mask out the original value.
1965139f7f9bSDimitry Andric     Val = Builder.CreateAnd(Val,
1966139f7f9bSDimitry Andric                             ~llvm::APInt::getBitsSet(Info.StorageSize,
1967139f7f9bSDimitry Andric                                                      Info.Offset,
1968139f7f9bSDimitry Andric                                                      Info.Offset + Info.Size),
1969139f7f9bSDimitry Andric                             "bf.clear");
1970139f7f9bSDimitry Andric 
1971139f7f9bSDimitry Andric     // Or together the unchanged values and the source value.
1972139f7f9bSDimitry Andric     SrcVal = Builder.CreateOr(Val, SrcVal, "bf.set");
1973139f7f9bSDimitry Andric   } else {
1974139f7f9bSDimitry Andric     assert(Info.Offset == 0);
1975139f7f9bSDimitry Andric   }
1976139f7f9bSDimitry Andric 
1977139f7f9bSDimitry Andric   // Write the new value back out.
19780623d748SDimitry Andric   Builder.CreateStore(SrcVal, Ptr, Dst.isVolatileQualified());
1979f22ef01cSRoman Divacky 
1980f22ef01cSRoman Divacky   // Return the new value of the bit-field, if requested.
1981f22ef01cSRoman Divacky   if (Result) {
1982139f7f9bSDimitry Andric     llvm::Value *ResultVal = MaskedVal;
1983f22ef01cSRoman Divacky 
1984139f7f9bSDimitry Andric     // Sign extend the value if needed.
1985139f7f9bSDimitry Andric     if (Info.IsSigned) {
1986139f7f9bSDimitry Andric       assert(Info.Size <= Info.StorageSize);
1987139f7f9bSDimitry Andric       unsigned HighBits = Info.StorageSize - Info.Size;
1988139f7f9bSDimitry Andric       if (HighBits) {
1989139f7f9bSDimitry Andric         ResultVal = Builder.CreateShl(ResultVal, HighBits, "bf.result.shl");
1990139f7f9bSDimitry Andric         ResultVal = Builder.CreateAShr(ResultVal, HighBits, "bf.result.ashr");
1991139f7f9bSDimitry Andric       }
1992f22ef01cSRoman Divacky     }
1993f22ef01cSRoman Divacky 
1994139f7f9bSDimitry Andric     ResultVal = Builder.CreateIntCast(ResultVal, ResLTy, Info.IsSigned,
1995139f7f9bSDimitry Andric                                       "bf.result.cast");
1996139f7f9bSDimitry Andric     *Result = EmitFromMemory(ResultVal, Dst.getType());
1997f22ef01cSRoman Divacky   }
1998f22ef01cSRoman Divacky }
1999f22ef01cSRoman Divacky 
2000f22ef01cSRoman Divacky void CodeGenFunction::EmitStoreThroughExtVectorComponentLValue(RValue Src,
200117a519f9SDimitry Andric                                                                LValue Dst) {
2002f22ef01cSRoman Divacky   // This access turns into a read/modify/write of the vector.  Load the input
2003f22ef01cSRoman Divacky   // value now.
20040623d748SDimitry Andric   llvm::Value *Vec = Builder.CreateLoad(Dst.getExtVectorAddress(),
20056122f3e6SDimitry Andric                                         Dst.isVolatileQualified());
2006f22ef01cSRoman Divacky   const llvm::Constant *Elts = Dst.getExtVectorElts();
2007f22ef01cSRoman Divacky 
2008f22ef01cSRoman Divacky   llvm::Value *SrcVal = Src.getScalarVal();
2009f22ef01cSRoman Divacky 
201017a519f9SDimitry Andric   if (const VectorType *VTy = Dst.getType()->getAs<VectorType>()) {
2011f22ef01cSRoman Divacky     unsigned NumSrcElts = VTy->getNumElements();
2012e7145dcbSDimitry Andric     unsigned NumDstElts = Vec->getType()->getVectorNumElements();
2013f22ef01cSRoman Divacky     if (NumDstElts == NumSrcElts) {
2014f22ef01cSRoman Divacky       // Use shuffle vector is the src and destination are the same number of
2015f22ef01cSRoman Divacky       // elements and restore the vector mask since it is on the side it will be
2016f22ef01cSRoman Divacky       // stored.
20176122f3e6SDimitry Andric       SmallVector<llvm::Constant*, 4> Mask(NumDstElts);
2018dff0c46cSDimitry Andric       for (unsigned i = 0; i != NumSrcElts; ++i)
2019dff0c46cSDimitry Andric         Mask[getAccessedFieldNo(i, Elts)] = Builder.getInt32(i);
2020f22ef01cSRoman Divacky 
20212754fe60SDimitry Andric       llvm::Value *MaskV = llvm::ConstantVector::get(Mask);
2022f22ef01cSRoman Divacky       Vec = Builder.CreateShuffleVector(SrcVal,
2023f22ef01cSRoman Divacky                                         llvm::UndefValue::get(Vec->getType()),
20246122f3e6SDimitry Andric                                         MaskV);
2025f22ef01cSRoman Divacky     } else if (NumDstElts > NumSrcElts) {
2026f22ef01cSRoman Divacky       // Extended the source vector to the same length and then shuffle it
2027f22ef01cSRoman Divacky       // into the destination.
2028f22ef01cSRoman Divacky       // FIXME: since we're shuffling with undef, can we just use the indices
2029f22ef01cSRoman Divacky       //        into that?  This could be simpler.
20306122f3e6SDimitry Andric       SmallVector<llvm::Constant*, 4> ExtMask;
2031dff0c46cSDimitry Andric       for (unsigned i = 0; i != NumSrcElts; ++i)
2032dff0c46cSDimitry Andric         ExtMask.push_back(Builder.getInt32(i));
2033dff0c46cSDimitry Andric       ExtMask.resize(NumDstElts, llvm::UndefValue::get(Int32Ty));
20342754fe60SDimitry Andric       llvm::Value *ExtMaskV = llvm::ConstantVector::get(ExtMask);
2035f22ef01cSRoman Divacky       llvm::Value *ExtSrcVal =
2036f22ef01cSRoman Divacky         Builder.CreateShuffleVector(SrcVal,
2037f22ef01cSRoman Divacky                                     llvm::UndefValue::get(SrcVal->getType()),
20386122f3e6SDimitry Andric                                     ExtMaskV);
2039f22ef01cSRoman Divacky       // build identity
20406122f3e6SDimitry Andric       SmallVector<llvm::Constant*, 4> Mask;
2041f22ef01cSRoman Divacky       for (unsigned i = 0; i != NumDstElts; ++i)
2042dff0c46cSDimitry Andric         Mask.push_back(Builder.getInt32(i));
2043f22ef01cSRoman Divacky 
2044f785676fSDimitry Andric       // When the vector size is odd and .odd or .hi is used, the last element
2045f785676fSDimitry Andric       // of the Elts constant array will be one past the size of the vector.
2046f785676fSDimitry Andric       // Ignore the last element here, if it is greater than the mask size.
2047f785676fSDimitry Andric       if (getAccessedFieldNo(NumSrcElts - 1, Elts) == Mask.size())
2048f785676fSDimitry Andric         NumSrcElts--;
2049f785676fSDimitry Andric 
2050f22ef01cSRoman Divacky       // modify when what gets shuffled in
2051dff0c46cSDimitry Andric       for (unsigned i = 0; i != NumSrcElts; ++i)
2052dff0c46cSDimitry Andric         Mask[getAccessedFieldNo(i, Elts)] = Builder.getInt32(i+NumDstElts);
20532754fe60SDimitry Andric       llvm::Value *MaskV = llvm::ConstantVector::get(Mask);
20546122f3e6SDimitry Andric       Vec = Builder.CreateShuffleVector(Vec, ExtSrcVal, MaskV);
2055f22ef01cSRoman Divacky     } else {
2056f22ef01cSRoman Divacky       // We should never shorten the vector
20576122f3e6SDimitry Andric       llvm_unreachable("unexpected shorten vector length");
2058f22ef01cSRoman Divacky     }
2059f22ef01cSRoman Divacky   } else {
2060f22ef01cSRoman Divacky     // If the Src is a scalar (not a vector) it must be updating one element.
2061f22ef01cSRoman Divacky     unsigned InIdx = getAccessedFieldNo(0, Elts);
206259d1ed5bSDimitry Andric     llvm::Value *Elt = llvm::ConstantInt::get(SizeTy, InIdx);
20636122f3e6SDimitry Andric     Vec = Builder.CreateInsertElement(Vec, SrcVal, Elt);
2064f22ef01cSRoman Divacky   }
2065f22ef01cSRoman Divacky 
20660623d748SDimitry Andric   Builder.CreateStore(Vec, Dst.getExtVectorAddress(),
2067dff0c46cSDimitry Andric                       Dst.isVolatileQualified());
2068f22ef01cSRoman Divacky }
2069f22ef01cSRoman Divacky 
207059d1ed5bSDimitry Andric /// @brief Store of global named registers are always calls to intrinsics.
207159d1ed5bSDimitry Andric void CodeGenFunction::EmitStoreThroughGlobalRegLValue(RValue Src, LValue Dst) {
207259d1ed5bSDimitry Andric   assert((Dst.getType()->isIntegerType() || Dst.getType()->isPointerType()) &&
207359d1ed5bSDimitry Andric          "Bad type for register variable");
207439d628a0SDimitry Andric   llvm::MDNode *RegName = cast<llvm::MDNode>(
207539d628a0SDimitry Andric       cast<llvm::MetadataAsValue>(Dst.getGlobalReg())->getMetadata());
207659d1ed5bSDimitry Andric   assert(RegName && "Register LValue is not metadata");
207759d1ed5bSDimitry Andric 
207859d1ed5bSDimitry Andric   // We accept integer and pointer types only
207959d1ed5bSDimitry Andric   llvm::Type *OrigTy = CGM.getTypes().ConvertType(Dst.getType());
208059d1ed5bSDimitry Andric   llvm::Type *Ty = OrigTy;
208159d1ed5bSDimitry Andric   if (OrigTy->isPointerTy())
208259d1ed5bSDimitry Andric     Ty = CGM.getTypes().getDataLayout().getIntPtrType(OrigTy);
208359d1ed5bSDimitry Andric   llvm::Type *Types[] = { Ty };
208459d1ed5bSDimitry Andric 
208559d1ed5bSDimitry Andric   llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::write_register, Types);
208659d1ed5bSDimitry Andric   llvm::Value *Value = Src.getScalarVal();
208759d1ed5bSDimitry Andric   if (OrigTy->isPointerTy())
208859d1ed5bSDimitry Andric     Value = Builder.CreatePtrToInt(Value, Ty);
208933956c43SDimitry Andric   Builder.CreateCall(
209033956c43SDimitry Andric       F, {llvm::MetadataAsValue::get(Ty->getContext(), RegName), Value});
209159d1ed5bSDimitry Andric }
209259d1ed5bSDimitry Andric 
209359d1ed5bSDimitry Andric // setObjCGCLValueClass - sets class of the lvalue for the purpose of
2094f22ef01cSRoman Divacky // generating write-barries API. It is currently a global, ivar,
2095f22ef01cSRoman Divacky // or neither.
2096f22ef01cSRoman Divacky static void setObjCGCLValueClass(const ASTContext &Ctx, const Expr *E,
20976122f3e6SDimitry Andric                                  LValue &LV,
20986122f3e6SDimitry Andric                                  bool IsMemberAccess=false) {
2099dff0c46cSDimitry Andric   if (Ctx.getLangOpts().getGC() == LangOptions::NonGC)
2100f22ef01cSRoman Divacky     return;
2101f22ef01cSRoman Divacky 
2102f22ef01cSRoman Divacky   if (isa<ObjCIvarRefExpr>(E)) {
21036122f3e6SDimitry Andric     QualType ExpTy = E->getType();
21046122f3e6SDimitry Andric     if (IsMemberAccess && ExpTy->isPointerType()) {
21056122f3e6SDimitry Andric       // If ivar is a structure pointer, assigning to field of
21066122f3e6SDimitry Andric       // this struct follows gcc's behavior and makes it a non-ivar
21076122f3e6SDimitry Andric       // writer-barrier conservatively.
21086122f3e6SDimitry Andric       ExpTy = ExpTy->getAs<PointerType>()->getPointeeType();
21096122f3e6SDimitry Andric       if (ExpTy->isRecordType()) {
21106122f3e6SDimitry Andric         LV.setObjCIvar(false);
21116122f3e6SDimitry Andric         return;
21126122f3e6SDimitry Andric       }
21136122f3e6SDimitry Andric     }
2114e580952dSDimitry Andric     LV.setObjCIvar(true);
211559d1ed5bSDimitry Andric     auto *Exp = cast<ObjCIvarRefExpr>(const_cast<Expr *>(E));
2116f22ef01cSRoman Divacky     LV.setBaseIvarExp(Exp->getBase());
2117e580952dSDimitry Andric     LV.setObjCArray(E->getType()->isArrayType());
2118f22ef01cSRoman Divacky     return;
2119f22ef01cSRoman Divacky   }
2120f22ef01cSRoman Divacky 
212159d1ed5bSDimitry Andric   if (const auto *Exp = dyn_cast<DeclRefExpr>(E)) {
212259d1ed5bSDimitry Andric     if (const auto *VD = dyn_cast<VarDecl>(Exp->getDecl())) {
21232754fe60SDimitry Andric       if (VD->hasGlobalStorage()) {
2124e580952dSDimitry Andric         LV.setGlobalObjCRef(true);
2125284c1978SDimitry Andric         LV.setThreadLocalRef(VD->getTLSKind() != VarDecl::TLS_None);
2126f22ef01cSRoman Divacky       }
2127e580952dSDimitry Andric     }
2128e580952dSDimitry Andric     LV.setObjCArray(E->getType()->isArrayType());
2129f22ef01cSRoman Divacky     return;
2130f22ef01cSRoman Divacky   }
2131f22ef01cSRoman Divacky 
213259d1ed5bSDimitry Andric   if (const auto *Exp = dyn_cast<UnaryOperator>(E)) {
21336122f3e6SDimitry Andric     setObjCGCLValueClass(Ctx, Exp->getSubExpr(), LV, IsMemberAccess);
2134f22ef01cSRoman Divacky     return;
2135f22ef01cSRoman Divacky   }
2136f22ef01cSRoman Divacky 
213759d1ed5bSDimitry Andric   if (const auto *Exp = dyn_cast<ParenExpr>(E)) {
21386122f3e6SDimitry Andric     setObjCGCLValueClass(Ctx, Exp->getSubExpr(), LV, IsMemberAccess);
2139f22ef01cSRoman Divacky     if (LV.isObjCIvar()) {
2140f22ef01cSRoman Divacky       // If cast is to a structure pointer, follow gcc's behavior and make it
2141f22ef01cSRoman Divacky       // a non-ivar write-barrier.
2142f22ef01cSRoman Divacky       QualType ExpTy = E->getType();
2143f22ef01cSRoman Divacky       if (ExpTy->isPointerType())
2144f22ef01cSRoman Divacky         ExpTy = ExpTy->getAs<PointerType>()->getPointeeType();
2145f22ef01cSRoman Divacky       if (ExpTy->isRecordType())
2146e580952dSDimitry Andric         LV.setObjCIvar(false);
2147f22ef01cSRoman Divacky     }
2148f22ef01cSRoman Divacky     return;
2149f22ef01cSRoman Divacky   }
21503b0f4066SDimitry Andric 
215159d1ed5bSDimitry Andric   if (const auto *Exp = dyn_cast<GenericSelectionExpr>(E)) {
21523b0f4066SDimitry Andric     setObjCGCLValueClass(Ctx, Exp->getResultExpr(), LV);
21533b0f4066SDimitry Andric     return;
21543b0f4066SDimitry Andric   }
21553b0f4066SDimitry Andric 
215659d1ed5bSDimitry Andric   if (const auto *Exp = dyn_cast<ImplicitCastExpr>(E)) {
21576122f3e6SDimitry Andric     setObjCGCLValueClass(Ctx, Exp->getSubExpr(), LV, IsMemberAccess);
2158f22ef01cSRoman Divacky     return;
2159f22ef01cSRoman Divacky   }
2160f22ef01cSRoman Divacky 
216159d1ed5bSDimitry Andric   if (const auto *Exp = dyn_cast<CStyleCastExpr>(E)) {
21626122f3e6SDimitry Andric     setObjCGCLValueClass(Ctx, Exp->getSubExpr(), LV, IsMemberAccess);
2163f22ef01cSRoman Divacky     return;
2164f22ef01cSRoman Divacky   }
2165f22ef01cSRoman Divacky 
216659d1ed5bSDimitry Andric   if (const auto *Exp = dyn_cast<ObjCBridgedCastExpr>(E)) {
21676122f3e6SDimitry Andric     setObjCGCLValueClass(Ctx, Exp->getSubExpr(), LV, IsMemberAccess);
216817a519f9SDimitry Andric     return;
216917a519f9SDimitry Andric   }
217017a519f9SDimitry Andric 
217159d1ed5bSDimitry Andric   if (const auto *Exp = dyn_cast<ArraySubscriptExpr>(E)) {
2172f22ef01cSRoman Divacky     setObjCGCLValueClass(Ctx, Exp->getBase(), LV);
2173f22ef01cSRoman Divacky     if (LV.isObjCIvar() && !LV.isObjCArray())
2174f22ef01cSRoman Divacky       // Using array syntax to assigning to what an ivar points to is not
2175f22ef01cSRoman Divacky       // same as assigning to the ivar itself. {id *Names;} Names[i] = 0;
2176e580952dSDimitry Andric       LV.setObjCIvar(false);
2177f22ef01cSRoman Divacky     else if (LV.isGlobalObjCRef() && !LV.isObjCArray())
2178f22ef01cSRoman Divacky       // Using array syntax to assigning to what global points to is not
2179f22ef01cSRoman Divacky       // same as assigning to the global itself. {id *G;} G[i] = 0;
2180e580952dSDimitry Andric       LV.setGlobalObjCRef(false);
2181f22ef01cSRoman Divacky     return;
2182f22ef01cSRoman Divacky   }
2183f22ef01cSRoman Divacky 
218459d1ed5bSDimitry Andric   if (const auto *Exp = dyn_cast<MemberExpr>(E)) {
21856122f3e6SDimitry Andric     setObjCGCLValueClass(Ctx, Exp->getBase(), LV, true);
2186f22ef01cSRoman Divacky     // We don't know if member is an 'ivar', but this flag is looked at
2187f22ef01cSRoman Divacky     // only in the context of LV.isObjCIvar().
2188e580952dSDimitry Andric     LV.setObjCArray(E->getType()->isArrayType());
2189f22ef01cSRoman Divacky     return;
2190f22ef01cSRoman Divacky   }
2191f22ef01cSRoman Divacky }
2192f22ef01cSRoman Divacky 
219317a519f9SDimitry Andric static llvm::Value *
219417a519f9SDimitry Andric EmitBitCastOfLValueToProperType(CodeGenFunction &CGF,
219517a519f9SDimitry Andric                                 llvm::Value *V, llvm::Type *IRType,
21966122f3e6SDimitry Andric                                 StringRef Name = StringRef()) {
219717a519f9SDimitry Andric   unsigned AS = cast<llvm::PointerType>(V->getType())->getAddressSpace();
219817a519f9SDimitry Andric   return CGF.Builder.CreateBitCast(V, IRType->getPointerTo(AS), Name);
219917a519f9SDimitry Andric }
220017a519f9SDimitry Andric 
220139d628a0SDimitry Andric static LValue EmitThreadPrivateVarDeclLValue(
22020623d748SDimitry Andric     CodeGenFunction &CGF, const VarDecl *VD, QualType T, Address Addr,
22030623d748SDimitry Andric     llvm::Type *RealVarTy, SourceLocation Loc) {
22040623d748SDimitry Andric   Addr = CGF.CGM.getOpenMPRuntime().getAddrOfThreadPrivate(CGF, VD, Addr, Loc);
22050623d748SDimitry Andric   Addr = CGF.Builder.CreateElementBitCast(Addr, RealVarTy);
22069a199699SDimitry Andric   return CGF.MakeAddrLValue(Addr, T, AlignmentSource::Decl);
22070623d748SDimitry Andric }
22080623d748SDimitry Andric 
22099a199699SDimitry Andric Address
22109a199699SDimitry Andric CodeGenFunction::EmitLoadOfReference(LValue RefLVal,
22119a199699SDimitry Andric                                      LValueBaseInfo *PointeeBaseInfo,
22129a199699SDimitry Andric                                      TBAAAccessInfo *PointeeTBAAInfo) {
22139a199699SDimitry Andric   llvm::LoadInst *Load = Builder.CreateLoad(RefLVal.getAddress(),
22149a199699SDimitry Andric                                             RefLVal.isVolatile());
22159a199699SDimitry Andric   CGM.DecorateInstructionWithTBAA(Load, RefLVal.getTBAAInfo());
22169a199699SDimitry Andric 
22179a199699SDimitry Andric   CharUnits Align = getNaturalTypeAlignment(RefLVal.getType()->getPointeeType(),
22189a199699SDimitry Andric                                             PointeeBaseInfo, PointeeTBAAInfo,
22199a199699SDimitry Andric                                             /* forPointeeType= */ true);
22209a199699SDimitry Andric   return Address(Load, Align);
22210623d748SDimitry Andric }
22220623d748SDimitry Andric 
22239a199699SDimitry Andric LValue CodeGenFunction::EmitLoadOfReferenceLValue(LValue RefLVal) {
22249a199699SDimitry Andric   LValueBaseInfo PointeeBaseInfo;
22259a199699SDimitry Andric   TBAAAccessInfo PointeeTBAAInfo;
22269a199699SDimitry Andric   Address PointeeAddr = EmitLoadOfReference(RefLVal, &PointeeBaseInfo,
22279a199699SDimitry Andric                                             &PointeeTBAAInfo);
22289a199699SDimitry Andric   return MakeAddrLValue(PointeeAddr, RefLVal.getType()->getPointeeType(),
22299a199699SDimitry Andric                         PointeeBaseInfo, PointeeTBAAInfo);
223039d628a0SDimitry Andric }
223139d628a0SDimitry Andric 
2232e7145dcbSDimitry Andric Address CodeGenFunction::EmitLoadOfPointer(Address Ptr,
2233e7145dcbSDimitry Andric                                            const PointerType *PtrTy,
22349a199699SDimitry Andric                                            LValueBaseInfo *BaseInfo,
22359a199699SDimitry Andric                                            TBAAAccessInfo *TBAAInfo) {
2236e7145dcbSDimitry Andric   llvm::Value *Addr = Builder.CreateLoad(Ptr);
2237d8866befSDimitry Andric   return Address(Addr, getNaturalTypeAlignment(PtrTy->getPointeeType(),
22389a199699SDimitry Andric                                                BaseInfo, TBAAInfo,
2239e7145dcbSDimitry Andric                                                /*forPointeeType=*/true));
2240e7145dcbSDimitry Andric }
2241e7145dcbSDimitry Andric 
2242e7145dcbSDimitry Andric LValue CodeGenFunction::EmitLoadOfPointerLValue(Address PtrAddr,
2243e7145dcbSDimitry Andric                                                 const PointerType *PtrTy) {
2244d8866befSDimitry Andric   LValueBaseInfo BaseInfo;
22459a199699SDimitry Andric   TBAAAccessInfo TBAAInfo;
22469a199699SDimitry Andric   Address Addr = EmitLoadOfPointer(PtrAddr, PtrTy, &BaseInfo, &TBAAInfo);
22479a199699SDimitry Andric   return MakeAddrLValue(Addr, PtrTy->getPointeeType(), BaseInfo, TBAAInfo);
2248e7145dcbSDimitry Andric }
2249e7145dcbSDimitry Andric 
2250f22ef01cSRoman Divacky static LValue EmitGlobalVarDeclLValue(CodeGenFunction &CGF,
2251f22ef01cSRoman Divacky                                       const Expr *E, const VarDecl *VD) {
225259d1ed5bSDimitry Andric   QualType T = E->getType();
225359d1ed5bSDimitry Andric 
225459d1ed5bSDimitry Andric   // If it's thread_local, emit a call to its wrapper function instead.
225539d628a0SDimitry Andric   if (VD->getTLSKind() == VarDecl::TLS_Dynamic &&
225639d628a0SDimitry Andric       CGF.CGM.getCXXABI().usesThreadWrapperFunction())
225759d1ed5bSDimitry Andric     return CGF.CGM.getCXXABI().EmitThreadLocalVarDeclLValue(CGF, VD, T);
225859d1ed5bSDimitry Andric 
2259f22ef01cSRoman Divacky   llvm::Value *V = CGF.CGM.GetAddrOfGlobalVar(VD);
2260dff0c46cSDimitry Andric   llvm::Type *RealVarTy = CGF.getTypes().ConvertTypeForMem(VD->getType());
2261dff0c46cSDimitry Andric   V = EmitBitCastOfLValueToProperType(CGF, V, RealVarTy);
2262dff0c46cSDimitry Andric   CharUnits Alignment = CGF.getContext().getDeclAlign(VD);
22630623d748SDimitry Andric   Address Addr(V, Alignment);
226439d628a0SDimitry Andric   // Emit reference to the private copy of the variable if it is an OpenMP
226539d628a0SDimitry Andric   // threadprivate variable.
226639d628a0SDimitry Andric   if (CGF.getLangOpts().OpenMP && VD->hasAttr<OMPThreadPrivateDeclAttr>())
22670623d748SDimitry Andric     return EmitThreadPrivateVarDeclLValue(CGF, VD, T, Addr, RealVarTy,
226839d628a0SDimitry Andric                                           E->getExprLoc());
22699a199699SDimitry Andric   LValue LV = VD->getType()->isReferenceType() ?
22709a199699SDimitry Andric       CGF.EmitLoadOfReferenceLValue(Addr, VD->getType(),
22719a199699SDimitry Andric                                     AlignmentSource::Decl) :
22729a199699SDimitry Andric       CGF.MakeAddrLValue(Addr, T, AlignmentSource::Decl);
2273f22ef01cSRoman Divacky   setObjCGCLValueClass(CGF.getContext(), E, LV);
2274f22ef01cSRoman Divacky   return LV;
2275f22ef01cSRoman Divacky }
2276f22ef01cSRoman Divacky 
227744290647SDimitry Andric static llvm::Constant *EmitFunctionDeclPointer(CodeGenModule &CGM,
227844290647SDimitry Andric                                                const FunctionDecl *FD) {
227944290647SDimitry Andric   if (FD->hasAttr<WeakRefAttr>()) {
228044290647SDimitry Andric     ConstantAddress aliasee = CGM.GetWeakRefReference(FD);
228144290647SDimitry Andric     return aliasee.getPointer();
228244290647SDimitry Andric   }
228344290647SDimitry Andric 
228444290647SDimitry Andric   llvm::Constant *V = CGM.GetAddrOfFunction(FD);
2285f22ef01cSRoman Divacky   if (!FD->hasPrototype()) {
2286f22ef01cSRoman Divacky     if (const FunctionProtoType *Proto =
2287f22ef01cSRoman Divacky             FD->getType()->getAs<FunctionProtoType>()) {
2288f22ef01cSRoman Divacky       // Ugly case: for a K&R-style definition, the type of the definition
2289f22ef01cSRoman Divacky       // isn't the same as the type of a use.  Correct for this with a
2290f22ef01cSRoman Divacky       // bitcast.
2291f22ef01cSRoman Divacky       QualType NoProtoType =
229244290647SDimitry Andric           CGM.getContext().getFunctionNoProtoType(Proto->getReturnType());
229344290647SDimitry Andric       NoProtoType = CGM.getContext().getPointerType(NoProtoType);
229444290647SDimitry Andric       V = llvm::ConstantExpr::getBitCast(V,
229544290647SDimitry Andric                                       CGM.getTypes().ConvertType(NoProtoType));
2296f22ef01cSRoman Divacky     }
2297f22ef01cSRoman Divacky   }
229844290647SDimitry Andric   return V;
229944290647SDimitry Andric }
230044290647SDimitry Andric 
230144290647SDimitry Andric static LValue EmitFunctionDeclLValue(CodeGenFunction &CGF,
230244290647SDimitry Andric                                      const Expr *E, const FunctionDecl *FD) {
230344290647SDimitry Andric   llvm::Value *V = EmitFunctionDeclPointer(CGF.CGM, FD);
2304dff0c46cSDimitry Andric   CharUnits Alignment = CGF.getContext().getDeclAlign(FD);
23059a199699SDimitry Andric   return CGF.MakeAddrLValue(V, E->getType(), Alignment,
23069a199699SDimitry Andric                             AlignmentSource::Decl);
2307f22ef01cSRoman Divacky }
2308f22ef01cSRoman Divacky 
2309f785676fSDimitry Andric static LValue EmitCapturedFieldLValue(CodeGenFunction &CGF, const FieldDecl *FD,
2310f785676fSDimitry Andric                                       llvm::Value *ThisValue) {
2311f785676fSDimitry Andric   QualType TagType = CGF.getContext().getTagDeclType(FD->getParent());
2312f785676fSDimitry Andric   LValue LV = CGF.MakeNaturalAlignAddrLValue(ThisValue, TagType);
2313f785676fSDimitry Andric   return CGF.EmitLValueForField(LV, FD);
2314f785676fSDimitry Andric }
2315f785676fSDimitry Andric 
231659d1ed5bSDimitry Andric /// Named Registers are named metadata pointing to the register name
231759d1ed5bSDimitry Andric /// which will be read from/written to as an argument to the intrinsic
231859d1ed5bSDimitry Andric /// @llvm.read/write_register.
231959d1ed5bSDimitry Andric /// So far, only the name is being passed down, but other options such as
232059d1ed5bSDimitry Andric /// register type, allocation type or even optimization options could be
232159d1ed5bSDimitry Andric /// passed down via the metadata node.
23220623d748SDimitry Andric static LValue EmitGlobalNamedRegister(const VarDecl *VD, CodeGenModule &CGM) {
232359d1ed5bSDimitry Andric   SmallString<64> Name("llvm.named.register.");
232459d1ed5bSDimitry Andric   AsmLabelAttr *Asm = VD->getAttr<AsmLabelAttr>();
232559d1ed5bSDimitry Andric   assert(Asm->getLabel().size() < 64-Name.size() &&
232659d1ed5bSDimitry Andric       "Register name too big");
232759d1ed5bSDimitry Andric   Name.append(Asm->getLabel());
232859d1ed5bSDimitry Andric   llvm::NamedMDNode *M =
232959d1ed5bSDimitry Andric     CGM.getModule().getOrInsertNamedMetadata(Name);
233059d1ed5bSDimitry Andric   if (M->getNumOperands() == 0) {
233159d1ed5bSDimitry Andric     llvm::MDString *Str = llvm::MDString::get(CGM.getLLVMContext(),
233259d1ed5bSDimitry Andric                                               Asm->getLabel());
233339d628a0SDimitry Andric     llvm::Metadata *Ops[] = {Str};
233459d1ed5bSDimitry Andric     M->addOperand(llvm::MDNode::get(CGM.getLLVMContext(), Ops));
233559d1ed5bSDimitry Andric   }
23360623d748SDimitry Andric 
23370623d748SDimitry Andric   CharUnits Alignment = CGM.getContext().getDeclAlign(VD);
23380623d748SDimitry Andric 
23390623d748SDimitry Andric   llvm::Value *Ptr =
23400623d748SDimitry Andric     llvm::MetadataAsValue::get(CGM.getLLVMContext(), M->getOperand(0));
23410623d748SDimitry Andric   return LValue::MakeGlobalReg(Address(Ptr, Alignment), VD->getType());
234259d1ed5bSDimitry Andric }
234359d1ed5bSDimitry Andric 
2344f22ef01cSRoman Divacky LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
2345f22ef01cSRoman Divacky   const NamedDecl *ND = E->getDecl();
2346dff0c46cSDimitry Andric   QualType T = E->getType();
2347dff0c46cSDimitry Andric 
234859d1ed5bSDimitry Andric   if (const auto *VD = dyn_cast<VarDecl>(ND)) {
234959d1ed5bSDimitry Andric     // Global Named registers access via intrinsics only
235059d1ed5bSDimitry Andric     if (VD->getStorageClass() == SC_Register &&
235159d1ed5bSDimitry Andric         VD->hasAttr<AsmLabelAttr>() && !VD->isLocalVarDecl())
23520623d748SDimitry Andric       return EmitGlobalNamedRegister(VD, CGM);
235359d1ed5bSDimitry Andric 
23543861d79fSDimitry Andric     // A DeclRefExpr for a reference initialized by a constant expression can
23553861d79fSDimitry Andric     // appear without being odr-used. Directly emit the constant initializer.
23563861d79fSDimitry Andric     const Expr *Init = VD->getAnyInitializer(VD);
23573861d79fSDimitry Andric     if (Init && !isa<ParmVarDecl>(VD) && VD->getType()->isReferenceType() &&
23583861d79fSDimitry Andric         VD->isUsableInConstantExpressions(getContext()) &&
23590623d748SDimitry Andric         VD->checkInitIsICE() &&
23600623d748SDimitry Andric         // Do not emit if it is private OpenMP variable.
23619a199699SDimitry Andric         !(E->refersToEnclosingVariableOrCapture() &&
23629a199699SDimitry Andric           ((CapturedStmtInfo &&
23639a199699SDimitry Andric             (LocalDeclMap.count(VD->getCanonicalDecl()) ||
23649a199699SDimitry Andric              CapturedStmtInfo->lookup(VD->getCanonicalDecl()))) ||
23659a199699SDimitry Andric            LambdaCaptureFields.lookup(VD->getCanonicalDecl()) ||
23669a199699SDimitry Andric            isa<BlockDecl>(CurCodeDecl)))) {
23673861d79fSDimitry Andric       llvm::Constant *Val =
23689a199699SDimitry Andric         ConstantEmitter(*this).emitAbstract(E->getLocation(),
23699a199699SDimitry Andric                                             *VD->evaluateValue(),
23709a199699SDimitry Andric                                             VD->getType());
23713861d79fSDimitry Andric       assert(Val && "failed to emit reference constant expression");
23723861d79fSDimitry Andric       // FIXME: Eventually we will want to emit vector element references.
23730623d748SDimitry Andric 
23740623d748SDimitry Andric       // Should we be using the alignment of the constant pointer we emitted?
23759a199699SDimitry Andric       CharUnits Alignment = getNaturalTypeAlignment(E->getType(),
23769a199699SDimitry Andric                                                     /* BaseInfo= */ nullptr,
23779a199699SDimitry Andric                                                     /* TBAAInfo= */ nullptr,
23789a199699SDimitry Andric                                                     /* forPointeeType= */ true);
23799a199699SDimitry Andric       return MakeAddrLValue(Address(Val, Alignment), T, AlignmentSource::Decl);
23803861d79fSDimitry Andric     }
238139d628a0SDimitry Andric 
238239d628a0SDimitry Andric     // Check for captured variables.
238339d628a0SDimitry Andric     if (E->refersToEnclosingVariableOrCapture()) {
23849a199699SDimitry Andric       VD = VD->getCanonicalDecl();
238539d628a0SDimitry Andric       if (auto *FD = LambdaCaptureFields.lookup(VD))
238639d628a0SDimitry Andric         return EmitCapturedFieldLValue(*this, FD, CXXABIThisValue);
238739d628a0SDimitry Andric       else if (CapturedStmtInfo) {
2388f41fbc90SDimitry Andric         auto I = LocalDeclMap.find(VD);
2389f41fbc90SDimitry Andric         if (I != LocalDeclMap.end()) {
23909a199699SDimitry Andric           if (VD->getType()->isReferenceType())
23919a199699SDimitry Andric             return EmitLoadOfReferenceLValue(I->second, VD->getType(),
23929a199699SDimitry Andric                                              AlignmentSource::Decl);
2393f41fbc90SDimitry Andric           return MakeAddrLValue(I->second, T);
23940623d748SDimitry Andric         }
23950623d748SDimitry Andric         LValue CapLVal =
23960623d748SDimitry Andric             EmitCapturedFieldLValue(*this, CapturedStmtInfo->lookup(VD),
23970623d748SDimitry Andric                                     CapturedStmtInfo->getContextValue());
23980623d748SDimitry Andric         return MakeAddrLValue(
23990623d748SDimitry Andric             Address(CapLVal.getPointer(), getContext().getDeclAlign(VD)),
24009a199699SDimitry Andric             CapLVal.getType(), LValueBaseInfo(AlignmentSource::Decl),
24019a199699SDimitry Andric             CapLVal.getTBAAInfo());
24020623d748SDimitry Andric       }
24030623d748SDimitry Andric 
240439d628a0SDimitry Andric       assert(isa<BlockDecl>(CurCodeDecl));
24050623d748SDimitry Andric       Address addr = GetAddrOfBlockDecl(VD, VD->hasAttr<BlocksAttr>());
24069a199699SDimitry Andric       return MakeAddrLValue(addr, T, AlignmentSource::Decl);
240739d628a0SDimitry Andric     }
24083861d79fSDimitry Andric   }
24093861d79fSDimitry Andric 
2410dff0c46cSDimitry Andric   // FIXME: We should be able to assert this for FunctionDecls as well!
2411dff0c46cSDimitry Andric   // FIXME: We should be able to assert this for all DeclRefExprs, not just
2412dff0c46cSDimitry Andric   // those with a valid source location.
2413dff0c46cSDimitry Andric   assert((ND->isUsed(false) || !isa<VarDecl>(ND) ||
2414dff0c46cSDimitry Andric           !E->getLocation().isValid()) &&
2415dff0c46cSDimitry Andric          "Should not use decl without marking it used!");
2416f22ef01cSRoman Divacky 
2417f22ef01cSRoman Divacky   if (ND->hasAttr<WeakRefAttr>()) {
241859d1ed5bSDimitry Andric     const auto *VD = cast<ValueDecl>(ND);
24190623d748SDimitry Andric     ConstantAddress Aliasee = CGM.GetWeakRefReference(VD);
24209a199699SDimitry Andric     return MakeAddrLValue(Aliasee, T, AlignmentSource::Decl);
2421f22ef01cSRoman Divacky   }
2422f22ef01cSRoman Divacky 
242359d1ed5bSDimitry Andric   if (const auto *VD = dyn_cast<VarDecl>(ND)) {
2424f22ef01cSRoman Divacky     // Check if this is a global variable.
242559d1ed5bSDimitry Andric     if (VD->hasLinkage() || VD->isStaticDataMember())
2426f22ef01cSRoman Divacky       return EmitGlobalVarDeclLValue(*this, E, VD);
2427f22ef01cSRoman Divacky 
24280623d748SDimitry Andric     Address addr = Address::invalid();
2429dff0c46cSDimitry Andric 
24300623d748SDimitry Andric     // The variable should generally be present in the local decl map.
24310623d748SDimitry Andric     auto iter = LocalDeclMap.find(VD);
24320623d748SDimitry Andric     if (iter != LocalDeclMap.end()) {
24330623d748SDimitry Andric       addr = iter->second;
2434dff0c46cSDimitry Andric 
24350623d748SDimitry Andric     // Otherwise, it might be static local we haven't emitted yet for
24360623d748SDimitry Andric     // some reason; most likely, because it's in an outer function.
24370623d748SDimitry Andric     } else if (VD->isStaticLocal()) {
24380623d748SDimitry Andric       addr = Address(CGM.getOrCreateStaticVarDecl(
24390623d748SDimitry Andric           *VD, CGM.getLLVMLinkageVarDefinition(VD, /*isConstant=*/false)),
24400623d748SDimitry Andric                      getContext().getDeclAlign(VD));
2441dff0c46cSDimitry Andric 
24420623d748SDimitry Andric     // No other cases for now.
2443dff0c46cSDimitry Andric     } else {
24440623d748SDimitry Andric       llvm_unreachable("DeclRefExpr for Decl not entered in LocalDeclMap?");
24450623d748SDimitry Andric     }
24460623d748SDimitry Andric 
24470623d748SDimitry Andric 
24480623d748SDimitry Andric     // Check for OpenMP threadprivate variables.
24490623d748SDimitry Andric     if (getLangOpts().OpenMP && VD->hasAttr<OMPThreadPrivateDeclAttr>()) {
24500623d748SDimitry Andric       return EmitThreadPrivateVarDeclLValue(
24510623d748SDimitry Andric           *this, VD, T, addr, getTypes().ConvertTypeForMem(VD->getType()),
24520623d748SDimitry Andric           E->getExprLoc());
24530623d748SDimitry Andric     }
24540623d748SDimitry Andric 
24550623d748SDimitry Andric     // Drill into block byref variables.
24560623d748SDimitry Andric     bool isBlockByref = VD->hasAttr<BlocksAttr>();
24570623d748SDimitry Andric     if (isBlockByref) {
24580623d748SDimitry Andric       addr = emitBlockByrefAddress(addr, VD);
24590623d748SDimitry Andric     }
24600623d748SDimitry Andric 
24610623d748SDimitry Andric     // Drill into reference types.
24629a199699SDimitry Andric     LValue LV = VD->getType()->isReferenceType() ?
24639a199699SDimitry Andric         EmitLoadOfReferenceLValue(addr, VD->getType(), AlignmentSource::Decl) :
24649a199699SDimitry Andric         MakeAddrLValue(addr, T, AlignmentSource::Decl);
2465e580952dSDimitry Andric 
2466139f7f9bSDimitry Andric     bool isLocalStorage = VD->hasLocalStorage();
2467139f7f9bSDimitry Andric 
2468139f7f9bSDimitry Andric     bool NonGCable = isLocalStorage &&
2469139f7f9bSDimitry Andric                      !VD->getType()->isReferenceType() &&
24700623d748SDimitry Andric                      !isBlockByref;
2471e580952dSDimitry Andric     if (NonGCable) {
2472e580952dSDimitry Andric       LV.getQuals().removeObjCGCAttr();
2473e580952dSDimitry Andric       LV.setNonGC(true);
2474e580952dSDimitry Andric     }
2475139f7f9bSDimitry Andric 
2476139f7f9bSDimitry Andric     bool isImpreciseLifetime =
2477139f7f9bSDimitry Andric       (isLocalStorage && !VD->hasAttr<ObjCPreciseLifetimeAttr>());
2478139f7f9bSDimitry Andric     if (isImpreciseLifetime)
2479139f7f9bSDimitry Andric       LV.setARCPreciseLifetime(ARCImpreciseLifetime);
2480f22ef01cSRoman Divacky     setObjCGCLValueClass(getContext(), E, LV);
2481f22ef01cSRoman Divacky     return LV;
2482f22ef01cSRoman Divacky   }
2483f22ef01cSRoman Divacky 
248459d1ed5bSDimitry Andric   if (const auto *FD = dyn_cast<FunctionDecl>(ND))
2485f785676fSDimitry Andric     return EmitFunctionDeclLValue(*this, E, FD);
2486f22ef01cSRoman Divacky 
248744290647SDimitry Andric   // FIXME: While we're emitting a binding from an enclosing scope, all other
248844290647SDimitry Andric   // DeclRefExprs we see should be implicitly treated as if they also refer to
248944290647SDimitry Andric   // an enclosing scope.
249044290647SDimitry Andric   if (const auto *BD = dyn_cast<BindingDecl>(ND))
249144290647SDimitry Andric     return EmitLValue(BD->getBinding());
249244290647SDimitry Andric 
24936122f3e6SDimitry Andric   llvm_unreachable("Unhandled DeclRefExpr");
2494f22ef01cSRoman Divacky }
2495f22ef01cSRoman Divacky 
2496f22ef01cSRoman Divacky LValue CodeGenFunction::EmitUnaryOpLValue(const UnaryOperator *E) {
2497f22ef01cSRoman Divacky   // __extension__ doesn't affect lvalue-ness.
2498e580952dSDimitry Andric   if (E->getOpcode() == UO_Extension)
2499f22ef01cSRoman Divacky     return EmitLValue(E->getSubExpr());
2500f22ef01cSRoman Divacky 
2501f22ef01cSRoman Divacky   QualType ExprTy = getContext().getCanonicalType(E->getSubExpr()->getType());
2502f22ef01cSRoman Divacky   switch (E->getOpcode()) {
25036122f3e6SDimitry Andric   default: llvm_unreachable("Unknown unary operator lvalue!");
2504e580952dSDimitry Andric   case UO_Deref: {
2505f22ef01cSRoman Divacky     QualType T = E->getSubExpr()->getType()->getPointeeType();
2506f22ef01cSRoman Divacky     assert(!T.isNull() && "CodeGenFunction::EmitUnaryOpLValue: Illegal type");
2507f22ef01cSRoman Divacky 
2508d8866befSDimitry Andric     LValueBaseInfo BaseInfo;
25099a199699SDimitry Andric     TBAAAccessInfo TBAAInfo;
25109a199699SDimitry Andric     Address Addr = EmitPointerWithAlignment(E->getSubExpr(), &BaseInfo,
25119a199699SDimitry Andric                                             &TBAAInfo);
25129a199699SDimitry Andric     LValue LV = MakeAddrLValue(Addr, T, BaseInfo, TBAAInfo);
2513e580952dSDimitry Andric     LV.getQuals().setAddressSpace(ExprTy.getAddressSpace());
2514f22ef01cSRoman Divacky 
2515f22ef01cSRoman Divacky     // We should not generate __weak write barrier on indirect reference
2516f22ef01cSRoman Divacky     // of a pointer to object; as in void foo (__weak id *param); *param = 0;
2517f22ef01cSRoman Divacky     // But, we continue to generate __strong write barrier on indirect write
2518f22ef01cSRoman Divacky     // into a pointer to object.
25193861d79fSDimitry Andric     if (getLangOpts().ObjC1 &&
25203861d79fSDimitry Andric         getLangOpts().getGC() != LangOptions::NonGC &&
2521f22ef01cSRoman Divacky         LV.isObjCWeak())
2522e580952dSDimitry Andric       LV.setNonGC(!E->isOBJCGCCandidate(getContext()));
2523f22ef01cSRoman Divacky     return LV;
2524f22ef01cSRoman Divacky   }
2525e580952dSDimitry Andric   case UO_Real:
2526e580952dSDimitry Andric   case UO_Imag: {
2527f22ef01cSRoman Divacky     LValue LV = EmitLValue(E->getSubExpr());
25282754fe60SDimitry Andric     assert(LV.isSimple() && "real/imag on non-ordinary l-value");
25292754fe60SDimitry Andric 
2530dff0c46cSDimitry Andric     // __real is valid on scalars.  This is a faster way of testing that.
2531dff0c46cSDimitry Andric     // __imag can only produce an rvalue on scalars.
2532dff0c46cSDimitry Andric     if (E->getOpcode() == UO_Real &&
25330623d748SDimitry Andric         !LV.getAddress().getElementType()->isStructTy()) {
25342754fe60SDimitry Andric       assert(E->getSubExpr()->getType()->isArithmeticType());
25352754fe60SDimitry Andric       return LV;
25362754fe60SDimitry Andric     }
25372754fe60SDimitry Andric 
2538f41fbc90SDimitry Andric     QualType T = ExprTy->castAs<ComplexType>()->getElementType();
25392754fe60SDimitry Andric 
25400623d748SDimitry Andric     Address Component =
25410623d748SDimitry Andric       (E->getOpcode() == UO_Real
25420623d748SDimitry Andric          ? emitAddrOfRealComponent(LV.getAddress(), LV.getType())
25430623d748SDimitry Andric          : emitAddrOfImagComponent(LV.getAddress(), LV.getType()));
25449a199699SDimitry Andric     LValue ElemLV = MakeAddrLValue(Component, T, LV.getBaseInfo(),
25459a199699SDimitry Andric                                    CGM.getTBAAInfoForSubobject(LV, T));
2546f41fbc90SDimitry Andric     ElemLV.getQuals().addQualifiers(LV.getQuals());
2547f41fbc90SDimitry Andric     return ElemLV;
2548f22ef01cSRoman Divacky   }
2549e580952dSDimitry Andric   case UO_PreInc:
2550e580952dSDimitry Andric   case UO_PreDec: {
2551f22ef01cSRoman Divacky     LValue LV = EmitLValue(E->getSubExpr());
2552e580952dSDimitry Andric     bool isInc = E->getOpcode() == UO_PreInc;
2553f22ef01cSRoman Divacky 
2554f22ef01cSRoman Divacky     if (E->getType()->isAnyComplexType())
2555f22ef01cSRoman Divacky       EmitComplexPrePostIncDec(E, LV, isInc, true/*isPre*/);
2556f22ef01cSRoman Divacky     else
2557f22ef01cSRoman Divacky       EmitScalarPrePostIncDec(E, LV, isInc, true/*isPre*/);
2558f22ef01cSRoman Divacky     return LV;
2559f22ef01cSRoman Divacky   }
2560f22ef01cSRoman Divacky   }
2561f22ef01cSRoman Divacky }
2562f22ef01cSRoman Divacky 
2563f22ef01cSRoman Divacky LValue CodeGenFunction::EmitStringLiteralLValue(const StringLiteral *E) {
2564e580952dSDimitry Andric   return MakeAddrLValue(CGM.GetAddrOfConstantStringFromLiteral(E),
25659a199699SDimitry Andric                         E->getType(), AlignmentSource::Decl);
2566f22ef01cSRoman Divacky }
2567f22ef01cSRoman Divacky 
2568f22ef01cSRoman Divacky LValue CodeGenFunction::EmitObjCEncodeExprLValue(const ObjCEncodeExpr *E) {
2569e580952dSDimitry Andric   return MakeAddrLValue(CGM.GetAddrOfConstantStringFromObjCEncode(E),
25709a199699SDimitry Andric                         E->getType(), AlignmentSource::Decl);
2571f22ef01cSRoman Divacky }
2572f22ef01cSRoman Divacky 
2573e580952dSDimitry Andric LValue CodeGenFunction::EmitPredefinedLValue(const PredefinedExpr *E) {
257439d628a0SDimitry Andric   auto SL = E->getFunctionName();
257539d628a0SDimitry Andric   assert(SL != nullptr && "No StringLiteral name in PredefinedExpr");
25766122f3e6SDimitry Andric   StringRef FnName = CurFn->getName();
2577f22ef01cSRoman Divacky   if (FnName.startswith("\01"))
2578f22ef01cSRoman Divacky     FnName = FnName.substr(1);
257939d628a0SDimitry Andric   StringRef NameItems[] = {
258039d628a0SDimitry Andric       PredefinedExpr::getIdentTypeName(E->getIdentType()), FnName};
258139d628a0SDimitry Andric   std::string GVName = llvm::join(NameItems, NameItems + 2, ".");
258244290647SDimitry Andric   if (auto *BD = dyn_cast<BlockDecl>(CurCodeDecl)) {
258344290647SDimitry Andric     std::string Name = SL->getString();
258444290647SDimitry Andric     if (!Name.empty()) {
258544290647SDimitry Andric       unsigned Discriminator =
258644290647SDimitry Andric           CGM.getCXXABI().getMangleContext().getBlockId(BD, true);
258744290647SDimitry Andric       if (Discriminator)
258844290647SDimitry Andric         Name += "_" + Twine(Discriminator + 1).str();
258944290647SDimitry Andric       auto C = CGM.GetAddrOfConstantCString(Name, GVName.c_str());
25909a199699SDimitry Andric       return MakeAddrLValue(C, E->getType(), AlignmentSource::Decl);
259144290647SDimitry Andric     } else {
25920623d748SDimitry Andric       auto C = CGM.GetAddrOfConstantCString(FnName, GVName.c_str());
25939a199699SDimitry Andric       return MakeAddrLValue(C, E->getType(), AlignmentSource::Decl);
2594f22ef01cSRoman Divacky     }
259544290647SDimitry Andric   }
259639d628a0SDimitry Andric   auto C = CGM.GetAddrOfConstantStringFromLiteral(SL, GVName);
25979a199699SDimitry Andric   return MakeAddrLValue(C, E->getType(), AlignmentSource::Decl);
2598f22ef01cSRoman Divacky }
2599f22ef01cSRoman Divacky 
26003861d79fSDimitry Andric /// Emit a type description suitable for use by a runtime sanitizer library. The
26013861d79fSDimitry Andric /// format of a type descriptor is
26023861d79fSDimitry Andric ///
26033861d79fSDimitry Andric /// \code
26043861d79fSDimitry Andric ///   { i16 TypeKind, i16 TypeInfo }
26053861d79fSDimitry Andric /// \endcode
26063861d79fSDimitry Andric ///
26073861d79fSDimitry Andric /// followed by an array of i8 containing the type name. TypeKind is 0 for an
26083861d79fSDimitry Andric /// integer, 1 for a floating point value, and -1 for anything else.
26093861d79fSDimitry Andric llvm::Constant *CodeGenFunction::EmitCheckTypeDescriptor(QualType T) {
2610f785676fSDimitry Andric   // Only emit each type's descriptor once.
261159d1ed5bSDimitry Andric   if (llvm::Constant *C = CGM.getTypeDescriptorFromMap(T))
2612f785676fSDimitry Andric     return C;
2613f785676fSDimitry Andric 
26143861d79fSDimitry Andric   uint16_t TypeKind = -1;
26153861d79fSDimitry Andric   uint16_t TypeInfo = 0;
2616f22ef01cSRoman Divacky 
26173861d79fSDimitry Andric   if (T->isIntegerType()) {
26183861d79fSDimitry Andric     TypeKind = 0;
26193861d79fSDimitry Andric     TypeInfo = (llvm::Log2_32(getContext().getTypeSize(T)) << 1) |
2620139f7f9bSDimitry Andric                (T->isSignedIntegerType() ? 1 : 0);
26213861d79fSDimitry Andric   } else if (T->isFloatingType()) {
26223861d79fSDimitry Andric     TypeKind = 1;
26233861d79fSDimitry Andric     TypeInfo = getContext().getTypeSize(T);
2624f22ef01cSRoman Divacky   }
2625f22ef01cSRoman Divacky 
26263861d79fSDimitry Andric   // Format the type name as if for a diagnostic, including quotes and
26273861d79fSDimitry Andric   // optionally an 'aka'.
2628139f7f9bSDimitry Andric   SmallString<32> Buffer;
26293861d79fSDimitry Andric   CGM.getDiags().ConvertArgToString(DiagnosticsEngine::ak_qualtype,
26303861d79fSDimitry Andric                                     (intptr_t)T.getAsOpaquePtr(),
263159d1ed5bSDimitry Andric                                     StringRef(), StringRef(), None, Buffer,
263239d628a0SDimitry Andric                                     None);
26333861d79fSDimitry Andric 
26343861d79fSDimitry Andric   llvm::Constant *Components[] = {
26353861d79fSDimitry Andric     Builder.getInt16(TypeKind), Builder.getInt16(TypeInfo),
26363861d79fSDimitry Andric     llvm::ConstantDataArray::getString(getLLVMContext(), Buffer)
26373861d79fSDimitry Andric   };
26383861d79fSDimitry Andric   llvm::Constant *Descriptor = llvm::ConstantStruct::getAnon(Components);
26393861d79fSDimitry Andric 
264059d1ed5bSDimitry Andric   auto *GV = new llvm::GlobalVariable(
264159d1ed5bSDimitry Andric       CGM.getModule(), Descriptor->getType(),
264259d1ed5bSDimitry Andric       /*isConstant=*/true, llvm::GlobalVariable::PrivateLinkage, Descriptor);
2643e7145dcbSDimitry Andric   GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
264439d628a0SDimitry Andric   CGM.getSanitizerMetadata()->disableSanitizerForGlobal(GV);
2645f785676fSDimitry Andric 
2646f785676fSDimitry Andric   // Remember the descriptor for this type.
264759d1ed5bSDimitry Andric   CGM.setTypeDescriptorInMap(T, GV);
2648f785676fSDimitry Andric 
26493861d79fSDimitry Andric   return GV;
26503861d79fSDimitry Andric }
26513861d79fSDimitry Andric 
26523861d79fSDimitry Andric llvm::Value *CodeGenFunction::EmitCheckValue(llvm::Value *V) {
26533861d79fSDimitry Andric   llvm::Type *TargetTy = IntPtrTy;
26543861d79fSDimitry Andric 
26559a199699SDimitry Andric   if (V->getType() == TargetTy)
26569a199699SDimitry Andric     return V;
26579a199699SDimitry Andric 
2658139f7f9bSDimitry Andric   // Floating-point types which fit into intptr_t are bitcast to integers
2659139f7f9bSDimitry Andric   // and then passed directly (after zero-extension, if necessary).
2660139f7f9bSDimitry Andric   if (V->getType()->isFloatingPointTy()) {
2661139f7f9bSDimitry Andric     unsigned Bits = V->getType()->getPrimitiveSizeInBits();
2662139f7f9bSDimitry Andric     if (Bits <= TargetTy->getIntegerBitWidth())
2663139f7f9bSDimitry Andric       V = Builder.CreateBitCast(V, llvm::Type::getIntNTy(getLLVMContext(),
2664139f7f9bSDimitry Andric                                                          Bits));
2665139f7f9bSDimitry Andric   }
2666139f7f9bSDimitry Andric 
26673861d79fSDimitry Andric   // Integers which fit in intptr_t are zero-extended and passed directly.
26683861d79fSDimitry Andric   if (V->getType()->isIntegerTy() &&
26693861d79fSDimitry Andric       V->getType()->getIntegerBitWidth() <= TargetTy->getIntegerBitWidth())
26703861d79fSDimitry Andric     return Builder.CreateZExt(V, TargetTy);
26713861d79fSDimitry Andric 
26723861d79fSDimitry Andric   // Pointers are passed directly, everything else is passed by address.
26733861d79fSDimitry Andric   if (!V->getType()->isPointerTy()) {
26740623d748SDimitry Andric     Address Ptr = CreateDefaultAlignTempAlloca(V->getType());
26753861d79fSDimitry Andric     Builder.CreateStore(V, Ptr);
26760623d748SDimitry Andric     V = Ptr.getPointer();
26773861d79fSDimitry Andric   }
26783861d79fSDimitry Andric   return Builder.CreatePtrToInt(V, TargetTy);
26793861d79fSDimitry Andric }
26803861d79fSDimitry Andric 
26813861d79fSDimitry Andric /// \brief Emit a representation of a SourceLocation for passing to a handler
26823861d79fSDimitry Andric /// in a sanitizer runtime library. The format for this data is:
26833861d79fSDimitry Andric /// \code
26843861d79fSDimitry Andric ///   struct SourceLocation {
26853861d79fSDimitry Andric ///     const char *Filename;
26863861d79fSDimitry Andric ///     int32_t Line, Column;
26873861d79fSDimitry Andric ///   };
26883861d79fSDimitry Andric /// \endcode
26893861d79fSDimitry Andric /// For an invalid SourceLocation, the Filename pointer is null.
26903861d79fSDimitry Andric llvm::Constant *CodeGenFunction::EmitCheckSourceLocation(SourceLocation Loc) {
269159d1ed5bSDimitry Andric   llvm::Constant *Filename;
269259d1ed5bSDimitry Andric   int Line, Column;
26933861d79fSDimitry Andric 
269459d1ed5bSDimitry Andric   PresumedLoc PLoc = getContext().getSourceManager().getPresumedLoc(Loc);
269559d1ed5bSDimitry Andric   if (PLoc.isValid()) {
2696e7145dcbSDimitry Andric     StringRef FilenameString = PLoc.getFilename();
2697e7145dcbSDimitry Andric 
2698e7145dcbSDimitry Andric     int PathComponentsToStrip =
2699e7145dcbSDimitry Andric         CGM.getCodeGenOpts().EmitCheckPathComponentsToStrip;
2700e7145dcbSDimitry Andric     if (PathComponentsToStrip < 0) {
2701e7145dcbSDimitry Andric       assert(PathComponentsToStrip != INT_MIN);
2702e7145dcbSDimitry Andric       int PathComponentsToKeep = -PathComponentsToStrip;
2703e7145dcbSDimitry Andric       auto I = llvm::sys::path::rbegin(FilenameString);
2704e7145dcbSDimitry Andric       auto E = llvm::sys::path::rend(FilenameString);
2705e7145dcbSDimitry Andric       while (I != E && --PathComponentsToKeep)
2706e7145dcbSDimitry Andric         ++I;
2707e7145dcbSDimitry Andric 
2708e7145dcbSDimitry Andric       FilenameString = FilenameString.substr(I - E);
2709e7145dcbSDimitry Andric     } else if (PathComponentsToStrip > 0) {
2710e7145dcbSDimitry Andric       auto I = llvm::sys::path::begin(FilenameString);
2711e7145dcbSDimitry Andric       auto E = llvm::sys::path::end(FilenameString);
2712e7145dcbSDimitry Andric       while (I != E && PathComponentsToStrip--)
2713e7145dcbSDimitry Andric         ++I;
2714e7145dcbSDimitry Andric 
2715e7145dcbSDimitry Andric       if (I != E)
2716e7145dcbSDimitry Andric         FilenameString =
2717e7145dcbSDimitry Andric             FilenameString.substr(I - llvm::sys::path::begin(FilenameString));
2718e7145dcbSDimitry Andric       else
2719e7145dcbSDimitry Andric         FilenameString = llvm::sys::path::filename(FilenameString);
2720e7145dcbSDimitry Andric     }
2721e7145dcbSDimitry Andric 
2722e7145dcbSDimitry Andric     auto FilenameGV = CGM.GetAddrOfConstantCString(FilenameString, ".src");
27230623d748SDimitry Andric     CGM.getSanitizerMetadata()->disableSanitizerForGlobal(
27240623d748SDimitry Andric                           cast<llvm::GlobalVariable>(FilenameGV.getPointer()));
27250623d748SDimitry Andric     Filename = FilenameGV.getPointer();
272659d1ed5bSDimitry Andric     Line = PLoc.getLine();
272759d1ed5bSDimitry Andric     Column = PLoc.getColumn();
272859d1ed5bSDimitry Andric   } else {
272959d1ed5bSDimitry Andric     Filename = llvm::Constant::getNullValue(Int8PtrTy);
273059d1ed5bSDimitry Andric     Line = Column = 0;
273159d1ed5bSDimitry Andric   }
273259d1ed5bSDimitry Andric 
273359d1ed5bSDimitry Andric   llvm::Constant *Data[] = {Filename, Builder.getInt32(Line),
273459d1ed5bSDimitry Andric                             Builder.getInt32(Column)};
27353861d79fSDimitry Andric 
27363861d79fSDimitry Andric   return llvm::ConstantStruct::getAnon(Data);
27373861d79fSDimitry Andric }
27383861d79fSDimitry Andric 
273939d628a0SDimitry Andric namespace {
274039d628a0SDimitry Andric /// \brief Specify under what conditions this check can be recovered
274139d628a0SDimitry Andric enum class CheckRecoverableKind {
274239d628a0SDimitry Andric   /// Always terminate program execution if this check fails.
274339d628a0SDimitry Andric   Unrecoverable,
274439d628a0SDimitry Andric   /// Check supports recovering, runtime has both fatal (noreturn) and
274539d628a0SDimitry Andric   /// non-fatal handlers for this check.
274639d628a0SDimitry Andric   Recoverable,
274739d628a0SDimitry Andric   /// Runtime conditionally aborts, always need to support recovery.
274839d628a0SDimitry Andric   AlwaysRecoverable
274939d628a0SDimitry Andric };
275039d628a0SDimitry Andric }
275139d628a0SDimitry Andric 
275233956c43SDimitry Andric static CheckRecoverableKind getRecoverableKind(SanitizerMask Kind) {
275333956c43SDimitry Andric   assert(llvm::countPopulation(Kind) == 1);
275439d628a0SDimitry Andric   switch (Kind) {
275539d628a0SDimitry Andric   case SanitizerKind::Vptr:
275639d628a0SDimitry Andric     return CheckRecoverableKind::AlwaysRecoverable;
275739d628a0SDimitry Andric   case SanitizerKind::Return:
275839d628a0SDimitry Andric   case SanitizerKind::Unreachable:
275939d628a0SDimitry Andric     return CheckRecoverableKind::Unrecoverable;
276039d628a0SDimitry Andric   default:
276139d628a0SDimitry Andric     return CheckRecoverableKind::Recoverable;
276239d628a0SDimitry Andric   }
276339d628a0SDimitry Andric }
276439d628a0SDimitry Andric 
276544290647SDimitry Andric namespace {
276644290647SDimitry Andric struct SanitizerHandlerInfo {
276744290647SDimitry Andric   char const *const Name;
276844290647SDimitry Andric   unsigned Version;
276944290647SDimitry Andric };
277044290647SDimitry Andric }
277144290647SDimitry Andric 
277244290647SDimitry Andric const SanitizerHandlerInfo SanitizerHandlers[] = {
277344290647SDimitry Andric #define SANITIZER_CHECK(Enum, Name, Version) {#Name, Version},
277444290647SDimitry Andric     LIST_SANITIZER_CHECKS
277544290647SDimitry Andric #undef SANITIZER_CHECK
277644290647SDimitry Andric };
277744290647SDimitry Andric 
277839d628a0SDimitry Andric static void emitCheckHandlerCall(CodeGenFunction &CGF,
277939d628a0SDimitry Andric                                  llvm::FunctionType *FnType,
278039d628a0SDimitry Andric                                  ArrayRef<llvm::Value *> FnArgs,
278144290647SDimitry Andric                                  SanitizerHandler CheckHandler,
278239d628a0SDimitry Andric                                  CheckRecoverableKind RecoverKind, bool IsFatal,
278339d628a0SDimitry Andric                                  llvm::BasicBlock *ContBB) {
278439d628a0SDimitry Andric   assert(IsFatal || RecoverKind != CheckRecoverableKind::Unrecoverable);
278539d628a0SDimitry Andric   bool NeedsAbortSuffix =
278639d628a0SDimitry Andric       IsFatal && RecoverKind != CheckRecoverableKind::Unrecoverable;
27879a199699SDimitry Andric   bool MinimalRuntime = CGF.CGM.getCodeGenOpts().SanitizeMinimalRuntime;
278844290647SDimitry Andric   const SanitizerHandlerInfo &CheckInfo = SanitizerHandlers[CheckHandler];
278944290647SDimitry Andric   const StringRef CheckName = CheckInfo.Name;
27909a199699SDimitry Andric   std::string FnName = "__ubsan_handle_" + CheckName.str();
27919a199699SDimitry Andric   if (CheckInfo.Version && !MinimalRuntime)
27929a199699SDimitry Andric     FnName += "_v" + llvm::utostr(CheckInfo.Version);
27939a199699SDimitry Andric   if (MinimalRuntime)
27949a199699SDimitry Andric     FnName += "_minimal";
27959a199699SDimitry Andric   if (NeedsAbortSuffix)
27969a199699SDimitry Andric     FnName += "_abort";
279739d628a0SDimitry Andric   bool MayReturn =
279839d628a0SDimitry Andric       !IsFatal || RecoverKind == CheckRecoverableKind::AlwaysRecoverable;
279939d628a0SDimitry Andric 
280039d628a0SDimitry Andric   llvm::AttrBuilder B;
280139d628a0SDimitry Andric   if (!MayReturn) {
280239d628a0SDimitry Andric     B.addAttribute(llvm::Attribute::NoReturn)
280339d628a0SDimitry Andric         .addAttribute(llvm::Attribute::NoUnwind);
280439d628a0SDimitry Andric   }
280539d628a0SDimitry Andric   B.addAttribute(llvm::Attribute::UWTable);
280639d628a0SDimitry Andric 
280739d628a0SDimitry Andric   llvm::Value *Fn = CGF.CGM.CreateRuntimeFunction(
280839d628a0SDimitry Andric       FnType, FnName,
280920e90f04SDimitry Andric       llvm::AttributeList::get(CGF.getLLVMContext(),
281020e90f04SDimitry Andric                                llvm::AttributeList::FunctionIndex, B),
281144290647SDimitry Andric       /*Local=*/true);
281239d628a0SDimitry Andric   llvm::CallInst *HandlerCall = CGF.EmitNounwindRuntimeCall(Fn, FnArgs);
281339d628a0SDimitry Andric   if (!MayReturn) {
281439d628a0SDimitry Andric     HandlerCall->setDoesNotReturn();
281539d628a0SDimitry Andric     CGF.Builder.CreateUnreachable();
281639d628a0SDimitry Andric   } else {
281739d628a0SDimitry Andric     CGF.Builder.CreateBr(ContBB);
281839d628a0SDimitry Andric   }
281939d628a0SDimitry Andric }
282039d628a0SDimitry Andric 
282139d628a0SDimitry Andric void CodeGenFunction::EmitCheck(
282233956c43SDimitry Andric     ArrayRef<std::pair<llvm::Value *, SanitizerMask>> Checked,
282344290647SDimitry Andric     SanitizerHandler CheckHandler, ArrayRef<llvm::Constant *> StaticArgs,
282439d628a0SDimitry Andric     ArrayRef<llvm::Value *> DynamicArgs) {
282559d1ed5bSDimitry Andric   assert(IsSanitizerScope);
282639d628a0SDimitry Andric   assert(Checked.size() > 0);
282744290647SDimitry Andric   assert(CheckHandler >= 0 &&
28289a199699SDimitry Andric          size_t(CheckHandler) < llvm::array_lengthof(SanitizerHandlers));
282944290647SDimitry Andric   const StringRef CheckName = SanitizerHandlers[CheckHandler].Name;
283039d628a0SDimitry Andric 
283139d628a0SDimitry Andric   llvm::Value *FatalCond = nullptr;
283239d628a0SDimitry Andric   llvm::Value *RecoverableCond = nullptr;
28338f0fd8f6SDimitry Andric   llvm::Value *TrapCond = nullptr;
283439d628a0SDimitry Andric   for (int i = 0, n = Checked.size(); i < n; ++i) {
283539d628a0SDimitry Andric     llvm::Value *Check = Checked[i].first;
28368f0fd8f6SDimitry Andric     // -fsanitize-trap= overrides -fsanitize-recover=.
283739d628a0SDimitry Andric     llvm::Value *&Cond =
28388f0fd8f6SDimitry Andric         CGM.getCodeGenOpts().SanitizeTrap.has(Checked[i].second)
28398f0fd8f6SDimitry Andric             ? TrapCond
28408f0fd8f6SDimitry Andric             : CGM.getCodeGenOpts().SanitizeRecover.has(Checked[i].second)
284139d628a0SDimitry Andric                   ? RecoverableCond
284239d628a0SDimitry Andric                   : FatalCond;
284339d628a0SDimitry Andric     Cond = Cond ? Builder.CreateAnd(Cond, Check) : Check;
284439d628a0SDimitry Andric   }
284539d628a0SDimitry Andric 
28468f0fd8f6SDimitry Andric   if (TrapCond)
28478f0fd8f6SDimitry Andric     EmitTrapCheck(TrapCond);
28488f0fd8f6SDimitry Andric   if (!FatalCond && !RecoverableCond)
28498f0fd8f6SDimitry Andric     return;
28508f0fd8f6SDimitry Andric 
285139d628a0SDimitry Andric   llvm::Value *JointCond;
285239d628a0SDimitry Andric   if (FatalCond && RecoverableCond)
285339d628a0SDimitry Andric     JointCond = Builder.CreateAnd(FatalCond, RecoverableCond);
285439d628a0SDimitry Andric   else
285539d628a0SDimitry Andric     JointCond = FatalCond ? FatalCond : RecoverableCond;
285639d628a0SDimitry Andric   assert(JointCond);
285739d628a0SDimitry Andric 
285839d628a0SDimitry Andric   CheckRecoverableKind RecoverKind = getRecoverableKind(Checked[0].second);
285939d628a0SDimitry Andric   assert(SanOpts.has(Checked[0].second));
286039d628a0SDimitry Andric #ifndef NDEBUG
286139d628a0SDimitry Andric   for (int i = 1, n = Checked.size(); i < n; ++i) {
286239d628a0SDimitry Andric     assert(RecoverKind == getRecoverableKind(Checked[i].second) &&
286339d628a0SDimitry Andric            "All recoverable kinds in a single check must be same!");
286439d628a0SDimitry Andric     assert(SanOpts.has(Checked[i].second));
286539d628a0SDimitry Andric   }
286639d628a0SDimitry Andric #endif
2867139f7f9bSDimitry Andric 
28683861d79fSDimitry Andric   llvm::BasicBlock *Cont = createBasicBlock("cont");
286939d628a0SDimitry Andric   llvm::BasicBlock *Handlers = createBasicBlock("handler." + CheckName);
287039d628a0SDimitry Andric   llvm::Instruction *Branch = Builder.CreateCondBr(JointCond, Cont, Handlers);
2871139f7f9bSDimitry Andric   // Give hint that we very much don't expect to execute the handler
2872139f7f9bSDimitry Andric   // Value chosen to match UR_NONTAKEN_WEIGHT, see BranchProbabilityInfo.cpp
2873139f7f9bSDimitry Andric   llvm::MDBuilder MDHelper(getLLVMContext());
2874139f7f9bSDimitry Andric   llvm::MDNode *Node = MDHelper.createBranchWeights((1U << 20) - 1, 1);
2875139f7f9bSDimitry Andric   Branch->setMetadata(llvm::LLVMContext::MD_prof, Node);
287639d628a0SDimitry Andric   EmitBlock(Handlers);
2877139f7f9bSDimitry Andric 
2878e7145dcbSDimitry Andric   // Handler functions take an i8* pointing to the (handler-specific) static
2879e7145dcbSDimitry Andric   // information block, followed by a sequence of intptr_t arguments
2880e7145dcbSDimitry Andric   // representing operand values.
2881139f7f9bSDimitry Andric   SmallVector<llvm::Value *, 4> Args;
2882139f7f9bSDimitry Andric   SmallVector<llvm::Type *, 4> ArgTypes;
28839a199699SDimitry Andric   if (!CGM.getCodeGenOpts().SanitizeMinimalRuntime) {
28843861d79fSDimitry Andric     Args.reserve(DynamicArgs.size() + 1);
28853861d79fSDimitry Andric     ArgTypes.reserve(DynamicArgs.size() + 1);
28863861d79fSDimitry Andric 
2887e7145dcbSDimitry Andric     // Emit handler arguments and create handler function type.
2888e7145dcbSDimitry Andric     if (!StaticArgs.empty()) {
2889e7145dcbSDimitry Andric       llvm::Constant *Info = llvm::ConstantStruct::getAnon(StaticArgs);
2890e7145dcbSDimitry Andric       auto *InfoPtr =
2891e7145dcbSDimitry Andric           new llvm::GlobalVariable(CGM.getModule(), Info->getType(), false,
2892e7145dcbSDimitry Andric                                    llvm::GlobalVariable::PrivateLinkage, Info);
2893e7145dcbSDimitry Andric       InfoPtr->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
2894e7145dcbSDimitry Andric       CGM.getSanitizerMetadata()->disableSanitizerForGlobal(InfoPtr);
28953861d79fSDimitry Andric       Args.push_back(Builder.CreateBitCast(InfoPtr, Int8PtrTy));
28963861d79fSDimitry Andric       ArgTypes.push_back(Int8PtrTy);
2897e7145dcbSDimitry Andric     }
2898e7145dcbSDimitry Andric 
28993861d79fSDimitry Andric     for (size_t i = 0, n = DynamicArgs.size(); i != n; ++i) {
29003861d79fSDimitry Andric       Args.push_back(EmitCheckValue(DynamicArgs[i]));
29013861d79fSDimitry Andric       ArgTypes.push_back(IntPtrTy);
29023861d79fSDimitry Andric     }
29039a199699SDimitry Andric   }
29043861d79fSDimitry Andric 
29053861d79fSDimitry Andric   llvm::FunctionType *FnType =
29063861d79fSDimitry Andric     llvm::FunctionType::get(CGM.VoidTy, ArgTypes, false);
2907139f7f9bSDimitry Andric 
290839d628a0SDimitry Andric   if (!FatalCond || !RecoverableCond) {
290939d628a0SDimitry Andric     // Simple case: we need to generate a single handler call, either
291039d628a0SDimitry Andric     // fatal, or non-fatal.
291144290647SDimitry Andric     emitCheckHandlerCall(*this, FnType, Args, CheckHandler, RecoverKind,
291239d628a0SDimitry Andric                          (FatalCond != nullptr), Cont);
29133861d79fSDimitry Andric   } else {
291439d628a0SDimitry Andric     // Emit two handler calls: first one for set of unrecoverable checks,
291539d628a0SDimitry Andric     // another one for recoverable.
291639d628a0SDimitry Andric     llvm::BasicBlock *NonFatalHandlerBB =
291739d628a0SDimitry Andric         createBasicBlock("non_fatal." + CheckName);
291839d628a0SDimitry Andric     llvm::BasicBlock *FatalHandlerBB = createBasicBlock("fatal." + CheckName);
291939d628a0SDimitry Andric     Builder.CreateCondBr(FatalCond, NonFatalHandlerBB, FatalHandlerBB);
292039d628a0SDimitry Andric     EmitBlock(FatalHandlerBB);
292144290647SDimitry Andric     emitCheckHandlerCall(*this, FnType, Args, CheckHandler, RecoverKind, true,
292239d628a0SDimitry Andric                          NonFatalHandlerBB);
292339d628a0SDimitry Andric     EmitBlock(NonFatalHandlerBB);
292444290647SDimitry Andric     emitCheckHandlerCall(*this, FnType, Args, CheckHandler, RecoverKind, false,
292539d628a0SDimitry Andric                          Cont);
29263861d79fSDimitry Andric   }
29273861d79fSDimitry Andric 
29283861d79fSDimitry Andric   EmitBlock(Cont);
29293861d79fSDimitry Andric }
29303861d79fSDimitry Andric 
2931e7145dcbSDimitry Andric void CodeGenFunction::EmitCfiSlowPathCheck(
2932e7145dcbSDimitry Andric     SanitizerMask Kind, llvm::Value *Cond, llvm::ConstantInt *TypeId,
2933e7145dcbSDimitry Andric     llvm::Value *Ptr, ArrayRef<llvm::Constant *> StaticArgs) {
29340623d748SDimitry Andric   llvm::BasicBlock *Cont = createBasicBlock("cfi.cont");
29350623d748SDimitry Andric 
29360623d748SDimitry Andric   llvm::BasicBlock *CheckBB = createBasicBlock("cfi.slowpath");
29370623d748SDimitry Andric   llvm::BranchInst *BI = Builder.CreateCondBr(Cond, Cont, CheckBB);
29380623d748SDimitry Andric 
29390623d748SDimitry Andric   llvm::MDBuilder MDHelper(getLLVMContext());
29400623d748SDimitry Andric   llvm::MDNode *Node = MDHelper.createBranchWeights((1U << 20) - 1, 1);
29410623d748SDimitry Andric   BI->setMetadata(llvm::LLVMContext::MD_prof, Node);
29420623d748SDimitry Andric 
29430623d748SDimitry Andric   EmitBlock(CheckBB);
29440623d748SDimitry Andric 
2945e7145dcbSDimitry Andric   bool WithDiag = !CGM.getCodeGenOpts().SanitizeTrap.has(Kind);
2946e7145dcbSDimitry Andric 
2947e7145dcbSDimitry Andric   llvm::CallInst *CheckCall;
2948e7145dcbSDimitry Andric   if (WithDiag) {
2949e7145dcbSDimitry Andric     llvm::Constant *Info = llvm::ConstantStruct::getAnon(StaticArgs);
2950e7145dcbSDimitry Andric     auto *InfoPtr =
2951e7145dcbSDimitry Andric         new llvm::GlobalVariable(CGM.getModule(), Info->getType(), false,
2952e7145dcbSDimitry Andric                                  llvm::GlobalVariable::PrivateLinkage, Info);
2953e7145dcbSDimitry Andric     InfoPtr->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
2954e7145dcbSDimitry Andric     CGM.getSanitizerMetadata()->disableSanitizerForGlobal(InfoPtr);
2955e7145dcbSDimitry Andric 
2956e7145dcbSDimitry Andric     llvm::Constant *SlowPathDiagFn = CGM.getModule().getOrInsertFunction(
2957e7145dcbSDimitry Andric         "__cfi_slowpath_diag",
2958e7145dcbSDimitry Andric         llvm::FunctionType::get(VoidTy, {Int64Ty, Int8PtrTy, Int8PtrTy},
2959e7145dcbSDimitry Andric                                 false));
2960e7145dcbSDimitry Andric     CheckCall = Builder.CreateCall(
2961e7145dcbSDimitry Andric         SlowPathDiagFn,
2962e7145dcbSDimitry Andric         {TypeId, Ptr, Builder.CreateBitCast(InfoPtr, Int8PtrTy)});
2963e7145dcbSDimitry Andric   } else {
29640623d748SDimitry Andric     llvm::Constant *SlowPathFn = CGM.getModule().getOrInsertFunction(
29650623d748SDimitry Andric         "__cfi_slowpath",
2966e7145dcbSDimitry Andric         llvm::FunctionType::get(VoidTy, {Int64Ty, Int8PtrTy}, false));
2967e7145dcbSDimitry Andric     CheckCall = Builder.CreateCall(SlowPathFn, {TypeId, Ptr});
2968e7145dcbSDimitry Andric   }
2969e7145dcbSDimitry Andric 
29700623d748SDimitry Andric   CheckCall->setDoesNotThrow();
29710623d748SDimitry Andric 
29720623d748SDimitry Andric   EmitBlock(Cont);
29730623d748SDimitry Andric }
29740623d748SDimitry Andric 
297520e90f04SDimitry Andric // Emit a stub for __cfi_check function so that the linker knows about this
297620e90f04SDimitry Andric // symbol in LTO mode.
297720e90f04SDimitry Andric void CodeGenFunction::EmitCfiCheckStub() {
297820e90f04SDimitry Andric   llvm::Module *M = &CGM.getModule();
297920e90f04SDimitry Andric   auto &Ctx = M->getContext();
298020e90f04SDimitry Andric   llvm::Function *F = llvm::Function::Create(
298120e90f04SDimitry Andric       llvm::FunctionType::get(VoidTy, {Int64Ty, Int8PtrTy, Int8PtrTy}, false),
298220e90f04SDimitry Andric       llvm::GlobalValue::WeakAnyLinkage, "__cfi_check", M);
298320e90f04SDimitry Andric   llvm::BasicBlock *BB = llvm::BasicBlock::Create(Ctx, "entry", F);
298420e90f04SDimitry Andric   // FIXME: consider emitting an intrinsic call like
298520e90f04SDimitry Andric   // call void @llvm.cfi_check(i64 %0, i8* %1, i8* %2)
298620e90f04SDimitry Andric   // which can be lowered in CrossDSOCFI pass to the actual contents of
298720e90f04SDimitry Andric   // __cfi_check. This would allow inlining of __cfi_check calls.
298820e90f04SDimitry Andric   llvm::CallInst::Create(
298920e90f04SDimitry Andric       llvm::Intrinsic::getDeclaration(M, llvm::Intrinsic::trap), "", BB);
299020e90f04SDimitry Andric   llvm::ReturnInst::Create(Ctx, nullptr, BB);
299120e90f04SDimitry Andric }
299220e90f04SDimitry Andric 
2993e7145dcbSDimitry Andric // This function is basically a switch over the CFI failure kind, which is
2994e7145dcbSDimitry Andric // extracted from CFICheckFailData (1st function argument). Each case is either
2995e7145dcbSDimitry Andric // llvm.trap or a call to one of the two runtime handlers, based on
2996e7145dcbSDimitry Andric // -fsanitize-trap and -fsanitize-recover settings.  Default case (invalid
2997e7145dcbSDimitry Andric // failure kind) traps, but this should really never happen.  CFICheckFailData
2998e7145dcbSDimitry Andric // can be nullptr if the calling module has -fsanitize-trap behavior for this
2999e7145dcbSDimitry Andric // check kind; in this case __cfi_check_fail traps as well.
3000e7145dcbSDimitry Andric void CodeGenFunction::EmitCfiCheckFail() {
3001e7145dcbSDimitry Andric   SanitizerScope SanScope(this);
3002e7145dcbSDimitry Andric   FunctionArgList Args;
3003db17bf38SDimitry Andric   ImplicitParamDecl ArgData(getContext(), getContext().VoidPtrTy,
3004db17bf38SDimitry Andric                             ImplicitParamDecl::Other);
3005db17bf38SDimitry Andric   ImplicitParamDecl ArgAddr(getContext(), getContext().VoidPtrTy,
3006db17bf38SDimitry Andric                             ImplicitParamDecl::Other);
3007e7145dcbSDimitry Andric   Args.push_back(&ArgData);
3008e7145dcbSDimitry Andric   Args.push_back(&ArgAddr);
3009e7145dcbSDimitry Andric 
3010e7145dcbSDimitry Andric   const CGFunctionInfo &FI =
3011e7145dcbSDimitry Andric     CGM.getTypes().arrangeBuiltinFunctionDeclaration(getContext().VoidTy, Args);
3012e7145dcbSDimitry Andric 
3013e7145dcbSDimitry Andric   llvm::Function *F = llvm::Function::Create(
3014e7145dcbSDimitry Andric       llvm::FunctionType::get(VoidTy, {VoidPtrTy, VoidPtrTy}, false),
3015e7145dcbSDimitry Andric       llvm::GlobalValue::WeakODRLinkage, "__cfi_check_fail", &CGM.getModule());
3016e7145dcbSDimitry Andric   F->setVisibility(llvm::GlobalValue::HiddenVisibility);
3017e7145dcbSDimitry Andric 
3018e7145dcbSDimitry Andric   StartFunction(GlobalDecl(), CGM.getContext().VoidTy, F, FI, Args,
3019e7145dcbSDimitry Andric                 SourceLocation());
3020e7145dcbSDimitry Andric 
3021e7145dcbSDimitry Andric   llvm::Value *Data =
3022e7145dcbSDimitry Andric       EmitLoadOfScalar(GetAddrOfLocalVar(&ArgData), /*Volatile=*/false,
3023e7145dcbSDimitry Andric                        CGM.getContext().VoidPtrTy, ArgData.getLocation());
3024e7145dcbSDimitry Andric   llvm::Value *Addr =
3025e7145dcbSDimitry Andric       EmitLoadOfScalar(GetAddrOfLocalVar(&ArgAddr), /*Volatile=*/false,
3026e7145dcbSDimitry Andric                        CGM.getContext().VoidPtrTy, ArgAddr.getLocation());
3027e7145dcbSDimitry Andric 
3028e7145dcbSDimitry Andric   // Data == nullptr means the calling module has trap behaviour for this check.
3029e7145dcbSDimitry Andric   llvm::Value *DataIsNotNullPtr =
3030e7145dcbSDimitry Andric       Builder.CreateICmpNE(Data, llvm::ConstantPointerNull::get(Int8PtrTy));
3031e7145dcbSDimitry Andric   EmitTrapCheck(DataIsNotNullPtr);
3032e7145dcbSDimitry Andric 
3033e7145dcbSDimitry Andric   llvm::StructType *SourceLocationTy =
30345517e702SDimitry Andric       llvm::StructType::get(VoidPtrTy, Int32Ty, Int32Ty);
3035e7145dcbSDimitry Andric   llvm::StructType *CfiCheckFailDataTy =
30365517e702SDimitry Andric       llvm::StructType::get(Int8Ty, SourceLocationTy, VoidPtrTy);
3037e7145dcbSDimitry Andric 
3038e7145dcbSDimitry Andric   llvm::Value *V = Builder.CreateConstGEP2_32(
3039e7145dcbSDimitry Andric       CfiCheckFailDataTy,
3040e7145dcbSDimitry Andric       Builder.CreatePointerCast(Data, CfiCheckFailDataTy->getPointerTo(0)), 0,
3041e7145dcbSDimitry Andric       0);
3042e7145dcbSDimitry Andric   Address CheckKindAddr(V, getIntAlign());
3043e7145dcbSDimitry Andric   llvm::Value *CheckKind = Builder.CreateLoad(CheckKindAddr);
3044e7145dcbSDimitry Andric 
3045e7145dcbSDimitry Andric   llvm::Value *AllVtables = llvm::MetadataAsValue::get(
3046e7145dcbSDimitry Andric       CGM.getLLVMContext(),
3047e7145dcbSDimitry Andric       llvm::MDString::get(CGM.getLLVMContext(), "all-vtables"));
3048e7145dcbSDimitry Andric   llvm::Value *ValidVtable = Builder.CreateZExt(
3049e7145dcbSDimitry Andric       Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::type_test),
3050e7145dcbSDimitry Andric                          {Addr, AllVtables}),
3051e7145dcbSDimitry Andric       IntPtrTy);
3052e7145dcbSDimitry Andric 
3053e7145dcbSDimitry Andric   const std::pair<int, SanitizerMask> CheckKinds[] = {
3054e7145dcbSDimitry Andric       {CFITCK_VCall, SanitizerKind::CFIVCall},
3055e7145dcbSDimitry Andric       {CFITCK_NVCall, SanitizerKind::CFINVCall},
3056e7145dcbSDimitry Andric       {CFITCK_DerivedCast, SanitizerKind::CFIDerivedCast},
3057e7145dcbSDimitry Andric       {CFITCK_UnrelatedCast, SanitizerKind::CFIUnrelatedCast},
3058e7145dcbSDimitry Andric       {CFITCK_ICall, SanitizerKind::CFIICall}};
3059e7145dcbSDimitry Andric 
3060e7145dcbSDimitry Andric   SmallVector<std::pair<llvm::Value *, SanitizerMask>, 5> Checks;
3061e7145dcbSDimitry Andric   for (auto CheckKindMaskPair : CheckKinds) {
3062e7145dcbSDimitry Andric     int Kind = CheckKindMaskPair.first;
3063e7145dcbSDimitry Andric     SanitizerMask Mask = CheckKindMaskPair.second;
3064e7145dcbSDimitry Andric     llvm::Value *Cond =
3065e7145dcbSDimitry Andric         Builder.CreateICmpNE(CheckKind, llvm::ConstantInt::get(Int8Ty, Kind));
3066e7145dcbSDimitry Andric     if (CGM.getLangOpts().Sanitize.has(Mask))
306744290647SDimitry Andric       EmitCheck(std::make_pair(Cond, Mask), SanitizerHandler::CFICheckFail, {},
3068e7145dcbSDimitry Andric                 {Data, Addr, ValidVtable});
3069e7145dcbSDimitry Andric     else
3070e7145dcbSDimitry Andric       EmitTrapCheck(Cond);
3071e7145dcbSDimitry Andric   }
3072e7145dcbSDimitry Andric 
3073e7145dcbSDimitry Andric   FinishFunction();
3074e7145dcbSDimitry Andric   // The only reference to this function will be created during LTO link.
3075e7145dcbSDimitry Andric   // Make sure it survives until then.
3076e7145dcbSDimitry Andric   CGM.addUsedGlobal(F);
3077e7145dcbSDimitry Andric }
3078e7145dcbSDimitry Andric 
307913ddaa84SDimitry Andric void CodeGenFunction::EmitUnreachable(SourceLocation Loc) {
308013ddaa84SDimitry Andric   if (SanOpts.has(SanitizerKind::Unreachable)) {
308113ddaa84SDimitry Andric     SanitizerScope SanScope(this);
308213ddaa84SDimitry Andric     EmitCheck(std::make_pair(static_cast<llvm::Value *>(Builder.getFalse()),
308313ddaa84SDimitry Andric                              SanitizerKind::Unreachable),
308413ddaa84SDimitry Andric               SanitizerHandler::BuiltinUnreachable,
308513ddaa84SDimitry Andric               EmitCheckSourceLocation(Loc), None);
308613ddaa84SDimitry Andric   }
308713ddaa84SDimitry Andric   Builder.CreateUnreachable();
308813ddaa84SDimitry Andric }
308913ddaa84SDimitry Andric 
3090139f7f9bSDimitry Andric void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked) {
30913861d79fSDimitry Andric   llvm::BasicBlock *Cont = createBasicBlock("cont");
30923861d79fSDimitry Andric 
30933861d79fSDimitry Andric   // If we're optimizing, collapse all calls to trap down to just one per
30943861d79fSDimitry Andric   // function to save on code size.
30953861d79fSDimitry Andric   if (!CGM.getCodeGenOpts().OptimizationLevel || !TrapBB) {
30963861d79fSDimitry Andric     TrapBB = createBasicBlock("trap");
30973861d79fSDimitry Andric     Builder.CreateCondBr(Checked, Cont, TrapBB);
30983861d79fSDimitry Andric     EmitBlock(TrapBB);
30993dac3a9bSDimitry Andric     llvm::CallInst *TrapCall = EmitTrapCall(llvm::Intrinsic::trap);
3100f22ef01cSRoman Divacky     TrapCall->setDoesNotReturn();
3101f22ef01cSRoman Divacky     TrapCall->setDoesNotThrow();
3102f22ef01cSRoman Divacky     Builder.CreateUnreachable();
31033861d79fSDimitry Andric   } else {
31043861d79fSDimitry Andric     Builder.CreateCondBr(Checked, Cont, TrapBB);
31053861d79fSDimitry Andric   }
3106f22ef01cSRoman Divacky 
3107f22ef01cSRoman Divacky   EmitBlock(Cont);
3108f22ef01cSRoman Divacky }
3109f22ef01cSRoman Divacky 
31103dac3a9bSDimitry Andric llvm::CallInst *CodeGenFunction::EmitTrapCall(llvm::Intrinsic::ID IntrID) {
3111875ed548SDimitry Andric   llvm::CallInst *TrapCall = Builder.CreateCall(CGM.getIntrinsic(IntrID));
31123dac3a9bSDimitry Andric 
311344290647SDimitry Andric   if (!CGM.getCodeGenOpts().TrapFuncName.empty()) {
311444290647SDimitry Andric     auto A = llvm::Attribute::get(getLLVMContext(), "trap-func-name",
31153dac3a9bSDimitry Andric                                   CGM.getCodeGenOpts().TrapFuncName);
311620e90f04SDimitry Andric     TrapCall->addAttribute(llvm::AttributeList::FunctionIndex, A);
311744290647SDimitry Andric   }
31183dac3a9bSDimitry Andric 
31193dac3a9bSDimitry Andric   return TrapCall;
31203dac3a9bSDimitry Andric }
31213dac3a9bSDimitry Andric 
31220623d748SDimitry Andric Address CodeGenFunction::EmitArrayToPointerDecay(const Expr *E,
31239a199699SDimitry Andric                                                  LValueBaseInfo *BaseInfo,
31249a199699SDimitry Andric                                                  TBAAAccessInfo *TBAAInfo) {
31250623d748SDimitry Andric   assert(E->getType()->isArrayType() &&
31260623d748SDimitry Andric          "Array to pointer decay must have array source type!");
31270623d748SDimitry Andric 
31280623d748SDimitry Andric   // Expressions of array type can't be bitfields or vector elements.
31290623d748SDimitry Andric   LValue LV = EmitLValue(E);
31300623d748SDimitry Andric   Address Addr = LV.getAddress();
31310623d748SDimitry Andric 
31320623d748SDimitry Andric   // If the array type was an incomplete type, we need to make sure
31330623d748SDimitry Andric   // the decay ends up being the right type.
31340623d748SDimitry Andric   llvm::Type *NewTy = ConvertType(E->getType());
31350623d748SDimitry Andric   Addr = Builder.CreateElementBitCast(Addr, NewTy);
31360623d748SDimitry Andric 
31370623d748SDimitry Andric   // Note that VLA pointers are always decayed, so we don't need to do
31380623d748SDimitry Andric   // anything here.
31390623d748SDimitry Andric   if (!E->getType()->isVariableArrayType()) {
31400623d748SDimitry Andric     assert(isa<llvm::ArrayType>(Addr.getElementType()) &&
31410623d748SDimitry Andric            "Expected pointer to array");
31420623d748SDimitry Andric     Addr = Builder.CreateStructGEP(Addr, 0, CharUnits::Zero(), "arraydecay");
31430623d748SDimitry Andric   }
31440623d748SDimitry Andric 
31459a199699SDimitry Andric   // The result of this decay conversion points to an array element within the
31469a199699SDimitry Andric   // base lvalue. However, since TBAA currently does not support representing
31479a199699SDimitry Andric   // accesses to elements of member arrays, we conservatively represent accesses
31489a199699SDimitry Andric   // to the pointee object as if it had no any base lvalue specified.
31499a199699SDimitry Andric   // TODO: Support TBAA for member arrays.
31500623d748SDimitry Andric   QualType EltType = E->getType()->castAsArrayTypeUnsafe()->getElementType();
31519a199699SDimitry Andric   if (BaseInfo) *BaseInfo = LV.getBaseInfo();
31529a199699SDimitry Andric   if (TBAAInfo) *TBAAInfo = CGM.getTBAAAccessInfo(EltType);
31539a199699SDimitry Andric 
31540623d748SDimitry Andric   return Builder.CreateElementBitCast(Addr, ConvertTypeForMem(EltType));
31550623d748SDimitry Andric }
31560623d748SDimitry Andric 
3157ffd1746dSEd Schouten /// isSimpleArrayDecayOperand - If the specified expr is a simple decay from an
3158ffd1746dSEd Schouten /// array to pointer, return the array subexpression.
3159ffd1746dSEd Schouten static const Expr *isSimpleArrayDecayOperand(const Expr *E) {
3160ffd1746dSEd Schouten   // If this isn't just an array->pointer decay, bail out.
316159d1ed5bSDimitry Andric   const auto *CE = dyn_cast<CastExpr>(E);
316259d1ed5bSDimitry Andric   if (!CE || CE->getCastKind() != CK_ArrayToPointerDecay)
316359d1ed5bSDimitry Andric     return nullptr;
3164ffd1746dSEd Schouten 
3165ffd1746dSEd Schouten   // If this is a decay from variable width array, bail out.
3166ffd1746dSEd Schouten   const Expr *SubExpr = CE->getSubExpr();
3167ffd1746dSEd Schouten   if (SubExpr->getType()->isVariableArrayType())
316859d1ed5bSDimitry Andric     return nullptr;
3169ffd1746dSEd Schouten 
3170ffd1746dSEd Schouten   return SubExpr;
3171ffd1746dSEd Schouten }
3172ffd1746dSEd Schouten 
31730623d748SDimitry Andric static llvm::Value *emitArraySubscriptGEP(CodeGenFunction &CGF,
31740623d748SDimitry Andric                                           llvm::Value *ptr,
31750623d748SDimitry Andric                                           ArrayRef<llvm::Value*> indices,
31760623d748SDimitry Andric                                           bool inbounds,
317724d58133SDimitry Andric                                           bool signedIndices,
3178f9448bf3SDimitry Andric                                           SourceLocation loc,
31790623d748SDimitry Andric                                     const llvm::Twine &name = "arrayidx") {
31800623d748SDimitry Andric   if (inbounds) {
3181b40b48b8SDimitry Andric     return CGF.EmitCheckedInBoundsGEP(ptr, indices, signedIndices,
3182b40b48b8SDimitry Andric                                       CodeGenFunction::NotSubtraction, loc,
3183b40b48b8SDimitry Andric                                       name);
31840623d748SDimitry Andric   } else {
31850623d748SDimitry Andric     return CGF.Builder.CreateGEP(ptr, indices, name);
31860623d748SDimitry Andric   }
31870623d748SDimitry Andric }
31880623d748SDimitry Andric 
31890623d748SDimitry Andric static CharUnits getArrayElementAlign(CharUnits arrayAlign,
31900623d748SDimitry Andric                                       llvm::Value *idx,
31910623d748SDimitry Andric                                       CharUnits eltSize) {
31920623d748SDimitry Andric   // If we have a constant index, we can use the exact offset of the
31930623d748SDimitry Andric   // element we're accessing.
31940623d748SDimitry Andric   if (auto constantIdx = dyn_cast<llvm::ConstantInt>(idx)) {
31950623d748SDimitry Andric     CharUnits offset = constantIdx->getZExtValue() * eltSize;
31960623d748SDimitry Andric     return arrayAlign.alignmentAtOffset(offset);
31970623d748SDimitry Andric 
31980623d748SDimitry Andric   // Otherwise, use the worst-case alignment for any element.
31990623d748SDimitry Andric   } else {
32000623d748SDimitry Andric     return arrayAlign.alignmentOfArrayElement(eltSize);
32010623d748SDimitry Andric   }
32020623d748SDimitry Andric }
32030623d748SDimitry Andric 
32040623d748SDimitry Andric static QualType getFixedSizeElementType(const ASTContext &ctx,
32050623d748SDimitry Andric                                         const VariableArrayType *vla) {
32060623d748SDimitry Andric   QualType eltType;
32070623d748SDimitry Andric   do {
32080623d748SDimitry Andric     eltType = vla->getElementType();
32090623d748SDimitry Andric   } while ((vla = ctx.getAsVariableArrayType(eltType)));
32100623d748SDimitry Andric   return eltType;
32110623d748SDimitry Andric }
32120623d748SDimitry Andric 
32130623d748SDimitry Andric static Address emitArraySubscriptGEP(CodeGenFunction &CGF, Address addr,
32140623d748SDimitry Andric                                      ArrayRef<llvm::Value *> indices,
32150623d748SDimitry Andric                                      QualType eltType, bool inbounds,
321624d58133SDimitry Andric                                      bool signedIndices, SourceLocation loc,
32170623d748SDimitry Andric                                      const llvm::Twine &name = "arrayidx") {
32180623d748SDimitry Andric   // All the indices except that last must be zero.
32190623d748SDimitry Andric #ifndef NDEBUG
32200623d748SDimitry Andric   for (auto idx : indices.drop_back())
32210623d748SDimitry Andric     assert(isa<llvm::ConstantInt>(idx) &&
32220623d748SDimitry Andric            cast<llvm::ConstantInt>(idx)->isZero());
32230623d748SDimitry Andric #endif
32240623d748SDimitry Andric 
32250623d748SDimitry Andric   // Determine the element size of the statically-sized base.  This is
32260623d748SDimitry Andric   // the thing that the indices are expressed in terms of.
32270623d748SDimitry Andric   if (auto vla = CGF.getContext().getAsVariableArrayType(eltType)) {
32280623d748SDimitry Andric     eltType = getFixedSizeElementType(CGF.getContext(), vla);
32290623d748SDimitry Andric   }
32300623d748SDimitry Andric 
32310623d748SDimitry Andric   // We can use that to compute the best alignment of the element.
32320623d748SDimitry Andric   CharUnits eltSize = CGF.getContext().getTypeSizeInChars(eltType);
32330623d748SDimitry Andric   CharUnits eltAlign =
32340623d748SDimitry Andric     getArrayElementAlign(addr.getAlignment(), indices.back(), eltSize);
32350623d748SDimitry Andric 
323624d58133SDimitry Andric   llvm::Value *eltPtr = emitArraySubscriptGEP(
323724d58133SDimitry Andric       CGF, addr.getPointer(), indices, inbounds, signedIndices, loc, name);
32380623d748SDimitry Andric   return Address(eltPtr, eltAlign);
32390623d748SDimitry Andric }
32400623d748SDimitry Andric 
3241139f7f9bSDimitry Andric LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E,
3242139f7f9bSDimitry Andric                                                bool Accessed) {
324344290647SDimitry Andric   // The index must always be an integer, which is not an aggregate.  Emit it
324444290647SDimitry Andric   // in lexical order (this complexity is, sadly, required by C++17).
324544290647SDimitry Andric   llvm::Value *IdxPre =
324644290647SDimitry Andric       (E->getLHS() == E->getIdx()) ? EmitScalarExpr(E->getIdx()) : nullptr;
324724d58133SDimitry Andric   bool SignedIndices = false;
324844290647SDimitry Andric   auto EmitIdxAfterBase = [&, IdxPre](bool Promote) -> llvm::Value * {
324944290647SDimitry Andric     auto *Idx = IdxPre;
325044290647SDimitry Andric     if (E->getLHS() != E->getIdx()) {
325144290647SDimitry Andric       assert(E->getRHS() == E->getIdx() && "index was neither LHS nor RHS");
325244290647SDimitry Andric       Idx = EmitScalarExpr(E->getIdx());
325344290647SDimitry Andric     }
325444290647SDimitry Andric 
3255f22ef01cSRoman Divacky     QualType IdxTy = E->getIdx()->getType();
3256bd5abe19SDimitry Andric     bool IdxSigned = IdxTy->isSignedIntegerOrEnumerationType();
325724d58133SDimitry Andric     SignedIndices |= IdxSigned;
3258f22ef01cSRoman Divacky 
325939d628a0SDimitry Andric     if (SanOpts.has(SanitizerKind::ArrayBounds))
3260139f7f9bSDimitry Andric       EmitBoundsCheck(E, E->getBase(), Idx, IdxTy, Accessed);
3261139f7f9bSDimitry Andric 
326244290647SDimitry Andric     // Extend or truncate the index type to 32 or 64-bits.
326344290647SDimitry Andric     if (Promote && Idx->getType() != IntPtrTy)
326444290647SDimitry Andric       Idx = Builder.CreateIntCast(Idx, IntPtrTy, IdxSigned, "idxprom");
326544290647SDimitry Andric 
326644290647SDimitry Andric     return Idx;
326744290647SDimitry Andric   };
326844290647SDimitry Andric   IdxPre = nullptr;
326944290647SDimitry Andric 
3270f22ef01cSRoman Divacky   // If the base is a vector type, then we are forming a vector element lvalue
3271f22ef01cSRoman Divacky   // with this subscript.
327239d628a0SDimitry Andric   if (E->getBase()->getType()->isVectorType() &&
327339d628a0SDimitry Andric       !isa<ExtVectorElementExpr>(E->getBase())) {
3274f22ef01cSRoman Divacky     // Emit the vector as an lvalue to get its address.
3275f22ef01cSRoman Divacky     LValue LHS = EmitLValue(E->getBase());
327644290647SDimitry Andric     auto *Idx = EmitIdxAfterBase(/*Promote*/false);
3277f22ef01cSRoman Divacky     assert(LHS.isSimple() && "Can only subscript lvalue vectors here!");
32789a199699SDimitry Andric     return LValue::MakeVectorElt(LHS.getAddress(), Idx, E->getBase()->getType(),
32799a199699SDimitry Andric                                  LHS.getBaseInfo(), TBAAAccessInfo());
3280f22ef01cSRoman Divacky   }
3281f22ef01cSRoman Divacky 
32820623d748SDimitry Andric   // All the other cases basically behave like simple offsetting.
32830623d748SDimitry Andric 
32840623d748SDimitry Andric   // Handle the extvector case we ignored above.
328539d628a0SDimitry Andric   if (isa<ExtVectorElementExpr>(E->getBase())) {
328639d628a0SDimitry Andric     LValue LV = EmitLValue(E->getBase());
328744290647SDimitry Andric     auto *Idx = EmitIdxAfterBase(/*Promote*/true);
32880623d748SDimitry Andric     Address Addr = EmitExtVectorElementLValue(LV);
32890623d748SDimitry Andric 
32900623d748SDimitry Andric     QualType EltType = LV.getType()->castAs<VectorType>()->getElementType();
3291f9448bf3SDimitry Andric     Addr = emitArraySubscriptGEP(*this, Addr, Idx, EltType, /*inbounds*/ true,
329224d58133SDimitry Andric                                  SignedIndices, E->getExprLoc());
32939a199699SDimitry Andric     return MakeAddrLValue(Addr, EltType, LV.getBaseInfo(),
32949a199699SDimitry Andric                           CGM.getTBAAInfoForSubobject(LV, EltType));
329539d628a0SDimitry Andric   }
32960623d748SDimitry Andric 
32979a199699SDimitry Andric   LValueBaseInfo EltBaseInfo;
32989a199699SDimitry Andric   TBAAAccessInfo EltTBAAInfo;
32990623d748SDimitry Andric   Address Addr = Address::invalid();
33000623d748SDimitry Andric   if (const VariableArrayType *vla =
3301f22ef01cSRoman Divacky            getContext().getAsVariableArrayType(E->getType())) {
330217a519f9SDimitry Andric     // The base must be a pointer, which is not an aggregate.  Emit
330317a519f9SDimitry Andric     // it.  It needs to be emitted first in case it's what captures
330417a519f9SDimitry Andric     // the VLA bounds.
33059a199699SDimitry Andric     Addr = EmitPointerWithAlignment(E->getBase(), &EltBaseInfo, &EltTBAAInfo);
330644290647SDimitry Andric     auto *Idx = EmitIdxAfterBase(/*Promote*/true);
3307f22ef01cSRoman Divacky 
330817a519f9SDimitry Andric     // The element count here is the total number of non-VLA elements.
330917a519f9SDimitry Andric     llvm::Value *numElements = getVLASize(vla).first;
3310f22ef01cSRoman Divacky 
331117a519f9SDimitry Andric     // Effectively, the multiply by the VLA size is part of the GEP.
331217a519f9SDimitry Andric     // GEP indexes are signed, and scaling an index isn't permitted to
331317a519f9SDimitry Andric     // signed-overflow, so we use the same semantics for our explicit
331417a519f9SDimitry Andric     // multiply.  We suppress this if overflow is not undefined behavior.
3315dff0c46cSDimitry Andric     if (getLangOpts().isSignedOverflowDefined()) {
331617a519f9SDimitry Andric       Idx = Builder.CreateMul(Idx, numElements);
331717a519f9SDimitry Andric     } else {
331817a519f9SDimitry Andric       Idx = Builder.CreateNSWMul(Idx, numElements);
331917a519f9SDimitry Andric     }
33200623d748SDimitry Andric 
33210623d748SDimitry Andric     Addr = emitArraySubscriptGEP(*this, Addr, Idx, vla->getElementType(),
3322f9448bf3SDimitry Andric                                  !getLangOpts().isSignedOverflowDefined(),
332324d58133SDimitry Andric                                  SignedIndices, E->getExprLoc());
33240623d748SDimitry Andric 
3325ffd1746dSEd Schouten   } else if (const ObjCObjectType *OIT = E->getType()->getAs<ObjCObjectType>()){
3326ffd1746dSEd Schouten     // Indexing over an interface, as in "NSString *P; P[4];"
3327f22ef01cSRoman Divacky 
33280623d748SDimitry Andric     // Emit the base pointer.
33299a199699SDimitry Andric     Addr = EmitPointerWithAlignment(E->getBase(), &EltBaseInfo, &EltTBAAInfo);
333044290647SDimitry Andric     auto *Idx = EmitIdxAfterBase(/*Promote*/true);
333144290647SDimitry Andric 
333244290647SDimitry Andric     CharUnits InterfaceSize = getContext().getTypeSizeInChars(OIT);
333344290647SDimitry Andric     llvm::Value *InterfaceSizeVal =
333444290647SDimitry Andric         llvm::ConstantInt::get(Idx->getType(), InterfaceSize.getQuantity());
333544290647SDimitry Andric 
333644290647SDimitry Andric     llvm::Value *ScaledIdx = Builder.CreateMul(Idx, InterfaceSizeVal);
33370623d748SDimitry Andric 
33380623d748SDimitry Andric     // We don't necessarily build correct LLVM struct types for ObjC
33390623d748SDimitry Andric     // interfaces, so we can't rely on GEP to do this scaling
33400623d748SDimitry Andric     // correctly, so we need to cast to i8*.  FIXME: is this actually
33410623d748SDimitry Andric     // true?  A lot of other things in the fragile ABI would break...
33420623d748SDimitry Andric     llvm::Type *OrigBaseTy = Addr.getType();
33430623d748SDimitry Andric     Addr = Builder.CreateElementBitCast(Addr, Int8Ty);
33440623d748SDimitry Andric 
33450623d748SDimitry Andric     // Do the GEP.
33460623d748SDimitry Andric     CharUnits EltAlign =
33470623d748SDimitry Andric       getArrayElementAlign(Addr.getAlignment(), Idx, InterfaceSize);
334824d58133SDimitry Andric     llvm::Value *EltPtr =
334924d58133SDimitry Andric         emitArraySubscriptGEP(*this, Addr.getPointer(), ScaledIdx, false,
335024d58133SDimitry Andric                               SignedIndices, E->getExprLoc());
33510623d748SDimitry Andric     Addr = Address(EltPtr, EltAlign);
33520623d748SDimitry Andric 
33530623d748SDimitry Andric     // Cast back.
33540623d748SDimitry Andric     Addr = Builder.CreateBitCast(Addr, OrigBaseTy);
3355ffd1746dSEd Schouten   } else if (const Expr *Array = isSimpleArrayDecayOperand(E->getBase())) {
3356ffd1746dSEd Schouten     // If this is A[i] where A is an array, the frontend will have decayed the
3357ffd1746dSEd Schouten     // base to be a ArrayToPointerDecay implicit cast.  While correct, it is
3358ffd1746dSEd Schouten     // inefficient at -O0 to emit a "gep A, 0, 0" when codegen'ing it, then a
3359ffd1746dSEd Schouten     // "gep x, i" here.  Emit one "gep A, 0, i".
3360ffd1746dSEd Schouten     assert(Array->getType()->isArrayType() &&
3361ffd1746dSEd Schouten            "Array to pointer decay must have array source type!");
3362139f7f9bSDimitry Andric     LValue ArrayLV;
3363139f7f9bSDimitry Andric     // For simple multidimensional array indexing, set the 'accessed' flag for
3364139f7f9bSDimitry Andric     // better bounds-checking of the base expression.
336559d1ed5bSDimitry Andric     if (const auto *ASE = dyn_cast<ArraySubscriptExpr>(Array))
3366139f7f9bSDimitry Andric       ArrayLV = EmitArraySubscriptExpr(ASE, /*Accessed*/ true);
3367139f7f9bSDimitry Andric     else
3368139f7f9bSDimitry Andric       ArrayLV = EmitLValue(Array);
336944290647SDimitry Andric     auto *Idx = EmitIdxAfterBase(/*Promote*/true);
3370ffd1746dSEd Schouten 
33713b0f4066SDimitry Andric     // Propagate the alignment from the array itself to the result.
337224d58133SDimitry Andric     Addr = emitArraySubscriptGEP(
337324d58133SDimitry Andric         *this, ArrayLV.getAddress(), {CGM.getSize(CharUnits::Zero()), Idx},
337424d58133SDimitry Andric         E->getType(), !getLangOpts().isSignedOverflowDefined(), SignedIndices,
3375f9448bf3SDimitry Andric         E->getExprLoc());
33769a199699SDimitry Andric     EltBaseInfo = ArrayLV.getBaseInfo();
33779a199699SDimitry Andric     EltTBAAInfo = CGM.getTBAAInfoForSubobject(ArrayLV, E->getType());
3378f22ef01cSRoman Divacky   } else {
33790623d748SDimitry Andric     // The base must be a pointer; emit it with an estimate of its alignment.
33809a199699SDimitry Andric     Addr = EmitPointerWithAlignment(E->getBase(), &EltBaseInfo, &EltTBAAInfo);
338144290647SDimitry Andric     auto *Idx = EmitIdxAfterBase(/*Promote*/true);
33820623d748SDimitry Andric     Addr = emitArraySubscriptGEP(*this, Addr, Idx, E->getType(),
3383f9448bf3SDimitry Andric                                  !getLangOpts().isSignedOverflowDefined(),
338424d58133SDimitry Andric                                  SignedIndices, E->getExprLoc());
3385f22ef01cSRoman Divacky   }
3386f22ef01cSRoman Divacky 
33879a199699SDimitry Andric   LValue LV = MakeAddrLValue(Addr, E->getType(), EltBaseInfo, EltTBAAInfo);
3388f22ef01cSRoman Divacky 
33893861d79fSDimitry Andric   if (getLangOpts().ObjC1 &&
33903861d79fSDimitry Andric       getLangOpts().getGC() != LangOptions::NonGC) {
3391e580952dSDimitry Andric     LV.setNonGC(!E->isOBJCGCCandidate(getContext()));
3392f22ef01cSRoman Divacky     setObjCGCLValueClass(getContext(), E, LV);
3393f22ef01cSRoman Divacky   }
3394f22ef01cSRoman Divacky   return LV;
3395f22ef01cSRoman Divacky }
3396f22ef01cSRoman Divacky 
3397e7145dcbSDimitry Andric static Address emitOMPArraySectionBase(CodeGenFunction &CGF, const Expr *Base,
3398d8866befSDimitry Andric                                        LValueBaseInfo &BaseInfo,
33999a199699SDimitry Andric                                        TBAAAccessInfo &TBAAInfo,
3400e7145dcbSDimitry Andric                                        QualType BaseTy, QualType ElTy,
3401e7145dcbSDimitry Andric                                        bool IsLowerBound) {
3402e7145dcbSDimitry Andric   LValue BaseLVal;
3403e7145dcbSDimitry Andric   if (auto *ASE = dyn_cast<OMPArraySectionExpr>(Base->IgnoreParenImpCasts())) {
3404e7145dcbSDimitry Andric     BaseLVal = CGF.EmitOMPArraySectionExpr(ASE, IsLowerBound);
3405e7145dcbSDimitry Andric     if (BaseTy->isArrayType()) {
3406e7145dcbSDimitry Andric       Address Addr = BaseLVal.getAddress();
3407d8866befSDimitry Andric       BaseInfo = BaseLVal.getBaseInfo();
3408e7145dcbSDimitry Andric 
3409e7145dcbSDimitry Andric       // If the array type was an incomplete type, we need to make sure
3410e7145dcbSDimitry Andric       // the decay ends up being the right type.
3411e7145dcbSDimitry Andric       llvm::Type *NewTy = CGF.ConvertType(BaseTy);
3412e7145dcbSDimitry Andric       Addr = CGF.Builder.CreateElementBitCast(Addr, NewTy);
3413e7145dcbSDimitry Andric 
3414e7145dcbSDimitry Andric       // Note that VLA pointers are always decayed, so we don't need to do
3415e7145dcbSDimitry Andric       // anything here.
3416e7145dcbSDimitry Andric       if (!BaseTy->isVariableArrayType()) {
3417e7145dcbSDimitry Andric         assert(isa<llvm::ArrayType>(Addr.getElementType()) &&
3418e7145dcbSDimitry Andric                "Expected pointer to array");
3419e7145dcbSDimitry Andric         Addr = CGF.Builder.CreateStructGEP(Addr, 0, CharUnits::Zero(),
3420e7145dcbSDimitry Andric                                            "arraydecay");
3421e7145dcbSDimitry Andric       }
3422e7145dcbSDimitry Andric 
3423e7145dcbSDimitry Andric       return CGF.Builder.CreateElementBitCast(Addr,
3424e7145dcbSDimitry Andric                                               CGF.ConvertTypeForMem(ElTy));
3425e7145dcbSDimitry Andric     }
34269a199699SDimitry Andric     LValueBaseInfo TypeBaseInfo;
34279a199699SDimitry Andric     TBAAAccessInfo TypeTBAAInfo;
34289a199699SDimitry Andric     CharUnits Align = CGF.getNaturalTypeAlignment(ElTy, &TypeBaseInfo,
34299a199699SDimitry Andric                                                   &TypeTBAAInfo);
34309a199699SDimitry Andric     BaseInfo.mergeForCast(TypeBaseInfo);
34319a199699SDimitry Andric     TBAAInfo = CGF.CGM.mergeTBAAInfoForCast(TBAAInfo, TypeTBAAInfo);
3432e7145dcbSDimitry Andric     return Address(CGF.Builder.CreateLoad(BaseLVal.getAddress()), Align);
3433e7145dcbSDimitry Andric   }
34349a199699SDimitry Andric   return CGF.EmitPointerWithAlignment(Base, &BaseInfo, &TBAAInfo);
3435e7145dcbSDimitry Andric }
3436e7145dcbSDimitry Andric 
34370623d748SDimitry Andric LValue CodeGenFunction::EmitOMPArraySectionExpr(const OMPArraySectionExpr *E,
34380623d748SDimitry Andric                                                 bool IsLowerBound) {
3439d4419f6fSDimitry Andric   QualType BaseTy = OMPArraySectionExpr::getBaseOriginalType(E->getBase());
34400623d748SDimitry Andric   QualType ResultExprTy;
34410623d748SDimitry Andric   if (auto *AT = getContext().getAsArrayType(BaseTy))
34420623d748SDimitry Andric     ResultExprTy = AT->getElementType();
34430623d748SDimitry Andric   else
34440623d748SDimitry Andric     ResultExprTy = BaseTy->getPointeeType();
3445e7145dcbSDimitry Andric   llvm::Value *Idx = nullptr;
3446e7145dcbSDimitry Andric   if (IsLowerBound || E->getColonLoc().isInvalid()) {
34470623d748SDimitry Andric     // Requesting lower bound or upper bound, but without provided length and
34480623d748SDimitry Andric     // without ':' symbol for the default length -> length = 1.
34490623d748SDimitry Andric     // Idx = LowerBound ?: 0;
34500623d748SDimitry Andric     if (auto *LowerBound = E->getLowerBound()) {
34510623d748SDimitry Andric       Idx = Builder.CreateIntCast(
34520623d748SDimitry Andric           EmitScalarExpr(LowerBound), IntPtrTy,
34530623d748SDimitry Andric           LowerBound->getType()->hasSignedIntegerRepresentation());
34540623d748SDimitry Andric     } else
34550623d748SDimitry Andric       Idx = llvm::ConstantInt::getNullValue(IntPtrTy);
34560623d748SDimitry Andric   } else {
3457e7145dcbSDimitry Andric     // Try to emit length or lower bound as constant. If this is possible, 1
3458e7145dcbSDimitry Andric     // is subtracted from constant length or lower bound. Otherwise, emit LLVM
3459e7145dcbSDimitry Andric     // IR (LB + Len) - 1.
34600623d748SDimitry Andric     auto &C = CGM.getContext();
34610623d748SDimitry Andric     auto *Length = E->getLength();
34620623d748SDimitry Andric     llvm::APSInt ConstLength;
34630623d748SDimitry Andric     if (Length) {
34640623d748SDimitry Andric       // Idx = LowerBound + Length - 1;
34650623d748SDimitry Andric       if (Length->isIntegerConstantExpr(ConstLength, C)) {
34660623d748SDimitry Andric         ConstLength = ConstLength.zextOrTrunc(PointerWidthInBits);
34670623d748SDimitry Andric         Length = nullptr;
34680623d748SDimitry Andric       }
34690623d748SDimitry Andric       auto *LowerBound = E->getLowerBound();
34700623d748SDimitry Andric       llvm::APSInt ConstLowerBound(PointerWidthInBits, /*isUnsigned=*/false);
34710623d748SDimitry Andric       if (LowerBound && LowerBound->isIntegerConstantExpr(ConstLowerBound, C)) {
34720623d748SDimitry Andric         ConstLowerBound = ConstLowerBound.zextOrTrunc(PointerWidthInBits);
34730623d748SDimitry Andric         LowerBound = nullptr;
34740623d748SDimitry Andric       }
34750623d748SDimitry Andric       if (!Length)
34760623d748SDimitry Andric         --ConstLength;
34770623d748SDimitry Andric       else if (!LowerBound)
34780623d748SDimitry Andric         --ConstLowerBound;
3479f22ef01cSRoman Divacky 
34800623d748SDimitry Andric       if (Length || LowerBound) {
34810623d748SDimitry Andric         auto *LowerBoundVal =
34820623d748SDimitry Andric             LowerBound
34830623d748SDimitry Andric                 ? Builder.CreateIntCast(
34840623d748SDimitry Andric                       EmitScalarExpr(LowerBound), IntPtrTy,
34850623d748SDimitry Andric                       LowerBound->getType()->hasSignedIntegerRepresentation())
34860623d748SDimitry Andric                 : llvm::ConstantInt::get(IntPtrTy, ConstLowerBound);
34870623d748SDimitry Andric         auto *LengthVal =
34880623d748SDimitry Andric             Length
34890623d748SDimitry Andric                 ? Builder.CreateIntCast(
34900623d748SDimitry Andric                       EmitScalarExpr(Length), IntPtrTy,
34910623d748SDimitry Andric                       Length->getType()->hasSignedIntegerRepresentation())
34920623d748SDimitry Andric                 : llvm::ConstantInt::get(IntPtrTy, ConstLength);
34930623d748SDimitry Andric         Idx = Builder.CreateAdd(LowerBoundVal, LengthVal, "lb_add_len",
34940623d748SDimitry Andric                                 /*HasNUW=*/false,
34950623d748SDimitry Andric                                 !getLangOpts().isSignedOverflowDefined());
34960623d748SDimitry Andric         if (Length && LowerBound) {
34970623d748SDimitry Andric           Idx = Builder.CreateSub(
34980623d748SDimitry Andric               Idx, llvm::ConstantInt::get(IntPtrTy, /*V=*/1), "idx_sub_1",
34990623d748SDimitry Andric               /*HasNUW=*/false, !getLangOpts().isSignedOverflowDefined());
35000623d748SDimitry Andric         }
35010623d748SDimitry Andric       } else
35020623d748SDimitry Andric         Idx = llvm::ConstantInt::get(IntPtrTy, ConstLength + ConstLowerBound);
35030623d748SDimitry Andric     } else {
35040623d748SDimitry Andric       // Idx = ArraySize - 1;
3505e7145dcbSDimitry Andric       QualType ArrayTy = BaseTy->isPointerType()
3506e7145dcbSDimitry Andric                              ? E->getBase()->IgnoreParenImpCasts()->getType()
3507e7145dcbSDimitry Andric                              : BaseTy;
3508e7145dcbSDimitry Andric       if (auto *VAT = C.getAsVariableArrayType(ArrayTy)) {
35090623d748SDimitry Andric         Length = VAT->getSizeExpr();
35100623d748SDimitry Andric         if (Length->isIntegerConstantExpr(ConstLength, C))
35110623d748SDimitry Andric           Length = nullptr;
35120623d748SDimitry Andric       } else {
3513e7145dcbSDimitry Andric         auto *CAT = C.getAsConstantArrayType(ArrayTy);
35140623d748SDimitry Andric         ConstLength = CAT->getSize();
35150623d748SDimitry Andric       }
35160623d748SDimitry Andric       if (Length) {
35170623d748SDimitry Andric         auto *LengthVal = Builder.CreateIntCast(
35180623d748SDimitry Andric             EmitScalarExpr(Length), IntPtrTy,
35190623d748SDimitry Andric             Length->getType()->hasSignedIntegerRepresentation());
35200623d748SDimitry Andric         Idx = Builder.CreateSub(
35210623d748SDimitry Andric             LengthVal, llvm::ConstantInt::get(IntPtrTy, /*V=*/1), "len_sub_1",
35220623d748SDimitry Andric             /*HasNUW=*/false, !getLangOpts().isSignedOverflowDefined());
35230623d748SDimitry Andric       } else {
35240623d748SDimitry Andric         ConstLength = ConstLength.zextOrTrunc(PointerWidthInBits);
35250623d748SDimitry Andric         --ConstLength;
35260623d748SDimitry Andric         Idx = llvm::ConstantInt::get(IntPtrTy, ConstLength);
35270623d748SDimitry Andric       }
35280623d748SDimitry Andric     }
35290623d748SDimitry Andric   }
35300623d748SDimitry Andric   assert(Idx);
35310623d748SDimitry Andric 
3532e7145dcbSDimitry Andric   Address EltPtr = Address::invalid();
3533d8866befSDimitry Andric   LValueBaseInfo BaseInfo;
35349a199699SDimitry Andric   TBAAAccessInfo TBAAInfo;
35350623d748SDimitry Andric   if (auto *VLA = getContext().getAsVariableArrayType(ResultExprTy)) {
3536e7145dcbSDimitry Andric     // The base must be a pointer, which is not an aggregate.  Emit
3537e7145dcbSDimitry Andric     // it.  It needs to be emitted first in case it's what captures
3538e7145dcbSDimitry Andric     // the VLA bounds.
3539e7145dcbSDimitry Andric     Address Base =
35409a199699SDimitry Andric         emitOMPArraySectionBase(*this, E->getBase(), BaseInfo, TBAAInfo,
35419a199699SDimitry Andric                                 BaseTy, VLA->getElementType(), IsLowerBound);
35420623d748SDimitry Andric     // The element count here is the total number of non-VLA elements.
3543e7145dcbSDimitry Andric     llvm::Value *NumElements = getVLASize(VLA).first;
35440623d748SDimitry Andric 
35450623d748SDimitry Andric     // Effectively, the multiply by the VLA size is part of the GEP.
35460623d748SDimitry Andric     // GEP indexes are signed, and scaling an index isn't permitted to
35470623d748SDimitry Andric     // signed-overflow, so we use the same semantics for our explicit
35480623d748SDimitry Andric     // multiply.  We suppress this if overflow is not undefined behavior.
3549e7145dcbSDimitry Andric     if (getLangOpts().isSignedOverflowDefined())
3550e7145dcbSDimitry Andric       Idx = Builder.CreateMul(Idx, NumElements);
3551e7145dcbSDimitry Andric     else
3552e7145dcbSDimitry Andric       Idx = Builder.CreateNSWMul(Idx, NumElements);
3553e7145dcbSDimitry Andric     EltPtr = emitArraySubscriptGEP(*this, Base, Idx, VLA->getElementType(),
3554f9448bf3SDimitry Andric                                    !getLangOpts().isSignedOverflowDefined(),
355524d58133SDimitry Andric                                    /*SignedIndices=*/false, E->getExprLoc());
3556e7145dcbSDimitry Andric   } else if (const Expr *Array = isSimpleArrayDecayOperand(E->getBase())) {
3557e7145dcbSDimitry Andric     // If this is A[i] where A is an array, the frontend will have decayed the
3558e7145dcbSDimitry Andric     // base to be a ArrayToPointerDecay implicit cast.  While correct, it is
3559e7145dcbSDimitry Andric     // inefficient at -O0 to emit a "gep A, 0, 0" when codegen'ing it, then a
3560e7145dcbSDimitry Andric     // "gep x, i" here.  Emit one "gep A, 0, i".
3561e7145dcbSDimitry Andric     assert(Array->getType()->isArrayType() &&
3562e7145dcbSDimitry Andric            "Array to pointer decay must have array source type!");
3563e7145dcbSDimitry Andric     LValue ArrayLV;
3564e7145dcbSDimitry Andric     // For simple multidimensional array indexing, set the 'accessed' flag for
3565e7145dcbSDimitry Andric     // better bounds-checking of the base expression.
3566e7145dcbSDimitry Andric     if (const auto *ASE = dyn_cast<ArraySubscriptExpr>(Array))
3567e7145dcbSDimitry Andric       ArrayLV = EmitArraySubscriptExpr(ASE, /*Accessed*/ true);
3568e7145dcbSDimitry Andric     else
3569e7145dcbSDimitry Andric       ArrayLV = EmitLValue(Array);
35700623d748SDimitry Andric 
3571e7145dcbSDimitry Andric     // Propagate the alignment from the array itself to the result.
3572e7145dcbSDimitry Andric     EltPtr = emitArraySubscriptGEP(
3573e7145dcbSDimitry Andric         *this, ArrayLV.getAddress(), {CGM.getSize(CharUnits::Zero()), Idx},
3574f9448bf3SDimitry Andric         ResultExprTy, !getLangOpts().isSignedOverflowDefined(),
357524d58133SDimitry Andric         /*SignedIndices=*/false, E->getExprLoc());
3576d8866befSDimitry Andric     BaseInfo = ArrayLV.getBaseInfo();
35779a199699SDimitry Andric     TBAAInfo = CGM.getTBAAInfoForSubobject(ArrayLV, ResultExprTy);
35780623d748SDimitry Andric   } else {
3579d8866befSDimitry Andric     Address Base = emitOMPArraySectionBase(*this, E->getBase(), BaseInfo,
35809a199699SDimitry Andric                                            TBAAInfo, BaseTy, ResultExprTy,
35819a199699SDimitry Andric                                            IsLowerBound);
3582e7145dcbSDimitry Andric     EltPtr = emitArraySubscriptGEP(*this, Base, Idx, ResultExprTy,
3583f9448bf3SDimitry Andric                                    !getLangOpts().isSignedOverflowDefined(),
358424d58133SDimitry Andric                                    /*SignedIndices=*/false, E->getExprLoc());
35850623d748SDimitry Andric   }
35860623d748SDimitry Andric 
35879a199699SDimitry Andric   return MakeAddrLValue(EltPtr, ResultExprTy, BaseInfo, TBAAInfo);
3588f22ef01cSRoman Divacky }
3589f22ef01cSRoman Divacky 
3590f22ef01cSRoman Divacky LValue CodeGenFunction::
3591f22ef01cSRoman Divacky EmitExtVectorElementExpr(const ExtVectorElementExpr *E) {
3592f22ef01cSRoman Divacky   // Emit the base vector as an l-value.
3593f22ef01cSRoman Divacky   LValue Base;
3594f22ef01cSRoman Divacky 
3595f22ef01cSRoman Divacky   // ExtVectorElementExpr's base can either be a vector or pointer to vector.
3596f22ef01cSRoman Divacky   if (E->isArrow()) {
3597f22ef01cSRoman Divacky     // If it is a pointer to a vector, emit the address and form an lvalue with
3598f22ef01cSRoman Divacky     // it.
3599d8866befSDimitry Andric     LValueBaseInfo BaseInfo;
36009a199699SDimitry Andric     TBAAAccessInfo TBAAInfo;
36019a199699SDimitry Andric     Address Ptr = EmitPointerWithAlignment(E->getBase(), &BaseInfo, &TBAAInfo);
3602f22ef01cSRoman Divacky     const PointerType *PT = E->getBase()->getType()->getAs<PointerType>();
36039a199699SDimitry Andric     Base = MakeAddrLValue(Ptr, PT->getPointeeType(), BaseInfo, TBAAInfo);
3604e580952dSDimitry Andric     Base.getQuals().removeObjCGCAttr();
36052754fe60SDimitry Andric   } else if (E->getBase()->isGLValue()) {
3606f22ef01cSRoman Divacky     // Otherwise, if the base is an lvalue ( as in the case of foo.x.x),
3607f22ef01cSRoman Divacky     // emit the base as an lvalue.
3608f22ef01cSRoman Divacky     assert(E->getBase()->getType()->isVectorType());
3609f22ef01cSRoman Divacky     Base = EmitLValue(E->getBase());
3610f22ef01cSRoman Divacky   } else {
3611f22ef01cSRoman Divacky     // Otherwise, the base is a normal rvalue (as in (V+V).x), emit it as such.
361217a519f9SDimitry Andric     assert(E->getBase()->getType()->isVectorType() &&
3613f22ef01cSRoman Divacky            "Result must be a vector");
3614f22ef01cSRoman Divacky     llvm::Value *Vec = EmitScalarExpr(E->getBase());
3615f22ef01cSRoman Divacky 
3616f22ef01cSRoman Divacky     // Store the vector to memory (because LValue wants an address).
36170623d748SDimitry Andric     Address VecMem = CreateMemTemp(E->getBase()->getType());
3618f22ef01cSRoman Divacky     Builder.CreateStore(Vec, VecMem);
36190623d748SDimitry Andric     Base = MakeAddrLValue(VecMem, E->getBase()->getType(),
36209a199699SDimitry Andric                           AlignmentSource::Decl);
3621f22ef01cSRoman Divacky   }
3622f22ef01cSRoman Divacky 
362317a519f9SDimitry Andric   QualType type =
362417a519f9SDimitry Andric     E->getType().withCVRQualifiers(Base.getQuals().getCVRQualifiers());
362517a519f9SDimitry Andric 
3626f22ef01cSRoman Divacky   // Encode the element access list into a vector of unsigned indices.
36270623d748SDimitry Andric   SmallVector<uint32_t, 4> Indices;
3628f22ef01cSRoman Divacky   E->getEncodedElementAccess(Indices);
3629f22ef01cSRoman Divacky 
3630f22ef01cSRoman Divacky   if (Base.isSimple()) {
36310623d748SDimitry Andric     llvm::Constant *CV =
36320623d748SDimitry Andric         llvm::ConstantDataVector::get(getLLVMContext(), Indices);
3633dff0c46cSDimitry Andric     return LValue::MakeExtVectorElt(Base.getAddress(), CV, type,
36349a199699SDimitry Andric                                     Base.getBaseInfo(), TBAAAccessInfo());
3635f22ef01cSRoman Divacky   }
3636f22ef01cSRoman Divacky   assert(Base.isExtVectorElt() && "Can only subscript lvalue vec elts here!");
3637f22ef01cSRoman Divacky 
3638f22ef01cSRoman Divacky   llvm::Constant *BaseElts = Base.getExtVectorElts();
36396122f3e6SDimitry Andric   SmallVector<llvm::Constant *, 4> CElts;
3640f22ef01cSRoman Divacky 
3641dff0c46cSDimitry Andric   for (unsigned i = 0, e = Indices.size(); i != e; ++i)
3642dff0c46cSDimitry Andric     CElts.push_back(BaseElts->getAggregateElement(Indices[i]));
36432754fe60SDimitry Andric   llvm::Constant *CV = llvm::ConstantVector::get(CElts);
36440623d748SDimitry Andric   return LValue::MakeExtVectorElt(Base.getExtVectorAddress(), CV, type,
36459a199699SDimitry Andric                                   Base.getBaseInfo(), TBAAAccessInfo());
3646f22ef01cSRoman Divacky }
3647f22ef01cSRoman Divacky 
3648f22ef01cSRoman Divacky LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) {
36499a199699SDimitry Andric   if (DeclRefExpr *DRE = tryToConvertMemberExprToDeclRefExpr(*this, E)) {
36509a199699SDimitry Andric     EmitIgnoredExpr(E->getBase());
36519a199699SDimitry Andric     return EmitDeclRefLValue(DRE);
36529a199699SDimitry Andric   }
36539a199699SDimitry Andric 
3654f22ef01cSRoman Divacky   Expr *BaseExpr = E->getBase();
3655f22ef01cSRoman Divacky   // If this is s.x, emit s as an lvalue.  If it is s->x, emit s as a scalar.
3656cb4dff85SDimitry Andric   LValue BaseLV;
36573861d79fSDimitry Andric   if (E->isArrow()) {
3658d8866befSDimitry Andric     LValueBaseInfo BaseInfo;
36599a199699SDimitry Andric     TBAAAccessInfo TBAAInfo;
36609a199699SDimitry Andric     Address Addr = EmitPointerWithAlignment(BaseExpr, &BaseInfo, &TBAAInfo);
36613861d79fSDimitry Andric     QualType PtrTy = BaseExpr->getType()->getPointeeType();
366220e90f04SDimitry Andric     SanitizerSet SkippedChecks;
366320e90f04SDimitry Andric     bool IsBaseCXXThis = IsWrappedCXXThis(BaseExpr);
366420e90f04SDimitry Andric     if (IsBaseCXXThis)
366520e90f04SDimitry Andric       SkippedChecks.set(SanitizerKind::Alignment, true);
366620e90f04SDimitry Andric     if (IsBaseCXXThis || isa<DeclRefExpr>(BaseExpr))
366720e90f04SDimitry Andric       SkippedChecks.set(SanitizerKind::Null, true);
366820e90f04SDimitry Andric     EmitTypeCheck(TCK_MemberAccess, E->getExprLoc(), Addr.getPointer(), PtrTy,
366920e90f04SDimitry Andric                   /*Alignment=*/CharUnits::Zero(), SkippedChecks);
36709a199699SDimitry Andric     BaseLV = MakeAddrLValue(Addr, PtrTy, BaseInfo, TBAAInfo);
36713861d79fSDimitry Andric   } else
36723861d79fSDimitry Andric     BaseLV = EmitCheckedLValue(BaseExpr, TCK_MemberAccess);
3673f22ef01cSRoman Divacky 
3674f22ef01cSRoman Divacky   NamedDecl *ND = E->getMemberDecl();
367559d1ed5bSDimitry Andric   if (auto *Field = dyn_cast<FieldDecl>(ND)) {
3676cb4dff85SDimitry Andric     LValue LV = EmitLValueForField(BaseLV, Field);
3677f22ef01cSRoman Divacky     setObjCGCLValueClass(getContext(), E, LV);
3678f22ef01cSRoman Divacky     return LV;
3679f22ef01cSRoman Divacky   }
3680f22ef01cSRoman Divacky 
368159d1ed5bSDimitry Andric   if (const auto *FD = dyn_cast<FunctionDecl>(ND))
3682f22ef01cSRoman Divacky     return EmitFunctionDeclLValue(*this, E, FD);
3683f22ef01cSRoman Divacky 
36846122f3e6SDimitry Andric   llvm_unreachable("Unhandled member declaration!");
3685f22ef01cSRoman Divacky }
3686f22ef01cSRoman Divacky 
3687284c1978SDimitry Andric /// Given that we are currently emitting a lambda, emit an l-value for
3688284c1978SDimitry Andric /// one of its members.
3689284c1978SDimitry Andric LValue CodeGenFunction::EmitLValueForLambdaField(const FieldDecl *Field) {
3690284c1978SDimitry Andric   assert(cast<CXXMethodDecl>(CurCodeDecl)->getParent()->isLambda());
3691284c1978SDimitry Andric   assert(cast<CXXMethodDecl>(CurCodeDecl)->getParent() == Field->getParent());
3692284c1978SDimitry Andric   QualType LambdaTagType =
3693284c1978SDimitry Andric     getContext().getTagDeclType(Field->getParent());
3694284c1978SDimitry Andric   LValue LambdaLV = MakeNaturalAlignAddrLValue(CXXABIThisValue, LambdaTagType);
3695284c1978SDimitry Andric   return EmitLValueForField(LambdaLV, Field);
3696284c1978SDimitry Andric }
3697284c1978SDimitry Andric 
36980623d748SDimitry Andric /// Drill down to the storage of a field without walking into
36990623d748SDimitry Andric /// reference types.
37000623d748SDimitry Andric ///
37010623d748SDimitry Andric /// The resulting address doesn't necessarily have the right type.
37020623d748SDimitry Andric static Address emitAddrOfFieldStorage(CodeGenFunction &CGF, Address base,
37030623d748SDimitry Andric                                       const FieldDecl *field) {
37040623d748SDimitry Andric   const RecordDecl *rec = field->getParent();
37050623d748SDimitry Andric 
37060623d748SDimitry Andric   unsigned idx =
37070623d748SDimitry Andric     CGF.CGM.getTypes().getCGRecordLayout(rec).getLLVMFieldNo(field);
37080623d748SDimitry Andric 
37090623d748SDimitry Andric   CharUnits offset;
37100623d748SDimitry Andric   // Adjust the alignment down to the given offset.
37110623d748SDimitry Andric   // As a special case, if the LLVM field index is 0, we know that this
37120623d748SDimitry Andric   // is zero.
37130623d748SDimitry Andric   assert((idx != 0 || CGF.getContext().getASTRecordLayout(rec)
37140623d748SDimitry Andric                          .getFieldOffset(field->getFieldIndex()) == 0) &&
37150623d748SDimitry Andric          "LLVM field at index zero had non-zero offset?");
37160623d748SDimitry Andric   if (idx != 0) {
37170623d748SDimitry Andric     auto &recLayout = CGF.getContext().getASTRecordLayout(rec);
37180623d748SDimitry Andric     auto offsetInBits = recLayout.getFieldOffset(field->getFieldIndex());
37190623d748SDimitry Andric     offset = CGF.getContext().toCharUnitsFromBits(offsetInBits);
37200623d748SDimitry Andric   }
37210623d748SDimitry Andric 
37220623d748SDimitry Andric   return CGF.Builder.CreateStructGEP(base, idx, offset, field->getName());
37230623d748SDimitry Andric }
37240623d748SDimitry Andric 
3725f9448bf3SDimitry Andric static bool hasAnyVptr(const QualType Type, const ASTContext &Context) {
3726f9448bf3SDimitry Andric   const auto *RD = Type.getTypePtr()->getAsCXXRecordDecl();
3727f9448bf3SDimitry Andric   if (!RD)
3728f9448bf3SDimitry Andric     return false;
3729f9448bf3SDimitry Andric 
3730f9448bf3SDimitry Andric   if (RD->isDynamicClass())
3731f9448bf3SDimitry Andric     return true;
3732f9448bf3SDimitry Andric 
3733f9448bf3SDimitry Andric   for (const auto &Base : RD->bases())
3734f9448bf3SDimitry Andric     if (hasAnyVptr(Base.getType(), Context))
3735f9448bf3SDimitry Andric       return true;
3736f9448bf3SDimitry Andric 
3737f9448bf3SDimitry Andric   for (const FieldDecl *Field : RD->fields())
3738f9448bf3SDimitry Andric     if (hasAnyVptr(Field->getType(), Context))
3739f9448bf3SDimitry Andric       return true;
3740f9448bf3SDimitry Andric 
3741f9448bf3SDimitry Andric   return false;
3742f9448bf3SDimitry Andric }
3743f9448bf3SDimitry Andric 
3744cb4dff85SDimitry Andric LValue CodeGenFunction::EmitLValueForField(LValue base,
3745cb4dff85SDimitry Andric                                            const FieldDecl *field) {
3746d8866befSDimitry Andric   LValueBaseInfo BaseInfo = base.getBaseInfo();
3747302affcbSDimitry Andric 
37487ae0e2c9SDimitry Andric   if (field->isBitField()) {
37497ae0e2c9SDimitry Andric     const CGRecordLayout &RL =
37507ae0e2c9SDimitry Andric       CGM.getTypes().getCGRecordLayout(field->getParent());
37517ae0e2c9SDimitry Andric     const CGBitFieldInfo &Info = RL.getBitFieldInfo(field);
37520623d748SDimitry Andric     Address Addr = base.getAddress();
3753139f7f9bSDimitry Andric     unsigned Idx = RL.getLLVMFieldNo(field);
3754139f7f9bSDimitry Andric     if (Idx != 0)
3755139f7f9bSDimitry Andric       // For structs, we GEP to the field that the record layout suggests.
37560623d748SDimitry Andric       Addr = Builder.CreateStructGEP(Addr, Idx, Info.StorageOffset,
37570623d748SDimitry Andric                                      field->getName());
3758139f7f9bSDimitry Andric     // Get the access type.
37590623d748SDimitry Andric     llvm::Type *FieldIntTy =
37600623d748SDimitry Andric       llvm::Type::getIntNTy(getLLVMContext(), Info.StorageSize);
37610623d748SDimitry Andric     if (Addr.getElementType() != FieldIntTy)
37620623d748SDimitry Andric       Addr = Builder.CreateElementBitCast(Addr, FieldIntTy);
3763139f7f9bSDimitry Andric 
37647ae0e2c9SDimitry Andric     QualType fieldType =
37657ae0e2c9SDimitry Andric       field->getType().withCVRQualifiers(base.getVRQualifiers());
37669a199699SDimitry Andric     // TODO: Support TBAA for bit fields.
37679a199699SDimitry Andric     LValueBaseInfo FieldBaseInfo(BaseInfo.getAlignmentSource());
37689a199699SDimitry Andric     return LValue::MakeBitfield(Addr, Info, fieldType, FieldBaseInfo,
37699a199699SDimitry Andric                                 TBAAAccessInfo());
37709a199699SDimitry Andric   }
37719a199699SDimitry Andric 
37729a199699SDimitry Andric   // Fields of may-alias structures are may-alias themselves.
37739a199699SDimitry Andric   // FIXME: this should get propagated down through anonymous structs
37749a199699SDimitry Andric   // and unions.
37759a199699SDimitry Andric   QualType FieldType = field->getType();
37769a199699SDimitry Andric   const RecordDecl *rec = field->getParent();
37779a199699SDimitry Andric   AlignmentSource BaseAlignSource = BaseInfo.getAlignmentSource();
37789a199699SDimitry Andric   LValueBaseInfo FieldBaseInfo(getFieldAlignmentSource(BaseAlignSource));
37799a199699SDimitry Andric   TBAAAccessInfo FieldTBAAInfo;
37809a199699SDimitry Andric   if (base.getTBAAInfo().isMayAlias() ||
37819a199699SDimitry Andric           rec->hasAttr<MayAliasAttr>() || FieldType->isVectorType()) {
37829a199699SDimitry Andric     FieldTBAAInfo = TBAAAccessInfo::getMayAliasInfo();
37839a199699SDimitry Andric   } else if (rec->isUnion()) {
37849a199699SDimitry Andric     // TODO: Support TBAA for unions.
37859a199699SDimitry Andric     FieldTBAAInfo = TBAAAccessInfo::getMayAliasInfo();
37869a199699SDimitry Andric   } else {
37879a199699SDimitry Andric     // If no base type been assigned for the base access, then try to generate
37889a199699SDimitry Andric     // one for this base lvalue.
37899a199699SDimitry Andric     FieldTBAAInfo = base.getTBAAInfo();
37909a199699SDimitry Andric     if (!FieldTBAAInfo.BaseType) {
37919a199699SDimitry Andric         FieldTBAAInfo.BaseType = CGM.getTBAABaseTypeInfo(base.getType());
37929a199699SDimitry Andric         assert(!FieldTBAAInfo.Offset &&
37939a199699SDimitry Andric                "Nonzero offset for an access with no base type!");
37949a199699SDimitry Andric     }
37959a199699SDimitry Andric 
37969a199699SDimitry Andric     // Adjust offset to be relative to the base type.
37979a199699SDimitry Andric     const ASTRecordLayout &Layout =
37989a199699SDimitry Andric         getContext().getASTRecordLayout(field->getParent());
37999a199699SDimitry Andric     unsigned CharWidth = getContext().getCharWidth();
38009a199699SDimitry Andric     if (FieldTBAAInfo.BaseType)
38019a199699SDimitry Andric       FieldTBAAInfo.Offset +=
38029a199699SDimitry Andric           Layout.getFieldOffset(field->getFieldIndex()) / CharWidth;
38039a199699SDimitry Andric 
380413ddaa84SDimitry Andric     // Update the final access type and size.
38059a199699SDimitry Andric     FieldTBAAInfo.AccessType = CGM.getTBAATypeInfo(FieldType);
380613ddaa84SDimitry Andric     FieldTBAAInfo.Size =
380713ddaa84SDimitry Andric         getContext().getTypeSizeInChars(FieldType).getQuantity();
38087ae0e2c9SDimitry Andric   }
3809f22ef01cSRoman Divacky 
38100623d748SDimitry Andric   Address addr = base.getAddress();
38119a199699SDimitry Andric   unsigned RecordCVR = base.getVRQualifiers();
3812dd6029ffSDimitry Andric   if (rec->isUnion()) {
381317a519f9SDimitry Andric     // For unions, there is no pointer adjustment.
38149a199699SDimitry Andric     assert(!FieldType->isReferenceType() && "union has reference member");
3815f9448bf3SDimitry Andric     if (CGM.getCodeGenOpts().StrictVTablePointers &&
3816f9448bf3SDimitry Andric         hasAnyVptr(FieldType, getContext()))
3817f9448bf3SDimitry Andric       // Because unions can easily skip invariant.barriers, we need to add
3818f9448bf3SDimitry Andric       // a barrier every time CXXRecord field with vptr is referenced.
3819f9448bf3SDimitry Andric       addr = Address(Builder.CreateInvariantGroupBarrier(addr.getPointer()),
3820f9448bf3SDimitry Andric                      addr.getAlignment());
3821dd6029ffSDimitry Andric   } else {
3822dd6029ffSDimitry Andric     // For structs, we GEP to the field that the record layout suggests.
38230623d748SDimitry Andric     addr = emitAddrOfFieldStorage(*this, addr, field);
3824dd6029ffSDimitry Andric 
3825dd6029ffSDimitry Andric     // If this is a reference field, load the reference right now.
38269a199699SDimitry Andric     if (FieldType->isReferenceType()) {
38279a199699SDimitry Andric       LValue RefLVal = MakeAddrLValue(addr, FieldType, FieldBaseInfo,
38289a199699SDimitry Andric                                       FieldTBAAInfo);
38299a199699SDimitry Andric       if (RecordCVR & Qualifiers::Volatile)
38309a199699SDimitry Andric         RefLVal.getQuals().setVolatile(true);
38319a199699SDimitry Andric       addr = EmitLoadOfReference(RefLVal, &FieldBaseInfo, &FieldTBAAInfo);
3832dd6029ffSDimitry Andric 
38339a199699SDimitry Andric       // Qualifiers on the struct don't apply to the referencee.
38349a199699SDimitry Andric       RecordCVR = 0;
38359a199699SDimitry Andric       FieldType = FieldType->getPointeeType();
3836dd6029ffSDimitry Andric     }
3837dd6029ffSDimitry Andric   }
3838dd6029ffSDimitry Andric 
383917a519f9SDimitry Andric   // Make sure that the address is pointing to the right type.  This is critical
384017a519f9SDimitry Andric   // for both unions and structs.  A union needs a bitcast, a struct element
384117a519f9SDimitry Andric   // will need a bitcast if the LLVM type laid out doesn't match the desired
384217a519f9SDimitry Andric   // type.
38439a199699SDimitry Andric   addr = Builder.CreateElementBitCast(
38449a199699SDimitry Andric       addr, CGM.getTypes().ConvertTypeForMem(FieldType), field->getName());
384517a519f9SDimitry Andric 
38466122f3e6SDimitry Andric   if (field->hasAttr<AnnotateAttr>())
38476122f3e6SDimitry Andric     addr = EmitFieldAnnotations(field, addr);
38486122f3e6SDimitry Andric 
38499a199699SDimitry Andric   LValue LV = MakeAddrLValue(addr, FieldType, FieldBaseInfo, FieldTBAAInfo);
38509a199699SDimitry Andric   LV.getQuals().addCVRQualifiers(RecordCVR);
3851f22ef01cSRoman Divacky 
3852e580952dSDimitry Andric   // __weak attribute on a field is ignored.
3853e580952dSDimitry Andric   if (LV.getQuals().getObjCGCAttr() == Qualifiers::Weak)
3854e580952dSDimitry Andric     LV.getQuals().removeObjCGCAttr();
3855e580952dSDimitry Andric 
3856e580952dSDimitry Andric   return LV;
3857f22ef01cSRoman Divacky }
3858f22ef01cSRoman Divacky 
3859f22ef01cSRoman Divacky LValue
3860cb4dff85SDimitry Andric CodeGenFunction::EmitLValueForFieldInitialization(LValue Base,
3861cb4dff85SDimitry Andric                                                   const FieldDecl *Field) {
3862f22ef01cSRoman Divacky   QualType FieldType = Field->getType();
3863f22ef01cSRoman Divacky 
3864f22ef01cSRoman Divacky   if (!FieldType->isReferenceType())
3865cb4dff85SDimitry Andric     return EmitLValueForField(Base, Field);
3866f22ef01cSRoman Divacky 
38670623d748SDimitry Andric   Address V = emitAddrOfFieldStorage(*this, Base.getAddress(), Field);
3868f22ef01cSRoman Divacky 
38690623d748SDimitry Andric   // Make sure that the address is pointing to the right type.
38706122f3e6SDimitry Andric   llvm::Type *llvmType = ConvertTypeForMem(FieldType);
38710623d748SDimitry Andric   V = Builder.CreateElementBitCast(V, llvmType, Field->getName());
387217a519f9SDimitry Andric 
38739a199699SDimitry Andric   // TODO: Generate TBAA information that describes this access as a structure
38749a199699SDimitry Andric   // member access and not just an access to an object of the field's type. This
38759a199699SDimitry Andric   // should be similar to what we do in EmitLValueForField().
3876d8866befSDimitry Andric   LValueBaseInfo BaseInfo = Base.getBaseInfo();
38779a199699SDimitry Andric   AlignmentSource FieldAlignSource = BaseInfo.getAlignmentSource();
38789a199699SDimitry Andric   LValueBaseInfo FieldBaseInfo(getFieldAlignmentSource(FieldAlignSource));
38799a199699SDimitry Andric   return MakeAddrLValue(V, FieldType, FieldBaseInfo,
38809a199699SDimitry Andric                         CGM.getTBAAInfoForSubobject(Base, FieldType));
3881f22ef01cSRoman Divacky }
3882f22ef01cSRoman Divacky 
3883f22ef01cSRoman Divacky LValue CodeGenFunction::EmitCompoundLiteralLValue(const CompoundLiteralExpr *E){
3884dff0c46cSDimitry Andric   if (E->isFileScope()) {
38850623d748SDimitry Andric     ConstantAddress GlobalPtr = CGM.GetAddrOfConstantCompoundLiteral(E);
38869a199699SDimitry Andric     return MakeAddrLValue(GlobalPtr, E->getType(), AlignmentSource::Decl);
3887dff0c46cSDimitry Andric   }
38887ae0e2c9SDimitry Andric   if (E->getType()->isVariablyModifiedType())
38897ae0e2c9SDimitry Andric     // make sure to emit the VLA size.
38907ae0e2c9SDimitry Andric     EmitVariablyModifiedType(E->getType());
3891dff0c46cSDimitry Andric 
38920623d748SDimitry Andric   Address DeclPtr = CreateMemTemp(E->getType(), ".compoundliteral");
3893f22ef01cSRoman Divacky   const Expr *InitExpr = E->getInitializer();
38949a199699SDimitry Andric   LValue Result = MakeAddrLValue(DeclPtr, E->getType(), AlignmentSource::Decl);
3895f22ef01cSRoman Divacky 
389617a519f9SDimitry Andric   EmitAnyExprToMem(InitExpr, DeclPtr, E->getType().getQualifiers(),
389717a519f9SDimitry Andric                    /*Init*/ true);
3898f22ef01cSRoman Divacky 
3899f22ef01cSRoman Divacky   return Result;
3900f22ef01cSRoman Divacky }
3901f22ef01cSRoman Divacky 
39027ae0e2c9SDimitry Andric LValue CodeGenFunction::EmitInitListLValue(const InitListExpr *E) {
39037ae0e2c9SDimitry Andric   if (!E->isGLValue())
39047ae0e2c9SDimitry Andric     // Initializing an aggregate temporary in C++11: T{...}.
39057ae0e2c9SDimitry Andric     return EmitAggExprToLValue(E);
39067ae0e2c9SDimitry Andric 
39077ae0e2c9SDimitry Andric   // An lvalue initializer list must be initializing a reference.
390844290647SDimitry Andric   assert(E->isTransparent() && "non-transparent glvalue init list");
39097ae0e2c9SDimitry Andric   return EmitLValue(E->getInit(0));
39107ae0e2c9SDimitry Andric }
39117ae0e2c9SDimitry Andric 
391259d1ed5bSDimitry Andric /// Emit the operand of a glvalue conditional operator. This is either a glvalue
391359d1ed5bSDimitry Andric /// or a (possibly-parenthesized) throw-expression. If this is a throw, no
391459d1ed5bSDimitry Andric /// LValue is returned and the current block has been terminated.
391559d1ed5bSDimitry Andric static Optional<LValue> EmitLValueOrThrowExpression(CodeGenFunction &CGF,
391659d1ed5bSDimitry Andric                                                     const Expr *Operand) {
391759d1ed5bSDimitry Andric   if (auto *ThrowExpr = dyn_cast<CXXThrowExpr>(Operand->IgnoreParens())) {
391859d1ed5bSDimitry Andric     CGF.EmitCXXThrowExpr(ThrowExpr, /*KeepInsertionPoint*/false);
391959d1ed5bSDimitry Andric     return None;
392059d1ed5bSDimitry Andric   }
392159d1ed5bSDimitry Andric 
392259d1ed5bSDimitry Andric   return CGF.EmitLValue(Operand);
392359d1ed5bSDimitry Andric }
392459d1ed5bSDimitry Andric 
39252754fe60SDimitry Andric LValue CodeGenFunction::
39262754fe60SDimitry Andric EmitConditionalOperatorLValue(const AbstractConditionalOperator *expr) {
39272754fe60SDimitry Andric   if (!expr->isGLValue()) {
3928f22ef01cSRoman Divacky     // ?: here should be an aggregate.
3929139f7f9bSDimitry Andric     assert(hasAggregateEvaluationKind(expr->getType()) &&
3930f22ef01cSRoman Divacky            "Unexpected conditional operator!");
39312754fe60SDimitry Andric     return EmitAggExprToLValue(expr);
39322754fe60SDimitry Andric   }
3933f22ef01cSRoman Divacky 
3934dff0c46cSDimitry Andric   OpaqueValueMapping binding(*this, expr);
3935dff0c46cSDimitry Andric 
39362754fe60SDimitry Andric   const Expr *condExpr = expr->getCond();
39373b0f4066SDimitry Andric   bool CondExprBool;
39383b0f4066SDimitry Andric   if (ConstantFoldsToSimpleInteger(condExpr, CondExprBool)) {
39392754fe60SDimitry Andric     const Expr *live = expr->getTrueExpr(), *dead = expr->getFalseExpr();
39403b0f4066SDimitry Andric     if (!CondExprBool) std::swap(live, dead);
39412754fe60SDimitry Andric 
394259d1ed5bSDimitry Andric     if (!ContainsLabel(dead)) {
394359d1ed5bSDimitry Andric       // If the true case is live, we need to track its region.
394459d1ed5bSDimitry Andric       if (CondExprBool)
394533956c43SDimitry Andric         incrementProfileCounter(expr);
39462754fe60SDimitry Andric       return EmitLValue(live);
39472754fe60SDimitry Andric     }
394859d1ed5bSDimitry Andric   }
39492754fe60SDimitry Andric 
39502754fe60SDimitry Andric   llvm::BasicBlock *lhsBlock = createBasicBlock("cond.true");
39512754fe60SDimitry Andric   llvm::BasicBlock *rhsBlock = createBasicBlock("cond.false");
39522754fe60SDimitry Andric   llvm::BasicBlock *contBlock = createBasicBlock("cond.end");
39532754fe60SDimitry Andric 
39542754fe60SDimitry Andric   ConditionalEvaluation eval(*this);
395533956c43SDimitry Andric   EmitBranchOnBoolExpr(condExpr, lhsBlock, rhsBlock, getProfileCount(expr));
39562754fe60SDimitry Andric 
39572754fe60SDimitry Andric   // Any temporaries created here are conditional.
39582754fe60SDimitry Andric   EmitBlock(lhsBlock);
395933956c43SDimitry Andric   incrementProfileCounter(expr);
39602754fe60SDimitry Andric   eval.begin(*this);
396159d1ed5bSDimitry Andric   Optional<LValue> lhs =
396259d1ed5bSDimitry Andric       EmitLValueOrThrowExpression(*this, expr->getTrueExpr());
39632754fe60SDimitry Andric   eval.end(*this);
39642754fe60SDimitry Andric 
396559d1ed5bSDimitry Andric   if (lhs && !lhs->isSimple())
39662754fe60SDimitry Andric     return EmitUnsupportedLValue(expr, "conditional operator");
39672754fe60SDimitry Andric 
39682754fe60SDimitry Andric   lhsBlock = Builder.GetInsertBlock();
396959d1ed5bSDimitry Andric   if (lhs)
39702754fe60SDimitry Andric     Builder.CreateBr(contBlock);
39712754fe60SDimitry Andric 
39722754fe60SDimitry Andric   // Any temporaries created here are conditional.
39732754fe60SDimitry Andric   EmitBlock(rhsBlock);
39742754fe60SDimitry Andric   eval.begin(*this);
397559d1ed5bSDimitry Andric   Optional<LValue> rhs =
397659d1ed5bSDimitry Andric       EmitLValueOrThrowExpression(*this, expr->getFalseExpr());
39772754fe60SDimitry Andric   eval.end(*this);
397859d1ed5bSDimitry Andric   if (rhs && !rhs->isSimple())
39792754fe60SDimitry Andric     return EmitUnsupportedLValue(expr, "conditional operator");
39802754fe60SDimitry Andric   rhsBlock = Builder.GetInsertBlock();
39812754fe60SDimitry Andric 
39822754fe60SDimitry Andric   EmitBlock(contBlock);
39832754fe60SDimitry Andric 
398459d1ed5bSDimitry Andric   if (lhs && rhs) {
39850623d748SDimitry Andric     llvm::PHINode *phi = Builder.CreatePHI(lhs->getPointer()->getType(),
398659d1ed5bSDimitry Andric                                            2, "cond-lvalue");
39870623d748SDimitry Andric     phi->addIncoming(lhs->getPointer(), lhsBlock);
39880623d748SDimitry Andric     phi->addIncoming(rhs->getPointer(), rhsBlock);
39890623d748SDimitry Andric     Address result(phi, std::min(lhs->getAlignment(), rhs->getAlignment()));
39900623d748SDimitry Andric     AlignmentSource alignSource =
3991d8866befSDimitry Andric       std::max(lhs->getBaseInfo().getAlignmentSource(),
3992d8866befSDimitry Andric                rhs->getBaseInfo().getAlignmentSource());
39939a199699SDimitry Andric     TBAAAccessInfo TBAAInfo = CGM.mergeTBAAInfoForConditionalOperator(
39949a199699SDimitry Andric         lhs->getTBAAInfo(), rhs->getTBAAInfo());
39959a199699SDimitry Andric     return MakeAddrLValue(result, expr->getType(), LValueBaseInfo(alignSource),
39969a199699SDimitry Andric                           TBAAInfo);
399759d1ed5bSDimitry Andric   } else {
399859d1ed5bSDimitry Andric     assert((lhs || rhs) &&
399959d1ed5bSDimitry Andric            "both operands of glvalue conditional are throw-expressions?");
400059d1ed5bSDimitry Andric     return lhs ? *lhs : *rhs;
400159d1ed5bSDimitry Andric   }
4002f22ef01cSRoman Divacky }
4003f22ef01cSRoman Divacky 
40047ae0e2c9SDimitry Andric /// EmitCastLValue - Casts are never lvalues unless that cast is to a reference
40057ae0e2c9SDimitry Andric /// type. If the cast is to a reference, we can have the usual lvalue result,
4006f22ef01cSRoman Divacky /// otherwise if a cast is needed by the code generator in an lvalue context,
4007f22ef01cSRoman Divacky /// then it must mean that we need the address of an aggregate in order to
40087ae0e2c9SDimitry Andric /// access one of its members.  This can happen for all the reasons that casts
4009f22ef01cSRoman Divacky /// are permitted with aggregate result, including noop aggregate casts, and
4010f22ef01cSRoman Divacky /// cast from scalar to union.
4011f22ef01cSRoman Divacky LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) {
4012f22ef01cSRoman Divacky   switch (E->getCastKind()) {
4013e580952dSDimitry Andric   case CK_ToVoid:
4014e580952dSDimitry Andric   case CK_BitCast:
4015e580952dSDimitry Andric   case CK_ArrayToPointerDecay:
4016e580952dSDimitry Andric   case CK_FunctionToPointerDecay:
4017e580952dSDimitry Andric   case CK_NullToMemberPointer:
40182754fe60SDimitry Andric   case CK_NullToPointer:
4019e580952dSDimitry Andric   case CK_IntegralToPointer:
4020e580952dSDimitry Andric   case CK_PointerToIntegral:
40212754fe60SDimitry Andric   case CK_PointerToBoolean:
4022e580952dSDimitry Andric   case CK_VectorSplat:
4023e580952dSDimitry Andric   case CK_IntegralCast:
4024444ed5c5SDimitry Andric   case CK_BooleanToSignedIntegral:
40252754fe60SDimitry Andric   case CK_IntegralToBoolean:
4026e580952dSDimitry Andric   case CK_IntegralToFloating:
4027e580952dSDimitry Andric   case CK_FloatingToIntegral:
40282754fe60SDimitry Andric   case CK_FloatingToBoolean:
4029e580952dSDimitry Andric   case CK_FloatingCast:
40302754fe60SDimitry Andric   case CK_FloatingRealToComplex:
40312754fe60SDimitry Andric   case CK_FloatingComplexToReal:
40322754fe60SDimitry Andric   case CK_FloatingComplexToBoolean:
40332754fe60SDimitry Andric   case CK_FloatingComplexCast:
40342754fe60SDimitry Andric   case CK_FloatingComplexToIntegralComplex:
40352754fe60SDimitry Andric   case CK_IntegralRealToComplex:
40362754fe60SDimitry Andric   case CK_IntegralComplexToReal:
40372754fe60SDimitry Andric   case CK_IntegralComplexToBoolean:
40382754fe60SDimitry Andric   case CK_IntegralComplexCast:
40392754fe60SDimitry Andric   case CK_IntegralComplexToFloatingComplex:
4040e580952dSDimitry Andric   case CK_DerivedToBaseMemberPointer:
4041e580952dSDimitry Andric   case CK_BaseToDerivedMemberPointer:
4042e580952dSDimitry Andric   case CK_MemberPointerToBoolean:
4043dff0c46cSDimitry Andric   case CK_ReinterpretMemberPointer:
404417a519f9SDimitry Andric   case CK_AnyPointerToBlockPointerCast:
40456122f3e6SDimitry Andric   case CK_ARCProduceObject:
40466122f3e6SDimitry Andric   case CK_ARCConsumeObject:
40476122f3e6SDimitry Andric   case CK_ARCReclaimReturnedObject:
4048dff0c46cSDimitry Andric   case CK_ARCExtendBlockObject:
4049f785676fSDimitry Andric   case CK_CopyAndAutoreleaseBlockObject:
405059d1ed5bSDimitry Andric   case CK_AddressSpaceConversion:
405144290647SDimitry Andric   case CK_IntToOCLSampler:
4052f785676fSDimitry Andric     return EmitUnsupportedLValue(E, "unexpected cast lvalue");
4053f785676fSDimitry Andric 
4054f785676fSDimitry Andric   case CK_Dependent:
4055f785676fSDimitry Andric     llvm_unreachable("dependent cast kind in IR gen!");
4056f785676fSDimitry Andric 
4057f785676fSDimitry Andric   case CK_BuiltinFnToFnPtr:
4058f785676fSDimitry Andric     llvm_unreachable("builtin functions are handled elsewhere");
4059f785676fSDimitry Andric 
4060f785676fSDimitry Andric   // These are never l-values; just use the aggregate emission code.
4061f785676fSDimitry Andric   case CK_NonAtomicToAtomic:
4062f785676fSDimitry Andric   case CK_AtomicToNonAtomic:
4063f785676fSDimitry Andric     return EmitAggExprToLValue(E);
4064e580952dSDimitry Andric 
4065e580952dSDimitry Andric   case CK_Dynamic: {
4066e580952dSDimitry Andric     LValue LV = EmitLValue(E->getSubExpr());
40670623d748SDimitry Andric     Address V = LV.getAddress();
406859d1ed5bSDimitry Andric     const auto *DCE = cast<CXXDynamicCastExpr>(E);
40690623d748SDimitry Andric     return MakeNaturalAlignAddrLValue(EmitDynamicCast(V, DCE), E->getType());
4070e580952dSDimitry Andric   }
4071e580952dSDimitry Andric 
4072e580952dSDimitry Andric   case CK_ConstructorConversion:
4073e580952dSDimitry Andric   case CK_UserDefinedConversion:
40746122f3e6SDimitry Andric   case CK_CPointerToObjCPointerCast:
40756122f3e6SDimitry Andric   case CK_BlockPointerToObjCPointerCast:
4076f785676fSDimitry Andric   case CK_NoOp:
4077f785676fSDimitry Andric   case CK_LValueToRValue:
4078f22ef01cSRoman Divacky     return EmitLValue(E->getSubExpr());
4079f22ef01cSRoman Divacky 
4080e580952dSDimitry Andric   case CK_UncheckedDerivedToBase:
4081e580952dSDimitry Andric   case CK_DerivedToBase: {
4082f22ef01cSRoman Divacky     const RecordType *DerivedClassTy =
4083f22ef01cSRoman Divacky       E->getSubExpr()->getType()->getAs<RecordType>();
408459d1ed5bSDimitry Andric     auto *DerivedClassDecl = cast<CXXRecordDecl>(DerivedClassTy->getDecl());
4085f22ef01cSRoman Divacky 
4086f22ef01cSRoman Divacky     LValue LV = EmitLValue(E->getSubExpr());
40870623d748SDimitry Andric     Address This = LV.getAddress();
4088f22ef01cSRoman Divacky 
4089f22ef01cSRoman Divacky     // Perform the derived-to-base conversion
40900623d748SDimitry Andric     Address Base = GetAddressOfBaseClass(
409139d628a0SDimitry Andric         This, DerivedClassDecl, E->path_begin(), E->path_end(),
409239d628a0SDimitry Andric         /*NullCheckValue=*/false, E->getExprLoc());
4093f22ef01cSRoman Divacky 
40949a199699SDimitry Andric     // TODO: Support accesses to members of base classes in TBAA. For now, we
40959a199699SDimitry Andric     // conservatively pretend that the complete object is of the base class
40969a199699SDimitry Andric     // type.
40979a199699SDimitry Andric     return MakeAddrLValue(Base, E->getType(), LV.getBaseInfo(),
40989a199699SDimitry Andric                           CGM.getTBAAInfoForSubobject(LV, E->getType()));
4099f22ef01cSRoman Divacky   }
4100e580952dSDimitry Andric   case CK_ToUnion:
4101f22ef01cSRoman Divacky     return EmitAggExprToLValue(E);
4102e580952dSDimitry Andric   case CK_BaseToDerived: {
4103f22ef01cSRoman Divacky     const RecordType *DerivedClassTy = E->getType()->getAs<RecordType>();
410459d1ed5bSDimitry Andric     auto *DerivedClassDecl = cast<CXXRecordDecl>(DerivedClassTy->getDecl());
4105f22ef01cSRoman Divacky 
4106f22ef01cSRoman Divacky     LValue LV = EmitLValue(E->getSubExpr());
4107f22ef01cSRoman Divacky 
4108f22ef01cSRoman Divacky     // Perform the base-to-derived conversion
41090623d748SDimitry Andric     Address Derived =
4110f22ef01cSRoman Divacky       GetAddressOfDerivedClass(LV.getAddress(), DerivedClassDecl,
4111e580952dSDimitry Andric                                E->path_begin(), E->path_end(),
4112e580952dSDimitry Andric                                /*NullCheckValue=*/false);
4113f22ef01cSRoman Divacky 
4114f785676fSDimitry Andric     // C++11 [expr.static.cast]p2: Behavior is undefined if a downcast is
4115f785676fSDimitry Andric     // performed and the object is not of the derived type.
411659d1ed5bSDimitry Andric     if (sanitizePerformTypeCheck())
4117f785676fSDimitry Andric       EmitTypeCheck(TCK_DowncastReference, E->getExprLoc(),
41180623d748SDimitry Andric                     Derived.getPointer(), E->getType());
4119f785676fSDimitry Andric 
412033956c43SDimitry Andric     if (SanOpts.has(SanitizerKind::CFIDerivedCast))
41210623d748SDimitry Andric       EmitVTablePtrCheckForCast(E->getType(), Derived.getPointer(),
41220623d748SDimitry Andric                                 /*MayBeNull=*/false,
41238f0fd8f6SDimitry Andric                                 CFITCK_DerivedCast, E->getLocStart());
412433956c43SDimitry Andric 
41259a199699SDimitry Andric     return MakeAddrLValue(Derived, E->getType(), LV.getBaseInfo(),
41269a199699SDimitry Andric                           CGM.getTBAAInfoForSubobject(LV, E->getType()));
4127f22ef01cSRoman Divacky   }
4128e580952dSDimitry Andric   case CK_LValueBitCast: {
4129f22ef01cSRoman Divacky     // This must be a reinterpret_cast (or c-style equivalent).
413059d1ed5bSDimitry Andric     const auto *CE = cast<ExplicitCastExpr>(E);
4131f22ef01cSRoman Divacky 
41320623d748SDimitry Andric     CGM.EmitExplicitCastExprType(CE, this);
4133f22ef01cSRoman Divacky     LValue LV = EmitLValue(E->getSubExpr());
41340623d748SDimitry Andric     Address V = Builder.CreateBitCast(LV.getAddress(),
4135f22ef01cSRoman Divacky                                       ConvertType(CE->getTypeAsWritten()));
413633956c43SDimitry Andric 
413733956c43SDimitry Andric     if (SanOpts.has(SanitizerKind::CFIUnrelatedCast))
41380623d748SDimitry Andric       EmitVTablePtrCheckForCast(E->getType(), V.getPointer(),
41390623d748SDimitry Andric                                 /*MayBeNull=*/false,
41408f0fd8f6SDimitry Andric                                 CFITCK_UnrelatedCast, E->getLocStart());
414133956c43SDimitry Andric 
41429a199699SDimitry Andric     return MakeAddrLValue(V, E->getType(), LV.getBaseInfo(),
41439a199699SDimitry Andric                           CGM.getTBAAInfoForSubobject(LV, E->getType()));
4144e580952dSDimitry Andric   }
4145e580952dSDimitry Andric   case CK_ObjCObjectLValueCast: {
4146e580952dSDimitry Andric     LValue LV = EmitLValue(E->getSubExpr());
41470623d748SDimitry Andric     Address V = Builder.CreateElementBitCast(LV.getAddress(),
41480623d748SDimitry Andric                                              ConvertType(E->getType()));
41499a199699SDimitry Andric     return MakeAddrLValue(V, E->getType(), LV.getBaseInfo(),
41509a199699SDimitry Andric                           CGM.getTBAAInfoForSubobject(LV, E->getType()));
4151f22ef01cSRoman Divacky   }
415244290647SDimitry Andric   case CK_ZeroToOCLQueue:
415344290647SDimitry Andric     llvm_unreachable("NULL to OpenCL queue lvalue cast is not valid");
4154139f7f9bSDimitry Andric   case CK_ZeroToOCLEvent:
4155139f7f9bSDimitry Andric     llvm_unreachable("NULL to OpenCL event lvalue cast is not valid");
4156f22ef01cSRoman Divacky   }
4157e580952dSDimitry Andric 
4158e580952dSDimitry Andric   llvm_unreachable("Unhandled lvalue cast kind?");
4159f22ef01cSRoman Divacky }
4160f22ef01cSRoman Divacky 
41612754fe60SDimitry Andric LValue CodeGenFunction::EmitOpaqueValueLValue(const OpaqueValueExpr *e) {
4162dff0c46cSDimitry Andric   assert(OpaqueValueMappingData::shouldBindAsLValue(e));
41632754fe60SDimitry Andric   return getOpaqueLValueMapping(e);
41642754fe60SDimitry Andric }
41652754fe60SDimitry Andric 
4166cb4dff85SDimitry Andric RValue CodeGenFunction::EmitRValueForField(LValue LV,
4167f785676fSDimitry Andric                                            const FieldDecl *FD,
4168f785676fSDimitry Andric                                            SourceLocation Loc) {
4169cb4dff85SDimitry Andric   QualType FT = FD->getType();
4170cb4dff85SDimitry Andric   LValue FieldLV = EmitLValueForField(LV, FD);
4171139f7f9bSDimitry Andric   switch (getEvaluationKind(FT)) {
4172139f7f9bSDimitry Andric   case TEK_Complex:
4173f785676fSDimitry Andric     return RValue::getComplex(EmitLoadOfComplex(FieldLV, Loc));
4174139f7f9bSDimitry Andric   case TEK_Aggregate:
4175cb4dff85SDimitry Andric     return FieldLV.asAggregateRValue();
4176139f7f9bSDimitry Andric   case TEK_Scalar:
4177e7145dcbSDimitry Andric     // This routine is used to load fields one-by-one to perform a copy, so
4178e7145dcbSDimitry Andric     // don't load reference fields.
4179e7145dcbSDimitry Andric     if (FD->getType()->isReferenceType())
4180e7145dcbSDimitry Andric       return RValue::get(FieldLV.getPointer());
4181f785676fSDimitry Andric     return EmitLoadOfLValue(FieldLV, Loc);
4182cb4dff85SDimitry Andric   }
4183139f7f9bSDimitry Andric   llvm_unreachable("bad evaluation kind");
4184139f7f9bSDimitry Andric }
418517a519f9SDimitry Andric 
4186f22ef01cSRoman Divacky //===--------------------------------------------------------------------===//
4187f22ef01cSRoman Divacky //                             Expression Emission
4188f22ef01cSRoman Divacky //===--------------------------------------------------------------------===//
4189f22ef01cSRoman Divacky 
4190f22ef01cSRoman Divacky RValue CodeGenFunction::EmitCallExpr(const CallExpr *E,
4191f22ef01cSRoman Divacky                                      ReturnValueSlot ReturnValue) {
4192f22ef01cSRoman Divacky   // Builtins never have block type.
4193f22ef01cSRoman Divacky   if (E->getCallee()->getType()->isBlockPointerType())
4194f22ef01cSRoman Divacky     return EmitBlockCallExpr(E, ReturnValue);
4195f22ef01cSRoman Divacky 
419659d1ed5bSDimitry Andric   if (const auto *CE = dyn_cast<CXXMemberCallExpr>(E))
4197f22ef01cSRoman Divacky     return EmitCXXMemberCallExpr(CE, ReturnValue);
4198f22ef01cSRoman Divacky 
419959d1ed5bSDimitry Andric   if (const auto *CE = dyn_cast<CUDAKernelCallExpr>(E))
42006122f3e6SDimitry Andric     return EmitCUDAKernelCallExpr(CE, ReturnValue);
42016122f3e6SDimitry Andric 
420259d1ed5bSDimitry Andric   if (const auto *CE = dyn_cast<CXXOperatorCallExpr>(E))
420344290647SDimitry Andric     if (const CXXMethodDecl *MD =
420444290647SDimitry Andric           dyn_cast_or_null<CXXMethodDecl>(CE->getCalleeDecl()))
4205f22ef01cSRoman Divacky       return EmitCXXOperatorMemberCallExpr(CE, MD, ReturnValue);
4206f22ef01cSRoman Divacky 
420744290647SDimitry Andric   CGCallee callee = EmitCallee(E->getCallee());
420817a519f9SDimitry Andric 
420944290647SDimitry Andric   if (callee.isBuiltin()) {
421044290647SDimitry Andric     return EmitBuiltinExpr(callee.getBuiltinDecl(), callee.getBuiltinID(),
421144290647SDimitry Andric                            E, ReturnValue);
421244290647SDimitry Andric   }
421344290647SDimitry Andric 
421444290647SDimitry Andric   if (callee.isPseudoDestructor()) {
421544290647SDimitry Andric     return EmitCXXPseudoDestructorExpr(callee.getPseudoDestructorExpr());
421644290647SDimitry Andric   }
421744290647SDimitry Andric 
421844290647SDimitry Andric   return EmitCall(E->getCallee()->getType(), callee, E, ReturnValue);
421944290647SDimitry Andric }
422044290647SDimitry Andric 
422144290647SDimitry Andric /// Emit a CallExpr without considering whether it might be a subclass.
422244290647SDimitry Andric RValue CodeGenFunction::EmitSimpleCallExpr(const CallExpr *E,
422344290647SDimitry Andric                                            ReturnValueSlot ReturnValue) {
422444290647SDimitry Andric   CGCallee Callee = EmitCallee(E->getCallee());
422544290647SDimitry Andric   return EmitCall(E->getCallee()->getType(), Callee, E, ReturnValue);
422644290647SDimitry Andric }
422744290647SDimitry Andric 
422844290647SDimitry Andric static CGCallee EmitDirectCallee(CodeGenFunction &CGF, const FunctionDecl *FD) {
422944290647SDimitry Andric   if (auto builtinID = FD->getBuiltinID()) {
423044290647SDimitry Andric     return CGCallee::forBuiltin(builtinID, FD);
423144290647SDimitry Andric   }
423244290647SDimitry Andric 
423344290647SDimitry Andric   llvm::Constant *calleePtr = EmitFunctionDeclPointer(CGF.CGM, FD);
423444290647SDimitry Andric   return CGCallee::forDirect(calleePtr, FD);
423544290647SDimitry Andric }
423644290647SDimitry Andric 
423744290647SDimitry Andric CGCallee CodeGenFunction::EmitCallee(const Expr *E) {
423844290647SDimitry Andric   E = E->IgnoreParens();
423944290647SDimitry Andric 
424044290647SDimitry Andric   // Look through function-to-pointer decay.
424144290647SDimitry Andric   if (auto ICE = dyn_cast<ImplicitCastExpr>(E)) {
424244290647SDimitry Andric     if (ICE->getCastKind() == CK_FunctionToPointerDecay ||
424344290647SDimitry Andric         ICE->getCastKind() == CK_BuiltinFnToFnPtr) {
424444290647SDimitry Andric       return EmitCallee(ICE->getSubExpr());
424544290647SDimitry Andric     }
424644290647SDimitry Andric 
424744290647SDimitry Andric   // Resolve direct calls.
424844290647SDimitry Andric   } else if (auto DRE = dyn_cast<DeclRefExpr>(E)) {
424944290647SDimitry Andric     if (auto FD = dyn_cast<FunctionDecl>(DRE->getDecl())) {
425044290647SDimitry Andric       return EmitDirectCallee(*this, FD);
425144290647SDimitry Andric     }
425244290647SDimitry Andric   } else if (auto ME = dyn_cast<MemberExpr>(E)) {
425344290647SDimitry Andric     if (auto FD = dyn_cast<FunctionDecl>(ME->getMemberDecl())) {
425444290647SDimitry Andric       EmitIgnoredExpr(ME->getBase());
425544290647SDimitry Andric       return EmitDirectCallee(*this, FD);
425644290647SDimitry Andric     }
425744290647SDimitry Andric 
425844290647SDimitry Andric   // Look through template substitutions.
425944290647SDimitry Andric   } else if (auto NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(E)) {
426044290647SDimitry Andric     return EmitCallee(NTTP->getReplacement());
426144290647SDimitry Andric 
426244290647SDimitry Andric   // Treat pseudo-destructor calls differently.
426344290647SDimitry Andric   } else if (auto PDE = dyn_cast<CXXPseudoDestructorExpr>(E)) {
426444290647SDimitry Andric     return CGCallee::forPseudoDestructor(PDE);
426544290647SDimitry Andric   }
426644290647SDimitry Andric 
426744290647SDimitry Andric   // Otherwise, we have an indirect reference.
426844290647SDimitry Andric   llvm::Value *calleePtr;
426944290647SDimitry Andric   QualType functionType;
427044290647SDimitry Andric   if (auto ptrType = E->getType()->getAs<PointerType>()) {
427144290647SDimitry Andric     calleePtr = EmitScalarExpr(E);
427244290647SDimitry Andric     functionType = ptrType->getPointeeType();
427317a519f9SDimitry Andric   } else {
427444290647SDimitry Andric     functionType = E->getType();
427544290647SDimitry Andric     calleePtr = EmitLValue(E).getPointer();
427617a519f9SDimitry Andric   }
427744290647SDimitry Andric   assert(functionType->isFunctionType());
427844290647SDimitry Andric   CGCalleeInfo calleeInfo(functionType->getAs<FunctionProtoType>(),
427944290647SDimitry Andric                           E->getReferencedDeclOfCallee());
428044290647SDimitry Andric   CGCallee callee(calleeInfo, calleePtr);
428144290647SDimitry Andric   return callee;
4282f22ef01cSRoman Divacky }
4283f22ef01cSRoman Divacky 
4284f22ef01cSRoman Divacky LValue CodeGenFunction::EmitBinaryOperatorLValue(const BinaryOperator *E) {
4285f22ef01cSRoman Divacky   // Comma expressions just emit their LHS then their RHS as an l-value.
4286e580952dSDimitry Andric   if (E->getOpcode() == BO_Comma) {
42872754fe60SDimitry Andric     EmitIgnoredExpr(E->getLHS());
4288f22ef01cSRoman Divacky     EnsureInsertPoint();
4289f22ef01cSRoman Divacky     return EmitLValue(E->getRHS());
4290f22ef01cSRoman Divacky   }
4291f22ef01cSRoman Divacky 
4292e580952dSDimitry Andric   if (E->getOpcode() == BO_PtrMemD ||
4293e580952dSDimitry Andric       E->getOpcode() == BO_PtrMemI)
4294f22ef01cSRoman Divacky     return EmitPointerToDataMemberBinaryExpr(E);
4295f22ef01cSRoman Divacky 
42962754fe60SDimitry Andric   assert(E->getOpcode() == BO_Assign && "unexpected binary l-value");
4297f22ef01cSRoman Divacky 
429817a519f9SDimitry Andric   // Note that in all of these cases, __block variables need the RHS
429917a519f9SDimitry Andric   // evaluated first just in case the variable gets moved by the RHS.
430017a519f9SDimitry Andric 
4301139f7f9bSDimitry Andric   switch (getEvaluationKind(E->getType())) {
4302139f7f9bSDimitry Andric   case TEK_Scalar: {
430317a519f9SDimitry Andric     switch (E->getLHS()->getType().getObjCLifetime()) {
430417a519f9SDimitry Andric     case Qualifiers::OCL_Strong:
430517a519f9SDimitry Andric       return EmitARCStoreStrong(E, /*ignored*/ false).first;
430617a519f9SDimitry Andric 
430717a519f9SDimitry Andric     case Qualifiers::OCL_Autoreleasing:
430817a519f9SDimitry Andric       return EmitARCStoreAutoreleasing(E).first;
430917a519f9SDimitry Andric 
431017a519f9SDimitry Andric     // No reason to do any of these differently.
431117a519f9SDimitry Andric     case Qualifiers::OCL_None:
431217a519f9SDimitry Andric     case Qualifiers::OCL_ExplicitNone:
431317a519f9SDimitry Andric     case Qualifiers::OCL_Weak:
431417a519f9SDimitry Andric       break;
431517a519f9SDimitry Andric     }
431617a519f9SDimitry Andric 
43172754fe60SDimitry Andric     RValue RV = EmitAnyExpr(E->getRHS());
43183861d79fSDimitry Andric     LValue LV = EmitCheckedLValue(E->getLHS(), TCK_Store);
4319f37b6182SDimitry Andric     if (RV.isScalar())
4320f37b6182SDimitry Andric       EmitNullabilityCheck(LV, RV.getScalarVal(), E->getExprLoc());
432117a519f9SDimitry Andric     EmitStoreThroughLValue(RV, LV);
4322f22ef01cSRoman Divacky     return LV;
4323f22ef01cSRoman Divacky   }
4324f22ef01cSRoman Divacky 
4325139f7f9bSDimitry Andric   case TEK_Complex:
43262754fe60SDimitry Andric     return EmitComplexAssignmentLValue(E);
43272754fe60SDimitry Andric 
4328139f7f9bSDimitry Andric   case TEK_Aggregate:
4329f22ef01cSRoman Divacky     return EmitAggExprToLValue(E);
4330f22ef01cSRoman Divacky   }
4331139f7f9bSDimitry Andric   llvm_unreachable("bad evaluation kind");
4332139f7f9bSDimitry Andric }
4333f22ef01cSRoman Divacky 
4334f22ef01cSRoman Divacky LValue CodeGenFunction::EmitCallExprLValue(const CallExpr *E) {
4335f22ef01cSRoman Divacky   RValue RV = EmitCallExpr(E);
4336f22ef01cSRoman Divacky 
4337f22ef01cSRoman Divacky   if (!RV.isScalar())
43380623d748SDimitry Andric     return MakeAddrLValue(RV.getAggregateAddress(), E->getType(),
43399a199699SDimitry Andric                           AlignmentSource::Decl);
4340f22ef01cSRoman Divacky 
434133956c43SDimitry Andric   assert(E->getCallReturnType(getContext())->isReferenceType() &&
4342f22ef01cSRoman Divacky          "Can't have a scalar return unless the return type is a "
4343f22ef01cSRoman Divacky          "reference type!");
4344f22ef01cSRoman Divacky 
43450623d748SDimitry Andric   return MakeNaturalAlignPointeeAddrLValue(RV.getScalarVal(), E->getType());
4346f22ef01cSRoman Divacky }
4347f22ef01cSRoman Divacky 
4348f22ef01cSRoman Divacky LValue CodeGenFunction::EmitVAArgExprLValue(const VAArgExpr *E) {
4349f22ef01cSRoman Divacky   // FIXME: This shouldn't require another copy.
4350f22ef01cSRoman Divacky   return EmitAggExprToLValue(E);
4351f22ef01cSRoman Divacky }
4352f22ef01cSRoman Divacky 
4353f22ef01cSRoman Divacky LValue CodeGenFunction::EmitCXXConstructLValue(const CXXConstructExpr *E) {
43542754fe60SDimitry Andric   assert(E->getType()->getAsCXXRecordDecl()->hasTrivialDestructor()
43552754fe60SDimitry Andric          && "binding l-value to type which needs a temporary");
43566122f3e6SDimitry Andric   AggValueSlot Slot = CreateAggTemp(E->getType());
43572754fe60SDimitry Andric   EmitCXXConstructExpr(E, Slot);
43589a199699SDimitry Andric   return MakeAddrLValue(Slot.getAddress(), E->getType(), AlignmentSource::Decl);
4359f22ef01cSRoman Divacky }
4360f22ef01cSRoman Divacky 
4361f22ef01cSRoman Divacky LValue
4362f22ef01cSRoman Divacky CodeGenFunction::EmitCXXTypeidLValue(const CXXTypeidExpr *E) {
43630623d748SDimitry Andric   return MakeNaturalAlignAddrLValue(EmitCXXTypeidExpr(E), E->getType());
4364f22ef01cSRoman Divacky }
4365f22ef01cSRoman Divacky 
43660623d748SDimitry Andric Address CodeGenFunction::EmitCXXUuidofExpr(const CXXUuidofExpr *E) {
43670623d748SDimitry Andric   return Builder.CreateElementBitCast(CGM.GetAddrOfUuidDescriptor(E),
43680623d748SDimitry Andric                                       ConvertType(E->getType()));
43693861d79fSDimitry Andric }
43703861d79fSDimitry Andric 
43713861d79fSDimitry Andric LValue CodeGenFunction::EmitCXXUuidofLValue(const CXXUuidofExpr *E) {
43720623d748SDimitry Andric   return MakeAddrLValue(EmitCXXUuidofExpr(E), E->getType(),
43739a199699SDimitry Andric                         AlignmentSource::Decl);
43743861d79fSDimitry Andric }
43753861d79fSDimitry Andric 
4376f22ef01cSRoman Divacky LValue
4377f22ef01cSRoman Divacky CodeGenFunction::EmitCXXBindTemporaryLValue(const CXXBindTemporaryExpr *E) {
43782754fe60SDimitry Andric   AggValueSlot Slot = CreateAggTemp(E->getType(), "temp.lvalue");
43796122f3e6SDimitry Andric   Slot.setExternallyDestructed();
43802754fe60SDimitry Andric   EmitAggExpr(E->getSubExpr(), Slot);
43810623d748SDimitry Andric   EmitCXXTemporary(E->getTemporary(), E->getType(), Slot.getAddress());
43829a199699SDimitry Andric   return MakeAddrLValue(Slot.getAddress(), E->getType(), AlignmentSource::Decl);
4383dff0c46cSDimitry Andric }
4384dff0c46cSDimitry Andric 
4385dff0c46cSDimitry Andric LValue
4386dff0c46cSDimitry Andric CodeGenFunction::EmitLambdaLValue(const LambdaExpr *E) {
4387dff0c46cSDimitry Andric   AggValueSlot Slot = CreateAggTemp(E->getType(), "temp.lvalue");
4388dff0c46cSDimitry Andric   EmitLambdaExpr(E, Slot);
43899a199699SDimitry Andric   return MakeAddrLValue(Slot.getAddress(), E->getType(), AlignmentSource::Decl);
4390f22ef01cSRoman Divacky }
4391f22ef01cSRoman Divacky 
4392f22ef01cSRoman Divacky LValue CodeGenFunction::EmitObjCMessageExprLValue(const ObjCMessageExpr *E) {
4393f22ef01cSRoman Divacky   RValue RV = EmitObjCMessageExpr(E);
4394ffd1746dSEd Schouten 
4395ffd1746dSEd Schouten   if (!RV.isScalar())
43960623d748SDimitry Andric     return MakeAddrLValue(RV.getAggregateAddress(), E->getType(),
43979a199699SDimitry Andric                           AlignmentSource::Decl);
4398ffd1746dSEd Schouten 
439959d1ed5bSDimitry Andric   assert(E->getMethodDecl()->getReturnType()->isReferenceType() &&
4400ffd1746dSEd Schouten          "Can't have a scalar return unless the return type is a "
4401ffd1746dSEd Schouten          "reference type!");
4402ffd1746dSEd Schouten 
44030623d748SDimitry Andric   return MakeNaturalAlignPointeeAddrLValue(RV.getScalarVal(), E->getType());
4404ffd1746dSEd Schouten }
4405ffd1746dSEd Schouten 
4406ffd1746dSEd Schouten LValue CodeGenFunction::EmitObjCSelectorLValue(const ObjCSelectorExpr *E) {
44070623d748SDimitry Andric   Address V =
44080623d748SDimitry Andric     CGM.getObjCRuntime().GetAddrOfSelector(*this, E->getSelector());
44099a199699SDimitry Andric   return MakeAddrLValue(V, E->getType(), AlignmentSource::Decl);
4410f22ef01cSRoman Divacky }
4411f22ef01cSRoman Divacky 
4412f22ef01cSRoman Divacky llvm::Value *CodeGenFunction::EmitIvarOffset(const ObjCInterfaceDecl *Interface,
4413f22ef01cSRoman Divacky                                              const ObjCIvarDecl *Ivar) {
4414f22ef01cSRoman Divacky   return CGM.getObjCRuntime().EmitIvarOffset(*this, Interface, Ivar);
4415f22ef01cSRoman Divacky }
4416f22ef01cSRoman Divacky 
4417f22ef01cSRoman Divacky LValue CodeGenFunction::EmitLValueForIvar(QualType ObjectTy,
4418f22ef01cSRoman Divacky                                           llvm::Value *BaseValue,
4419f22ef01cSRoman Divacky                                           const ObjCIvarDecl *Ivar,
4420f22ef01cSRoman Divacky                                           unsigned CVRQualifiers) {
4421f22ef01cSRoman Divacky   return CGM.getObjCRuntime().EmitObjCValueForIvar(*this, ObjectTy, BaseValue,
4422f22ef01cSRoman Divacky                                                    Ivar, CVRQualifiers);
4423f22ef01cSRoman Divacky }
4424f22ef01cSRoman Divacky 
4425f22ef01cSRoman Divacky LValue CodeGenFunction::EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E) {
4426f22ef01cSRoman Divacky   // FIXME: A lot of the code below could be shared with EmitMemberExpr.
442759d1ed5bSDimitry Andric   llvm::Value *BaseValue = nullptr;
4428f22ef01cSRoman Divacky   const Expr *BaseExpr = E->getBase();
4429f22ef01cSRoman Divacky   Qualifiers BaseQuals;
4430f22ef01cSRoman Divacky   QualType ObjectTy;
4431f22ef01cSRoman Divacky   if (E->isArrow()) {
4432f22ef01cSRoman Divacky     BaseValue = EmitScalarExpr(BaseExpr);
4433f22ef01cSRoman Divacky     ObjectTy = BaseExpr->getType()->getPointeeType();
4434f22ef01cSRoman Divacky     BaseQuals = ObjectTy.getQualifiers();
4435f22ef01cSRoman Divacky   } else {
4436f22ef01cSRoman Divacky     LValue BaseLV = EmitLValue(BaseExpr);
44370623d748SDimitry Andric     BaseValue = BaseLV.getPointer();
4438f22ef01cSRoman Divacky     ObjectTy = BaseExpr->getType();
4439f22ef01cSRoman Divacky     BaseQuals = ObjectTy.getQualifiers();
4440f22ef01cSRoman Divacky   }
4441f22ef01cSRoman Divacky 
4442f22ef01cSRoman Divacky   LValue LV =
4443f22ef01cSRoman Divacky     EmitLValueForIvar(ObjectTy, BaseValue, E->getDecl(),
4444f22ef01cSRoman Divacky                       BaseQuals.getCVRQualifiers());
4445f22ef01cSRoman Divacky   setObjCGCLValueClass(getContext(), E, LV);
4446f22ef01cSRoman Divacky   return LV;
4447f22ef01cSRoman Divacky }
4448f22ef01cSRoman Divacky 
4449f22ef01cSRoman Divacky LValue CodeGenFunction::EmitStmtExprLValue(const StmtExpr *E) {
4450f22ef01cSRoman Divacky   // Can only get l-value for message expression returning aggregate type
4451f22ef01cSRoman Divacky   RValue RV = EmitAnyExprToTemp(E);
44520623d748SDimitry Andric   return MakeAddrLValue(RV.getAggregateAddress(), E->getType(),
44539a199699SDimitry Andric                         AlignmentSource::Decl);
4454f22ef01cSRoman Divacky }
4455f22ef01cSRoman Divacky 
445644290647SDimitry Andric RValue CodeGenFunction::EmitCall(QualType CalleeType, const CGCallee &OrigCallee,
445739d628a0SDimitry Andric                                  const CallExpr *E, ReturnValueSlot ReturnValue,
445844290647SDimitry Andric                                  llvm::Value *Chain) {
4459f22ef01cSRoman Divacky   // Get the actual function type. The callee type will always be a pointer to
4460f22ef01cSRoman Divacky   // function type or a block pointer type.
4461f22ef01cSRoman Divacky   assert(CalleeType->isFunctionPointerType() &&
4462f22ef01cSRoman Divacky          "Call must have function pointer type!");
4463f22ef01cSRoman Divacky 
446444290647SDimitry Andric   const Decl *TargetDecl = OrigCallee.getAbstractInfo().getCalleeDecl();
44650623d748SDimitry Andric 
44660623d748SDimitry Andric   if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl))
44670623d748SDimitry Andric     // We can only guarantee that a function is called from the correct
44680623d748SDimitry Andric     // context/function based on the appropriate target attributes,
44690623d748SDimitry Andric     // so only check in the case where we have both always_inline and target
44700623d748SDimitry Andric     // since otherwise we could be making a conditional call after a check for
44710623d748SDimitry Andric     // the proper cpu features (and it won't cause code generation issues due to
44720623d748SDimitry Andric     // function based code generation).
44730623d748SDimitry Andric     if (TargetDecl->hasAttr<AlwaysInlineAttr>() &&
44740623d748SDimitry Andric         TargetDecl->hasAttr<TargetAttr>())
44750623d748SDimitry Andric       checkTargetFeatures(E, FD);
44760623d748SDimitry Andric 
4477f22ef01cSRoman Divacky   CalleeType = getContext().getCanonicalType(CalleeType);
4478f22ef01cSRoman Divacky 
447959d1ed5bSDimitry Andric   const auto *FnType =
448059d1ed5bSDimitry Andric       cast<FunctionType>(cast<PointerType>(CalleeType)->getPointeeType());
4481f22ef01cSRoman Divacky 
448244290647SDimitry Andric   CGCallee Callee = OrigCallee;
448344290647SDimitry Andric 
448439d628a0SDimitry Andric   if (getLangOpts().CPlusPlus && SanOpts.has(SanitizerKind::Function) &&
4485f785676fSDimitry Andric       (!TargetDecl || !isa<FunctionDecl>(TargetDecl))) {
4486f785676fSDimitry Andric     if (llvm::Constant *PrefixSig =
4487f785676fSDimitry Andric             CGM.getTargetCodeGenInfo().getUBSanFunctionSignature(CGM)) {
448859d1ed5bSDimitry Andric       SanitizerScope SanScope(this);
4489f785676fSDimitry Andric       llvm::Constant *FTRTTIConst =
4490f785676fSDimitry Andric           CGM.GetAddrOfRTTIDescriptor(QualType(FnType, 0), /*ForEH=*/true);
44919a199699SDimitry Andric       llvm::Type *PrefixStructTyElems[] = {PrefixSig->getType(), Int32Ty};
4492f785676fSDimitry Andric       llvm::StructType *PrefixStructTy = llvm::StructType::get(
4493f785676fSDimitry Andric           CGM.getLLVMContext(), PrefixStructTyElems, /*isPacked=*/true);
4494f785676fSDimitry Andric 
449544290647SDimitry Andric       llvm::Value *CalleePtr = Callee.getFunctionPointer();
449644290647SDimitry Andric 
4497f785676fSDimitry Andric       llvm::Value *CalleePrefixStruct = Builder.CreateBitCast(
449844290647SDimitry Andric           CalleePtr, llvm::PointerType::getUnqual(PrefixStructTy));
4499f785676fSDimitry Andric       llvm::Value *CalleeSigPtr =
450033956c43SDimitry Andric           Builder.CreateConstGEP2_32(PrefixStructTy, CalleePrefixStruct, 0, 0);
45010623d748SDimitry Andric       llvm::Value *CalleeSig =
45020623d748SDimitry Andric           Builder.CreateAlignedLoad(CalleeSigPtr, getIntAlign());
4503f785676fSDimitry Andric       llvm::Value *CalleeSigMatch = Builder.CreateICmpEQ(CalleeSig, PrefixSig);
4504f785676fSDimitry Andric 
4505f785676fSDimitry Andric       llvm::BasicBlock *Cont = createBasicBlock("cont");
4506f785676fSDimitry Andric       llvm::BasicBlock *TypeCheck = createBasicBlock("typecheck");
4507f785676fSDimitry Andric       Builder.CreateCondBr(CalleeSigMatch, TypeCheck, Cont);
4508f785676fSDimitry Andric 
4509f785676fSDimitry Andric       EmitBlock(TypeCheck);
4510f785676fSDimitry Andric       llvm::Value *CalleeRTTIPtr =
451133956c43SDimitry Andric           Builder.CreateConstGEP2_32(PrefixStructTy, CalleePrefixStruct, 0, 1);
45129a199699SDimitry Andric       llvm::Value *CalleeRTTIEncoded =
45130623d748SDimitry Andric           Builder.CreateAlignedLoad(CalleeRTTIPtr, getPointerAlign());
45149a199699SDimitry Andric       llvm::Value *CalleeRTTI =
45159a199699SDimitry Andric           DecodeAddrUsedInPrologue(CalleePtr, CalleeRTTIEncoded);
4516f785676fSDimitry Andric       llvm::Value *CalleeRTTIMatch =
4517f785676fSDimitry Andric           Builder.CreateICmpEQ(CalleeRTTI, FTRTTIConst);
4518f785676fSDimitry Andric       llvm::Constant *StaticData[] = {
451939d628a0SDimitry Andric         EmitCheckSourceLocation(E->getLocStart()),
4520f785676fSDimitry Andric         EmitCheckTypeDescriptor(CalleeType)
4521f785676fSDimitry Andric       };
452239d628a0SDimitry Andric       EmitCheck(std::make_pair(CalleeRTTIMatch, SanitizerKind::Function),
452344290647SDimitry Andric                 SanitizerHandler::FunctionTypeMismatch, StaticData, CalleePtr);
4524f785676fSDimitry Andric 
4525f785676fSDimitry Andric       Builder.CreateBr(Cont);
4526f785676fSDimitry Andric       EmitBlock(Cont);
4527f785676fSDimitry Andric     }
4528f785676fSDimitry Andric   }
4529f785676fSDimitry Andric 
45300623d748SDimitry Andric   // If we are checking indirect calls and this call is indirect, check that the
45310623d748SDimitry Andric   // function pointer is a member of the bit set for the function type.
45320623d748SDimitry Andric   if (SanOpts.has(SanitizerKind::CFIICall) &&
45330623d748SDimitry Andric       (!TargetDecl || !isa<FunctionDecl>(TargetDecl))) {
45340623d748SDimitry Andric     SanitizerScope SanScope(this);
4535e7145dcbSDimitry Andric     EmitSanitizerStatReport(llvm::SanStat_CFI_ICall);
45360623d748SDimitry Andric 
45379a199699SDimitry Andric     llvm::Metadata *MD;
45389a199699SDimitry Andric     if (CGM.getCodeGenOpts().SanitizeCfiICallGeneralizePointers)
45399a199699SDimitry Andric       MD = CGM.CreateMetadataIdentifierGeneralized(QualType(FnType, 0));
45409a199699SDimitry Andric     else
45419a199699SDimitry Andric       MD = CGM.CreateMetadataIdentifierForType(QualType(FnType, 0));
45429a199699SDimitry Andric 
4543e7145dcbSDimitry Andric     llvm::Value *TypeId = llvm::MetadataAsValue::get(getLLVMContext(), MD);
45440623d748SDimitry Andric 
454544290647SDimitry Andric     llvm::Value *CalleePtr = Callee.getFunctionPointer();
454644290647SDimitry Andric     llvm::Value *CastedCallee = Builder.CreateBitCast(CalleePtr, Int8PtrTy);
4547e7145dcbSDimitry Andric     llvm::Value *TypeTest = Builder.CreateCall(
4548e7145dcbSDimitry Andric         CGM.getIntrinsic(llvm::Intrinsic::type_test), {CastedCallee, TypeId});
45490623d748SDimitry Andric 
4550e7145dcbSDimitry Andric     auto CrossDsoTypeId = CGM.CreateCrossDsoCfiTypeId(MD);
45510623d748SDimitry Andric     llvm::Constant *StaticData[] = {
4552e7145dcbSDimitry Andric         llvm::ConstantInt::get(Int8Ty, CFITCK_ICall),
45530623d748SDimitry Andric         EmitCheckSourceLocation(E->getLocStart()),
45540623d748SDimitry Andric         EmitCheckTypeDescriptor(QualType(FnType, 0)),
45550623d748SDimitry Andric     };
4556e7145dcbSDimitry Andric     if (CGM.getCodeGenOpts().SanitizeCfiCrossDso && CrossDsoTypeId) {
4557e7145dcbSDimitry Andric       EmitCfiSlowPathCheck(SanitizerKind::CFIICall, TypeTest, CrossDsoTypeId,
4558e7145dcbSDimitry Andric                            CastedCallee, StaticData);
4559e7145dcbSDimitry Andric     } else {
4560e7145dcbSDimitry Andric       EmitCheck(std::make_pair(TypeTest, SanitizerKind::CFIICall),
456144290647SDimitry Andric                 SanitizerHandler::CFICheckFail, StaticData,
4562e7145dcbSDimitry Andric                 {CastedCallee, llvm::UndefValue::get(IntPtrTy)});
45630623d748SDimitry Andric     }
45640623d748SDimitry Andric   }
45650623d748SDimitry Andric 
4566f22ef01cSRoman Divacky   CallArgList Args;
456739d628a0SDimitry Andric   if (Chain)
456839d628a0SDimitry Andric     Args.add(RValue::get(Builder.CreateBitCast(Chain, CGM.VoidPtrTy)),
456939d628a0SDimitry Andric              CGM.getContext().VoidPtrTy);
457044290647SDimitry Andric 
457144290647SDimitry Andric   // C++17 requires that we evaluate arguments to a call using assignment syntax
457244290647SDimitry Andric   // right-to-left, and that we evaluate arguments to certain other operators
457344290647SDimitry Andric   // left-to-right. Note that we allow this to override the order dictated by
457444290647SDimitry Andric   // the calling convention on the MS ABI, which means that parameter
457544290647SDimitry Andric   // destruction order is not necessarily reverse construction order.
457644290647SDimitry Andric   // FIXME: Revisit this based on C++ committee response to unimplementability.
457744290647SDimitry Andric   EvaluationOrder Order = EvaluationOrder::Default;
457844290647SDimitry Andric   if (auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {
457944290647SDimitry Andric     if (OCE->isAssignmentOp())
458044290647SDimitry Andric       Order = EvaluationOrder::ForceRightToLeft;
458144290647SDimitry Andric     else {
458244290647SDimitry Andric       switch (OCE->getOperator()) {
458344290647SDimitry Andric       case OO_LessLess:
458444290647SDimitry Andric       case OO_GreaterGreater:
458544290647SDimitry Andric       case OO_AmpAmp:
458644290647SDimitry Andric       case OO_PipePipe:
458744290647SDimitry Andric       case OO_Comma:
458844290647SDimitry Andric       case OO_ArrowStar:
458944290647SDimitry Andric         Order = EvaluationOrder::ForceLeftToRight;
459044290647SDimitry Andric         break;
459144290647SDimitry Andric       default:
459244290647SDimitry Andric         break;
459344290647SDimitry Andric       }
459444290647SDimitry Andric     }
459544290647SDimitry Andric   }
459644290647SDimitry Andric 
45970623d748SDimitry Andric   EmitCallArgs(Args, dyn_cast<FunctionProtoType>(FnType), E->arguments(),
459844290647SDimitry Andric                E->getDirectCallee(), /*ParamsToSkip*/ 0, Order);
4599f22ef01cSRoman Divacky 
460039d628a0SDimitry Andric   const CGFunctionInfo &FnInfo = CGM.getTypes().arrangeFreeFunctionCall(
460139d628a0SDimitry Andric       Args, FnType, /*isChainCall=*/Chain);
46026122f3e6SDimitry Andric 
46036122f3e6SDimitry Andric   // C99 6.5.2.2p6:
46046122f3e6SDimitry Andric   //   If the expression that denotes the called function has a type
46056122f3e6SDimitry Andric   //   that does not include a prototype, [the default argument
46066122f3e6SDimitry Andric   //   promotions are performed]. If the number of arguments does not
46076122f3e6SDimitry Andric   //   equal the number of parameters, the behavior is undefined. If
46086122f3e6SDimitry Andric   //   the function is defined with a type that includes a prototype,
46096122f3e6SDimitry Andric   //   and either the prototype ends with an ellipsis (, ...) or the
46106122f3e6SDimitry Andric   //   types of the arguments after promotion are not compatible with
46116122f3e6SDimitry Andric   //   the types of the parameters, the behavior is undefined. If the
46126122f3e6SDimitry Andric   //   function is defined with a type that does not include a
46136122f3e6SDimitry Andric   //   prototype, and the types of the arguments after promotion are
46146122f3e6SDimitry Andric   //   not compatible with those of the parameters after promotion,
46156122f3e6SDimitry Andric   //   the behavior is undefined [except in some trivial cases].
46166122f3e6SDimitry Andric   // That is, in the general case, we should assume that a call
46176122f3e6SDimitry Andric   // through an unprototyped function type works like a *non-variadic*
46186122f3e6SDimitry Andric   // call.  The way we make this work is to cast to the exact type
46196122f3e6SDimitry Andric   // of the promoted arguments.
462039d628a0SDimitry Andric   //
462139d628a0SDimitry Andric   // Chain calls use this same code path to add the invisible chain parameter
462239d628a0SDimitry Andric   // to the function type.
462339d628a0SDimitry Andric   if (isa<FunctionNoProtoType>(FnType) || Chain) {
4624dff0c46cSDimitry Andric     llvm::Type *CalleeTy = getTypes().GetFunctionType(FnInfo);
46256122f3e6SDimitry Andric     CalleeTy = CalleeTy->getPointerTo();
462644290647SDimitry Andric 
462744290647SDimitry Andric     llvm::Value *CalleePtr = Callee.getFunctionPointer();
462844290647SDimitry Andric     CalleePtr = Builder.CreateBitCast(CalleePtr, CalleeTy, "callee.knr.cast");
462944290647SDimitry Andric     Callee.setFunctionPointer(CalleePtr);
46306122f3e6SDimitry Andric   }
46316122f3e6SDimitry Andric 
463213ddaa84SDimitry Andric   return EmitCall(FnInfo, Callee, ReturnValue, Args, nullptr, E->getExprLoc());
4633f22ef01cSRoman Divacky }
4634f22ef01cSRoman Divacky 
4635f22ef01cSRoman Divacky LValue CodeGenFunction::
4636f22ef01cSRoman Divacky EmitPointerToDataMemberBinaryExpr(const BinaryOperator *E) {
46370623d748SDimitry Andric   Address BaseAddr = Address::invalid();
46380623d748SDimitry Andric   if (E->getOpcode() == BO_PtrMemI) {
46390623d748SDimitry Andric     BaseAddr = EmitPointerWithAlignment(E->getLHS());
46400623d748SDimitry Andric   } else {
46410623d748SDimitry Andric     BaseAddr = EmitLValue(E->getLHS()).getAddress();
46420623d748SDimitry Andric   }
4643e580952dSDimitry Andric 
4644f22ef01cSRoman Divacky   llvm::Value *OffsetV = EmitScalarExpr(E->getRHS());
4645f22ef01cSRoman Divacky 
4646e580952dSDimitry Andric   const MemberPointerType *MPT
4647e580952dSDimitry Andric     = E->getRHS()->getType()->getAs<MemberPointerType>();
4648f22ef01cSRoman Divacky 
4649d8866befSDimitry Andric   LValueBaseInfo BaseInfo;
46509a199699SDimitry Andric   TBAAAccessInfo TBAAInfo;
46510623d748SDimitry Andric   Address MemberAddr =
46529a199699SDimitry Andric     EmitCXXMemberDataPointerAddress(E, BaseAddr, OffsetV, MPT, &BaseInfo,
46539a199699SDimitry Andric                                     &TBAAInfo);
4654e580952dSDimitry Andric 
46559a199699SDimitry Andric   return MakeAddrLValue(MemberAddr, MPT->getPointeeType(), BaseInfo, TBAAInfo);
4656f22ef01cSRoman Divacky }
46576122f3e6SDimitry Andric 
4658139f7f9bSDimitry Andric /// Given the address of a temporary variable, produce an r-value of
4659139f7f9bSDimitry Andric /// its type.
46600623d748SDimitry Andric RValue CodeGenFunction::convertTempToRValue(Address addr,
4661f785676fSDimitry Andric                                             QualType type,
4662f785676fSDimitry Andric                                             SourceLocation loc) {
46639a199699SDimitry Andric   LValue lvalue = MakeAddrLValue(addr, type, AlignmentSource::Decl);
4664139f7f9bSDimitry Andric   switch (getEvaluationKind(type)) {
4665139f7f9bSDimitry Andric   case TEK_Complex:
4666f785676fSDimitry Andric     return RValue::getComplex(EmitLoadOfComplex(lvalue, loc));
4667139f7f9bSDimitry Andric   case TEK_Aggregate:
4668139f7f9bSDimitry Andric     return lvalue.asAggregateRValue();
4669139f7f9bSDimitry Andric   case TEK_Scalar:
4670f785676fSDimitry Andric     return RValue::get(EmitLoadOfScalar(lvalue, loc));
46716122f3e6SDimitry Andric   }
4672139f7f9bSDimitry Andric   llvm_unreachable("bad evaluation kind");
46736122f3e6SDimitry Andric }
4674dff0c46cSDimitry Andric 
4675dff0c46cSDimitry Andric void CodeGenFunction::SetFPAccuracy(llvm::Value *Val, float Accuracy) {
4676dff0c46cSDimitry Andric   assert(Val->getType()->isFPOrFPVectorTy());
4677dff0c46cSDimitry Andric   if (Accuracy == 0.0 || !isa<llvm::Instruction>(Val))
4678dff0c46cSDimitry Andric     return;
4679dff0c46cSDimitry Andric 
4680cb4dff85SDimitry Andric   llvm::MDBuilder MDHelper(getLLVMContext());
4681cb4dff85SDimitry Andric   llvm::MDNode *Node = MDHelper.createFPMath(Accuracy);
4682dff0c46cSDimitry Andric 
4683cb4dff85SDimitry Andric   cast<llvm::Instruction>(Val)->setMetadata(llvm::LLVMContext::MD_fpmath, Node);
4684dff0c46cSDimitry Andric }
4685dff0c46cSDimitry Andric 
4686dff0c46cSDimitry Andric namespace {
4687dff0c46cSDimitry Andric   struct LValueOrRValue {
4688dff0c46cSDimitry Andric     LValue LV;
4689dff0c46cSDimitry Andric     RValue RV;
4690dff0c46cSDimitry Andric   };
4691dff0c46cSDimitry Andric }
4692dff0c46cSDimitry Andric 
4693dff0c46cSDimitry Andric static LValueOrRValue emitPseudoObjectExpr(CodeGenFunction &CGF,
4694dff0c46cSDimitry Andric                                            const PseudoObjectExpr *E,
4695dff0c46cSDimitry Andric                                            bool forLValue,
4696dff0c46cSDimitry Andric                                            AggValueSlot slot) {
4697139f7f9bSDimitry Andric   SmallVector<CodeGenFunction::OpaqueValueMappingData, 4> opaques;
4698dff0c46cSDimitry Andric 
4699dff0c46cSDimitry Andric   // Find the result expression, if any.
4700dff0c46cSDimitry Andric   const Expr *resultExpr = E->getResultExpr();
4701dff0c46cSDimitry Andric   LValueOrRValue result;
4702dff0c46cSDimitry Andric 
4703dff0c46cSDimitry Andric   for (PseudoObjectExpr::const_semantics_iterator
4704dff0c46cSDimitry Andric          i = E->semantics_begin(), e = E->semantics_end(); i != e; ++i) {
4705dff0c46cSDimitry Andric     const Expr *semantic = *i;
4706dff0c46cSDimitry Andric 
4707dff0c46cSDimitry Andric     // If this semantic expression is an opaque value, bind it
4708dff0c46cSDimitry Andric     // to the result of its source expression.
470959d1ed5bSDimitry Andric     if (const auto *ov = dyn_cast<OpaqueValueExpr>(semantic)) {
4710dff0c46cSDimitry Andric 
4711dff0c46cSDimitry Andric       // If this is the result expression, we may need to evaluate
4712dff0c46cSDimitry Andric       // directly into the slot.
4713dff0c46cSDimitry Andric       typedef CodeGenFunction::OpaqueValueMappingData OVMA;
4714dff0c46cSDimitry Andric       OVMA opaqueData;
4715dff0c46cSDimitry Andric       if (ov == resultExpr && ov->isRValue() && !forLValue &&
4716139f7f9bSDimitry Andric           CodeGenFunction::hasAggregateEvaluationKind(ov->getType())) {
4717dff0c46cSDimitry Andric         CGF.EmitAggExpr(ov->getSourceExpr(), slot);
47180623d748SDimitry Andric         LValue LV = CGF.MakeAddrLValue(slot.getAddress(), ov->getType(),
47199a199699SDimitry Andric                                        AlignmentSource::Decl);
4720dff0c46cSDimitry Andric         opaqueData = OVMA::bind(CGF, ov, LV);
4721dff0c46cSDimitry Andric         result.RV = slot.asRValue();
4722dff0c46cSDimitry Andric 
4723dff0c46cSDimitry Andric       // Otherwise, emit as normal.
4724dff0c46cSDimitry Andric       } else {
4725dff0c46cSDimitry Andric         opaqueData = OVMA::bind(CGF, ov, ov->getSourceExpr());
4726dff0c46cSDimitry Andric 
4727dff0c46cSDimitry Andric         // If this is the result, also evaluate the result now.
4728dff0c46cSDimitry Andric         if (ov == resultExpr) {
4729dff0c46cSDimitry Andric           if (forLValue)
4730dff0c46cSDimitry Andric             result.LV = CGF.EmitLValue(ov);
4731dff0c46cSDimitry Andric           else
4732dff0c46cSDimitry Andric             result.RV = CGF.EmitAnyExpr(ov, slot);
4733dff0c46cSDimitry Andric         }
4734dff0c46cSDimitry Andric       }
4735dff0c46cSDimitry Andric 
4736dff0c46cSDimitry Andric       opaques.push_back(opaqueData);
4737dff0c46cSDimitry Andric 
4738dff0c46cSDimitry Andric     // Otherwise, if the expression is the result, evaluate it
4739dff0c46cSDimitry Andric     // and remember the result.
4740dff0c46cSDimitry Andric     } else if (semantic == resultExpr) {
4741dff0c46cSDimitry Andric       if (forLValue)
4742dff0c46cSDimitry Andric         result.LV = CGF.EmitLValue(semantic);
4743dff0c46cSDimitry Andric       else
4744dff0c46cSDimitry Andric         result.RV = CGF.EmitAnyExpr(semantic, slot);
4745dff0c46cSDimitry Andric 
4746dff0c46cSDimitry Andric     // Otherwise, evaluate the expression in an ignored context.
4747dff0c46cSDimitry Andric     } else {
4748dff0c46cSDimitry Andric       CGF.EmitIgnoredExpr(semantic);
4749dff0c46cSDimitry Andric     }
4750dff0c46cSDimitry Andric   }
4751dff0c46cSDimitry Andric 
4752dff0c46cSDimitry Andric   // Unbind all the opaques now.
4753dff0c46cSDimitry Andric   for (unsigned i = 0, e = opaques.size(); i != e; ++i)
4754dff0c46cSDimitry Andric     opaques[i].unbind(CGF);
4755dff0c46cSDimitry Andric 
4756dff0c46cSDimitry Andric   return result;
4757dff0c46cSDimitry Andric }
4758dff0c46cSDimitry Andric 
4759dff0c46cSDimitry Andric RValue CodeGenFunction::EmitPseudoObjectRValue(const PseudoObjectExpr *E,
4760dff0c46cSDimitry Andric                                                AggValueSlot slot) {
4761dff0c46cSDimitry Andric   return emitPseudoObjectExpr(*this, E, false, slot).RV;
4762dff0c46cSDimitry Andric }
4763dff0c46cSDimitry Andric 
4764dff0c46cSDimitry Andric LValue CodeGenFunction::EmitPseudoObjectLValue(const PseudoObjectExpr *E) {
4765dff0c46cSDimitry Andric   return emitPseudoObjectExpr(*this, E, true, AggValueSlot::ignored()).LV;
4766dff0c46cSDimitry Andric }
4767