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"
29*b5893f02SDimitry Andric #include "clang/Basic/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
EmitCastToVoidPtr(llvm::Value * value)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.
CreateTempAllocaWithoutCast(llvm::Type * Ty,CharUnits Align,const Twine & Name,llvm::Value * ArraySize)644ba319b5SDimitry Andric Address CodeGenFunction::CreateTempAllocaWithoutCast(llvm::Type *Ty,
654ba319b5SDimitry Andric CharUnits Align,
664ba319b5SDimitry Andric const Twine &Name,
674ba319b5SDimitry Andric llvm::Value *ArraySize) {
684ba319b5SDimitry Andric auto Alloca = CreateTempAlloca(Ty, Name, ArraySize);
694ba319b5SDimitry Andric Alloca->setAlignment(Align.getQuantity());
704ba319b5SDimitry Andric return Address(Alloca, Align);
714ba319b5SDimitry Andric }
724ba319b5SDimitry Andric
734ba319b5SDimitry Andric /// CreateTempAlloca - This creates a alloca and inserts it into the entry
744ba319b5SDimitry Andric /// block. The alloca is casted to default address space if necessary.
CreateTempAlloca(llvm::Type * Ty,CharUnits Align,const Twine & Name,llvm::Value * ArraySize,Address * AllocaAddr)750623d748SDimitry Andric Address CodeGenFunction::CreateTempAlloca(llvm::Type *Ty, CharUnits Align,
76edd7eaddSDimitry Andric const Twine &Name,
77edd7eaddSDimitry Andric llvm::Value *ArraySize,
784ba319b5SDimitry Andric Address *AllocaAddr) {
794ba319b5SDimitry Andric auto Alloca = CreateTempAllocaWithoutCast(Ty, Align, Name, ArraySize);
804ba319b5SDimitry Andric if (AllocaAddr)
814ba319b5SDimitry Andric *AllocaAddr = Alloca;
824ba319b5SDimitry Andric llvm::Value *V = Alloca.getPointer();
83edd7eaddSDimitry Andric // Alloca always returns a pointer in alloca address space, which may
84edd7eaddSDimitry Andric // be different from the type defined by the language. For example,
85edd7eaddSDimitry Andric // in C++ the auto variables are in the default address space. Therefore
86edd7eaddSDimitry Andric // cast alloca to the default address space when necessary.
874ba319b5SDimitry Andric if (getASTAllocaAddressSpace() != LangAS::Default) {
88edd7eaddSDimitry Andric auto DestAddrSpace = getContext().getTargetAddressSpace(LangAS::Default);
899a199699SDimitry Andric llvm::IRBuilderBase::InsertPointGuard IPG(Builder);
909a199699SDimitry Andric // When ArraySize is nullptr, alloca is inserted at AllocaInsertPt,
919a199699SDimitry Andric // otherwise alloca is inserted at the current insertion point of the
929a199699SDimitry Andric // builder.
939a199699SDimitry Andric if (!ArraySize)
94b40b48b8SDimitry Andric Builder.SetInsertPoint(AllocaInsertPt);
95edd7eaddSDimitry Andric V = getTargetHooks().performAddrSpaceCast(
96edd7eaddSDimitry Andric *this, V, getASTAllocaAddressSpace(), LangAS::Default,
97edd7eaddSDimitry Andric Ty->getPointerTo(DestAddrSpace), /*non-null*/ true);
980623d748SDimitry Andric }
990623d748SDimitry Andric
100edd7eaddSDimitry Andric return Address(V, Align);
101edd7eaddSDimitry Andric }
102edd7eaddSDimitry Andric
103edd7eaddSDimitry Andric /// CreateTempAlloca - This creates an alloca and inserts it into the entry
104edd7eaddSDimitry Andric /// block if \p ArraySize is nullptr, otherwise inserts it at the current
105edd7eaddSDimitry Andric /// insertion point of the builder.
CreateTempAlloca(llvm::Type * Ty,const Twine & Name,llvm::Value * ArraySize)1066122f3e6SDimitry Andric llvm::AllocaInst *CodeGenFunction::CreateTempAlloca(llvm::Type *Ty,
107edd7eaddSDimitry Andric const Twine &Name,
108edd7eaddSDimitry Andric llvm::Value *ArraySize) {
109edd7eaddSDimitry Andric if (ArraySize)
110edd7eaddSDimitry Andric return Builder.CreateAlloca(Ty, ArraySize, Name);
11120e90f04SDimitry Andric return new llvm::AllocaInst(Ty, CGM.getDataLayout().getAllocaAddrSpace(),
112edd7eaddSDimitry Andric ArraySize, Name, AllocaInsertPt);
113f22ef01cSRoman Divacky }
114f22ef01cSRoman Divacky
1150623d748SDimitry Andric /// CreateDefaultAlignTempAlloca - This creates an alloca with the
1160623d748SDimitry Andric /// default alignment of the corresponding LLVM type, which is *not*
1170623d748SDimitry Andric /// guaranteed to be related in any way to the expected alignment of
1180623d748SDimitry Andric /// an AST type that might have been lowered to Ty.
CreateDefaultAlignTempAlloca(llvm::Type * Ty,const Twine & Name)1190623d748SDimitry Andric Address CodeGenFunction::CreateDefaultAlignTempAlloca(llvm::Type *Ty,
1200623d748SDimitry Andric const Twine &Name) {
1210623d748SDimitry Andric CharUnits Align =
1220623d748SDimitry Andric CharUnits::fromQuantity(CGM.getDataLayout().getABITypeAlignment(Ty));
1230623d748SDimitry Andric return CreateTempAlloca(Ty, Align, Name);
1240623d748SDimitry Andric }
1250623d748SDimitry Andric
InitTempAlloca(Address Var,llvm::Value * Init)1260623d748SDimitry Andric void CodeGenFunction::InitTempAlloca(Address Var, llvm::Value *Init) {
1270623d748SDimitry Andric assert(isa<llvm::AllocaInst>(Var.getPointer()));
1280623d748SDimitry Andric auto *Store = new llvm::StoreInst(Init, Var.getPointer());
1290623d748SDimitry Andric Store->setAlignment(Var.getAlignment().getQuantity());
130f22ef01cSRoman Divacky llvm::BasicBlock *Block = AllocaInsertPt->getParent();
1310623d748SDimitry Andric Block->getInstList().insertAfter(AllocaInsertPt->getIterator(), Store);
132f22ef01cSRoman Divacky }
133f22ef01cSRoman Divacky
CreateIRTemp(QualType Ty,const Twine & Name)1340623d748SDimitry Andric Address CodeGenFunction::CreateIRTemp(QualType Ty, const Twine &Name) {
135f22ef01cSRoman Divacky CharUnits Align = getContext().getTypeAlignInChars(Ty);
1360623d748SDimitry Andric return CreateTempAlloca(ConvertType(Ty), Align, Name);
137f22ef01cSRoman Divacky }
138f22ef01cSRoman Divacky
CreateMemTemp(QualType Ty,const Twine & Name,Address * Alloca)139edd7eaddSDimitry Andric Address CodeGenFunction::CreateMemTemp(QualType Ty, const Twine &Name,
1404ba319b5SDimitry Andric Address *Alloca) {
141f22ef01cSRoman Divacky // FIXME: Should we prefer the preferred type alignment here?
1424ba319b5SDimitry Andric return CreateMemTemp(Ty, getContext().getTypeAlignInChars(Ty), Name, Alloca);
1430623d748SDimitry Andric }
1440623d748SDimitry Andric
CreateMemTemp(QualType Ty,CharUnits Align,const Twine & Name,Address * Alloca)1450623d748SDimitry Andric Address CodeGenFunction::CreateMemTemp(QualType Ty, CharUnits Align,
1464ba319b5SDimitry Andric const Twine &Name, Address *Alloca) {
1474ba319b5SDimitry Andric return CreateTempAlloca(ConvertTypeForMem(Ty), Align, Name,
1484ba319b5SDimitry Andric /*ArraySize=*/nullptr, Alloca);
1494ba319b5SDimitry Andric }
1504ba319b5SDimitry Andric
CreateMemTempWithoutCast(QualType Ty,CharUnits Align,const Twine & Name)1514ba319b5SDimitry Andric Address CodeGenFunction::CreateMemTempWithoutCast(QualType Ty, CharUnits Align,
1524ba319b5SDimitry Andric const Twine &Name) {
1534ba319b5SDimitry Andric return CreateTempAllocaWithoutCast(ConvertTypeForMem(Ty), Align, Name);
1544ba319b5SDimitry Andric }
1554ba319b5SDimitry Andric
CreateMemTempWithoutCast(QualType Ty,const Twine & Name)1564ba319b5SDimitry Andric Address CodeGenFunction::CreateMemTempWithoutCast(QualType Ty,
1574ba319b5SDimitry Andric const Twine &Name) {
1584ba319b5SDimitry Andric return CreateMemTempWithoutCast(Ty, getContext().getTypeAlignInChars(Ty),
1594ba319b5SDimitry Andric Name);
160f22ef01cSRoman Divacky }
161f22ef01cSRoman Divacky
162f22ef01cSRoman Divacky /// EvaluateExprAsBool - Perform the usual unary conversions on the specified
163f22ef01cSRoman Divacky /// expression and compare the result against zero, returning an Int1Ty value.
EvaluateExprAsBool(const Expr * E)164f22ef01cSRoman Divacky llvm::Value *CodeGenFunction::EvaluateExprAsBool(const Expr *E) {
16559d1ed5bSDimitry Andric PGO.setCurrentStmt(E);
166e580952dSDimitry Andric if (const MemberPointerType *MPT = E->getType()->getAs<MemberPointerType>()) {
167e580952dSDimitry Andric llvm::Value *MemPtr = EmitScalarExpr(E);
1682754fe60SDimitry Andric return CGM.getCXXABI().EmitMemberPointerIsNotNull(*this, MemPtr, MPT);
169f22ef01cSRoman Divacky }
170e580952dSDimitry Andric
171e580952dSDimitry Andric QualType BoolTy = getContext().BoolTy;
1720623d748SDimitry Andric SourceLocation Loc = E->getExprLoc();
173f22ef01cSRoman Divacky if (!E->getType()->isAnyComplexType())
1740623d748SDimitry Andric return EmitScalarConversion(EmitScalarExpr(E), E->getType(), BoolTy, Loc);
175f22ef01cSRoman Divacky
1760623d748SDimitry Andric return EmitComplexToScalarConversion(EmitComplexExpr(E), E->getType(), BoolTy,
1770623d748SDimitry Andric Loc);
178f22ef01cSRoman Divacky }
179f22ef01cSRoman Divacky
1802754fe60SDimitry Andric /// EmitIgnoredExpr - Emit code to compute the specified expression,
1812754fe60SDimitry Andric /// ignoring the result.
EmitIgnoredExpr(const Expr * E)1822754fe60SDimitry Andric void CodeGenFunction::EmitIgnoredExpr(const Expr *E) {
1832754fe60SDimitry Andric if (E->isRValue())
1842754fe60SDimitry Andric return (void) EmitAnyExpr(E, AggValueSlot::ignored(), true);
1852754fe60SDimitry Andric
1862754fe60SDimitry Andric // Just emit it as an l-value and drop the result.
1872754fe60SDimitry Andric EmitLValue(E);
1882754fe60SDimitry Andric }
1892754fe60SDimitry Andric
1902754fe60SDimitry Andric /// EmitAnyExpr - Emit code to compute the specified expression which
1912754fe60SDimitry Andric /// can have any type. The result is returned as an RValue struct.
1922754fe60SDimitry Andric /// If this is an aggregate expression, AggSlot indicates where the
193f22ef01cSRoman Divacky /// result should be returned.
EmitAnyExpr(const Expr * E,AggValueSlot aggSlot,bool ignoreResult)1947ae0e2c9SDimitry Andric RValue CodeGenFunction::EmitAnyExpr(const Expr *E,
1957ae0e2c9SDimitry Andric AggValueSlot aggSlot,
1967ae0e2c9SDimitry Andric bool ignoreResult) {
197139f7f9bSDimitry Andric switch (getEvaluationKind(E->getType())) {
198139f7f9bSDimitry Andric case TEK_Scalar:
1997ae0e2c9SDimitry Andric return RValue::get(EmitScalarExpr(E, ignoreResult));
200139f7f9bSDimitry Andric case TEK_Complex:
2017ae0e2c9SDimitry Andric return RValue::getComplex(EmitComplexExpr(E, ignoreResult, ignoreResult));
202139f7f9bSDimitry Andric case TEK_Aggregate:
2037ae0e2c9SDimitry Andric if (!ignoreResult && aggSlot.isIgnored())
2047ae0e2c9SDimitry Andric aggSlot = CreateAggTemp(E->getType(), "agg-temp");
2057ae0e2c9SDimitry Andric EmitAggExpr(E, aggSlot);
2067ae0e2c9SDimitry Andric return aggSlot.asRValue();
207f22ef01cSRoman Divacky }
208139f7f9bSDimitry Andric llvm_unreachable("bad evaluation kind");
209139f7f9bSDimitry Andric }
210f22ef01cSRoman Divacky
2114ba319b5SDimitry Andric /// EmitAnyExprToTemp - Similar to EmitAnyExpr(), however, the result will
212f22ef01cSRoman Divacky /// always be accessible even if no aggregate location is provided.
EmitAnyExprToTemp(const Expr * E)2132754fe60SDimitry Andric RValue CodeGenFunction::EmitAnyExprToTemp(const Expr *E) {
2142754fe60SDimitry Andric AggValueSlot AggSlot = AggValueSlot::ignored();
215f22ef01cSRoman Divacky
216139f7f9bSDimitry Andric if (hasAggregateEvaluationKind(E->getType()))
2172754fe60SDimitry Andric AggSlot = CreateAggTemp(E->getType(), "agg.tmp");
2182754fe60SDimitry Andric return EmitAnyExpr(E, AggSlot);
219f22ef01cSRoman Divacky }
220f22ef01cSRoman Divacky
221f22ef01cSRoman Divacky /// EmitAnyExprToMem - Evaluate an expression into a given memory
222f22ef01cSRoman Divacky /// location.
EmitAnyExprToMem(const Expr * E,Address Location,Qualifiers Quals,bool IsInit)223f22ef01cSRoman Divacky void CodeGenFunction::EmitAnyExprToMem(const Expr *E,
2240623d748SDimitry Andric Address Location,
22517a519f9SDimitry Andric Qualifiers Quals,
226f22ef01cSRoman Divacky bool IsInit) {
227dff0c46cSDimitry Andric // FIXME: This function should take an LValue as an argument.
228139f7f9bSDimitry Andric switch (getEvaluationKind(E->getType())) {
229139f7f9bSDimitry Andric case TEK_Complex:
2300623d748SDimitry Andric EmitComplexExprIntoLValue(E, MakeAddrLValue(Location, E->getType()),
231139f7f9bSDimitry Andric /*isInit*/ false);
232139f7f9bSDimitry Andric return;
233139f7f9bSDimitry Andric
234139f7f9bSDimitry Andric case TEK_Aggregate: {
2350623d748SDimitry Andric EmitAggExpr(E, AggValueSlot::forAddr(Location, Quals,
2366122f3e6SDimitry Andric AggValueSlot::IsDestructed_t(IsInit),
2376122f3e6SDimitry Andric AggValueSlot::DoesNotNeedGCBarriers,
2384ba319b5SDimitry Andric AggValueSlot::IsAliased_t(!IsInit),
2394ba319b5SDimitry Andric AggValueSlot::MayOverlap));
240139f7f9bSDimitry Andric return;
241139f7f9bSDimitry Andric }
242139f7f9bSDimitry Andric
243139f7f9bSDimitry Andric case TEK_Scalar: {
244f22ef01cSRoman Divacky RValue RV = RValue::get(EmitScalarExpr(E, /*Ignore*/ false));
245e580952dSDimitry Andric LValue LV = MakeAddrLValue(Location, E->getType());
24617a519f9SDimitry Andric EmitStoreThroughLValue(RV, LV);
247139f7f9bSDimitry Andric return;
248f22ef01cSRoman Divacky }
249f22ef01cSRoman Divacky }
250139f7f9bSDimitry Andric llvm_unreachable("bad evaluation kind");
251139f7f9bSDimitry Andric }
252f22ef01cSRoman Divacky
253f785676fSDimitry Andric static void
pushTemporaryCleanup(CodeGenFunction & CGF,const MaterializeTemporaryExpr * M,const Expr * E,Address ReferenceTemporary)254f785676fSDimitry Andric pushTemporaryCleanup(CodeGenFunction &CGF, const MaterializeTemporaryExpr *M,
2550623d748SDimitry Andric const Expr *E, Address ReferenceTemporary) {
25617a519f9SDimitry Andric // Objective-C++ ARC:
25717a519f9SDimitry Andric // If we are binding a reference to a temporary that has ownership, we
25817a519f9SDimitry Andric // need to perform retain/release operations on the temporary.
259f785676fSDimitry Andric //
260f785676fSDimitry Andric // FIXME: This should be looking at E, not M.
2610623d748SDimitry Andric if (auto Lifetime = M->getType().getObjCLifetime()) {
2620623d748SDimitry Andric switch (Lifetime) {
26317a519f9SDimitry Andric case Qualifiers::OCL_None:
26417a519f9SDimitry Andric case Qualifiers::OCL_ExplicitNone:
265f785676fSDimitry Andric // Carry on to normal cleanup handling.
266f785676fSDimitry Andric break;
267f785676fSDimitry Andric
26817a519f9SDimitry Andric case Qualifiers::OCL_Autoreleasing:
269f785676fSDimitry Andric // Nothing to do; cleaned up by an autorelease pool.
270f785676fSDimitry Andric return;
27117a519f9SDimitry Andric
272f785676fSDimitry Andric case Qualifiers::OCL_Strong:
27317a519f9SDimitry Andric case Qualifiers::OCL_Weak:
274f785676fSDimitry Andric switch (StorageDuration Duration = M->getStorageDuration()) {
275f785676fSDimitry Andric case SD_Static:
276f785676fSDimitry Andric // Note: we intentionally do not register a cleanup to release
277f785676fSDimitry Andric // the object on program termination.
278f785676fSDimitry Andric return;
279f785676fSDimitry Andric
280f785676fSDimitry Andric case SD_Thread:
281f785676fSDimitry Andric // FIXME: We should probably register a cleanup in this case.
282f785676fSDimitry Andric return;
283f785676fSDimitry Andric
284f785676fSDimitry Andric case SD_Automatic:
285f785676fSDimitry Andric case SD_FullExpression:
286f785676fSDimitry Andric CodeGenFunction::Destroyer *Destroy;
287f785676fSDimitry Andric CleanupKind CleanupKind;
288f785676fSDimitry Andric if (Lifetime == Qualifiers::OCL_Strong) {
289f785676fSDimitry Andric const ValueDecl *VD = M->getExtendingDecl();
290f785676fSDimitry Andric bool Precise =
291f785676fSDimitry Andric VD && isa<VarDecl>(VD) && VD->hasAttr<ObjCPreciseLifetimeAttr>();
292f785676fSDimitry Andric CleanupKind = CGF.getARCCleanupKind();
293f785676fSDimitry Andric Destroy = Precise ? &CodeGenFunction::destroyARCStrongPrecise
294f785676fSDimitry Andric : &CodeGenFunction::destroyARCStrongImprecise;
295f785676fSDimitry Andric } else {
296f785676fSDimitry Andric // __weak objects always get EH cleanups; otherwise, exceptions
297f785676fSDimitry Andric // could cause really nasty crashes instead of mere leaks.
298f785676fSDimitry Andric CleanupKind = NormalAndEHCleanup;
299f785676fSDimitry Andric Destroy = &CodeGenFunction::destroyARCWeak;
300f785676fSDimitry Andric }
301f785676fSDimitry Andric if (Duration == SD_FullExpression)
302f785676fSDimitry Andric CGF.pushDestroy(CleanupKind, ReferenceTemporary,
3030623d748SDimitry Andric M->getType(), *Destroy,
304f785676fSDimitry Andric CleanupKind & EHCleanup);
305f785676fSDimitry Andric else
306f785676fSDimitry Andric CGF.pushLifetimeExtendedDestroy(CleanupKind, ReferenceTemporary,
3070623d748SDimitry Andric M->getType(),
308f785676fSDimitry Andric *Destroy, CleanupKind & EHCleanup);
309f785676fSDimitry Andric return;
310f785676fSDimitry Andric
311f785676fSDimitry Andric case SD_Dynamic:
312f785676fSDimitry Andric llvm_unreachable("temporary cannot have dynamic storage duration");
313f785676fSDimitry Andric }
314f785676fSDimitry Andric llvm_unreachable("unknown storage duration");
315f785676fSDimitry Andric }
31617a519f9SDimitry Andric }
31717a519f9SDimitry Andric
31859d1ed5bSDimitry Andric CXXDestructorDecl *ReferenceTemporaryDtor = nullptr;
319f785676fSDimitry Andric if (const RecordType *RT =
320139f7f9bSDimitry Andric E->getType()->getBaseElementTypeUnsafe()->getAs<RecordType>()) {
321284c1978SDimitry Andric // Get the destructor for the reference temporary.
32259d1ed5bSDimitry Andric auto *ClassDecl = cast<CXXRecordDecl>(RT->getDecl());
323ffd1746dSEd Schouten if (!ClassDecl->hasTrivialDestructor())
324ffd1746dSEd Schouten ReferenceTemporaryDtor = ClassDecl->getDestructor();
325f22ef01cSRoman Divacky }
326f785676fSDimitry Andric
327f785676fSDimitry Andric if (!ReferenceTemporaryDtor)
328f785676fSDimitry Andric return;
329f785676fSDimitry Andric
330f785676fSDimitry Andric // Call the destructor for the temporary.
331f785676fSDimitry Andric switch (M->getStorageDuration()) {
332f785676fSDimitry Andric case SD_Static:
333f785676fSDimitry Andric case SD_Thread: {
334f785676fSDimitry Andric llvm::Constant *CleanupFn;
335f785676fSDimitry Andric llvm::Constant *CleanupArg;
336f785676fSDimitry Andric if (E->getType()->isArrayType()) {
337f785676fSDimitry Andric CleanupFn = CodeGenFunction(CGF.CGM).generateDestroyHelper(
3380623d748SDimitry Andric ReferenceTemporary, E->getType(),
339f785676fSDimitry Andric CodeGenFunction::destroyCXXObject, CGF.getLangOpts().Exceptions,
340f785676fSDimitry Andric dyn_cast_or_null<VarDecl>(M->getExtendingDecl()));
341f785676fSDimitry Andric CleanupArg = llvm::Constant::getNullValue(CGF.Int8PtrTy);
342f785676fSDimitry Andric } else {
34339d628a0SDimitry Andric CleanupFn = CGF.CGM.getAddrOfCXXStructor(ReferenceTemporaryDtor,
34439d628a0SDimitry Andric StructorType::Complete);
3450623d748SDimitry Andric CleanupArg = cast<llvm::Constant>(ReferenceTemporary.getPointer());
346f785676fSDimitry Andric }
347f785676fSDimitry Andric CGF.CGM.getCXXABI().registerGlobalDtor(
348f785676fSDimitry Andric CGF, *cast<VarDecl>(M->getExtendingDecl()), CleanupFn, CleanupArg);
349f785676fSDimitry Andric break;
350f22ef01cSRoman Divacky }
351f22ef01cSRoman Divacky
352f785676fSDimitry Andric case SD_FullExpression:
353f785676fSDimitry Andric CGF.pushDestroy(NormalAndEHCleanup, ReferenceTemporary, E->getType(),
354f785676fSDimitry Andric CodeGenFunction::destroyCXXObject,
355f785676fSDimitry Andric CGF.getLangOpts().Exceptions);
356f785676fSDimitry Andric break;
35717a519f9SDimitry Andric
358f785676fSDimitry Andric case SD_Automatic:
359f785676fSDimitry Andric CGF.pushLifetimeExtendedDestroy(NormalAndEHCleanup,
360f785676fSDimitry Andric ReferenceTemporary, E->getType(),
361f785676fSDimitry Andric CodeGenFunction::destroyCXXObject,
362f785676fSDimitry Andric CGF.getLangOpts().Exceptions);
363f785676fSDimitry Andric break;
364f785676fSDimitry Andric
365f785676fSDimitry Andric case SD_Dynamic:
366f785676fSDimitry Andric llvm_unreachable("temporary cannot have dynamic storage duration");
367f785676fSDimitry Andric }
368f785676fSDimitry Andric }
369f785676fSDimitry Andric
createReferenceTemporary(CodeGenFunction & CGF,const MaterializeTemporaryExpr * M,const Expr * Inner,Address * Alloca=nullptr)370c4394386SDimitry Andric static Address createReferenceTemporary(CodeGenFunction &CGF,
371c4394386SDimitry Andric const MaterializeTemporaryExpr *M,
3724ba319b5SDimitry Andric const Expr *Inner,
3734ba319b5SDimitry Andric Address *Alloca = nullptr) {
374c4394386SDimitry Andric auto &TCG = CGF.getTargetHooks();
375f785676fSDimitry Andric switch (M->getStorageDuration()) {
376f785676fSDimitry Andric case SD_FullExpression:
37733956c43SDimitry Andric case SD_Automatic: {
37833956c43SDimitry Andric // If we have a constant temporary array or record try to promote it into a
37933956c43SDimitry Andric // constant global under the same rules a normal constant would've been
38033956c43SDimitry Andric // promoted. This is easier on the optimizer and generally emits fewer
38133956c43SDimitry Andric // instructions.
38233956c43SDimitry Andric QualType Ty = Inner->getType();
38333956c43SDimitry Andric if (CGF.CGM.getCodeGenOpts().MergeAllConstants &&
38433956c43SDimitry Andric (Ty->isArrayType() || Ty->isRecordType()) &&
38533956c43SDimitry Andric CGF.CGM.isTypeConstant(Ty, true))
3869a199699SDimitry Andric if (auto Init = ConstantEmitter(CGF).tryEmitAbstract(Inner, Ty)) {
387c4394386SDimitry Andric if (auto AddrSpace = CGF.getTarget().getConstantAddressSpace()) {
388c4394386SDimitry Andric auto AS = AddrSpace.getValue();
38933956c43SDimitry Andric auto *GV = new llvm::GlobalVariable(
39033956c43SDimitry Andric CGF.CGM.getModule(), Init->getType(), /*isConstant=*/true,
391c4394386SDimitry Andric llvm::GlobalValue::PrivateLinkage, Init, ".ref.tmp", nullptr,
392c4394386SDimitry Andric llvm::GlobalValue::NotThreadLocal,
393c4394386SDimitry Andric CGF.getContext().getTargetAddressSpace(AS));
3940623d748SDimitry Andric CharUnits alignment = CGF.getContext().getTypeAlignInChars(Ty);
3950623d748SDimitry Andric GV->setAlignment(alignment.getQuantity());
396c4394386SDimitry Andric llvm::Constant *C = GV;
397c4394386SDimitry Andric if (AS != LangAS::Default)
398c4394386SDimitry Andric C = TCG.performAddrSpaceCast(
399c4394386SDimitry Andric CGF.CGM, GV, AS, LangAS::Default,
400c4394386SDimitry Andric GV->getValueType()->getPointerTo(
401c4394386SDimitry Andric CGF.getContext().getTargetAddressSpace(LangAS::Default)));
40233956c43SDimitry Andric // FIXME: Should we put the new global into a COMDAT?
403c4394386SDimitry Andric return Address(C, alignment);
404c4394386SDimitry Andric }
40533956c43SDimitry Andric }
4064ba319b5SDimitry Andric return CGF.CreateMemTemp(Ty, "ref.tmp", Alloca);
40733956c43SDimitry Andric }
408f785676fSDimitry Andric case SD_Thread:
409f785676fSDimitry Andric case SD_Static:
410f785676fSDimitry Andric return CGF.CGM.GetAddrOfGlobalTemporary(M, Inner);
411f785676fSDimitry Andric
412f785676fSDimitry Andric case SD_Dynamic:
413f785676fSDimitry Andric llvm_unreachable("temporary can't have dynamic storage duration");
414f785676fSDimitry Andric }
415f785676fSDimitry Andric llvm_unreachable("unknown storage duration");
416f785676fSDimitry Andric }
417f785676fSDimitry Andric
41839d628a0SDimitry Andric LValue CodeGenFunction::
EmitMaterializeTemporaryExpr(const MaterializeTemporaryExpr * M)41939d628a0SDimitry Andric EmitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *M) {
420f785676fSDimitry Andric const Expr *E = M->GetTemporaryExpr();
421f785676fSDimitry Andric
422*b5893f02SDimitry Andric assert((!M->getExtendingDecl() || !isa<VarDecl>(M->getExtendingDecl()) ||
423*b5893f02SDimitry Andric !cast<VarDecl>(M->getExtendingDecl())->isARCPseudoStrong()) &&
424*b5893f02SDimitry Andric "Reference should never be pseudo-strong!");
425*b5893f02SDimitry Andric
42639d628a0SDimitry Andric // FIXME: ideally this would use EmitAnyExprToMem, however, we cannot do so
42739d628a0SDimitry Andric // as that will cause the lifetime adjustment to be lost for ARC
4280623d748SDimitry Andric auto ownership = M->getType().getObjCLifetime();
4290623d748SDimitry Andric if (ownership != Qualifiers::OCL_None &&
4300623d748SDimitry Andric ownership != Qualifiers::OCL_ExplicitNone) {
4310623d748SDimitry Andric Address Object = createReferenceTemporary(*this, M, E);
4320623d748SDimitry Andric if (auto *Var = dyn_cast<llvm::GlobalVariable>(Object.getPointer())) {
4330623d748SDimitry Andric Object = Address(llvm::ConstantExpr::getBitCast(Var,
4340623d748SDimitry Andric ConvertTypeForMem(E->getType())
4350623d748SDimitry Andric ->getPointerTo(Object.getAddressSpace())),
4360623d748SDimitry Andric Object.getAlignment());
437e7145dcbSDimitry Andric
438e7145dcbSDimitry Andric // createReferenceTemporary will promote the temporary to a global with a
439e7145dcbSDimitry Andric // constant initializer if it can. It can only do this to a value of
440e7145dcbSDimitry Andric // ARC-manageable type if the value is global and therefore "immune" to
441e7145dcbSDimitry Andric // ref-counting operations. Therefore we have no need to emit either a
442e7145dcbSDimitry Andric // dynamic initialization or a cleanup and we can just return the address
443e7145dcbSDimitry Andric // of the temporary.
444e7145dcbSDimitry Andric if (Var->hasInitializer())
4459a199699SDimitry Andric return MakeAddrLValue(Object, M->getType(), AlignmentSource::Decl);
446e7145dcbSDimitry Andric
447f785676fSDimitry Andric Var->setInitializer(CGM.EmitNullConstant(E->getType()));
448f785676fSDimitry Andric }
4490623d748SDimitry Andric LValue RefTempDst = MakeAddrLValue(Object, M->getType(),
4509a199699SDimitry Andric AlignmentSource::Decl);
451f785676fSDimitry Andric
45239d628a0SDimitry Andric switch (getEvaluationKind(E->getType())) {
45339d628a0SDimitry Andric default: llvm_unreachable("expected scalar or aggregate expression");
45439d628a0SDimitry Andric case TEK_Scalar:
455f785676fSDimitry Andric EmitScalarInit(E, M->getExtendingDecl(), RefTempDst, false);
45639d628a0SDimitry Andric break;
45739d628a0SDimitry Andric case TEK_Aggregate: {
4580623d748SDimitry Andric EmitAggExpr(E, AggValueSlot::forAddr(Object,
45939d628a0SDimitry Andric E->getType().getQualifiers(),
46039d628a0SDimitry Andric AggValueSlot::IsDestructed,
46139d628a0SDimitry Andric AggValueSlot::DoesNotNeedGCBarriers,
4624ba319b5SDimitry Andric AggValueSlot::IsNotAliased,
4634ba319b5SDimitry Andric AggValueSlot::DoesNotOverlap));
46439d628a0SDimitry Andric break;
46539d628a0SDimitry Andric }
46639d628a0SDimitry Andric }
467f785676fSDimitry Andric
468f785676fSDimitry Andric pushTemporaryCleanup(*this, M, E, Object);
469f785676fSDimitry Andric return RefTempDst;
470f785676fSDimitry Andric }
471f785676fSDimitry Andric
472f785676fSDimitry Andric SmallVector<const Expr *, 2> CommaLHSs;
473f785676fSDimitry Andric SmallVector<SubobjectAdjustment, 2> Adjustments;
474f785676fSDimitry Andric E = E->skipRValueSubobjectAdjustments(CommaLHSs, Adjustments);
475f785676fSDimitry Andric
47639d628a0SDimitry Andric for (const auto &Ignored : CommaLHSs)
47739d628a0SDimitry Andric EmitIgnoredExpr(Ignored);
478f785676fSDimitry Andric
47959d1ed5bSDimitry Andric if (const auto *opaque = dyn_cast<OpaqueValueExpr>(E)) {
480f785676fSDimitry Andric if (opaque->getType()->isRecordType()) {
481f785676fSDimitry Andric assert(Adjustments.empty());
482f785676fSDimitry Andric return EmitOpaqueValueLValue(opaque);
483f785676fSDimitry Andric }
484f785676fSDimitry Andric }
485f785676fSDimitry Andric
486f785676fSDimitry Andric // Create and initialize the reference temporary.
4874ba319b5SDimitry Andric Address Alloca = Address::invalid();
4884ba319b5SDimitry Andric Address Object = createReferenceTemporary(*this, M, E, &Alloca);
489c4394386SDimitry Andric if (auto *Var = dyn_cast<llvm::GlobalVariable>(
490c4394386SDimitry Andric Object.getPointer()->stripPointerCasts())) {
4910623d748SDimitry Andric Object = Address(llvm::ConstantExpr::getBitCast(
492c4394386SDimitry Andric cast<llvm::Constant>(Object.getPointer()),
493c4394386SDimitry Andric ConvertTypeForMem(E->getType())->getPointerTo()),
4940623d748SDimitry Andric Object.getAlignment());
49533956c43SDimitry Andric // If the temporary is a global and has a constant initializer or is a
49633956c43SDimitry Andric // constant temporary that we promoted to a global, we may have already
49733956c43SDimitry Andric // initialized it.
498f785676fSDimitry Andric if (!Var->hasInitializer()) {
499f785676fSDimitry Andric Var->setInitializer(CGM.EmitNullConstant(E->getType()));
500f785676fSDimitry Andric EmitAnyExprToMem(E, Object, Qualifiers(), /*IsInit*/true);
501f785676fSDimitry Andric }
502f785676fSDimitry Andric } else {
503e7145dcbSDimitry Andric switch (M->getStorageDuration()) {
504e7145dcbSDimitry Andric case SD_Automatic:
505e7145dcbSDimitry Andric if (auto *Size = EmitLifetimeStart(
5064ba319b5SDimitry Andric CGM.getDataLayout().getTypeAllocSize(Alloca.getElementType()),
5074ba319b5SDimitry Andric Alloca.getPointer())) {
508e7145dcbSDimitry Andric pushCleanupAfterFullExpr<CallLifetimeEnd>(NormalEHLifetimeMarker,
5094ba319b5SDimitry Andric Alloca, Size);
510*b5893f02SDimitry Andric }
511*b5893f02SDimitry Andric break;
512*b5893f02SDimitry Andric
513*b5893f02SDimitry Andric case SD_FullExpression: {
514*b5893f02SDimitry Andric if (!ShouldEmitLifetimeMarkers)
515*b5893f02SDimitry Andric break;
516*b5893f02SDimitry Andric
517*b5893f02SDimitry Andric // Avoid creating a conditional cleanup just to hold an llvm.lifetime.end
518*b5893f02SDimitry Andric // marker. Instead, start the lifetime of a conditional temporary earlier
519*b5893f02SDimitry Andric // so that it's unconditional. Don't do this in ASan's use-after-scope
520*b5893f02SDimitry Andric // mode so that it gets the more precise lifetime marks. If the type has
521*b5893f02SDimitry Andric // a non-trivial destructor, we'll have a cleanup block for it anyway,
522*b5893f02SDimitry Andric // so this typically doesn't help; skip it in that case.
523*b5893f02SDimitry Andric ConditionalEvaluation *OldConditional = nullptr;
524*b5893f02SDimitry Andric CGBuilderTy::InsertPoint OldIP;
525*b5893f02SDimitry Andric if (isInConditionalBranch() && !E->getType().isDestructedType() &&
526*b5893f02SDimitry Andric !CGM.getCodeGenOpts().SanitizeAddressUseAfterScope) {
527*b5893f02SDimitry Andric OldConditional = OutermostConditional;
528*b5893f02SDimitry Andric OutermostConditional = nullptr;
529*b5893f02SDimitry Andric
530*b5893f02SDimitry Andric OldIP = Builder.saveIP();
531*b5893f02SDimitry Andric llvm::BasicBlock *Block = OldConditional->getStartingBlock();
532*b5893f02SDimitry Andric Builder.restoreIP(CGBuilderTy::InsertPoint(
533*b5893f02SDimitry Andric Block, llvm::BasicBlock::iterator(Block->back())));
534*b5893f02SDimitry Andric }
535*b5893f02SDimitry Andric
536*b5893f02SDimitry Andric if (auto *Size = EmitLifetimeStart(
537*b5893f02SDimitry Andric CGM.getDataLayout().getTypeAllocSize(Alloca.getElementType()),
538*b5893f02SDimitry Andric Alloca.getPointer())) {
5394ba319b5SDimitry Andric pushFullExprCleanup<CallLifetimeEnd>(NormalEHLifetimeMarker, Alloca,
540e7145dcbSDimitry Andric Size);
541e7145dcbSDimitry Andric }
542*b5893f02SDimitry Andric
543*b5893f02SDimitry Andric if (OldConditional) {
544*b5893f02SDimitry Andric OutermostConditional = OldConditional;
545*b5893f02SDimitry Andric Builder.restoreIP(OldIP);
546*b5893f02SDimitry Andric }
547e7145dcbSDimitry Andric break;
548*b5893f02SDimitry Andric }
549*b5893f02SDimitry Andric
550e7145dcbSDimitry Andric default:
551e7145dcbSDimitry Andric break;
552e7145dcbSDimitry Andric }
553f785676fSDimitry Andric EmitAnyExprToMem(E, Object, Qualifiers(), /*IsInit*/true);
554f785676fSDimitry Andric }
555f785676fSDimitry Andric pushTemporaryCleanup(*this, M, E, Object);
556f785676fSDimitry Andric
557f785676fSDimitry Andric // Perform derived-to-base casts and/or field accesses, to get from the
558f785676fSDimitry Andric // temporary object we created (and, potentially, for which we extended
559f785676fSDimitry Andric // the lifetime) to the subobject we're binding the reference to.
560f22ef01cSRoman Divacky for (unsigned I = Adjustments.size(); I != 0; --I) {
561f22ef01cSRoman Divacky SubobjectAdjustment &Adjustment = Adjustments[I-1];
562f22ef01cSRoman Divacky switch (Adjustment.Kind) {
563f22ef01cSRoman Divacky case SubobjectAdjustment::DerivedToBaseAdjustment:
564ffd1746dSEd Schouten Object =
565f785676fSDimitry Andric GetAddressOfBaseClass(Object, Adjustment.DerivedToBase.DerivedClass,
566e580952dSDimitry Andric Adjustment.DerivedToBase.BasePath->path_begin(),
567e580952dSDimitry Andric Adjustment.DerivedToBase.BasePath->path_end(),
56839d628a0SDimitry Andric /*NullCheckValue=*/ false, E->getExprLoc());
569f22ef01cSRoman Divacky break;
570f22ef01cSRoman Divacky
571f22ef01cSRoman Divacky case SubobjectAdjustment::FieldAdjustment: {
5729a199699SDimitry Andric LValue LV = MakeAddrLValue(Object, E->getType(), AlignmentSource::Decl);
573f785676fSDimitry Andric LV = EmitLValueForField(LV, Adjustment.Field);
574f785676fSDimitry Andric assert(LV.isSimple() &&
575f785676fSDimitry Andric "materialized temporary field is not a simple lvalue");
576f22ef01cSRoman Divacky Object = LV.getAddress();
577f22ef01cSRoman Divacky break;
578f22ef01cSRoman Divacky }
579f22ef01cSRoman Divacky
5807ae0e2c9SDimitry Andric case SubobjectAdjustment::MemberPointerAdjustment: {
581f785676fSDimitry Andric llvm::Value *Ptr = EmitScalarExpr(Adjustment.Ptr.RHS);
5820623d748SDimitry Andric Object = EmitCXXMemberDataPointerAddress(E, Object, Ptr,
5830623d748SDimitry Andric Adjustment.Ptr.MPT);
5847ae0e2c9SDimitry Andric break;
5857ae0e2c9SDimitry Andric }
586f22ef01cSRoman Divacky }
587f22ef01cSRoman Divacky }
588f22ef01cSRoman Divacky
5899a199699SDimitry Andric return MakeAddrLValue(Object, M->getType(), AlignmentSource::Decl);
590f22ef01cSRoman Divacky }
591f22ef01cSRoman Divacky
592ffd1746dSEd Schouten RValue
EmitReferenceBindingToExpr(const Expr * E)593f785676fSDimitry Andric CodeGenFunction::EmitReferenceBindingToExpr(const Expr *E) {
594f785676fSDimitry Andric // Emit the expression as an lvalue.
595f785676fSDimitry Andric LValue LV = EmitLValue(E);
596f785676fSDimitry Andric assert(LV.isSimple());
5970623d748SDimitry Andric llvm::Value *Value = LV.getPointer();
598f785676fSDimitry Andric
59959d1ed5bSDimitry Andric if (sanitizePerformTypeCheck() && !E->getType()->isFunctionType()) {
6003861d79fSDimitry Andric // C++11 [dcl.ref]p5 (as amended by core issue 453):
6013861d79fSDimitry Andric // If a glvalue to which a reference is directly bound designates neither
6023861d79fSDimitry Andric // an existing object or function of an appropriate type nor a region of
6033861d79fSDimitry Andric // storage of suitable size and alignment to contain an object of the
6043861d79fSDimitry Andric // reference's type, the behavior is undefined.
6053861d79fSDimitry Andric QualType Ty = E->getType();
6063861d79fSDimitry Andric EmitTypeCheck(TCK_ReferenceBinding, E->getExprLoc(), Value, Ty);
6073861d79fSDimitry Andric }
608ffd1746dSEd Schouten
609ffd1746dSEd Schouten return RValue::get(Value);
610f22ef01cSRoman Divacky }
611f22ef01cSRoman Divacky
612f22ef01cSRoman Divacky
613f22ef01cSRoman Divacky /// getAccessedFieldNo - Given an encoded value and a result number, return the
614f22ef01cSRoman Divacky /// input field number being accessed.
getAccessedFieldNo(unsigned Idx,const llvm::Constant * Elts)615f22ef01cSRoman Divacky unsigned CodeGenFunction::getAccessedFieldNo(unsigned Idx,
616f22ef01cSRoman Divacky const llvm::Constant *Elts) {
617dff0c46cSDimitry Andric return cast<llvm::ConstantInt>(Elts->getAggregateElement(Idx))
618dff0c46cSDimitry Andric ->getZExtValue();
619f22ef01cSRoman Divacky }
620f22ef01cSRoman Divacky
6213861d79fSDimitry Andric /// Emit the hash_16_bytes function from include/llvm/ADT/Hashing.h.
emitHash16Bytes(CGBuilderTy & Builder,llvm::Value * Low,llvm::Value * High)6223861d79fSDimitry Andric static llvm::Value *emitHash16Bytes(CGBuilderTy &Builder, llvm::Value *Low,
6233861d79fSDimitry Andric llvm::Value *High) {
6243861d79fSDimitry Andric llvm::Value *KMul = Builder.getInt64(0x9ddfea08eb382d69ULL);
6253861d79fSDimitry Andric llvm::Value *K47 = Builder.getInt64(47);
6263861d79fSDimitry Andric llvm::Value *A0 = Builder.CreateMul(Builder.CreateXor(Low, High), KMul);
6273861d79fSDimitry Andric llvm::Value *A1 = Builder.CreateXor(Builder.CreateLShr(A0, K47), A0);
6283861d79fSDimitry Andric llvm::Value *B0 = Builder.CreateMul(Builder.CreateXor(High, A1), KMul);
6293861d79fSDimitry Andric llvm::Value *B1 = Builder.CreateXor(Builder.CreateLShr(B0, K47), B0);
6303861d79fSDimitry Andric return Builder.CreateMul(B1, KMul);
6313861d79fSDimitry Andric }
6323861d79fSDimitry Andric
isNullPointerAllowed(TypeCheckKind TCK)6339a199699SDimitry Andric bool CodeGenFunction::isNullPointerAllowed(TypeCheckKind TCK) {
6349a199699SDimitry Andric return TCK == TCK_DowncastPointer || TCK == TCK_Upcast ||
635fe4fed2eSDimitry Andric TCK == TCK_UpcastToVirtualBase || TCK == TCK_DynamicOperation;
6369a199699SDimitry Andric }
6379a199699SDimitry Andric
isVptrCheckRequired(TypeCheckKind TCK,QualType Ty)6389a199699SDimitry Andric bool CodeGenFunction::isVptrCheckRequired(TypeCheckKind TCK, QualType Ty) {
6399a199699SDimitry Andric CXXRecordDecl *RD = Ty->getAsCXXRecordDecl();
6409a199699SDimitry Andric return (RD && RD->hasDefinition() && RD->isDynamicClass()) &&
6419a199699SDimitry Andric (TCK == TCK_MemberAccess || TCK == TCK_MemberCall ||
6429a199699SDimitry Andric TCK == TCK_DowncastPointer || TCK == TCK_DowncastReference ||
643fe4fed2eSDimitry Andric TCK == TCK_UpcastToVirtualBase || TCK == TCK_DynamicOperation);
6449a199699SDimitry Andric }
6459a199699SDimitry Andric
sanitizePerformTypeCheck() const64659d1ed5bSDimitry Andric bool CodeGenFunction::sanitizePerformTypeCheck() const {
64739d628a0SDimitry Andric return SanOpts.has(SanitizerKind::Null) |
64839d628a0SDimitry Andric SanOpts.has(SanitizerKind::Alignment) |
64939d628a0SDimitry Andric SanOpts.has(SanitizerKind::ObjectSize) |
65039d628a0SDimitry Andric SanOpts.has(SanitizerKind::Vptr);
65159d1ed5bSDimitry Andric }
65259d1ed5bSDimitry Andric
EmitTypeCheck(TypeCheckKind TCK,SourceLocation Loc,llvm::Value * Ptr,QualType Ty,CharUnits Alignment,SanitizerSet SkippedChecks)6533861d79fSDimitry Andric void CodeGenFunction::EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc,
6540623d748SDimitry Andric llvm::Value *Ptr, QualType Ty,
65520e90f04SDimitry Andric CharUnits Alignment,
65620e90f04SDimitry Andric SanitizerSet SkippedChecks) {
65759d1ed5bSDimitry Andric if (!sanitizePerformTypeCheck())
658f22ef01cSRoman Divacky return;
659f22ef01cSRoman Divacky
6603861d79fSDimitry Andric // Don't check pointers outside the default address space. The null check
6613861d79fSDimitry Andric // isn't correct, the object-size check isn't supported by LLVM, and we can't
6623861d79fSDimitry Andric // communicate the addresses to the runtime handler for the vptr check.
6630623d748SDimitry Andric if (Ptr->getType()->getPointerAddressSpace())
6643861d79fSDimitry Andric return;
665f22ef01cSRoman Divacky
66624d58133SDimitry Andric // Don't check pointers to volatile data. The behavior here is implementation-
66724d58133SDimitry Andric // defined.
66824d58133SDimitry Andric if (Ty.isVolatileQualified())
66924d58133SDimitry Andric return;
67024d58133SDimitry Andric
67159d1ed5bSDimitry Andric SanitizerScope SanScope(this);
6723861d79fSDimitry Andric
67333956c43SDimitry Andric SmallVector<std::pair<llvm::Value *, SanitizerMask>, 3> Checks;
67459d1ed5bSDimitry Andric llvm::BasicBlock *Done = nullptr;
67559d1ed5bSDimitry Andric
67651690af2SDimitry Andric // Quickly determine whether we have a pointer to an alloca. It's possible
67751690af2SDimitry Andric // to skip null checks, and some alignment checks, for these pointers. This
67851690af2SDimitry Andric // can reduce compile-time significantly.
67951690af2SDimitry Andric auto PtrToAlloca =
68051690af2SDimitry Andric dyn_cast<llvm::AllocaInst>(Ptr->stripPointerCastsNoFollowAliases());
68151690af2SDimitry Andric
6829a199699SDimitry Andric llvm::Value *True = llvm::ConstantInt::getTrue(getLLVMContext());
6839a199699SDimitry Andric llvm::Value *IsNonNull = nullptr;
6849a199699SDimitry Andric bool IsGuaranteedNonNull =
6859a199699SDimitry Andric SkippedChecks.has(SanitizerKind::Null) || PtrToAlloca;
6869a199699SDimitry Andric bool AllowNullPointers = isNullPointerAllowed(TCK);
68739d628a0SDimitry Andric if ((SanOpts.has(SanitizerKind::Null) || AllowNullPointers) &&
6889a199699SDimitry Andric !IsGuaranteedNonNull) {
6893861d79fSDimitry Andric // The glvalue must not be an empty glvalue.
6909a199699SDimitry Andric IsNonNull = Builder.CreateIsNotNull(Ptr);
691139f7f9bSDimitry Andric
6926bc11b14SDimitry Andric // The IR builder can constant-fold the null check if the pointer points to
6936bc11b14SDimitry Andric // a constant.
6949a199699SDimitry Andric IsGuaranteedNonNull = IsNonNull == True;
6956bc11b14SDimitry Andric
6966bc11b14SDimitry Andric // Skip the null check if the pointer is known to be non-null.
6979a199699SDimitry Andric if (!IsGuaranteedNonNull) {
69839d628a0SDimitry Andric if (AllowNullPointers) {
69939d628a0SDimitry Andric // When performing pointer casts, it's OK if the value is null.
700139f7f9bSDimitry Andric // Skip the remaining checks in that case.
701139f7f9bSDimitry Andric Done = createBasicBlock("null");
702139f7f9bSDimitry Andric llvm::BasicBlock *Rest = createBasicBlock("not.null");
70339d628a0SDimitry Andric Builder.CreateCondBr(IsNonNull, Rest, Done);
704139f7f9bSDimitry Andric EmitBlock(Rest);
70539d628a0SDimitry Andric } else {
70639d628a0SDimitry Andric Checks.push_back(std::make_pair(IsNonNull, SanitizerKind::Null));
707139f7f9bSDimitry Andric }
7083861d79fSDimitry Andric }
7096bc11b14SDimitry Andric }
7103861d79fSDimitry Andric
71120e90f04SDimitry Andric if (SanOpts.has(SanitizerKind::ObjectSize) &&
71220e90f04SDimitry Andric !SkippedChecks.has(SanitizerKind::ObjectSize) &&
71320e90f04SDimitry Andric !Ty->isIncompleteType()) {
7143861d79fSDimitry Andric uint64_t Size = getContext().getTypeSizeInChars(Ty).getQuantity();
7153861d79fSDimitry Andric
7163861d79fSDimitry Andric // The glvalue must refer to a large enough storage region.
7173861d79fSDimitry Andric // FIXME: If Address Sanitizer is enabled, insert dynamic instrumentation
7183861d79fSDimitry Andric // to check this.
719f785676fSDimitry Andric // FIXME: Get object address space
720f785676fSDimitry Andric llvm::Type *Tys[2] = { IntPtrTy, Int8PtrTy };
721f785676fSDimitry Andric llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::objectsize, Tys);
7227ae0e2c9SDimitry Andric llvm::Value *Min = Builder.getFalse();
72320e90f04SDimitry Andric llvm::Value *NullIsUnknown = Builder.getFalse();
7240623d748SDimitry Andric llvm::Value *CastAddr = Builder.CreateBitCast(Ptr, Int8PtrTy);
72520e90f04SDimitry Andric llvm::Value *LargeEnough = Builder.CreateICmpUGE(
72620e90f04SDimitry Andric Builder.CreateCall(F, {CastAddr, Min, NullIsUnknown}),
7273861d79fSDimitry Andric llvm::ConstantInt::get(IntPtrTy, Size));
72839d628a0SDimitry Andric Checks.push_back(std::make_pair(LargeEnough, SanitizerKind::ObjectSize));
7293861d79fSDimitry Andric }
7303861d79fSDimitry Andric
7313861d79fSDimitry Andric uint64_t AlignVal = 0;
7329a199699SDimitry Andric llvm::Value *PtrAsInt = nullptr;
7333861d79fSDimitry Andric
73420e90f04SDimitry Andric if (SanOpts.has(SanitizerKind::Alignment) &&
73520e90f04SDimitry Andric !SkippedChecks.has(SanitizerKind::Alignment)) {
7363861d79fSDimitry Andric AlignVal = Alignment.getQuantity();
7373861d79fSDimitry Andric if (!Ty->isIncompleteType() && !AlignVal)
7383861d79fSDimitry Andric AlignVal = getContext().getTypeAlignInChars(Ty).getQuantity();
7393861d79fSDimitry Andric
7403861d79fSDimitry Andric // The glvalue must be suitably aligned.
74151690af2SDimitry Andric if (AlignVal > 1 &&
74251690af2SDimitry Andric (!PtrToAlloca || PtrToAlloca->getAlignment() < AlignVal)) {
7439a199699SDimitry Andric PtrAsInt = Builder.CreatePtrToInt(Ptr, IntPtrTy);
7449a199699SDimitry Andric llvm::Value *Align = Builder.CreateAnd(
7459a199699SDimitry Andric PtrAsInt, llvm::ConstantInt::get(IntPtrTy, AlignVal - 1));
7463861d79fSDimitry Andric llvm::Value *Aligned =
7473861d79fSDimitry Andric Builder.CreateICmpEQ(Align, llvm::ConstantInt::get(IntPtrTy, 0));
7489a199699SDimitry Andric if (Aligned != True)
74939d628a0SDimitry Andric Checks.push_back(std::make_pair(Aligned, SanitizerKind::Alignment));
7503861d79fSDimitry Andric }
7513861d79fSDimitry Andric }
7523861d79fSDimitry Andric
75339d628a0SDimitry Andric if (Checks.size() > 0) {
75495ec533aSDimitry Andric // Make sure we're not losing information. Alignment needs to be a power of
75595ec533aSDimitry Andric // 2
75695ec533aSDimitry Andric assert(!AlignVal || (uint64_t)1 << llvm::Log2_64(AlignVal) == AlignVal);
7573861d79fSDimitry Andric llvm::Constant *StaticData[] = {
75895ec533aSDimitry Andric EmitCheckSourceLocation(Loc), EmitCheckTypeDescriptor(Ty),
75995ec533aSDimitry Andric llvm::ConstantInt::get(Int8Ty, AlignVal ? llvm::Log2_64(AlignVal) : 1),
76095ec533aSDimitry Andric llvm::ConstantInt::get(Int8Ty, TCK)};
7619a199699SDimitry Andric EmitCheck(Checks, SanitizerHandler::TypeMismatch, StaticData,
7629a199699SDimitry Andric PtrAsInt ? PtrAsInt : Ptr);
7633861d79fSDimitry Andric }
7643861d79fSDimitry Andric
7653861d79fSDimitry Andric // If possible, check that the vptr indicates that there is a subobject of
7663861d79fSDimitry Andric // type Ty at offset zero within this object.
767139f7f9bSDimitry Andric //
768139f7f9bSDimitry Andric // C++11 [basic.life]p5,6:
769139f7f9bSDimitry Andric // [For storage which does not refer to an object within its lifetime]
770139f7f9bSDimitry Andric // The program has undefined behavior if:
771139f7f9bSDimitry Andric // -- the [pointer or glvalue] is used to access a non-static data member
772139f7f9bSDimitry Andric // or call a non-static member function
77339d628a0SDimitry Andric if (SanOpts.has(SanitizerKind::Vptr) &&
7749a199699SDimitry Andric !SkippedChecks.has(SanitizerKind::Vptr) && isVptrCheckRequired(TCK, Ty)) {
7759a199699SDimitry Andric // Ensure that the pointer is non-null before loading it. If there is no
7769a199699SDimitry Andric // compile-time guarantee, reuse the run-time null check or emit a new one.
7779a199699SDimitry Andric if (!IsGuaranteedNonNull) {
7789a199699SDimitry Andric if (!IsNonNull)
7799a199699SDimitry Andric IsNonNull = Builder.CreateIsNotNull(Ptr);
7809a199699SDimitry Andric if (!Done)
7819a199699SDimitry Andric Done = createBasicBlock("vptr.null");
7829a199699SDimitry Andric llvm::BasicBlock *VptrNotNull = createBasicBlock("vptr.not.null");
7839a199699SDimitry Andric Builder.CreateCondBr(IsNonNull, VptrNotNull, Done);
7849a199699SDimitry Andric EmitBlock(VptrNotNull);
7859a199699SDimitry Andric }
7869a199699SDimitry Andric
7873861d79fSDimitry Andric // Compute a hash of the mangled name of the type.
7883861d79fSDimitry Andric //
7893861d79fSDimitry Andric // FIXME: This is not guaranteed to be deterministic! Move to a
7903861d79fSDimitry Andric // fingerprinting mechanism once LLVM provides one. For the time
7913861d79fSDimitry Andric // being the implementation happens to be deterministic.
792139f7f9bSDimitry Andric SmallString<64> MangledName;
7933861d79fSDimitry Andric llvm::raw_svector_ostream Out(MangledName);
7943861d79fSDimitry Andric CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty.getUnqualifiedType(),
7953861d79fSDimitry Andric Out);
79659d1ed5bSDimitry Andric
79759d1ed5bSDimitry Andric // Blacklist based on the mangled type.
79839d628a0SDimitry Andric if (!CGM.getContext().getSanitizerBlacklist().isBlacklistedType(
7999a199699SDimitry Andric SanitizerKind::Vptr, Out.str())) {
8003861d79fSDimitry Andric llvm::hash_code TypeHash = hash_value(Out.str());
8013861d79fSDimitry Andric
8023861d79fSDimitry Andric // Load the vptr, and compute hash_16_bytes(TypeHash, vptr).
8033861d79fSDimitry Andric llvm::Value *Low = llvm::ConstantInt::get(Int64Ty, TypeHash);
8043861d79fSDimitry Andric llvm::Type *VPtrTy = llvm::PointerType::get(IntPtrTy, 0);
8050623d748SDimitry Andric Address VPtrAddr(Builder.CreateBitCast(Ptr, VPtrTy), getPointerAlign());
8063861d79fSDimitry Andric llvm::Value *VPtrVal = Builder.CreateLoad(VPtrAddr);
8073861d79fSDimitry Andric llvm::Value *High = Builder.CreateZExt(VPtrVal, Int64Ty);
8083861d79fSDimitry Andric
8093861d79fSDimitry Andric llvm::Value *Hash = emitHash16Bytes(Builder, Low, High);
8103861d79fSDimitry Andric Hash = Builder.CreateTrunc(Hash, IntPtrTy);
8113861d79fSDimitry Andric
8123861d79fSDimitry Andric // Look the hash up in our cache.
8133861d79fSDimitry Andric const int CacheSize = 128;
8143861d79fSDimitry Andric llvm::Type *HashTable = llvm::ArrayType::get(IntPtrTy, CacheSize);
8153861d79fSDimitry Andric llvm::Value *Cache = CGM.CreateRuntimeVariable(HashTable,
8163861d79fSDimitry Andric "__ubsan_vptr_type_cache");
8173861d79fSDimitry Andric llvm::Value *Slot = Builder.CreateAnd(Hash,
8183861d79fSDimitry Andric llvm::ConstantInt::get(IntPtrTy,
8193861d79fSDimitry Andric CacheSize-1));
8203861d79fSDimitry Andric llvm::Value *Indices[] = { Builder.getInt32(0), Slot };
8213861d79fSDimitry Andric llvm::Value *CacheVal =
8220623d748SDimitry Andric Builder.CreateAlignedLoad(Builder.CreateInBoundsGEP(Cache, Indices),
8230623d748SDimitry Andric getPointerAlign());
8243861d79fSDimitry Andric
8253861d79fSDimitry Andric // If the hash isn't in the cache, call a runtime handler to perform the
8263861d79fSDimitry Andric // hard work of checking whether the vptr is for an object of the right
8273861d79fSDimitry Andric // type. This will either fill in the cache and return, or produce a
8283861d79fSDimitry Andric // diagnostic.
82939d628a0SDimitry Andric llvm::Value *EqualHash = Builder.CreateICmpEQ(CacheVal, Hash);
8303861d79fSDimitry Andric llvm::Constant *StaticData[] = {
8313861d79fSDimitry Andric EmitCheckSourceLocation(Loc),
8323861d79fSDimitry Andric EmitCheckTypeDescriptor(Ty),
8333861d79fSDimitry Andric CGM.GetAddrOfRTTIDescriptor(Ty.getUnqualifiedType()),
8343861d79fSDimitry Andric llvm::ConstantInt::get(Int8Ty, TCK)
8353861d79fSDimitry Andric };
8360623d748SDimitry Andric llvm::Value *DynamicData[] = { Ptr, Hash };
83739d628a0SDimitry Andric EmitCheck(std::make_pair(EqualHash, SanitizerKind::Vptr),
83844290647SDimitry Andric SanitizerHandler::DynamicTypeCacheMiss, StaticData,
83944290647SDimitry Andric DynamicData);
8403861d79fSDimitry Andric }
84159d1ed5bSDimitry Andric }
842139f7f9bSDimitry Andric
843139f7f9bSDimitry Andric if (Done) {
844139f7f9bSDimitry Andric Builder.CreateBr(Done);
845139f7f9bSDimitry Andric EmitBlock(Done);
846139f7f9bSDimitry Andric }
847139f7f9bSDimitry Andric }
848139f7f9bSDimitry Andric
849139f7f9bSDimitry Andric /// Determine whether this expression refers to a flexible array member in a
850139f7f9bSDimitry Andric /// struct. We disable array bounds checks for such members.
isFlexibleArrayMemberExpr(const Expr * E)851139f7f9bSDimitry Andric static bool isFlexibleArrayMemberExpr(const Expr *E) {
852139f7f9bSDimitry Andric // For compatibility with existing code, we treat arrays of length 0 or
853139f7f9bSDimitry Andric // 1 as flexible array members.
854139f7f9bSDimitry Andric const ArrayType *AT = E->getType()->castAsArrayTypeUnsafe();
85559d1ed5bSDimitry Andric if (const auto *CAT = dyn_cast<ConstantArrayType>(AT)) {
856139f7f9bSDimitry Andric if (CAT->getSize().ugt(1))
857139f7f9bSDimitry Andric return false;
858139f7f9bSDimitry Andric } else if (!isa<IncompleteArrayType>(AT))
859139f7f9bSDimitry Andric return false;
860139f7f9bSDimitry Andric
861139f7f9bSDimitry Andric E = E->IgnoreParens();
862139f7f9bSDimitry Andric
863139f7f9bSDimitry Andric // A flexible array member must be the last member in the class.
86459d1ed5bSDimitry Andric if (const auto *ME = dyn_cast<MemberExpr>(E)) {
865139f7f9bSDimitry Andric // FIXME: If the base type of the member expr is not FD->getParent(),
866139f7f9bSDimitry Andric // this should not be treated as a flexible array member access.
86759d1ed5bSDimitry Andric if (const auto *FD = dyn_cast<FieldDecl>(ME->getMemberDecl())) {
868139f7f9bSDimitry Andric RecordDecl::field_iterator FI(
869139f7f9bSDimitry Andric DeclContext::decl_iterator(const_cast<FieldDecl *>(FD)));
870139f7f9bSDimitry Andric return ++FI == FD->getParent()->field_end();
871139f7f9bSDimitry Andric }
87244290647SDimitry Andric } else if (const auto *IRE = dyn_cast<ObjCIvarRefExpr>(E)) {
87344290647SDimitry Andric return IRE->getDecl()->getNextIvar() == nullptr;
874139f7f9bSDimitry Andric }
875139f7f9bSDimitry Andric
876139f7f9bSDimitry Andric return false;
877139f7f9bSDimitry Andric }
878139f7f9bSDimitry Andric
LoadPassedObjectSize(const Expr * E,QualType EltTy)8799a199699SDimitry Andric llvm::Value *CodeGenFunction::LoadPassedObjectSize(const Expr *E,
8809a199699SDimitry Andric QualType EltTy) {
8819a199699SDimitry Andric ASTContext &C = getContext();
8829a199699SDimitry Andric uint64_t EltSize = C.getTypeSizeInChars(EltTy).getQuantity();
8839a199699SDimitry Andric if (!EltSize)
8849a199699SDimitry Andric return nullptr;
8859a199699SDimitry Andric
8869a199699SDimitry Andric auto *ArrayDeclRef = dyn_cast<DeclRefExpr>(E->IgnoreParenImpCasts());
8879a199699SDimitry Andric if (!ArrayDeclRef)
8889a199699SDimitry Andric return nullptr;
8899a199699SDimitry Andric
8909a199699SDimitry Andric auto *ParamDecl = dyn_cast<ParmVarDecl>(ArrayDeclRef->getDecl());
8919a199699SDimitry Andric if (!ParamDecl)
8929a199699SDimitry Andric return nullptr;
8939a199699SDimitry Andric
8949a199699SDimitry Andric auto *POSAttr = ParamDecl->getAttr<PassObjectSizeAttr>();
8959a199699SDimitry Andric if (!POSAttr)
8969a199699SDimitry Andric return nullptr;
8979a199699SDimitry Andric
8989a199699SDimitry Andric // Don't load the size if it's a lower bound.
8999a199699SDimitry Andric int POSType = POSAttr->getType();
9009a199699SDimitry Andric if (POSType != 0 && POSType != 1)
9019a199699SDimitry Andric return nullptr;
9029a199699SDimitry Andric
9039a199699SDimitry Andric // Find the implicit size parameter.
9049a199699SDimitry Andric auto PassedSizeIt = SizeArguments.find(ParamDecl);
9059a199699SDimitry Andric if (PassedSizeIt == SizeArguments.end())
9069a199699SDimitry Andric return nullptr;
9079a199699SDimitry Andric
9089a199699SDimitry Andric const ImplicitParamDecl *PassedSizeDecl = PassedSizeIt->second;
9099a199699SDimitry Andric assert(LocalDeclMap.count(PassedSizeDecl) && "Passed size not loadable");
9109a199699SDimitry Andric Address AddrOfSize = LocalDeclMap.find(PassedSizeDecl)->second;
9119a199699SDimitry Andric llvm::Value *SizeInBytes = EmitLoadOfScalar(AddrOfSize, /*Volatile=*/false,
9129a199699SDimitry Andric C.getSizeType(), E->getExprLoc());
9139a199699SDimitry Andric llvm::Value *SizeOfElement =
9149a199699SDimitry Andric llvm::ConstantInt::get(SizeInBytes->getType(), EltSize);
9159a199699SDimitry Andric return Builder.CreateUDiv(SizeInBytes, SizeOfElement);
9169a199699SDimitry Andric }
9179a199699SDimitry Andric
918139f7f9bSDimitry Andric /// If Base is known to point to the start of an array, return the length of
919139f7f9bSDimitry Andric /// that array. Return 0 if the length cannot be determined.
getArrayIndexingBound(CodeGenFunction & CGF,const Expr * Base,QualType & IndexedType)920139f7f9bSDimitry Andric static llvm::Value *getArrayIndexingBound(
921139f7f9bSDimitry Andric CodeGenFunction &CGF, const Expr *Base, QualType &IndexedType) {
922139f7f9bSDimitry Andric // For the vector indexing extension, the bound is the number of elements.
923139f7f9bSDimitry Andric if (const VectorType *VT = Base->getType()->getAs<VectorType>()) {
924139f7f9bSDimitry Andric IndexedType = Base->getType();
925139f7f9bSDimitry Andric return CGF.Builder.getInt32(VT->getNumElements());
926139f7f9bSDimitry Andric }
927139f7f9bSDimitry Andric
928139f7f9bSDimitry Andric Base = Base->IgnoreParens();
929139f7f9bSDimitry Andric
93059d1ed5bSDimitry Andric if (const auto *CE = dyn_cast<CastExpr>(Base)) {
931139f7f9bSDimitry Andric if (CE->getCastKind() == CK_ArrayToPointerDecay &&
932139f7f9bSDimitry Andric !isFlexibleArrayMemberExpr(CE->getSubExpr())) {
933139f7f9bSDimitry Andric IndexedType = CE->getSubExpr()->getType();
934139f7f9bSDimitry Andric const ArrayType *AT = IndexedType->castAsArrayTypeUnsafe();
93559d1ed5bSDimitry Andric if (const auto *CAT = dyn_cast<ConstantArrayType>(AT))
936139f7f9bSDimitry Andric return CGF.Builder.getInt(CAT->getSize());
93759d1ed5bSDimitry Andric else if (const auto *VAT = dyn_cast<VariableArrayType>(AT))
9384ba319b5SDimitry Andric return CGF.getVLASize(VAT).NumElts;
9399a199699SDimitry Andric // Ignore pass_object_size here. It's not applicable on decayed pointers.
940139f7f9bSDimitry Andric }
941139f7f9bSDimitry Andric }
942139f7f9bSDimitry Andric
9439a199699SDimitry Andric QualType EltTy{Base->getType()->getPointeeOrArrayElementType(), 0};
9449a199699SDimitry Andric if (llvm::Value *POS = CGF.LoadPassedObjectSize(Base, EltTy)) {
9459a199699SDimitry Andric IndexedType = Base->getType();
9469a199699SDimitry Andric return POS;
9479a199699SDimitry Andric }
9489a199699SDimitry Andric
94959d1ed5bSDimitry Andric return nullptr;
950139f7f9bSDimitry Andric }
951139f7f9bSDimitry Andric
EmitBoundsCheck(const Expr * E,const Expr * Base,llvm::Value * Index,QualType IndexType,bool Accessed)952139f7f9bSDimitry Andric void CodeGenFunction::EmitBoundsCheck(const Expr *E, const Expr *Base,
953139f7f9bSDimitry Andric llvm::Value *Index, QualType IndexType,
954139f7f9bSDimitry Andric bool Accessed) {
95539d628a0SDimitry Andric assert(SanOpts.has(SanitizerKind::ArrayBounds) &&
956f785676fSDimitry Andric "should not be called unless adding bounds checks");
95759d1ed5bSDimitry Andric SanitizerScope SanScope(this);
958139f7f9bSDimitry Andric
959139f7f9bSDimitry Andric QualType IndexedType;
960139f7f9bSDimitry Andric llvm::Value *Bound = getArrayIndexingBound(*this, Base, IndexedType);
961139f7f9bSDimitry Andric if (!Bound)
962139f7f9bSDimitry Andric return;
963139f7f9bSDimitry Andric
964139f7f9bSDimitry Andric bool IndexSigned = IndexType->isSignedIntegerOrEnumerationType();
965139f7f9bSDimitry Andric llvm::Value *IndexVal = Builder.CreateIntCast(Index, SizeTy, IndexSigned);
966139f7f9bSDimitry Andric llvm::Value *BoundVal = Builder.CreateIntCast(Bound, SizeTy, false);
967139f7f9bSDimitry Andric
968139f7f9bSDimitry Andric llvm::Constant *StaticData[] = {
969139f7f9bSDimitry Andric EmitCheckSourceLocation(E->getExprLoc()),
970139f7f9bSDimitry Andric EmitCheckTypeDescriptor(IndexedType),
971139f7f9bSDimitry Andric EmitCheckTypeDescriptor(IndexType)
972139f7f9bSDimitry Andric };
973139f7f9bSDimitry Andric llvm::Value *Check = Accessed ? Builder.CreateICmpULT(IndexVal, BoundVal)
974139f7f9bSDimitry Andric : Builder.CreateICmpULE(IndexVal, BoundVal);
97544290647SDimitry Andric EmitCheck(std::make_pair(Check, SanitizerKind::ArrayBounds),
97644290647SDimitry Andric SanitizerHandler::OutOfBounds, StaticData, Index);
977f22ef01cSRoman Divacky }
978f22ef01cSRoman Divacky
979f22ef01cSRoman Divacky
980f22ef01cSRoman Divacky CodeGenFunction::ComplexPairTy CodeGenFunction::
EmitComplexPrePostIncDec(const UnaryOperator * E,LValue LV,bool isInc,bool isPre)981f22ef01cSRoman Divacky EmitComplexPrePostIncDec(const UnaryOperator *E, LValue LV,
982f22ef01cSRoman Divacky bool isInc, bool isPre) {
983f785676fSDimitry Andric ComplexPairTy InVal = EmitLoadOfComplex(LV, E->getExprLoc());
984f22ef01cSRoman Divacky
985f22ef01cSRoman Divacky llvm::Value *NextVal;
986f22ef01cSRoman Divacky if (isa<llvm::IntegerType>(InVal.first->getType())) {
987f22ef01cSRoman Divacky uint64_t AmountVal = isInc ? 1 : -1;
988f22ef01cSRoman Divacky NextVal = llvm::ConstantInt::get(InVal.first->getType(), AmountVal, true);
989f22ef01cSRoman Divacky
990f22ef01cSRoman Divacky // Add the inc/dec to the real part.
991f22ef01cSRoman Divacky NextVal = Builder.CreateAdd(InVal.first, NextVal, isInc ? "inc" : "dec");
992f22ef01cSRoman Divacky } else {
993f22ef01cSRoman Divacky QualType ElemTy = E->getType()->getAs<ComplexType>()->getElementType();
994f22ef01cSRoman Divacky llvm::APFloat FVal(getContext().getFloatTypeSemantics(ElemTy), 1);
995f22ef01cSRoman Divacky if (!isInc)
996f22ef01cSRoman Divacky FVal.changeSign();
997f22ef01cSRoman Divacky NextVal = llvm::ConstantFP::get(getLLVMContext(), FVal);
998f22ef01cSRoman Divacky
999f22ef01cSRoman Divacky // Add the inc/dec to the real part.
1000f22ef01cSRoman Divacky NextVal = Builder.CreateFAdd(InVal.first, NextVal, isInc ? "inc" : "dec");
1001f22ef01cSRoman Divacky }
1002f22ef01cSRoman Divacky
1003f22ef01cSRoman Divacky ComplexPairTy IncVal(NextVal, InVal.second);
1004f22ef01cSRoman Divacky
1005f22ef01cSRoman Divacky // Store the updated result through the lvalue.
1006139f7f9bSDimitry Andric EmitStoreOfComplex(IncVal, LV, /*init*/ false);
1007f22ef01cSRoman Divacky
1008f22ef01cSRoman Divacky // If this is a postinc, return the value read from memory, otherwise use the
1009f22ef01cSRoman Divacky // updated value.
1010f22ef01cSRoman Divacky return isPre ? IncVal : InVal;
1011f22ef01cSRoman Divacky }
1012f22ef01cSRoman Divacky
EmitExplicitCastExprType(const ExplicitCastExpr * E,CodeGenFunction * CGF)10130623d748SDimitry Andric void CodeGenModule::EmitExplicitCastExprType(const ExplicitCastExpr *E,
10140623d748SDimitry Andric CodeGenFunction *CGF) {
10150623d748SDimitry Andric // Bind VLAs in the cast type.
10160623d748SDimitry Andric if (CGF && E->getType()->isVariablyModifiedType())
10170623d748SDimitry Andric CGF->EmitVariablyModifiedType(E->getType());
10180623d748SDimitry Andric
10190623d748SDimitry Andric if (CGDebugInfo *DI = getModuleDebugInfo())
10200623d748SDimitry Andric DI->EmitExplicitCastType(E->getType());
10210623d748SDimitry Andric }
10220623d748SDimitry Andric
1023f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
1024f22ef01cSRoman Divacky // LValue Expression Emission
1025f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
1026f22ef01cSRoman Divacky
10270623d748SDimitry Andric /// EmitPointerWithAlignment - Given an expression of pointer type, try to
10280623d748SDimitry Andric /// derive a more accurate bound on the alignment of the pointer.
EmitPointerWithAlignment(const Expr * E,LValueBaseInfo * BaseInfo,TBAAAccessInfo * TBAAInfo)10290623d748SDimitry Andric Address CodeGenFunction::EmitPointerWithAlignment(const Expr *E,
10309a199699SDimitry Andric LValueBaseInfo *BaseInfo,
10319a199699SDimitry Andric TBAAAccessInfo *TBAAInfo) {
10320623d748SDimitry Andric // We allow this with ObjC object pointers because of fragile ABIs.
10330623d748SDimitry Andric assert(E->getType()->isPointerType() ||
10340623d748SDimitry Andric E->getType()->isObjCObjectPointerType());
10350623d748SDimitry Andric E = E->IgnoreParens();
10360623d748SDimitry Andric
10370623d748SDimitry Andric // Casts:
10380623d748SDimitry Andric if (const CastExpr *CE = dyn_cast<CastExpr>(E)) {
10390623d748SDimitry Andric if (const auto *ECE = dyn_cast<ExplicitCastExpr>(CE))
10400623d748SDimitry Andric CGM.EmitExplicitCastExprType(ECE, this);
10410623d748SDimitry Andric
10420623d748SDimitry Andric switch (CE->getCastKind()) {
10430623d748SDimitry Andric // Non-converting casts (but not C's implicit conversion from void*).
10440623d748SDimitry Andric case CK_BitCast:
10450623d748SDimitry Andric case CK_NoOp:
10469a199699SDimitry Andric case CK_AddressSpaceConversion:
10470623d748SDimitry Andric if (auto PtrTy = CE->getSubExpr()->getType()->getAs<PointerType>()) {
10480623d748SDimitry Andric if (PtrTy->getPointeeType()->isVoidType())
10490623d748SDimitry Andric break;
10500623d748SDimitry Andric
10519a199699SDimitry Andric LValueBaseInfo InnerBaseInfo;
10529a199699SDimitry Andric TBAAAccessInfo InnerTBAAInfo;
10539a199699SDimitry Andric Address Addr = EmitPointerWithAlignment(CE->getSubExpr(),
10549a199699SDimitry Andric &InnerBaseInfo,
10559a199699SDimitry Andric &InnerTBAAInfo);
10569a199699SDimitry Andric if (BaseInfo) *BaseInfo = InnerBaseInfo;
10579a199699SDimitry Andric if (TBAAInfo) *TBAAInfo = InnerTBAAInfo;
10580623d748SDimitry Andric
10599a199699SDimitry Andric if (isa<ExplicitCastExpr>(CE)) {
10609a199699SDimitry Andric LValueBaseInfo TargetTypeBaseInfo;
10619a199699SDimitry Andric TBAAAccessInfo TargetTypeTBAAInfo;
1062d8866befSDimitry Andric CharUnits Align = getNaturalPointeeTypeAlignment(E->getType(),
10639a199699SDimitry Andric &TargetTypeBaseInfo,
10649a199699SDimitry Andric &TargetTypeTBAAInfo);
10659a199699SDimitry Andric if (TBAAInfo)
10669a199699SDimitry Andric *TBAAInfo = CGM.mergeTBAAInfoForCast(*TBAAInfo,
10679a199699SDimitry Andric TargetTypeTBAAInfo);
10689a199699SDimitry Andric // If the source l-value is opaque, honor the alignment of the
10699a199699SDimitry Andric // casted-to type.
10709a199699SDimitry Andric if (InnerBaseInfo.getAlignmentSource() != AlignmentSource::Decl) {
1071d8866befSDimitry Andric if (BaseInfo)
10729a199699SDimitry Andric BaseInfo->mergeForCast(TargetTypeBaseInfo);
1073d8866befSDimitry Andric Addr = Address(Addr.getPointer(), Align);
10740623d748SDimitry Andric }
10759a199699SDimitry Andric }
10760623d748SDimitry Andric
1077e7145dcbSDimitry Andric if (SanOpts.has(SanitizerKind::CFIUnrelatedCast) &&
1078e7145dcbSDimitry Andric CE->getCastKind() == CK_BitCast) {
10790623d748SDimitry Andric if (auto PT = E->getType()->getAs<PointerType>())
10800623d748SDimitry Andric EmitVTablePtrCheckForCast(PT->getPointeeType(), Addr.getPointer(),
10810623d748SDimitry Andric /*MayBeNull=*/true,
10820623d748SDimitry Andric CodeGenFunction::CFITCK_UnrelatedCast,
1083*b5893f02SDimitry Andric CE->getBeginLoc());
10840623d748SDimitry Andric }
10859a199699SDimitry Andric return CE->getCastKind() != CK_AddressSpaceConversion
10869a199699SDimitry Andric ? Builder.CreateBitCast(Addr, ConvertType(E->getType()))
10879a199699SDimitry Andric : Builder.CreateAddrSpaceCast(Addr,
10889a199699SDimitry Andric ConvertType(E->getType()));
10890623d748SDimitry Andric }
10900623d748SDimitry Andric break;
10910623d748SDimitry Andric
10920623d748SDimitry Andric // Array-to-pointer decay.
10930623d748SDimitry Andric case CK_ArrayToPointerDecay:
10949a199699SDimitry Andric return EmitArrayToPointerDecay(CE->getSubExpr(), BaseInfo, TBAAInfo);
10950623d748SDimitry Andric
10960623d748SDimitry Andric // Derived-to-base conversions.
10970623d748SDimitry Andric case CK_UncheckedDerivedToBase:
10980623d748SDimitry Andric case CK_DerivedToBase: {
1099bf22ec69SDimitry Andric // TODO: Support accesses to members of base classes in TBAA. For now, we
1100bf22ec69SDimitry Andric // conservatively pretend that the complete object is of the base class
1101bf22ec69SDimitry Andric // type.
1102bf22ec69SDimitry Andric if (TBAAInfo)
1103bf22ec69SDimitry Andric *TBAAInfo = CGM.getTBAAAccessInfo(E->getType());
1104bf22ec69SDimitry Andric Address Addr = EmitPointerWithAlignment(CE->getSubExpr(), BaseInfo);
11050623d748SDimitry Andric auto Derived = CE->getSubExpr()->getType()->getPointeeCXXRecordDecl();
11060623d748SDimitry Andric return GetAddressOfBaseClass(Addr, Derived,
11070623d748SDimitry Andric CE->path_begin(), CE->path_end(),
11080623d748SDimitry Andric ShouldNullCheckClassCastValue(CE),
11090623d748SDimitry Andric CE->getExprLoc());
11100623d748SDimitry Andric }
11110623d748SDimitry Andric
11120623d748SDimitry Andric // TODO: Is there any reason to treat base-to-derived conversions
11130623d748SDimitry Andric // specially?
11140623d748SDimitry Andric default:
11150623d748SDimitry Andric break;
11160623d748SDimitry Andric }
11170623d748SDimitry Andric }
11180623d748SDimitry Andric
11190623d748SDimitry Andric // Unary &.
11200623d748SDimitry Andric if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(E)) {
11210623d748SDimitry Andric if (UO->getOpcode() == UO_AddrOf) {
11220623d748SDimitry Andric LValue LV = EmitLValue(UO->getSubExpr());
1123d8866befSDimitry Andric if (BaseInfo) *BaseInfo = LV.getBaseInfo();
11249a199699SDimitry Andric if (TBAAInfo) *TBAAInfo = LV.getTBAAInfo();
11250623d748SDimitry Andric return LV.getAddress();
11260623d748SDimitry Andric }
11270623d748SDimitry Andric }
11280623d748SDimitry Andric
11290623d748SDimitry Andric // TODO: conditional operators, comma.
11300623d748SDimitry Andric
11310623d748SDimitry Andric // Otherwise, use the alignment of the type.
11329a199699SDimitry Andric CharUnits Align = getNaturalPointeeTypeAlignment(E->getType(), BaseInfo,
11339a199699SDimitry Andric TBAAInfo);
11340623d748SDimitry Andric return Address(EmitScalarExpr(E), Align);
11350623d748SDimitry Andric }
11360623d748SDimitry Andric
GetUndefRValue(QualType Ty)1137f22ef01cSRoman Divacky RValue CodeGenFunction::GetUndefRValue(QualType Ty) {
1138f22ef01cSRoman Divacky if (Ty->isVoidType())
113959d1ed5bSDimitry Andric return RValue::get(nullptr);
1140f22ef01cSRoman Divacky
1141139f7f9bSDimitry Andric switch (getEvaluationKind(Ty)) {
1142139f7f9bSDimitry Andric case TEK_Complex: {
1143139f7f9bSDimitry Andric llvm::Type *EltTy =
1144139f7f9bSDimitry Andric ConvertType(Ty->castAs<ComplexType>()->getElementType());
1145f22ef01cSRoman Divacky llvm::Value *U = llvm::UndefValue::get(EltTy);
1146f22ef01cSRoman Divacky return RValue::getComplex(std::make_pair(U, U));
1147f22ef01cSRoman Divacky }
1148f22ef01cSRoman Divacky
1149e580952dSDimitry Andric // If this is a use of an undefined aggregate type, the aggregate must have an
1150e580952dSDimitry Andric // identifiable address. Just because the contents of the value are undefined
1151e580952dSDimitry Andric // doesn't mean that the address can't be taken and compared.
1152139f7f9bSDimitry Andric case TEK_Aggregate: {
11530623d748SDimitry Andric Address DestPtr = CreateMemTemp(Ty, "undef.agg.tmp");
1154e580952dSDimitry Andric return RValue::getAggregate(DestPtr);
1155f22ef01cSRoman Divacky }
1156f22ef01cSRoman Divacky
1157139f7f9bSDimitry Andric case TEK_Scalar:
1158f22ef01cSRoman Divacky return RValue::get(llvm::UndefValue::get(ConvertType(Ty)));
1159f22ef01cSRoman Divacky }
1160139f7f9bSDimitry Andric llvm_unreachable("bad evaluation kind");
1161139f7f9bSDimitry Andric }
1162f22ef01cSRoman Divacky
EmitUnsupportedRValue(const Expr * E,const char * Name)1163f22ef01cSRoman Divacky RValue CodeGenFunction::EmitUnsupportedRValue(const Expr *E,
1164f22ef01cSRoman Divacky const char *Name) {
1165f22ef01cSRoman Divacky ErrorUnsupported(E, Name);
1166f22ef01cSRoman Divacky return GetUndefRValue(E->getType());
1167f22ef01cSRoman Divacky }
1168f22ef01cSRoman Divacky
EmitUnsupportedLValue(const Expr * E,const char * Name)1169f22ef01cSRoman Divacky LValue CodeGenFunction::EmitUnsupportedLValue(const Expr *E,
1170f22ef01cSRoman Divacky const char *Name) {
1171f22ef01cSRoman Divacky ErrorUnsupported(E, Name);
1172f22ef01cSRoman Divacky llvm::Type *Ty = llvm::PointerType::getUnqual(ConvertType(E->getType()));
11730623d748SDimitry Andric return MakeAddrLValue(Address(llvm::UndefValue::get(Ty), CharUnits::One()),
11740623d748SDimitry Andric E->getType());
1175f22ef01cSRoman Divacky }
1176f22ef01cSRoman Divacky
IsWrappedCXXThis(const Expr * Obj)117720e90f04SDimitry Andric bool CodeGenFunction::IsWrappedCXXThis(const Expr *Obj) {
117820e90f04SDimitry Andric const Expr *Base = Obj;
117920e90f04SDimitry Andric while (!isa<CXXThisExpr>(Base)) {
118020e90f04SDimitry Andric // The result of a dynamic_cast can be null.
118120e90f04SDimitry Andric if (isa<CXXDynamicCastExpr>(Base))
118220e90f04SDimitry Andric return false;
118320e90f04SDimitry Andric
118420e90f04SDimitry Andric if (const auto *CE = dyn_cast<CastExpr>(Base)) {
118520e90f04SDimitry Andric Base = CE->getSubExpr();
118620e90f04SDimitry Andric } else if (const auto *PE = dyn_cast<ParenExpr>(Base)) {
118720e90f04SDimitry Andric Base = PE->getSubExpr();
118820e90f04SDimitry Andric } else if (const auto *UO = dyn_cast<UnaryOperator>(Base)) {
118920e90f04SDimitry Andric if (UO->getOpcode() == UO_Extension)
119020e90f04SDimitry Andric Base = UO->getSubExpr();
119120e90f04SDimitry Andric else
119220e90f04SDimitry Andric return false;
119320e90f04SDimitry Andric } else {
119420e90f04SDimitry Andric return false;
119520e90f04SDimitry Andric }
119620e90f04SDimitry Andric }
119720e90f04SDimitry Andric return true;
119820e90f04SDimitry Andric }
119920e90f04SDimitry Andric
EmitCheckedLValue(const Expr * E,TypeCheckKind TCK)12003861d79fSDimitry Andric LValue CodeGenFunction::EmitCheckedLValue(const Expr *E, TypeCheckKind TCK) {
1201139f7f9bSDimitry Andric LValue LV;
120239d628a0SDimitry Andric if (SanOpts.has(SanitizerKind::ArrayBounds) && isa<ArraySubscriptExpr>(E))
1203139f7f9bSDimitry Andric LV = EmitArraySubscriptExpr(cast<ArraySubscriptExpr>(E), /*Accessed*/true);
1204139f7f9bSDimitry Andric else
1205139f7f9bSDimitry Andric LV = EmitLValue(E);
120620e90f04SDimitry Andric if (!isa<DeclRefExpr>(E) && !LV.isBitField() && LV.isSimple()) {
120720e90f04SDimitry Andric SanitizerSet SkippedChecks;
120820e90f04SDimitry Andric if (const auto *ME = dyn_cast<MemberExpr>(E)) {
120920e90f04SDimitry Andric bool IsBaseCXXThis = IsWrappedCXXThis(ME->getBase());
121020e90f04SDimitry Andric if (IsBaseCXXThis)
121120e90f04SDimitry Andric SkippedChecks.set(SanitizerKind::Alignment, true);
121220e90f04SDimitry Andric if (IsBaseCXXThis || isa<DeclRefExpr>(ME->getBase()))
121320e90f04SDimitry Andric SkippedChecks.set(SanitizerKind::Null, true);
121420e90f04SDimitry Andric }
12150623d748SDimitry Andric EmitTypeCheck(TCK, E->getExprLoc(), LV.getPointer(),
121620e90f04SDimitry Andric E->getType(), LV.getAlignment(), SkippedChecks);
121720e90f04SDimitry Andric }
1218f22ef01cSRoman Divacky return LV;
1219f22ef01cSRoman Divacky }
1220f22ef01cSRoman Divacky
1221f22ef01cSRoman Divacky /// EmitLValue - Emit code to compute a designator that specifies the location
1222f22ef01cSRoman Divacky /// of the expression.
1223f22ef01cSRoman Divacky ///
1224f22ef01cSRoman Divacky /// This can return one of two things: a simple address or a bitfield reference.
1225f22ef01cSRoman Divacky /// In either case, the LLVM Value* in the LValue structure is guaranteed to be
1226f22ef01cSRoman Divacky /// an LLVM pointer type.
1227f22ef01cSRoman Divacky ///
1228f22ef01cSRoman Divacky /// If this returns a bitfield reference, nothing about the pointee type of the
1229f22ef01cSRoman Divacky /// LLVM value is known: For example, it may not be a pointer to an integer.
1230f22ef01cSRoman Divacky ///
1231f22ef01cSRoman Divacky /// If this returns a normal address, and if the lvalue's C type is fixed size,
1232f22ef01cSRoman Divacky /// this method guarantees that the returned pointer type will point to an LLVM
1233f22ef01cSRoman Divacky /// type of the same size of the lvalue's type. If the lvalue has a variable
1234f22ef01cSRoman Divacky /// length type, this is not possible.
1235f22ef01cSRoman Divacky ///
EmitLValue(const Expr * E)1236f22ef01cSRoman Divacky LValue CodeGenFunction::EmitLValue(const Expr *E) {
123733956c43SDimitry Andric ApplyDebugLocation DL(*this, E);
1238f22ef01cSRoman Divacky switch (E->getStmtClass()) {
1239f22ef01cSRoman Divacky default: return EmitUnsupportedLValue(E, "l-value expression");
1240f22ef01cSRoman Divacky
1241dff0c46cSDimitry Andric case Expr::ObjCPropertyRefExprClass:
1242dff0c46cSDimitry Andric llvm_unreachable("cannot emit a property reference directly");
1243dff0c46cSDimitry Andric
1244ffd1746dSEd Schouten case Expr::ObjCSelectorExprClass:
1245ffd1746dSEd Schouten return EmitObjCSelectorLValue(cast<ObjCSelectorExpr>(E));
1246f22ef01cSRoman Divacky case Expr::ObjCIsaExprClass:
1247f22ef01cSRoman Divacky return EmitObjCIsaExpr(cast<ObjCIsaExpr>(E));
1248f22ef01cSRoman Divacky case Expr::BinaryOperatorClass:
1249f22ef01cSRoman Divacky return EmitBinaryOperatorLValue(cast<BinaryOperator>(E));
125033956c43SDimitry Andric case Expr::CompoundAssignOperatorClass: {
125133956c43SDimitry Andric QualType Ty = E->getType();
125233956c43SDimitry Andric if (const AtomicType *AT = Ty->getAs<AtomicType>())
125333956c43SDimitry Andric Ty = AT->getValueType();
125433956c43SDimitry Andric if (!Ty->isAnyComplexType())
12552754fe60SDimitry Andric return EmitCompoundAssignmentLValue(cast<CompoundAssignOperator>(E));
12562754fe60SDimitry Andric return EmitComplexCompoundAssignmentLValue(cast<CompoundAssignOperator>(E));
125733956c43SDimitry Andric }
1258f22ef01cSRoman Divacky case Expr::CallExprClass:
1259f22ef01cSRoman Divacky case Expr::CXXMemberCallExprClass:
1260f22ef01cSRoman Divacky case Expr::CXXOperatorCallExprClass:
1261dff0c46cSDimitry Andric case Expr::UserDefinedLiteralClass:
1262f22ef01cSRoman Divacky return EmitCallExprLValue(cast<CallExpr>(E));
1263f22ef01cSRoman Divacky case Expr::VAArgExprClass:
1264f22ef01cSRoman Divacky return EmitVAArgExprLValue(cast<VAArgExpr>(E));
1265f22ef01cSRoman Divacky case Expr::DeclRefExprClass:
1266f22ef01cSRoman Divacky return EmitDeclRefLValue(cast<DeclRefExpr>(E));
1267*b5893f02SDimitry Andric case Expr::ConstantExprClass:
1268*b5893f02SDimitry Andric return EmitLValue(cast<ConstantExpr>(E)->getSubExpr());
12696122f3e6SDimitry Andric case Expr::ParenExprClass:
12706122f3e6SDimitry Andric return EmitLValue(cast<ParenExpr>(E)->getSubExpr());
12713b0f4066SDimitry Andric case Expr::GenericSelectionExprClass:
12723b0f4066SDimitry Andric return EmitLValue(cast<GenericSelectionExpr>(E)->getResultExpr());
1273f22ef01cSRoman Divacky case Expr::PredefinedExprClass:
1274f22ef01cSRoman Divacky return EmitPredefinedLValue(cast<PredefinedExpr>(E));
1275f22ef01cSRoman Divacky case Expr::StringLiteralClass:
1276f22ef01cSRoman Divacky return EmitStringLiteralLValue(cast<StringLiteral>(E));
1277f22ef01cSRoman Divacky case Expr::ObjCEncodeExprClass:
1278f22ef01cSRoman Divacky return EmitObjCEncodeExprLValue(cast<ObjCEncodeExpr>(E));
1279dff0c46cSDimitry Andric case Expr::PseudoObjectExprClass:
1280dff0c46cSDimitry Andric return EmitPseudoObjectLValue(cast<PseudoObjectExpr>(E));
1281dff0c46cSDimitry Andric case Expr::InitListExprClass:
12827ae0e2c9SDimitry Andric return EmitInitListLValue(cast<InitListExpr>(E));
1283f22ef01cSRoman Divacky case Expr::CXXTemporaryObjectExprClass:
1284f22ef01cSRoman Divacky case Expr::CXXConstructExprClass:
1285f22ef01cSRoman Divacky return EmitCXXConstructLValue(cast<CXXConstructExpr>(E));
1286f22ef01cSRoman Divacky case Expr::CXXBindTemporaryExprClass:
1287f22ef01cSRoman Divacky return EmitCXXBindTemporaryLValue(cast<CXXBindTemporaryExpr>(E));
12883861d79fSDimitry Andric case Expr::CXXUuidofExprClass:
12893861d79fSDimitry Andric return EmitCXXUuidofLValue(cast<CXXUuidofExpr>(E));
1290dff0c46cSDimitry Andric case Expr::LambdaExprClass:
1291dff0c46cSDimitry Andric return EmitLambdaLValue(cast<LambdaExpr>(E));
1292dff0c46cSDimitry Andric
1293dff0c46cSDimitry Andric case Expr::ExprWithCleanupsClass: {
129459d1ed5bSDimitry Andric const auto *cleanups = cast<ExprWithCleanups>(E);
1295dff0c46cSDimitry Andric enterFullExpression(cleanups);
1296dff0c46cSDimitry Andric RunCleanupsScope Scope(*this);
129720e90f04SDimitry Andric LValue LV = EmitLValue(cleanups->getSubExpr());
129820e90f04SDimitry Andric if (LV.isSimple()) {
129920e90f04SDimitry Andric // Defend against branches out of gnu statement expressions surrounded by
130020e90f04SDimitry Andric // cleanups.
130120e90f04SDimitry Andric llvm::Value *V = LV.getPointer();
130220e90f04SDimitry Andric Scope.ForceCleanup({&V});
130320e90f04SDimitry Andric return LValue::MakeAddr(Address(V, LV.getAlignment()), LV.getType(),
13049a199699SDimitry Andric getContext(), LV.getBaseInfo(), LV.getTBAAInfo());
130520e90f04SDimitry Andric }
130620e90f04SDimitry Andric // FIXME: Is it possible to create an ExprWithCleanups that produces a
130720e90f04SDimitry Andric // bitfield lvalue or some other non-simple lvalue?
130820e90f04SDimitry Andric return LV;
1309dff0c46cSDimitry Andric }
1310dff0c46cSDimitry Andric
1311f22ef01cSRoman Divacky case Expr::CXXDefaultArgExprClass:
1312f22ef01cSRoman Divacky return EmitLValue(cast<CXXDefaultArgExpr>(E)->getExpr());
1313284c1978SDimitry Andric case Expr::CXXDefaultInitExprClass: {
1314284c1978SDimitry Andric CXXDefaultInitExprScope Scope(*this);
1315284c1978SDimitry Andric return EmitLValue(cast<CXXDefaultInitExpr>(E)->getExpr());
1316284c1978SDimitry Andric }
1317f22ef01cSRoman Divacky case Expr::CXXTypeidExprClass:
1318f22ef01cSRoman Divacky return EmitCXXTypeidLValue(cast<CXXTypeidExpr>(E));
1319f22ef01cSRoman Divacky
1320f22ef01cSRoman Divacky case Expr::ObjCMessageExprClass:
1321f22ef01cSRoman Divacky return EmitObjCMessageExprLValue(cast<ObjCMessageExpr>(E));
1322f22ef01cSRoman Divacky case Expr::ObjCIvarRefExprClass:
1323f22ef01cSRoman Divacky return EmitObjCIvarRefLValue(cast<ObjCIvarRefExpr>(E));
1324f22ef01cSRoman Divacky case Expr::StmtExprClass:
1325f22ef01cSRoman Divacky return EmitStmtExprLValue(cast<StmtExpr>(E));
1326f22ef01cSRoman Divacky case Expr::UnaryOperatorClass:
1327f22ef01cSRoman Divacky return EmitUnaryOpLValue(cast<UnaryOperator>(E));
1328f22ef01cSRoman Divacky case Expr::ArraySubscriptExprClass:
1329f22ef01cSRoman Divacky return EmitArraySubscriptExpr(cast<ArraySubscriptExpr>(E));
13300623d748SDimitry Andric case Expr::OMPArraySectionExprClass:
13310623d748SDimitry Andric return EmitOMPArraySectionExpr(cast<OMPArraySectionExpr>(E));
1332f22ef01cSRoman Divacky case Expr::ExtVectorElementExprClass:
1333f22ef01cSRoman Divacky return EmitExtVectorElementExpr(cast<ExtVectorElementExpr>(E));
1334f22ef01cSRoman Divacky case Expr::MemberExprClass:
1335f22ef01cSRoman Divacky return EmitMemberExpr(cast<MemberExpr>(E));
1336f22ef01cSRoman Divacky case Expr::CompoundLiteralExprClass:
1337f22ef01cSRoman Divacky return EmitCompoundLiteralLValue(cast<CompoundLiteralExpr>(E));
1338f22ef01cSRoman Divacky case Expr::ConditionalOperatorClass:
1339f22ef01cSRoman Divacky return EmitConditionalOperatorLValue(cast<ConditionalOperator>(E));
13402754fe60SDimitry Andric case Expr::BinaryConditionalOperatorClass:
13412754fe60SDimitry Andric return EmitConditionalOperatorLValue(cast<BinaryConditionalOperator>(E));
1342f22ef01cSRoman Divacky case Expr::ChooseExprClass:
1343f785676fSDimitry Andric return EmitLValue(cast<ChooseExpr>(E)->getChosenSubExpr());
13442754fe60SDimitry Andric case Expr::OpaqueValueExprClass:
13452754fe60SDimitry Andric return EmitOpaqueValueLValue(cast<OpaqueValueExpr>(E));
134617a519f9SDimitry Andric case Expr::SubstNonTypeTemplateParmExprClass:
134717a519f9SDimitry Andric return EmitLValue(cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement());
1348f22ef01cSRoman Divacky case Expr::ImplicitCastExprClass:
1349f22ef01cSRoman Divacky case Expr::CStyleCastExprClass:
1350f22ef01cSRoman Divacky case Expr::CXXFunctionalCastExprClass:
1351f22ef01cSRoman Divacky case Expr::CXXStaticCastExprClass:
1352f22ef01cSRoman Divacky case Expr::CXXDynamicCastExprClass:
1353f22ef01cSRoman Divacky case Expr::CXXReinterpretCastExprClass:
1354f22ef01cSRoman Divacky case Expr::CXXConstCastExprClass:
135517a519f9SDimitry Andric case Expr::ObjCBridgedCastExprClass:
1356f22ef01cSRoman Divacky return EmitCastLValue(cast<CastExpr>(E));
135717a519f9SDimitry Andric
135817a519f9SDimitry Andric case Expr::MaterializeTemporaryExprClass:
135917a519f9SDimitry Andric return EmitMaterializeTemporaryExpr(cast<MaterializeTemporaryExpr>(E));
136024d58133SDimitry Andric
136124d58133SDimitry Andric case Expr::CoawaitExprClass:
136224d58133SDimitry Andric return EmitCoawaitLValue(cast<CoawaitExpr>(E));
136324d58133SDimitry Andric case Expr::CoyieldExprClass:
136424d58133SDimitry Andric return EmitCoyieldLValue(cast<CoyieldExpr>(E));
1365f22ef01cSRoman Divacky }
1366f22ef01cSRoman Divacky }
1367f22ef01cSRoman Divacky
1368dff0c46cSDimitry Andric /// Given an object of the given canonical type, can we safely copy a
1369dff0c46cSDimitry Andric /// value out of it based on its initializer?
isConstantEmittableObjectType(QualType type)1370dff0c46cSDimitry Andric static bool isConstantEmittableObjectType(QualType type) {
1371dff0c46cSDimitry Andric assert(type.isCanonical());
1372dff0c46cSDimitry Andric assert(!type->isReferenceType());
1373dff0c46cSDimitry Andric
1374dff0c46cSDimitry Andric // Must be const-qualified but non-volatile.
1375dff0c46cSDimitry Andric Qualifiers qs = type.getLocalQualifiers();
1376dff0c46cSDimitry Andric if (!qs.hasConst() || qs.hasVolatile()) return false;
1377dff0c46cSDimitry Andric
1378dff0c46cSDimitry Andric // Otherwise, all object types satisfy this except C++ classes with
1379dff0c46cSDimitry Andric // mutable subobjects or non-trivial copy/destroy behavior.
138059d1ed5bSDimitry Andric if (const auto *RT = dyn_cast<RecordType>(type))
138159d1ed5bSDimitry Andric if (const auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl()))
1382dff0c46cSDimitry Andric if (RD->hasMutableFields() || !RD->isTrivial())
1383dff0c46cSDimitry Andric return false;
1384dff0c46cSDimitry Andric
1385dff0c46cSDimitry Andric return true;
1386dff0c46cSDimitry Andric }
1387dff0c46cSDimitry Andric
1388dff0c46cSDimitry Andric /// Can we constant-emit a load of a reference to a variable of the
1389dff0c46cSDimitry Andric /// given type? This is different from predicates like
1390dff0c46cSDimitry Andric /// Decl::isUsableInConstantExpressions because we do want it to apply
1391dff0c46cSDimitry Andric /// in situations that don't necessarily satisfy the language's rules
1392dff0c46cSDimitry Andric /// for this (e.g. C++'s ODR-use rules). For example, we want to able
1393dff0c46cSDimitry Andric /// to do this with const float variables even if those variables
1394dff0c46cSDimitry Andric /// aren't marked 'constexpr'.
1395dff0c46cSDimitry Andric enum ConstantEmissionKind {
1396dff0c46cSDimitry Andric CEK_None,
1397dff0c46cSDimitry Andric CEK_AsReferenceOnly,
1398dff0c46cSDimitry Andric CEK_AsValueOrReference,
1399dff0c46cSDimitry Andric CEK_AsValueOnly
1400dff0c46cSDimitry Andric };
checkVarTypeForConstantEmission(QualType type)1401dff0c46cSDimitry Andric static ConstantEmissionKind checkVarTypeForConstantEmission(QualType type) {
1402dff0c46cSDimitry Andric type = type.getCanonicalType();
140359d1ed5bSDimitry Andric if (const auto *ref = dyn_cast<ReferenceType>(type)) {
1404dff0c46cSDimitry Andric if (isConstantEmittableObjectType(ref->getPointeeType()))
1405dff0c46cSDimitry Andric return CEK_AsValueOrReference;
1406dff0c46cSDimitry Andric return CEK_AsReferenceOnly;
1407dff0c46cSDimitry Andric }
1408dff0c46cSDimitry Andric if (isConstantEmittableObjectType(type))
1409dff0c46cSDimitry Andric return CEK_AsValueOnly;
1410dff0c46cSDimitry Andric return CEK_None;
1411dff0c46cSDimitry Andric }
1412dff0c46cSDimitry Andric
1413dff0c46cSDimitry Andric /// Try to emit a reference to the given value without producing it as
1414dff0c46cSDimitry Andric /// an l-value. This is actually more than an optimization: we can't
1415dff0c46cSDimitry Andric /// produce an l-value for variables that we never actually captured
1416dff0c46cSDimitry Andric /// in a block or lambda, which means const int variables or constexpr
1417dff0c46cSDimitry Andric /// literals or similar.
1418dff0c46cSDimitry Andric CodeGenFunction::ConstantEmission
tryEmitAsConstant(DeclRefExpr * refExpr)1419dff0c46cSDimitry Andric CodeGenFunction::tryEmitAsConstant(DeclRefExpr *refExpr) {
1420dff0c46cSDimitry Andric ValueDecl *value = refExpr->getDecl();
1421dff0c46cSDimitry Andric
1422dff0c46cSDimitry Andric // The value needs to be an enum constant or a constant variable.
1423dff0c46cSDimitry Andric ConstantEmissionKind CEK;
1424dff0c46cSDimitry Andric if (isa<ParmVarDecl>(value)) {
1425dff0c46cSDimitry Andric CEK = CEK_None;
142659d1ed5bSDimitry Andric } else if (auto *var = dyn_cast<VarDecl>(value)) {
1427dff0c46cSDimitry Andric CEK = checkVarTypeForConstantEmission(var->getType());
1428dff0c46cSDimitry Andric } else if (isa<EnumConstantDecl>(value)) {
1429dff0c46cSDimitry Andric CEK = CEK_AsValueOnly;
1430dff0c46cSDimitry Andric } else {
1431dff0c46cSDimitry Andric CEK = CEK_None;
1432dff0c46cSDimitry Andric }
1433dff0c46cSDimitry Andric if (CEK == CEK_None) return ConstantEmission();
1434dff0c46cSDimitry Andric
1435dff0c46cSDimitry Andric Expr::EvalResult result;
1436dff0c46cSDimitry Andric bool resultIsReference;
1437dff0c46cSDimitry Andric QualType resultType;
1438dff0c46cSDimitry Andric
1439dff0c46cSDimitry Andric // It's best to evaluate all the way as an r-value if that's permitted.
1440dff0c46cSDimitry Andric if (CEK != CEK_AsReferenceOnly &&
1441dff0c46cSDimitry Andric refExpr->EvaluateAsRValue(result, getContext())) {
1442dff0c46cSDimitry Andric resultIsReference = false;
1443dff0c46cSDimitry Andric resultType = refExpr->getType();
1444dff0c46cSDimitry Andric
1445dff0c46cSDimitry Andric // Otherwise, try to evaluate as an l-value.
1446dff0c46cSDimitry Andric } else if (CEK != CEK_AsValueOnly &&
1447dff0c46cSDimitry Andric refExpr->EvaluateAsLValue(result, getContext())) {
1448dff0c46cSDimitry Andric resultIsReference = true;
1449dff0c46cSDimitry Andric resultType = value->getType();
1450dff0c46cSDimitry Andric
1451dff0c46cSDimitry Andric // Failure.
1452dff0c46cSDimitry Andric } else {
1453dff0c46cSDimitry Andric return ConstantEmission();
1454dff0c46cSDimitry Andric }
1455dff0c46cSDimitry Andric
1456dff0c46cSDimitry Andric // In any case, if the initializer has side-effects, abandon ship.
1457dff0c46cSDimitry Andric if (result.HasSideEffects)
1458dff0c46cSDimitry Andric return ConstantEmission();
1459dff0c46cSDimitry Andric
1460dff0c46cSDimitry Andric // Emit as a constant.
14619a199699SDimitry Andric auto C = ConstantEmitter(*this).emitAbstract(refExpr->getLocation(),
14629a199699SDimitry Andric result.Val, resultType);
1463dff0c46cSDimitry Andric
1464dff0c46cSDimitry Andric // Make sure we emit a debug reference to the global variable.
1465dff0c46cSDimitry Andric // This should probably fire even for
1466dff0c46cSDimitry Andric if (isa<VarDecl>(value)) {
1467dff0c46cSDimitry Andric if (!getContext().DeclMustBeEmitted(cast<VarDecl>(value)))
146844290647SDimitry Andric EmitDeclRefExprDbgValue(refExpr, result.Val);
1469dff0c46cSDimitry Andric } else {
1470dff0c46cSDimitry Andric assert(isa<EnumConstantDecl>(value));
147144290647SDimitry Andric EmitDeclRefExprDbgValue(refExpr, result.Val);
1472dff0c46cSDimitry Andric }
1473dff0c46cSDimitry Andric
1474dff0c46cSDimitry Andric // If we emitted a reference constant, we need to dereference that.
1475dff0c46cSDimitry Andric if (resultIsReference)
1476dff0c46cSDimitry Andric return ConstantEmission::forReference(C);
1477dff0c46cSDimitry Andric
1478dff0c46cSDimitry Andric return ConstantEmission::forValue(C);
1479dff0c46cSDimitry Andric }
1480dff0c46cSDimitry Andric
tryToConvertMemberExprToDeclRefExpr(CodeGenFunction & CGF,const MemberExpr * ME)14819a199699SDimitry Andric static DeclRefExpr *tryToConvertMemberExprToDeclRefExpr(CodeGenFunction &CGF,
14829a199699SDimitry Andric const MemberExpr *ME) {
14839a199699SDimitry Andric if (auto *VD = dyn_cast<VarDecl>(ME->getMemberDecl())) {
14849a199699SDimitry Andric // Try to emit static variable member expressions as DREs.
14859a199699SDimitry Andric return DeclRefExpr::Create(
14869a199699SDimitry Andric CGF.getContext(), NestedNameSpecifierLoc(), SourceLocation(), VD,
14879a199699SDimitry Andric /*RefersToEnclosingVariableOrCapture=*/false, ME->getExprLoc(),
14889a199699SDimitry Andric ME->getType(), ME->getValueKind());
14899a199699SDimitry Andric }
14909a199699SDimitry Andric return nullptr;
14919a199699SDimitry Andric }
14929a199699SDimitry Andric
14939a199699SDimitry Andric CodeGenFunction::ConstantEmission
tryEmitAsConstant(const MemberExpr * ME)14949a199699SDimitry Andric CodeGenFunction::tryEmitAsConstant(const MemberExpr *ME) {
14959a199699SDimitry Andric if (DeclRefExpr *DRE = tryToConvertMemberExprToDeclRefExpr(*this, ME))
14969a199699SDimitry Andric return tryEmitAsConstant(DRE);
14979a199699SDimitry Andric return ConstantEmission();
14989a199699SDimitry Andric }
14999a199699SDimitry Andric
emitScalarConstant(const CodeGenFunction::ConstantEmission & Constant,Expr * E)1500*b5893f02SDimitry Andric llvm::Value *CodeGenFunction::emitScalarConstant(
1501*b5893f02SDimitry Andric const CodeGenFunction::ConstantEmission &Constant, Expr *E) {
1502*b5893f02SDimitry Andric assert(Constant && "not a constant");
1503*b5893f02SDimitry Andric if (Constant.isReference())
1504*b5893f02SDimitry Andric return EmitLoadOfLValue(Constant.getReferenceLValue(*this, E),
1505*b5893f02SDimitry Andric E->getExprLoc())
1506*b5893f02SDimitry Andric .getScalarVal();
1507*b5893f02SDimitry Andric return Constant.getValue();
1508*b5893f02SDimitry Andric }
1509*b5893f02SDimitry Andric
EmitLoadOfScalar(LValue lvalue,SourceLocation Loc)1510f785676fSDimitry Andric llvm::Value *CodeGenFunction::EmitLoadOfScalar(LValue lvalue,
1511f785676fSDimitry Andric SourceLocation Loc) {
151217a519f9SDimitry Andric return EmitLoadOfScalar(lvalue.getAddress(), lvalue.isVolatile(),
1513d8866befSDimitry Andric lvalue.getType(), Loc, lvalue.getBaseInfo(),
15149a199699SDimitry Andric lvalue.getTBAAInfo(), lvalue.isNontemporal());
1515dff0c46cSDimitry Andric }
1516dff0c46cSDimitry Andric
hasBooleanRepresentation(QualType Ty)1517dff0c46cSDimitry Andric static bool hasBooleanRepresentation(QualType Ty) {
1518dff0c46cSDimitry Andric if (Ty->isBooleanType())
1519dff0c46cSDimitry Andric return true;
1520dff0c46cSDimitry Andric
1521dff0c46cSDimitry Andric if (const EnumType *ET = Ty->getAs<EnumType>())
1522dff0c46cSDimitry Andric return ET->getDecl()->getIntegerType()->isBooleanType();
1523dff0c46cSDimitry Andric
1524dff0c46cSDimitry Andric if (const AtomicType *AT = Ty->getAs<AtomicType>())
1525dff0c46cSDimitry Andric return hasBooleanRepresentation(AT->getValueType());
1526dff0c46cSDimitry Andric
1527dff0c46cSDimitry Andric return false;
1528dff0c46cSDimitry Andric }
1529dff0c46cSDimitry Andric
getRangeForType(CodeGenFunction & CGF,QualType Ty,llvm::APInt & Min,llvm::APInt & End,bool StrictEnums,bool IsBool)1530139f7f9bSDimitry Andric static bool getRangeForType(CodeGenFunction &CGF, QualType Ty,
1531139f7f9bSDimitry Andric llvm::APInt &Min, llvm::APInt &End,
153244290647SDimitry Andric bool StrictEnums, bool IsBool) {
1533dff0c46cSDimitry Andric const EnumType *ET = Ty->getAs<EnumType>();
1534139f7f9bSDimitry Andric bool IsRegularCPlusPlusEnum = CGF.getLangOpts().CPlusPlus && StrictEnums &&
1535139f7f9bSDimitry Andric ET && !ET->getDecl()->isFixed();
1536dff0c46cSDimitry Andric if (!IsBool && !IsRegularCPlusPlusEnum)
1537139f7f9bSDimitry Andric return false;
1538dff0c46cSDimitry Andric
1539dff0c46cSDimitry Andric if (IsBool) {
1540139f7f9bSDimitry Andric Min = llvm::APInt(CGF.getContext().getTypeSize(Ty), 0);
1541139f7f9bSDimitry Andric End = llvm::APInt(CGF.getContext().getTypeSize(Ty), 2);
1542dff0c46cSDimitry Andric } else {
1543dff0c46cSDimitry Andric const EnumDecl *ED = ET->getDecl();
1544139f7f9bSDimitry Andric llvm::Type *LTy = CGF.ConvertTypeForMem(ED->getIntegerType());
1545dff0c46cSDimitry Andric unsigned Bitwidth = LTy->getScalarSizeInBits();
1546dff0c46cSDimitry Andric unsigned NumNegativeBits = ED->getNumNegativeBits();
1547dff0c46cSDimitry Andric unsigned NumPositiveBits = ED->getNumPositiveBits();
1548dff0c46cSDimitry Andric
1549dff0c46cSDimitry Andric if (NumNegativeBits) {
1550dff0c46cSDimitry Andric unsigned NumBits = std::max(NumNegativeBits, NumPositiveBits + 1);
1551dff0c46cSDimitry Andric assert(NumBits <= Bitwidth);
1552dff0c46cSDimitry Andric End = llvm::APInt(Bitwidth, 1) << (NumBits - 1);
1553dff0c46cSDimitry Andric Min = -End;
1554dff0c46cSDimitry Andric } else {
1555dff0c46cSDimitry Andric assert(NumPositiveBits <= Bitwidth);
1556dff0c46cSDimitry Andric End = llvm::APInt(Bitwidth, 1) << NumPositiveBits;
1557dff0c46cSDimitry Andric Min = llvm::APInt(Bitwidth, 0);
1558dff0c46cSDimitry Andric }
1559dff0c46cSDimitry Andric }
1560139f7f9bSDimitry Andric return true;
1561139f7f9bSDimitry Andric }
1562139f7f9bSDimitry Andric
getRangeForLoadFromType(QualType Ty)1563139f7f9bSDimitry Andric llvm::MDNode *CodeGenFunction::getRangeForLoadFromType(QualType Ty) {
1564139f7f9bSDimitry Andric llvm::APInt Min, End;
156544290647SDimitry Andric if (!getRangeForType(*this, Ty, Min, End, CGM.getCodeGenOpts().StrictEnums,
156644290647SDimitry Andric hasBooleanRepresentation(Ty)))
156759d1ed5bSDimitry Andric return nullptr;
1568dff0c46cSDimitry Andric
1569cb4dff85SDimitry Andric llvm::MDBuilder MDHelper(getLLVMContext());
1570cb4dff85SDimitry Andric return MDHelper.createRange(Min, End);
157117a519f9SDimitry Andric }
157217a519f9SDimitry Andric
EmitScalarRangeCheck(llvm::Value * Value,QualType Ty,SourceLocation Loc)157320e90f04SDimitry Andric bool CodeGenFunction::EmitScalarRangeCheck(llvm::Value *Value, QualType Ty,
157420e90f04SDimitry Andric SourceLocation Loc) {
157520e90f04SDimitry Andric bool HasBoolCheck = SanOpts.has(SanitizerKind::Bool);
157620e90f04SDimitry Andric bool HasEnumCheck = SanOpts.has(SanitizerKind::Enum);
157720e90f04SDimitry Andric if (!HasBoolCheck && !HasEnumCheck)
157820e90f04SDimitry Andric return false;
157920e90f04SDimitry Andric
158020e90f04SDimitry Andric bool IsBool = hasBooleanRepresentation(Ty) ||
158120e90f04SDimitry Andric NSAPI(CGM.getContext()).isObjCBOOLType(Ty);
158220e90f04SDimitry Andric bool NeedsBoolCheck = HasBoolCheck && IsBool;
158320e90f04SDimitry Andric bool NeedsEnumCheck = HasEnumCheck && Ty->getAs<EnumType>();
158420e90f04SDimitry Andric if (!NeedsBoolCheck && !NeedsEnumCheck)
158520e90f04SDimitry Andric return false;
158620e90f04SDimitry Andric
158720e90f04SDimitry Andric // Single-bit booleans don't need to be checked. Special-case this to avoid
158820e90f04SDimitry Andric // a bit width mismatch when handling bitfield values. This is handled by
158920e90f04SDimitry Andric // EmitFromMemory for the non-bitfield case.
159020e90f04SDimitry Andric if (IsBool &&
159120e90f04SDimitry Andric cast<llvm::IntegerType>(Value->getType())->getBitWidth() == 1)
159220e90f04SDimitry Andric return false;
159320e90f04SDimitry Andric
159420e90f04SDimitry Andric llvm::APInt Min, End;
159520e90f04SDimitry Andric if (!getRangeForType(*this, Ty, Min, End, /*StrictEnums=*/true, IsBool))
159620e90f04SDimitry Andric return true;
159720e90f04SDimitry Andric
15989a199699SDimitry Andric auto &Ctx = getLLVMContext();
159920e90f04SDimitry Andric SanitizerScope SanScope(this);
160020e90f04SDimitry Andric llvm::Value *Check;
160120e90f04SDimitry Andric --End;
160220e90f04SDimitry Andric if (!Min) {
16039a199699SDimitry Andric Check = Builder.CreateICmpULE(Value, llvm::ConstantInt::get(Ctx, End));
160420e90f04SDimitry Andric } else {
16059a199699SDimitry Andric llvm::Value *Upper =
16069a199699SDimitry Andric Builder.CreateICmpSLE(Value, llvm::ConstantInt::get(Ctx, End));
16079a199699SDimitry Andric llvm::Value *Lower =
16089a199699SDimitry Andric Builder.CreateICmpSGE(Value, llvm::ConstantInt::get(Ctx, Min));
160920e90f04SDimitry Andric Check = Builder.CreateAnd(Upper, Lower);
161020e90f04SDimitry Andric }
161120e90f04SDimitry Andric llvm::Constant *StaticArgs[] = {EmitCheckSourceLocation(Loc),
161220e90f04SDimitry Andric EmitCheckTypeDescriptor(Ty)};
161320e90f04SDimitry Andric SanitizerMask Kind =
161420e90f04SDimitry Andric NeedsEnumCheck ? SanitizerKind::Enum : SanitizerKind::Bool;
161520e90f04SDimitry Andric EmitCheck(std::make_pair(Check, Kind), SanitizerHandler::LoadInvalidValue,
161620e90f04SDimitry Andric StaticArgs, EmitCheckValue(Value));
161720e90f04SDimitry Andric return true;
161820e90f04SDimitry Andric }
161920e90f04SDimitry Andric
EmitLoadOfScalar(Address Addr,bool Volatile,QualType Ty,SourceLocation Loc,LValueBaseInfo BaseInfo,TBAAAccessInfo TBAAInfo,bool isNontemporal)16200623d748SDimitry Andric llvm::Value *CodeGenFunction::EmitLoadOfScalar(Address Addr, bool Volatile,
16210623d748SDimitry Andric QualType Ty,
1622f785676fSDimitry Andric SourceLocation Loc,
1623d8866befSDimitry Andric LValueBaseInfo BaseInfo,
16249a199699SDimitry Andric TBAAAccessInfo TBAAInfo,
16250623d748SDimitry Andric bool isNontemporal) {
162620e90f04SDimitry Andric if (!CGM.getCodeGenOpts().PreserveVec3Type) {
16277ae0e2c9SDimitry Andric // For better performance, handle vector loads differently.
16287ae0e2c9SDimitry Andric if (Ty->isVectorType()) {
16290623d748SDimitry Andric const llvm::Type *EltTy = Addr.getElementType();
16307ae0e2c9SDimitry Andric
163159d1ed5bSDimitry Andric const auto *VTy = cast<llvm::VectorType>(EltTy);
16327ae0e2c9SDimitry Andric
16330623d748SDimitry Andric // Handle vectors of size 3 like size 4 for better performance.
16347ae0e2c9SDimitry Andric if (VTy->getNumElements() == 3) {
16357ae0e2c9SDimitry Andric
16367ae0e2c9SDimitry Andric // Bitcast to vec4 type.
163720e90f04SDimitry Andric llvm::VectorType *vec4Ty =
163820e90f04SDimitry Andric llvm::VectorType::get(VTy->getElementType(), 4);
16390623d748SDimitry Andric Address Cast = Builder.CreateElementBitCast(Addr, vec4Ty, "castToVec4");
16407ae0e2c9SDimitry Andric // Now load value.
16410623d748SDimitry Andric llvm::Value *V = Builder.CreateLoad(Cast, Volatile, "loadVec4");
16427ae0e2c9SDimitry Andric
16437ae0e2c9SDimitry Andric // Shuffle vector to get vec3.
16440623d748SDimitry Andric V = Builder.CreateShuffleVector(V, llvm::UndefValue::get(vec4Ty),
16450623d748SDimitry Andric {0, 1, 2}, "extractVec");
16467ae0e2c9SDimitry Andric return EmitFromMemory(V, Ty);
16477ae0e2c9SDimitry Andric }
16487ae0e2c9SDimitry Andric }
164920e90f04SDimitry Andric }
16507ae0e2c9SDimitry Andric
1651139f7f9bSDimitry Andric // Atomic operations have to be done on integral types.
1652e7145dcbSDimitry Andric LValue AtomicLValue =
1653d8866befSDimitry Andric LValue::MakeAddr(Addr, Ty, getContext(), BaseInfo, TBAAInfo);
1654e7145dcbSDimitry Andric if (Ty->isAtomicType() || LValueIsSuitableForInlineAtomic(AtomicLValue)) {
1655e7145dcbSDimitry Andric return EmitAtomicLoad(AtomicLValue, Loc).getScalarVal();
1656139f7f9bSDimitry Andric }
1657139f7f9bSDimitry Andric
16580623d748SDimitry Andric llvm::LoadInst *Load = Builder.CreateLoad(Addr, Volatile);
16590623d748SDimitry Andric if (isNontemporal) {
16600623d748SDimitry Andric llvm::MDNode *Node = llvm::MDNode::get(
16610623d748SDimitry Andric Load->getContext(), llvm::ConstantAsMetadata::get(Builder.getInt32(1)));
16620623d748SDimitry Andric Load->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node);
16630623d748SDimitry Andric }
16649a199699SDimitry Andric
16659a199699SDimitry Andric CGM.DecorateInstructionWithTBAA(Load, TBAAInfo);
1666dff0c46cSDimitry Andric
166720e90f04SDimitry Andric if (EmitScalarRangeCheck(Load, Ty, Loc)) {
166820e90f04SDimitry Andric // In order to prevent the optimizer from throwing away the check, don't
166920e90f04SDimitry Andric // attach range metadata to the load.
1670139f7f9bSDimitry Andric } else if (CGM.getCodeGenOpts().OptimizationLevel > 0)
1671dff0c46cSDimitry Andric if (llvm::MDNode *RangeInfo = getRangeForLoadFromType(Ty))
1672dff0c46cSDimitry Andric Load->setMetadata(llvm::LLVMContext::MD_range, RangeInfo);
1673f22ef01cSRoman Divacky
16742754fe60SDimitry Andric return EmitFromMemory(Load, Ty);
16752754fe60SDimitry Andric }
1676f22ef01cSRoman Divacky
EmitToMemory(llvm::Value * Value,QualType Ty)16772754fe60SDimitry Andric llvm::Value *CodeGenFunction::EmitToMemory(llvm::Value *Value, QualType Ty) {
16782754fe60SDimitry Andric // Bool has a different representation in memory than in registers.
1679dff0c46cSDimitry Andric if (hasBooleanRepresentation(Ty)) {
16802754fe60SDimitry Andric // This should really always be an i1, but sometimes it's already
16812754fe60SDimitry Andric // an i8, and it's awkward to track those cases down.
16822754fe60SDimitry Andric if (Value->getType()->isIntegerTy(1))
1683139f7f9bSDimitry Andric return Builder.CreateZExt(Value, ConvertTypeForMem(Ty), "frombool");
1684139f7f9bSDimitry Andric assert(Value->getType()->isIntegerTy(getContext().getTypeSize(Ty)) &&
1685139f7f9bSDimitry Andric "wrong value rep of bool");
16862754fe60SDimitry Andric }
16872754fe60SDimitry Andric
16882754fe60SDimitry Andric return Value;
16892754fe60SDimitry Andric }
16902754fe60SDimitry Andric
EmitFromMemory(llvm::Value * Value,QualType Ty)16912754fe60SDimitry Andric llvm::Value *CodeGenFunction::EmitFromMemory(llvm::Value *Value, QualType Ty) {
16922754fe60SDimitry Andric // Bool has a different representation in memory than in registers.
1693dff0c46cSDimitry Andric if (hasBooleanRepresentation(Ty)) {
1694139f7f9bSDimitry Andric assert(Value->getType()->isIntegerTy(getContext().getTypeSize(Ty)) &&
1695139f7f9bSDimitry Andric "wrong value rep of bool");
16962754fe60SDimitry Andric return Builder.CreateTrunc(Value, Builder.getInt1Ty(), "tobool");
16972754fe60SDimitry Andric }
16982754fe60SDimitry Andric
16992754fe60SDimitry Andric return Value;
1700f22ef01cSRoman Divacky }
1701f22ef01cSRoman Divacky
EmitStoreOfScalar(llvm::Value * Value,Address Addr,bool Volatile,QualType Ty,LValueBaseInfo BaseInfo,TBAAAccessInfo TBAAInfo,bool isInit,bool isNontemporal)17020623d748SDimitry Andric void CodeGenFunction::EmitStoreOfScalar(llvm::Value *Value, Address Addr,
17030623d748SDimitry Andric bool Volatile, QualType Ty,
1704d8866befSDimitry Andric LValueBaseInfo BaseInfo,
17059a199699SDimitry Andric TBAAAccessInfo TBAAInfo,
17069a199699SDimitry Andric bool isInit, bool isNontemporal) {
170720e90f04SDimitry Andric if (!CGM.getCodeGenOpts().PreserveVec3Type) {
17087ae0e2c9SDimitry Andric // Handle vectors differently to get better performance.
17097ae0e2c9SDimitry Andric if (Ty->isVectorType()) {
17107ae0e2c9SDimitry Andric llvm::Type *SrcTy = Value->getType();
17116d97bb29SDimitry Andric auto *VecTy = dyn_cast<llvm::VectorType>(SrcTy);
17127ae0e2c9SDimitry Andric // Handle vec3 special.
17136d97bb29SDimitry Andric if (VecTy && VecTy->getNumElements() == 3) {
17147ae0e2c9SDimitry Andric // Our source is a vec3, do a shuffle vector to make it a vec4.
17150623d748SDimitry Andric llvm::Constant *Mask[] = {Builder.getInt32(0), Builder.getInt32(1),
17160623d748SDimitry Andric Builder.getInt32(2),
17170623d748SDimitry Andric llvm::UndefValue::get(Builder.getInt32Ty())};
17187ae0e2c9SDimitry Andric llvm::Value *MaskV = llvm::ConstantVector::get(Mask);
171920e90f04SDimitry Andric Value = Builder.CreateShuffleVector(Value, llvm::UndefValue::get(VecTy),
17207ae0e2c9SDimitry Andric MaskV, "extractVec");
17217ae0e2c9SDimitry Andric SrcTy = llvm::VectorType::get(VecTy->getElementType(), 4);
17227ae0e2c9SDimitry Andric }
17230623d748SDimitry Andric if (Addr.getElementType() != SrcTy) {
17240623d748SDimitry Andric Addr = Builder.CreateElementBitCast(Addr, SrcTy, "storetmp");
17257ae0e2c9SDimitry Andric }
17267ae0e2c9SDimitry Andric }
172720e90f04SDimitry Andric }
17287ae0e2c9SDimitry Andric
17292754fe60SDimitry Andric Value = EmitToMemory(Value, Ty);
173017a519f9SDimitry Andric
1731e7145dcbSDimitry Andric LValue AtomicLValue =
1732d8866befSDimitry Andric LValue::MakeAddr(Addr, Ty, getContext(), BaseInfo, TBAAInfo);
173333956c43SDimitry Andric if (Ty->isAtomicType() ||
1734e7145dcbSDimitry Andric (!isInit && LValueIsSuitableForInlineAtomic(AtomicLValue))) {
1735e7145dcbSDimitry Andric EmitAtomicStore(RValue::get(Value), AtomicLValue, isInit);
1736139f7f9bSDimitry Andric return;
1737139f7f9bSDimitry Andric }
1738139f7f9bSDimitry Andric
1739e580952dSDimitry Andric llvm::StoreInst *Store = Builder.CreateStore(Value, Addr, Volatile);
17400623d748SDimitry Andric if (isNontemporal) {
17410623d748SDimitry Andric llvm::MDNode *Node =
17420623d748SDimitry Andric llvm::MDNode::get(Store->getContext(),
17430623d748SDimitry Andric llvm::ConstantAsMetadata::get(Builder.getInt32(1)));
17440623d748SDimitry Andric Store->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node);
17450623d748SDimitry Andric }
17469a199699SDimitry Andric
17479a199699SDimitry Andric CGM.DecorateInstructionWithTBAA(Store, TBAAInfo);
1748f22ef01cSRoman Divacky }
1749f22ef01cSRoman Divacky
EmitStoreOfScalar(llvm::Value * value,LValue lvalue,bool isInit)1750dff0c46cSDimitry Andric void CodeGenFunction::EmitStoreOfScalar(llvm::Value *value, LValue lvalue,
1751dff0c46cSDimitry Andric bool isInit) {
175217a519f9SDimitry Andric EmitStoreOfScalar(value, lvalue.getAddress(), lvalue.isVolatile(),
1753d8866befSDimitry Andric lvalue.getType(), lvalue.getBaseInfo(),
17549a199699SDimitry Andric lvalue.getTBAAInfo(), isInit, lvalue.isNontemporal());
175517a519f9SDimitry Andric }
175617a519f9SDimitry Andric
1757f22ef01cSRoman Divacky /// EmitLoadOfLValue - Given an expression that represents a value lvalue, this
1758f22ef01cSRoman Divacky /// method emits the address of the lvalue, then loads the result as an rvalue,
1759f22ef01cSRoman Divacky /// returning the rvalue.
EmitLoadOfLValue(LValue LV,SourceLocation Loc)1760f785676fSDimitry Andric RValue CodeGenFunction::EmitLoadOfLValue(LValue LV, SourceLocation Loc) {
1761f22ef01cSRoman Divacky if (LV.isObjCWeak()) {
1762f22ef01cSRoman Divacky // load of a __weak object.
17630623d748SDimitry Andric Address AddrWeakObj = LV.getAddress();
1764f22ef01cSRoman Divacky return RValue::get(CGM.getObjCRuntime().EmitObjCWeakRead(*this,
1765f22ef01cSRoman Divacky AddrWeakObj));
1766f22ef01cSRoman Divacky }
1767139f7f9bSDimitry Andric if (LV.getQuals().getObjCLifetime() == Qualifiers::OCL_Weak) {
17680623d748SDimitry Andric // In MRC mode, we do a load+autorelease.
17690623d748SDimitry Andric if (!getLangOpts().ObjCAutoRefCount) {
17700623d748SDimitry Andric return RValue::get(EmitARCLoadWeak(LV.getAddress()));
17710623d748SDimitry Andric }
17720623d748SDimitry Andric
17730623d748SDimitry Andric // In ARC mode, we load retained and then consume the value.
1774139f7f9bSDimitry Andric llvm::Value *Object = EmitARCLoadWeakRetained(LV.getAddress());
1775139f7f9bSDimitry Andric Object = EmitObjCConsumeObject(LV.getType(), Object);
1776139f7f9bSDimitry Andric return RValue::get(Object);
1777139f7f9bSDimitry Andric }
1778f22ef01cSRoman Divacky
1779f22ef01cSRoman Divacky if (LV.isSimple()) {
178017a519f9SDimitry Andric assert(!LV.getType()->isFunctionType());
1781e580952dSDimitry Andric
1782e580952dSDimitry Andric // Everything needs a load.
1783f785676fSDimitry Andric return RValue::get(EmitLoadOfScalar(LV, Loc));
1784f22ef01cSRoman Divacky }
1785f22ef01cSRoman Divacky
1786f22ef01cSRoman Divacky if (LV.isVectorElt()) {
17870623d748SDimitry Andric llvm::LoadInst *Load = Builder.CreateLoad(LV.getVectorAddress(),
17886122f3e6SDimitry Andric LV.isVolatileQualified());
1789dff0c46cSDimitry Andric return RValue::get(Builder.CreateExtractElement(Load, LV.getVectorIdx(),
1790f22ef01cSRoman Divacky "vecext"));
1791f22ef01cSRoman Divacky }
1792f22ef01cSRoman Divacky
1793f22ef01cSRoman Divacky // If this is a reference to a subset of the elements of a vector, either
1794f22ef01cSRoman Divacky // shuffle the input or extract/insert them as appropriate.
1795f22ef01cSRoman Divacky if (LV.isExtVectorElt())
179617a519f9SDimitry Andric return EmitLoadOfExtVectorElementLValue(LV);
1797f22ef01cSRoman Divacky
179859d1ed5bSDimitry Andric // Global Register variables always invoke intrinsics
179959d1ed5bSDimitry Andric if (LV.isGlobalReg())
180059d1ed5bSDimitry Andric return EmitLoadOfGlobalRegLValue(LV);
180159d1ed5bSDimitry Andric
1802dff0c46cSDimitry Andric assert(LV.isBitField() && "Unknown LValue type!");
180320e90f04SDimitry Andric return EmitLoadOfBitfieldLValue(LV, Loc);
1804f22ef01cSRoman Divacky }
1805f22ef01cSRoman Divacky
EmitLoadOfBitfieldLValue(LValue LV,SourceLocation Loc)180620e90f04SDimitry Andric RValue CodeGenFunction::EmitLoadOfBitfieldLValue(LValue LV,
180720e90f04SDimitry Andric SourceLocation Loc) {
1808f22ef01cSRoman Divacky const CGBitFieldInfo &Info = LV.getBitFieldInfo();
1809f22ef01cSRoman Divacky
1810f22ef01cSRoman Divacky // Get the output type.
18116122f3e6SDimitry Andric llvm::Type *ResLTy = ConvertType(LV.getType());
1812f22ef01cSRoman Divacky
18130623d748SDimitry Andric Address Ptr = LV.getBitFieldAddress();
18140623d748SDimitry Andric llvm::Value *Val = Builder.CreateLoad(Ptr, LV.isVolatileQualified(), "bf.load");
1815f22ef01cSRoman Divacky
1816139f7f9bSDimitry Andric if (Info.IsSigned) {
1817139f7f9bSDimitry Andric assert(static_cast<unsigned>(Info.Offset + Info.Size) <= Info.StorageSize);
1818139f7f9bSDimitry Andric unsigned HighBits = Info.StorageSize - Info.Offset - Info.Size;
1819139f7f9bSDimitry Andric if (HighBits)
1820139f7f9bSDimitry Andric Val = Builder.CreateShl(Val, HighBits, "bf.shl");
1821139f7f9bSDimitry Andric if (Info.Offset + HighBits)
1822139f7f9bSDimitry Andric Val = Builder.CreateAShr(Val, Info.Offset + HighBits, "bf.ashr");
1823139f7f9bSDimitry Andric } else {
1824139f7f9bSDimitry Andric if (Info.Offset)
1825139f7f9bSDimitry Andric Val = Builder.CreateLShr(Val, Info.Offset, "bf.lshr");
1826139f7f9bSDimitry Andric if (static_cast<unsigned>(Info.Offset) + Info.Size < Info.StorageSize)
1827139f7f9bSDimitry Andric Val = Builder.CreateAnd(Val, llvm::APInt::getLowBitsSet(Info.StorageSize,
1828139f7f9bSDimitry Andric Info.Size),
1829f22ef01cSRoman Divacky "bf.clear");
1830f22ef01cSRoman Divacky }
1831139f7f9bSDimitry Andric Val = Builder.CreateIntCast(Val, ResLTy, Info.IsSigned, "bf.cast");
183220e90f04SDimitry Andric EmitScalarRangeCheck(Val, LV.getType(), Loc);
1833139f7f9bSDimitry Andric return RValue::get(Val);
1834f22ef01cSRoman Divacky }
1835f22ef01cSRoman Divacky
1836f22ef01cSRoman Divacky // If this is a reference to a subset of the elements of a vector, create an
1837f22ef01cSRoman Divacky // appropriate shufflevector.
EmitLoadOfExtVectorElementLValue(LValue LV)183817a519f9SDimitry Andric RValue CodeGenFunction::EmitLoadOfExtVectorElementLValue(LValue LV) {
18390623d748SDimitry Andric llvm::Value *Vec = Builder.CreateLoad(LV.getExtVectorAddress(),
18406122f3e6SDimitry Andric LV.isVolatileQualified());
1841f22ef01cSRoman Divacky
1842f22ef01cSRoman Divacky const llvm::Constant *Elts = LV.getExtVectorElts();
1843f22ef01cSRoman Divacky
1844f22ef01cSRoman Divacky // If the result of the expression is a non-vector type, we must be extracting
1845f22ef01cSRoman Divacky // a single element. Just codegen as an extractelement.
184617a519f9SDimitry Andric const VectorType *ExprVT = LV.getType()->getAs<VectorType>();
1847f22ef01cSRoman Divacky if (!ExprVT) {
1848f22ef01cSRoman Divacky unsigned InIdx = getAccessedFieldNo(0, Elts);
184959d1ed5bSDimitry Andric llvm::Value *Elt = llvm::ConstantInt::get(SizeTy, InIdx);
18506122f3e6SDimitry Andric return RValue::get(Builder.CreateExtractElement(Vec, Elt));
1851f22ef01cSRoman Divacky }
1852f22ef01cSRoman Divacky
1853f22ef01cSRoman Divacky // Always use shuffle vector to try to retain the original program structure
1854f22ef01cSRoman Divacky unsigned NumResultElts = ExprVT->getNumElements();
1855f22ef01cSRoman Divacky
18566122f3e6SDimitry Andric SmallVector<llvm::Constant*, 4> Mask;
1857dff0c46cSDimitry Andric for (unsigned i = 0; i != NumResultElts; ++i)
1858dff0c46cSDimitry Andric Mask.push_back(Builder.getInt32(getAccessedFieldNo(i, Elts)));
1859f22ef01cSRoman Divacky
18602754fe60SDimitry Andric llvm::Value *MaskV = llvm::ConstantVector::get(Mask);
18612754fe60SDimitry Andric Vec = Builder.CreateShuffleVector(Vec, llvm::UndefValue::get(Vec->getType()),
18626122f3e6SDimitry Andric MaskV);
1863f22ef01cSRoman Divacky return RValue::get(Vec);
1864f22ef01cSRoman Divacky }
1865f22ef01cSRoman Divacky
18664ba319b5SDimitry Andric /// Generates lvalue for partial ext_vector access.
EmitExtVectorElementLValue(LValue LV)18670623d748SDimitry Andric Address CodeGenFunction::EmitExtVectorElementLValue(LValue LV) {
18680623d748SDimitry Andric Address VectorAddress = LV.getExtVectorAddress();
186939d628a0SDimitry Andric const VectorType *ExprVT = LV.getType()->getAs<VectorType>();
187039d628a0SDimitry Andric QualType EQT = ExprVT->getElementType();
187139d628a0SDimitry Andric llvm::Type *VectorElementTy = CGM.getTypes().ConvertType(EQT);
187239d628a0SDimitry Andric
18730623d748SDimitry Andric Address CastToPointerElement =
18740623d748SDimitry Andric Builder.CreateElementBitCast(VectorAddress, VectorElementTy,
18750623d748SDimitry Andric "conv.ptr.element");
187639d628a0SDimitry Andric
187739d628a0SDimitry Andric const llvm::Constant *Elts = LV.getExtVectorElts();
187839d628a0SDimitry Andric unsigned ix = getAccessedFieldNo(0, Elts);
187939d628a0SDimitry Andric
18800623d748SDimitry Andric Address VectorBasePtrPlusIx =
18810623d748SDimitry Andric Builder.CreateConstInBoundsGEP(CastToPointerElement, ix,
18820623d748SDimitry Andric getContext().getTypeSizeInChars(EQT),
18830623d748SDimitry Andric "vector.elt");
188439d628a0SDimitry Andric
188539d628a0SDimitry Andric return VectorBasePtrPlusIx;
188639d628a0SDimitry Andric }
188739d628a0SDimitry Andric
18884ba319b5SDimitry Andric /// Load of global gamed gegisters are always calls to intrinsics.
EmitLoadOfGlobalRegLValue(LValue LV)188959d1ed5bSDimitry Andric RValue CodeGenFunction::EmitLoadOfGlobalRegLValue(LValue LV) {
189059d1ed5bSDimitry Andric assert((LV.getType()->isIntegerType() || LV.getType()->isPointerType()) &&
189159d1ed5bSDimitry Andric "Bad type for register variable");
189239d628a0SDimitry Andric llvm::MDNode *RegName = cast<llvm::MDNode>(
189339d628a0SDimitry Andric cast<llvm::MetadataAsValue>(LV.getGlobalReg())->getMetadata());
189459d1ed5bSDimitry Andric
189559d1ed5bSDimitry Andric // We accept integer and pointer types only
189659d1ed5bSDimitry Andric llvm::Type *OrigTy = CGM.getTypes().ConvertType(LV.getType());
189759d1ed5bSDimitry Andric llvm::Type *Ty = OrigTy;
189859d1ed5bSDimitry Andric if (OrigTy->isPointerTy())
189959d1ed5bSDimitry Andric Ty = CGM.getTypes().getDataLayout().getIntPtrType(OrigTy);
190059d1ed5bSDimitry Andric llvm::Type *Types[] = { Ty };
190159d1ed5bSDimitry Andric
190259d1ed5bSDimitry Andric llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::read_register, Types);
190339d628a0SDimitry Andric llvm::Value *Call = Builder.CreateCall(
190439d628a0SDimitry Andric F, llvm::MetadataAsValue::get(Ty->getContext(), RegName));
190559d1ed5bSDimitry Andric if (OrigTy->isPointerTy())
190659d1ed5bSDimitry Andric Call = Builder.CreateIntToPtr(Call, OrigTy);
190759d1ed5bSDimitry Andric return RValue::get(Call);
190859d1ed5bSDimitry Andric }
1909f22ef01cSRoman Divacky
1910f22ef01cSRoman Divacky
1911f22ef01cSRoman Divacky /// EmitStoreThroughLValue - Store the specified rvalue into the specified
1912f22ef01cSRoman Divacky /// lvalue, where both are guaranteed to the have the same type, and that type
1913f22ef01cSRoman Divacky /// is 'Ty'.
EmitStoreThroughLValue(RValue Src,LValue Dst,bool isInit)1914f785676fSDimitry Andric void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst,
1915f785676fSDimitry Andric bool isInit) {
1916f22ef01cSRoman Divacky if (!Dst.isSimple()) {
1917f22ef01cSRoman Divacky if (Dst.isVectorElt()) {
1918f22ef01cSRoman Divacky // Read/modify/write the vector, inserting the new element.
19190623d748SDimitry Andric llvm::Value *Vec = Builder.CreateLoad(Dst.getVectorAddress(),
19206122f3e6SDimitry Andric Dst.isVolatileQualified());
1921f22ef01cSRoman Divacky Vec = Builder.CreateInsertElement(Vec, Src.getScalarVal(),
1922f22ef01cSRoman Divacky Dst.getVectorIdx(), "vecins");
19230623d748SDimitry Andric Builder.CreateStore(Vec, Dst.getVectorAddress(),
1924dff0c46cSDimitry Andric Dst.isVolatileQualified());
1925f22ef01cSRoman Divacky return;
1926f22ef01cSRoman Divacky }
1927f22ef01cSRoman Divacky
1928f22ef01cSRoman Divacky // If this is an update of extended vector elements, insert them as
1929f22ef01cSRoman Divacky // appropriate.
1930f22ef01cSRoman Divacky if (Dst.isExtVectorElt())
193117a519f9SDimitry Andric return EmitStoreThroughExtVectorComponentLValue(Src, Dst);
1932f22ef01cSRoman Divacky
193359d1ed5bSDimitry Andric if (Dst.isGlobalReg())
193459d1ed5bSDimitry Andric return EmitStoreThroughGlobalRegLValue(Src, Dst);
193559d1ed5bSDimitry Andric
1936dff0c46cSDimitry Andric assert(Dst.isBitField() && "Unknown LValue type");
193717a519f9SDimitry Andric return EmitStoreThroughBitfieldLValue(Src, Dst);
1938f22ef01cSRoman Divacky }
1939f22ef01cSRoman Divacky
194017a519f9SDimitry Andric // There's special magic for assigning into an ARC-qualified l-value.
194117a519f9SDimitry Andric if (Qualifiers::ObjCLifetime Lifetime = Dst.getQuals().getObjCLifetime()) {
194217a519f9SDimitry Andric switch (Lifetime) {
194317a519f9SDimitry Andric case Qualifiers::OCL_None:
194417a519f9SDimitry Andric llvm_unreachable("present but none");
194517a519f9SDimitry Andric
194617a519f9SDimitry Andric case Qualifiers::OCL_ExplicitNone:
194717a519f9SDimitry Andric // nothing special
194817a519f9SDimitry Andric break;
194917a519f9SDimitry Andric
195017a519f9SDimitry Andric case Qualifiers::OCL_Strong:
195144290647SDimitry Andric if (isInit) {
195244290647SDimitry Andric Src = RValue::get(EmitARCRetain(Dst.getType(), Src.getScalarVal()));
195344290647SDimitry Andric break;
195444290647SDimitry Andric }
195517a519f9SDimitry Andric EmitARCStoreStrong(Dst, Src.getScalarVal(), /*ignore*/ true);
195617a519f9SDimitry Andric return;
195717a519f9SDimitry Andric
195817a519f9SDimitry Andric case Qualifiers::OCL_Weak:
195944290647SDimitry Andric if (isInit)
196044290647SDimitry Andric // Initialize and then skip the primitive store.
196144290647SDimitry Andric EmitARCInitWeak(Dst.getAddress(), Src.getScalarVal());
196244290647SDimitry Andric else
196317a519f9SDimitry Andric EmitARCStoreWeak(Dst.getAddress(), Src.getScalarVal(), /*ignore*/ true);
196417a519f9SDimitry Andric return;
196517a519f9SDimitry Andric
196617a519f9SDimitry Andric case Qualifiers::OCL_Autoreleasing:
196717a519f9SDimitry Andric Src = RValue::get(EmitObjCExtendObjectLifetime(Dst.getType(),
196817a519f9SDimitry Andric Src.getScalarVal()));
196917a519f9SDimitry Andric // fall into the normal path
197017a519f9SDimitry Andric break;
197117a519f9SDimitry Andric }
197217a519f9SDimitry Andric }
197317a519f9SDimitry Andric
1974f22ef01cSRoman Divacky if (Dst.isObjCWeak() && !Dst.isNonGC()) {
1975f22ef01cSRoman Divacky // load of a __weak object.
19760623d748SDimitry Andric Address LvalueDst = Dst.getAddress();
1977f22ef01cSRoman Divacky llvm::Value *src = Src.getScalarVal();
1978f22ef01cSRoman Divacky CGM.getObjCRuntime().EmitObjCWeakAssign(*this, src, LvalueDst);
1979f22ef01cSRoman Divacky return;
1980f22ef01cSRoman Divacky }
1981f22ef01cSRoman Divacky
1982f22ef01cSRoman Divacky if (Dst.isObjCStrong() && !Dst.isNonGC()) {
1983f22ef01cSRoman Divacky // load of a __strong object.
19840623d748SDimitry Andric Address LvalueDst = Dst.getAddress();
1985f22ef01cSRoman Divacky llvm::Value *src = Src.getScalarVal();
1986f22ef01cSRoman Divacky if (Dst.isObjCIvar()) {
1987f22ef01cSRoman Divacky assert(Dst.getBaseIvarExp() && "BaseIvarExp is NULL");
19880623d748SDimitry Andric llvm::Type *ResultType = IntPtrTy;
19890623d748SDimitry Andric Address dst = EmitPointerWithAlignment(Dst.getBaseIvarExp());
19900623d748SDimitry Andric llvm::Value *RHS = dst.getPointer();
1991f22ef01cSRoman Divacky RHS = Builder.CreatePtrToInt(RHS, ResultType, "sub.ptr.rhs.cast");
1992f22ef01cSRoman Divacky llvm::Value *LHS =
19930623d748SDimitry Andric Builder.CreatePtrToInt(LvalueDst.getPointer(), ResultType,
19940623d748SDimitry Andric "sub.ptr.lhs.cast");
1995f22ef01cSRoman Divacky llvm::Value *BytesBetween = Builder.CreateSub(LHS, RHS, "ivar.offset");
1996f22ef01cSRoman Divacky CGM.getObjCRuntime().EmitObjCIvarAssign(*this, src, dst,
1997f22ef01cSRoman Divacky BytesBetween);
1998e580952dSDimitry Andric } else if (Dst.isGlobalObjCRef()) {
1999e580952dSDimitry Andric CGM.getObjCRuntime().EmitObjCGlobalAssign(*this, src, LvalueDst,
2000e580952dSDimitry Andric Dst.isThreadLocalRef());
2001e580952dSDimitry Andric }
2002f22ef01cSRoman Divacky else
2003f22ef01cSRoman Divacky CGM.getObjCRuntime().EmitObjCStrongCastAssign(*this, src, LvalueDst);
2004f22ef01cSRoman Divacky return;
2005f22ef01cSRoman Divacky }
2006f22ef01cSRoman Divacky
2007f22ef01cSRoman Divacky assert(Src.isScalar() && "Can't emit an agg store with this method");
2008dff0c46cSDimitry Andric EmitStoreOfScalar(Src.getScalarVal(), Dst, isInit);
2009f22ef01cSRoman Divacky }
2010f22ef01cSRoman Divacky
EmitStoreThroughBitfieldLValue(RValue Src,LValue Dst,llvm::Value ** Result)2011f22ef01cSRoman Divacky void CodeGenFunction::EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst,
2012f22ef01cSRoman Divacky llvm::Value **Result) {
2013f22ef01cSRoman Divacky const CGBitFieldInfo &Info = Dst.getBitFieldInfo();
20146122f3e6SDimitry Andric llvm::Type *ResLTy = ConvertTypeForMem(Dst.getType());
20150623d748SDimitry Andric Address Ptr = Dst.getBitFieldAddress();
2016f22ef01cSRoman Divacky
2017f22ef01cSRoman Divacky // Get the source value, truncated to the width of the bit-field.
2018f22ef01cSRoman Divacky llvm::Value *SrcVal = Src.getScalarVal();
2019f22ef01cSRoman Divacky
2020139f7f9bSDimitry Andric // Cast the source to the storage type and shift it into place.
20210623d748SDimitry Andric SrcVal = Builder.CreateIntCast(SrcVal, Ptr.getElementType(),
2022139f7f9bSDimitry Andric /*IsSigned=*/false);
2023139f7f9bSDimitry Andric llvm::Value *MaskedVal = SrcVal;
2024f22ef01cSRoman Divacky
2025139f7f9bSDimitry Andric // See if there are other bits in the bitfield's storage we'll need to load
2026139f7f9bSDimitry Andric // and mask together with source before storing.
2027139f7f9bSDimitry Andric if (Info.StorageSize != Info.Size) {
2028139f7f9bSDimitry Andric assert(Info.StorageSize > Info.Size && "Invalid bitfield size.");
20290623d748SDimitry Andric llvm::Value *Val =
20300623d748SDimitry Andric Builder.CreateLoad(Ptr, Dst.isVolatileQualified(), "bf.load");
2031139f7f9bSDimitry Andric
2032139f7f9bSDimitry Andric // Mask the source value as needed.
2033139f7f9bSDimitry Andric if (!hasBooleanRepresentation(Dst.getType()))
2034139f7f9bSDimitry Andric SrcVal = Builder.CreateAnd(SrcVal,
2035139f7f9bSDimitry Andric llvm::APInt::getLowBitsSet(Info.StorageSize,
2036139f7f9bSDimitry Andric Info.Size),
2037f22ef01cSRoman Divacky "bf.value");
2038139f7f9bSDimitry Andric MaskedVal = SrcVal;
2039139f7f9bSDimitry Andric if (Info.Offset)
2040139f7f9bSDimitry Andric SrcVal = Builder.CreateShl(SrcVal, Info.Offset, "bf.shl");
2041139f7f9bSDimitry Andric
2042139f7f9bSDimitry Andric // Mask out the original value.
2043139f7f9bSDimitry Andric Val = Builder.CreateAnd(Val,
2044139f7f9bSDimitry Andric ~llvm::APInt::getBitsSet(Info.StorageSize,
2045139f7f9bSDimitry Andric Info.Offset,
2046139f7f9bSDimitry Andric Info.Offset + Info.Size),
2047139f7f9bSDimitry Andric "bf.clear");
2048139f7f9bSDimitry Andric
2049139f7f9bSDimitry Andric // Or together the unchanged values and the source value.
2050139f7f9bSDimitry Andric SrcVal = Builder.CreateOr(Val, SrcVal, "bf.set");
2051139f7f9bSDimitry Andric } else {
2052139f7f9bSDimitry Andric assert(Info.Offset == 0);
2053139f7f9bSDimitry Andric }
2054139f7f9bSDimitry Andric
2055139f7f9bSDimitry Andric // Write the new value back out.
20560623d748SDimitry Andric Builder.CreateStore(SrcVal, Ptr, Dst.isVolatileQualified());
2057f22ef01cSRoman Divacky
2058f22ef01cSRoman Divacky // Return the new value of the bit-field, if requested.
2059f22ef01cSRoman Divacky if (Result) {
2060139f7f9bSDimitry Andric llvm::Value *ResultVal = MaskedVal;
2061f22ef01cSRoman Divacky
2062139f7f9bSDimitry Andric // Sign extend the value if needed.
2063139f7f9bSDimitry Andric if (Info.IsSigned) {
2064139f7f9bSDimitry Andric assert(Info.Size <= Info.StorageSize);
2065139f7f9bSDimitry Andric unsigned HighBits = Info.StorageSize - Info.Size;
2066139f7f9bSDimitry Andric if (HighBits) {
2067139f7f9bSDimitry Andric ResultVal = Builder.CreateShl(ResultVal, HighBits, "bf.result.shl");
2068139f7f9bSDimitry Andric ResultVal = Builder.CreateAShr(ResultVal, HighBits, "bf.result.ashr");
2069139f7f9bSDimitry Andric }
2070f22ef01cSRoman Divacky }
2071f22ef01cSRoman Divacky
2072139f7f9bSDimitry Andric ResultVal = Builder.CreateIntCast(ResultVal, ResLTy, Info.IsSigned,
2073139f7f9bSDimitry Andric "bf.result.cast");
2074139f7f9bSDimitry Andric *Result = EmitFromMemory(ResultVal, Dst.getType());
2075f22ef01cSRoman Divacky }
2076f22ef01cSRoman Divacky }
2077f22ef01cSRoman Divacky
EmitStoreThroughExtVectorComponentLValue(RValue Src,LValue Dst)2078f22ef01cSRoman Divacky void CodeGenFunction::EmitStoreThroughExtVectorComponentLValue(RValue Src,
207917a519f9SDimitry Andric LValue Dst) {
2080f22ef01cSRoman Divacky // This access turns into a read/modify/write of the vector. Load the input
2081f22ef01cSRoman Divacky // value now.
20820623d748SDimitry Andric llvm::Value *Vec = Builder.CreateLoad(Dst.getExtVectorAddress(),
20836122f3e6SDimitry Andric Dst.isVolatileQualified());
2084f22ef01cSRoman Divacky const llvm::Constant *Elts = Dst.getExtVectorElts();
2085f22ef01cSRoman Divacky
2086f22ef01cSRoman Divacky llvm::Value *SrcVal = Src.getScalarVal();
2087f22ef01cSRoman Divacky
208817a519f9SDimitry Andric if (const VectorType *VTy = Dst.getType()->getAs<VectorType>()) {
2089f22ef01cSRoman Divacky unsigned NumSrcElts = VTy->getNumElements();
2090e7145dcbSDimitry Andric unsigned NumDstElts = Vec->getType()->getVectorNumElements();
2091f22ef01cSRoman Divacky if (NumDstElts == NumSrcElts) {
2092f22ef01cSRoman Divacky // Use shuffle vector is the src and destination are the same number of
2093f22ef01cSRoman Divacky // elements and restore the vector mask since it is on the side it will be
2094f22ef01cSRoman Divacky // stored.
20956122f3e6SDimitry Andric SmallVector<llvm::Constant*, 4> Mask(NumDstElts);
2096dff0c46cSDimitry Andric for (unsigned i = 0; i != NumSrcElts; ++i)
2097dff0c46cSDimitry Andric Mask[getAccessedFieldNo(i, Elts)] = Builder.getInt32(i);
2098f22ef01cSRoman Divacky
20992754fe60SDimitry Andric llvm::Value *MaskV = llvm::ConstantVector::get(Mask);
2100f22ef01cSRoman Divacky Vec = Builder.CreateShuffleVector(SrcVal,
2101f22ef01cSRoman Divacky llvm::UndefValue::get(Vec->getType()),
21026122f3e6SDimitry Andric MaskV);
2103f22ef01cSRoman Divacky } else if (NumDstElts > NumSrcElts) {
2104f22ef01cSRoman Divacky // Extended the source vector to the same length and then shuffle it
2105f22ef01cSRoman Divacky // into the destination.
2106f22ef01cSRoman Divacky // FIXME: since we're shuffling with undef, can we just use the indices
2107f22ef01cSRoman Divacky // into that? This could be simpler.
21086122f3e6SDimitry Andric SmallVector<llvm::Constant*, 4> ExtMask;
2109dff0c46cSDimitry Andric for (unsigned i = 0; i != NumSrcElts; ++i)
2110dff0c46cSDimitry Andric ExtMask.push_back(Builder.getInt32(i));
2111dff0c46cSDimitry Andric ExtMask.resize(NumDstElts, llvm::UndefValue::get(Int32Ty));
21122754fe60SDimitry Andric llvm::Value *ExtMaskV = llvm::ConstantVector::get(ExtMask);
2113f22ef01cSRoman Divacky llvm::Value *ExtSrcVal =
2114f22ef01cSRoman Divacky Builder.CreateShuffleVector(SrcVal,
2115f22ef01cSRoman Divacky llvm::UndefValue::get(SrcVal->getType()),
21166122f3e6SDimitry Andric ExtMaskV);
2117f22ef01cSRoman Divacky // build identity
21186122f3e6SDimitry Andric SmallVector<llvm::Constant*, 4> Mask;
2119f22ef01cSRoman Divacky for (unsigned i = 0; i != NumDstElts; ++i)
2120dff0c46cSDimitry Andric Mask.push_back(Builder.getInt32(i));
2121f22ef01cSRoman Divacky
2122f785676fSDimitry Andric // When the vector size is odd and .odd or .hi is used, the last element
2123f785676fSDimitry Andric // of the Elts constant array will be one past the size of the vector.
2124f785676fSDimitry Andric // Ignore the last element here, if it is greater than the mask size.
2125f785676fSDimitry Andric if (getAccessedFieldNo(NumSrcElts - 1, Elts) == Mask.size())
2126f785676fSDimitry Andric NumSrcElts--;
2127f785676fSDimitry Andric
2128f22ef01cSRoman Divacky // modify when what gets shuffled in
2129dff0c46cSDimitry Andric for (unsigned i = 0; i != NumSrcElts; ++i)
2130dff0c46cSDimitry Andric Mask[getAccessedFieldNo(i, Elts)] = Builder.getInt32(i+NumDstElts);
21312754fe60SDimitry Andric llvm::Value *MaskV = llvm::ConstantVector::get(Mask);
21326122f3e6SDimitry Andric Vec = Builder.CreateShuffleVector(Vec, ExtSrcVal, MaskV);
2133f22ef01cSRoman Divacky } else {
2134f22ef01cSRoman Divacky // We should never shorten the vector
21356122f3e6SDimitry Andric llvm_unreachable("unexpected shorten vector length");
2136f22ef01cSRoman Divacky }
2137f22ef01cSRoman Divacky } else {
2138f22ef01cSRoman Divacky // If the Src is a scalar (not a vector) it must be updating one element.
2139f22ef01cSRoman Divacky unsigned InIdx = getAccessedFieldNo(0, Elts);
214059d1ed5bSDimitry Andric llvm::Value *Elt = llvm::ConstantInt::get(SizeTy, InIdx);
21416122f3e6SDimitry Andric Vec = Builder.CreateInsertElement(Vec, SrcVal, Elt);
2142f22ef01cSRoman Divacky }
2143f22ef01cSRoman Divacky
21440623d748SDimitry Andric Builder.CreateStore(Vec, Dst.getExtVectorAddress(),
2145dff0c46cSDimitry Andric Dst.isVolatileQualified());
2146f22ef01cSRoman Divacky }
2147f22ef01cSRoman Divacky
21484ba319b5SDimitry Andric /// Store of global named registers are always calls to intrinsics.
EmitStoreThroughGlobalRegLValue(RValue Src,LValue Dst)214959d1ed5bSDimitry Andric void CodeGenFunction::EmitStoreThroughGlobalRegLValue(RValue Src, LValue Dst) {
215059d1ed5bSDimitry Andric assert((Dst.getType()->isIntegerType() || Dst.getType()->isPointerType()) &&
215159d1ed5bSDimitry Andric "Bad type for register variable");
215239d628a0SDimitry Andric llvm::MDNode *RegName = cast<llvm::MDNode>(
215339d628a0SDimitry Andric cast<llvm::MetadataAsValue>(Dst.getGlobalReg())->getMetadata());
215459d1ed5bSDimitry Andric assert(RegName && "Register LValue is not metadata");
215559d1ed5bSDimitry Andric
215659d1ed5bSDimitry Andric // We accept integer and pointer types only
215759d1ed5bSDimitry Andric llvm::Type *OrigTy = CGM.getTypes().ConvertType(Dst.getType());
215859d1ed5bSDimitry Andric llvm::Type *Ty = OrigTy;
215959d1ed5bSDimitry Andric if (OrigTy->isPointerTy())
216059d1ed5bSDimitry Andric Ty = CGM.getTypes().getDataLayout().getIntPtrType(OrigTy);
216159d1ed5bSDimitry Andric llvm::Type *Types[] = { Ty };
216259d1ed5bSDimitry Andric
216359d1ed5bSDimitry Andric llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::write_register, Types);
216459d1ed5bSDimitry Andric llvm::Value *Value = Src.getScalarVal();
216559d1ed5bSDimitry Andric if (OrigTy->isPointerTy())
216659d1ed5bSDimitry Andric Value = Builder.CreatePtrToInt(Value, Ty);
216733956c43SDimitry Andric Builder.CreateCall(
216833956c43SDimitry Andric F, {llvm::MetadataAsValue::get(Ty->getContext(), RegName), Value});
216959d1ed5bSDimitry Andric }
217059d1ed5bSDimitry Andric
217159d1ed5bSDimitry Andric // setObjCGCLValueClass - sets class of the lvalue for the purpose of
2172f22ef01cSRoman Divacky // generating write-barries API. It is currently a global, ivar,
2173f22ef01cSRoman Divacky // or neither.
setObjCGCLValueClass(const ASTContext & Ctx,const Expr * E,LValue & LV,bool IsMemberAccess=false)2174f22ef01cSRoman Divacky static void setObjCGCLValueClass(const ASTContext &Ctx, const Expr *E,
21756122f3e6SDimitry Andric LValue &LV,
21766122f3e6SDimitry Andric bool IsMemberAccess=false) {
2177dff0c46cSDimitry Andric if (Ctx.getLangOpts().getGC() == LangOptions::NonGC)
2178f22ef01cSRoman Divacky return;
2179f22ef01cSRoman Divacky
2180f22ef01cSRoman Divacky if (isa<ObjCIvarRefExpr>(E)) {
21816122f3e6SDimitry Andric QualType ExpTy = E->getType();
21826122f3e6SDimitry Andric if (IsMemberAccess && ExpTy->isPointerType()) {
21836122f3e6SDimitry Andric // If ivar is a structure pointer, assigning to field of
21846122f3e6SDimitry Andric // this struct follows gcc's behavior and makes it a non-ivar
21856122f3e6SDimitry Andric // writer-barrier conservatively.
21866122f3e6SDimitry Andric ExpTy = ExpTy->getAs<PointerType>()->getPointeeType();
21876122f3e6SDimitry Andric if (ExpTy->isRecordType()) {
21886122f3e6SDimitry Andric LV.setObjCIvar(false);
21896122f3e6SDimitry Andric return;
21906122f3e6SDimitry Andric }
21916122f3e6SDimitry Andric }
2192e580952dSDimitry Andric LV.setObjCIvar(true);
219359d1ed5bSDimitry Andric auto *Exp = cast<ObjCIvarRefExpr>(const_cast<Expr *>(E));
2194f22ef01cSRoman Divacky LV.setBaseIvarExp(Exp->getBase());
2195e580952dSDimitry Andric LV.setObjCArray(E->getType()->isArrayType());
2196f22ef01cSRoman Divacky return;
2197f22ef01cSRoman Divacky }
2198f22ef01cSRoman Divacky
219959d1ed5bSDimitry Andric if (const auto *Exp = dyn_cast<DeclRefExpr>(E)) {
220059d1ed5bSDimitry Andric if (const auto *VD = dyn_cast<VarDecl>(Exp->getDecl())) {
22012754fe60SDimitry Andric if (VD->hasGlobalStorage()) {
2202e580952dSDimitry Andric LV.setGlobalObjCRef(true);
2203284c1978SDimitry Andric LV.setThreadLocalRef(VD->getTLSKind() != VarDecl::TLS_None);
2204f22ef01cSRoman Divacky }
2205e580952dSDimitry Andric }
2206e580952dSDimitry Andric LV.setObjCArray(E->getType()->isArrayType());
2207f22ef01cSRoman Divacky return;
2208f22ef01cSRoman Divacky }
2209f22ef01cSRoman Divacky
221059d1ed5bSDimitry Andric if (const auto *Exp = dyn_cast<UnaryOperator>(E)) {
22116122f3e6SDimitry Andric setObjCGCLValueClass(Ctx, Exp->getSubExpr(), LV, IsMemberAccess);
2212f22ef01cSRoman Divacky return;
2213f22ef01cSRoman Divacky }
2214f22ef01cSRoman Divacky
221559d1ed5bSDimitry Andric if (const auto *Exp = dyn_cast<ParenExpr>(E)) {
22166122f3e6SDimitry Andric setObjCGCLValueClass(Ctx, Exp->getSubExpr(), LV, IsMemberAccess);
2217f22ef01cSRoman Divacky if (LV.isObjCIvar()) {
2218f22ef01cSRoman Divacky // If cast is to a structure pointer, follow gcc's behavior and make it
2219f22ef01cSRoman Divacky // a non-ivar write-barrier.
2220f22ef01cSRoman Divacky QualType ExpTy = E->getType();
2221f22ef01cSRoman Divacky if (ExpTy->isPointerType())
2222f22ef01cSRoman Divacky ExpTy = ExpTy->getAs<PointerType>()->getPointeeType();
2223f22ef01cSRoman Divacky if (ExpTy->isRecordType())
2224e580952dSDimitry Andric LV.setObjCIvar(false);
2225f22ef01cSRoman Divacky }
2226f22ef01cSRoman Divacky return;
2227f22ef01cSRoman Divacky }
22283b0f4066SDimitry Andric
222959d1ed5bSDimitry Andric if (const auto *Exp = dyn_cast<GenericSelectionExpr>(E)) {
22303b0f4066SDimitry Andric setObjCGCLValueClass(Ctx, Exp->getResultExpr(), LV);
22313b0f4066SDimitry Andric return;
22323b0f4066SDimitry Andric }
22333b0f4066SDimitry Andric
223459d1ed5bSDimitry Andric if (const auto *Exp = dyn_cast<ImplicitCastExpr>(E)) {
22356122f3e6SDimitry Andric setObjCGCLValueClass(Ctx, Exp->getSubExpr(), LV, IsMemberAccess);
2236f22ef01cSRoman Divacky return;
2237f22ef01cSRoman Divacky }
2238f22ef01cSRoman Divacky
223959d1ed5bSDimitry Andric if (const auto *Exp = dyn_cast<CStyleCastExpr>(E)) {
22406122f3e6SDimitry Andric setObjCGCLValueClass(Ctx, Exp->getSubExpr(), LV, IsMemberAccess);
2241f22ef01cSRoman Divacky return;
2242f22ef01cSRoman Divacky }
2243f22ef01cSRoman Divacky
224459d1ed5bSDimitry Andric if (const auto *Exp = dyn_cast<ObjCBridgedCastExpr>(E)) {
22456122f3e6SDimitry Andric setObjCGCLValueClass(Ctx, Exp->getSubExpr(), LV, IsMemberAccess);
224617a519f9SDimitry Andric return;
224717a519f9SDimitry Andric }
224817a519f9SDimitry Andric
224959d1ed5bSDimitry Andric if (const auto *Exp = dyn_cast<ArraySubscriptExpr>(E)) {
2250f22ef01cSRoman Divacky setObjCGCLValueClass(Ctx, Exp->getBase(), LV);
2251f22ef01cSRoman Divacky if (LV.isObjCIvar() && !LV.isObjCArray())
2252f22ef01cSRoman Divacky // Using array syntax to assigning to what an ivar points to is not
2253f22ef01cSRoman Divacky // same as assigning to the ivar itself. {id *Names;} Names[i] = 0;
2254e580952dSDimitry Andric LV.setObjCIvar(false);
2255f22ef01cSRoman Divacky else if (LV.isGlobalObjCRef() && !LV.isObjCArray())
2256f22ef01cSRoman Divacky // Using array syntax to assigning to what global points to is not
2257f22ef01cSRoman Divacky // same as assigning to the global itself. {id *G;} G[i] = 0;
2258e580952dSDimitry Andric LV.setGlobalObjCRef(false);
2259f22ef01cSRoman Divacky return;
2260f22ef01cSRoman Divacky }
2261f22ef01cSRoman Divacky
226259d1ed5bSDimitry Andric if (const auto *Exp = dyn_cast<MemberExpr>(E)) {
22636122f3e6SDimitry Andric setObjCGCLValueClass(Ctx, Exp->getBase(), LV, true);
2264f22ef01cSRoman Divacky // We don't know if member is an 'ivar', but this flag is looked at
2265f22ef01cSRoman Divacky // only in the context of LV.isObjCIvar().
2266e580952dSDimitry Andric LV.setObjCArray(E->getType()->isArrayType());
2267f22ef01cSRoman Divacky return;
2268f22ef01cSRoman Divacky }
2269f22ef01cSRoman Divacky }
2270f22ef01cSRoman Divacky
227117a519f9SDimitry Andric static llvm::Value *
EmitBitCastOfLValueToProperType(CodeGenFunction & CGF,llvm::Value * V,llvm::Type * IRType,StringRef Name=StringRef ())227217a519f9SDimitry Andric EmitBitCastOfLValueToProperType(CodeGenFunction &CGF,
227317a519f9SDimitry Andric llvm::Value *V, llvm::Type *IRType,
22746122f3e6SDimitry Andric StringRef Name = StringRef()) {
227517a519f9SDimitry Andric unsigned AS = cast<llvm::PointerType>(V->getType())->getAddressSpace();
227617a519f9SDimitry Andric return CGF.Builder.CreateBitCast(V, IRType->getPointerTo(AS), Name);
227717a519f9SDimitry Andric }
227817a519f9SDimitry Andric
EmitThreadPrivateVarDeclLValue(CodeGenFunction & CGF,const VarDecl * VD,QualType T,Address Addr,llvm::Type * RealVarTy,SourceLocation Loc)227939d628a0SDimitry Andric static LValue EmitThreadPrivateVarDeclLValue(
22800623d748SDimitry Andric CodeGenFunction &CGF, const VarDecl *VD, QualType T, Address Addr,
22810623d748SDimitry Andric llvm::Type *RealVarTy, SourceLocation Loc) {
22820623d748SDimitry Andric Addr = CGF.CGM.getOpenMPRuntime().getAddrOfThreadPrivate(CGF, VD, Addr, Loc);
22830623d748SDimitry Andric Addr = CGF.Builder.CreateElementBitCast(Addr, RealVarTy);
22849a199699SDimitry Andric return CGF.MakeAddrLValue(Addr, T, AlignmentSource::Decl);
22850623d748SDimitry Andric }
22860623d748SDimitry Andric
emitDeclTargetLinkVarDeclLValue(CodeGenFunction & CGF,const VarDecl * VD,QualType T)22874ba319b5SDimitry Andric static Address emitDeclTargetLinkVarDeclLValue(CodeGenFunction &CGF,
22884ba319b5SDimitry Andric const VarDecl *VD, QualType T) {
2289*b5893f02SDimitry Andric llvm::Optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
2290*b5893f02SDimitry Andric OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD);
2291*b5893f02SDimitry Andric if (!Res || *Res == OMPDeclareTargetDeclAttr::MT_To)
22924ba319b5SDimitry Andric return Address::invalid();
2293*b5893f02SDimitry Andric assert(*Res == OMPDeclareTargetDeclAttr::MT_Link && "Expected link clause");
2294*b5893f02SDimitry Andric QualType PtrTy = CGF.getContext().getPointerType(VD->getType());
2295*b5893f02SDimitry Andric Address Addr = CGF.CGM.getOpenMPRuntime().getAddrOfDeclareTargetLink(VD);
2296*b5893f02SDimitry Andric return CGF.EmitLoadOfPointer(Addr, PtrTy->castAs<PointerType>());
22974ba319b5SDimitry Andric }
22984ba319b5SDimitry Andric
22999a199699SDimitry Andric Address
EmitLoadOfReference(LValue RefLVal,LValueBaseInfo * PointeeBaseInfo,TBAAAccessInfo * PointeeTBAAInfo)23009a199699SDimitry Andric CodeGenFunction::EmitLoadOfReference(LValue RefLVal,
23019a199699SDimitry Andric LValueBaseInfo *PointeeBaseInfo,
23029a199699SDimitry Andric TBAAAccessInfo *PointeeTBAAInfo) {
23039a199699SDimitry Andric llvm::LoadInst *Load = Builder.CreateLoad(RefLVal.getAddress(),
23049a199699SDimitry Andric RefLVal.isVolatile());
23059a199699SDimitry Andric CGM.DecorateInstructionWithTBAA(Load, RefLVal.getTBAAInfo());
23069a199699SDimitry Andric
23079a199699SDimitry Andric CharUnits Align = getNaturalTypeAlignment(RefLVal.getType()->getPointeeType(),
23089a199699SDimitry Andric PointeeBaseInfo, PointeeTBAAInfo,
23099a199699SDimitry Andric /* forPointeeType= */ true);
23109a199699SDimitry Andric return Address(Load, Align);
23110623d748SDimitry Andric }
23120623d748SDimitry Andric
EmitLoadOfReferenceLValue(LValue RefLVal)23139a199699SDimitry Andric LValue CodeGenFunction::EmitLoadOfReferenceLValue(LValue RefLVal) {
23149a199699SDimitry Andric LValueBaseInfo PointeeBaseInfo;
23159a199699SDimitry Andric TBAAAccessInfo PointeeTBAAInfo;
23169a199699SDimitry Andric Address PointeeAddr = EmitLoadOfReference(RefLVal, &PointeeBaseInfo,
23179a199699SDimitry Andric &PointeeTBAAInfo);
23189a199699SDimitry Andric return MakeAddrLValue(PointeeAddr, RefLVal.getType()->getPointeeType(),
23199a199699SDimitry Andric PointeeBaseInfo, PointeeTBAAInfo);
232039d628a0SDimitry Andric }
232139d628a0SDimitry Andric
EmitLoadOfPointer(Address Ptr,const PointerType * PtrTy,LValueBaseInfo * BaseInfo,TBAAAccessInfo * TBAAInfo)2322e7145dcbSDimitry Andric Address CodeGenFunction::EmitLoadOfPointer(Address Ptr,
2323e7145dcbSDimitry Andric const PointerType *PtrTy,
23249a199699SDimitry Andric LValueBaseInfo *BaseInfo,
23259a199699SDimitry Andric TBAAAccessInfo *TBAAInfo) {
2326e7145dcbSDimitry Andric llvm::Value *Addr = Builder.CreateLoad(Ptr);
2327d8866befSDimitry Andric return Address(Addr, getNaturalTypeAlignment(PtrTy->getPointeeType(),
23289a199699SDimitry Andric BaseInfo, TBAAInfo,
2329e7145dcbSDimitry Andric /*forPointeeType=*/true));
2330e7145dcbSDimitry Andric }
2331e7145dcbSDimitry Andric
EmitLoadOfPointerLValue(Address PtrAddr,const PointerType * PtrTy)2332e7145dcbSDimitry Andric LValue CodeGenFunction::EmitLoadOfPointerLValue(Address PtrAddr,
2333e7145dcbSDimitry Andric const PointerType *PtrTy) {
2334d8866befSDimitry Andric LValueBaseInfo BaseInfo;
23359a199699SDimitry Andric TBAAAccessInfo TBAAInfo;
23369a199699SDimitry Andric Address Addr = EmitLoadOfPointer(PtrAddr, PtrTy, &BaseInfo, &TBAAInfo);
23379a199699SDimitry Andric return MakeAddrLValue(Addr, PtrTy->getPointeeType(), BaseInfo, TBAAInfo);
2338e7145dcbSDimitry Andric }
2339e7145dcbSDimitry Andric
EmitGlobalVarDeclLValue(CodeGenFunction & CGF,const Expr * E,const VarDecl * VD)2340f22ef01cSRoman Divacky static LValue EmitGlobalVarDeclLValue(CodeGenFunction &CGF,
2341f22ef01cSRoman Divacky const Expr *E, const VarDecl *VD) {
234259d1ed5bSDimitry Andric QualType T = E->getType();
234359d1ed5bSDimitry Andric
234459d1ed5bSDimitry Andric // If it's thread_local, emit a call to its wrapper function instead.
234539d628a0SDimitry Andric if (VD->getTLSKind() == VarDecl::TLS_Dynamic &&
234639d628a0SDimitry Andric CGF.CGM.getCXXABI().usesThreadWrapperFunction())
234759d1ed5bSDimitry Andric return CGF.CGM.getCXXABI().EmitThreadLocalVarDeclLValue(CGF, VD, T);
23484ba319b5SDimitry Andric // Check if the variable is marked as declare target with link clause in
23494ba319b5SDimitry Andric // device codegen.
23504ba319b5SDimitry Andric if (CGF.getLangOpts().OpenMPIsDevice) {
23514ba319b5SDimitry Andric Address Addr = emitDeclTargetLinkVarDeclLValue(CGF, VD, T);
23524ba319b5SDimitry Andric if (Addr.isValid())
23534ba319b5SDimitry Andric return CGF.MakeAddrLValue(Addr, T, AlignmentSource::Decl);
23544ba319b5SDimitry Andric }
235559d1ed5bSDimitry Andric
2356f22ef01cSRoman Divacky llvm::Value *V = CGF.CGM.GetAddrOfGlobalVar(VD);
2357dff0c46cSDimitry Andric llvm::Type *RealVarTy = CGF.getTypes().ConvertTypeForMem(VD->getType());
2358dff0c46cSDimitry Andric V = EmitBitCastOfLValueToProperType(CGF, V, RealVarTy);
2359dff0c46cSDimitry Andric CharUnits Alignment = CGF.getContext().getDeclAlign(VD);
23600623d748SDimitry Andric Address Addr(V, Alignment);
236139d628a0SDimitry Andric // Emit reference to the private copy of the variable if it is an OpenMP
236239d628a0SDimitry Andric // threadprivate variable.
236330785c0eSDimitry Andric if (CGF.getLangOpts().OpenMP && !CGF.getLangOpts().OpenMPSimd &&
236430785c0eSDimitry Andric VD->hasAttr<OMPThreadPrivateDeclAttr>()) {
23650623d748SDimitry Andric return EmitThreadPrivateVarDeclLValue(CGF, VD, T, Addr, RealVarTy,
236639d628a0SDimitry Andric E->getExprLoc());
236730785c0eSDimitry Andric }
23689a199699SDimitry Andric LValue LV = VD->getType()->isReferenceType() ?
23699a199699SDimitry Andric CGF.EmitLoadOfReferenceLValue(Addr, VD->getType(),
23709a199699SDimitry Andric AlignmentSource::Decl) :
23719a199699SDimitry Andric CGF.MakeAddrLValue(Addr, T, AlignmentSource::Decl);
2372f22ef01cSRoman Divacky setObjCGCLValueClass(CGF.getContext(), E, LV);
2373f22ef01cSRoman Divacky return LV;
2374f22ef01cSRoman Divacky }
2375f22ef01cSRoman Divacky
EmitFunctionDeclPointer(CodeGenModule & CGM,const FunctionDecl * FD)237644290647SDimitry Andric static llvm::Constant *EmitFunctionDeclPointer(CodeGenModule &CGM,
237744290647SDimitry Andric const FunctionDecl *FD) {
237844290647SDimitry Andric if (FD->hasAttr<WeakRefAttr>()) {
237944290647SDimitry Andric ConstantAddress aliasee = CGM.GetWeakRefReference(FD);
238044290647SDimitry Andric return aliasee.getPointer();
238144290647SDimitry Andric }
238244290647SDimitry Andric
238344290647SDimitry Andric llvm::Constant *V = CGM.GetAddrOfFunction(FD);
2384f22ef01cSRoman Divacky if (!FD->hasPrototype()) {
2385f22ef01cSRoman Divacky if (const FunctionProtoType *Proto =
2386f22ef01cSRoman Divacky FD->getType()->getAs<FunctionProtoType>()) {
2387f22ef01cSRoman Divacky // Ugly case: for a K&R-style definition, the type of the definition
2388f22ef01cSRoman Divacky // isn't the same as the type of a use. Correct for this with a
2389f22ef01cSRoman Divacky // bitcast.
2390f22ef01cSRoman Divacky QualType NoProtoType =
239144290647SDimitry Andric CGM.getContext().getFunctionNoProtoType(Proto->getReturnType());
239244290647SDimitry Andric NoProtoType = CGM.getContext().getPointerType(NoProtoType);
239344290647SDimitry Andric V = llvm::ConstantExpr::getBitCast(V,
239444290647SDimitry Andric CGM.getTypes().ConvertType(NoProtoType));
2395f22ef01cSRoman Divacky }
2396f22ef01cSRoman Divacky }
239744290647SDimitry Andric return V;
239844290647SDimitry Andric }
239944290647SDimitry Andric
EmitFunctionDeclLValue(CodeGenFunction & CGF,const Expr * E,const FunctionDecl * FD)240044290647SDimitry Andric static LValue EmitFunctionDeclLValue(CodeGenFunction &CGF,
240144290647SDimitry Andric const Expr *E, const FunctionDecl *FD) {
240244290647SDimitry Andric llvm::Value *V = EmitFunctionDeclPointer(CGF.CGM, FD);
2403dff0c46cSDimitry Andric CharUnits Alignment = CGF.getContext().getDeclAlign(FD);
24049a199699SDimitry Andric return CGF.MakeAddrLValue(V, E->getType(), Alignment,
24059a199699SDimitry Andric AlignmentSource::Decl);
2406f22ef01cSRoman Divacky }
2407f22ef01cSRoman Divacky
EmitCapturedFieldLValue(CodeGenFunction & CGF,const FieldDecl * FD,llvm::Value * ThisValue)2408f785676fSDimitry Andric static LValue EmitCapturedFieldLValue(CodeGenFunction &CGF, const FieldDecl *FD,
2409f785676fSDimitry Andric llvm::Value *ThisValue) {
2410f785676fSDimitry Andric QualType TagType = CGF.getContext().getTagDeclType(FD->getParent());
2411f785676fSDimitry Andric LValue LV = CGF.MakeNaturalAlignAddrLValue(ThisValue, TagType);
2412f785676fSDimitry Andric return CGF.EmitLValueForField(LV, FD);
2413f785676fSDimitry Andric }
2414f785676fSDimitry Andric
241559d1ed5bSDimitry Andric /// Named Registers are named metadata pointing to the register name
241659d1ed5bSDimitry Andric /// which will be read from/written to as an argument to the intrinsic
241759d1ed5bSDimitry Andric /// @llvm.read/write_register.
241859d1ed5bSDimitry Andric /// So far, only the name is being passed down, but other options such as
241959d1ed5bSDimitry Andric /// register type, allocation type or even optimization options could be
242059d1ed5bSDimitry Andric /// passed down via the metadata node.
EmitGlobalNamedRegister(const VarDecl * VD,CodeGenModule & CGM)24210623d748SDimitry Andric static LValue EmitGlobalNamedRegister(const VarDecl *VD, CodeGenModule &CGM) {
242259d1ed5bSDimitry Andric SmallString<64> Name("llvm.named.register.");
242359d1ed5bSDimitry Andric AsmLabelAttr *Asm = VD->getAttr<AsmLabelAttr>();
242459d1ed5bSDimitry Andric assert(Asm->getLabel().size() < 64-Name.size() &&
242559d1ed5bSDimitry Andric "Register name too big");
242659d1ed5bSDimitry Andric Name.append(Asm->getLabel());
242759d1ed5bSDimitry Andric llvm::NamedMDNode *M =
242859d1ed5bSDimitry Andric CGM.getModule().getOrInsertNamedMetadata(Name);
242959d1ed5bSDimitry Andric if (M->getNumOperands() == 0) {
243059d1ed5bSDimitry Andric llvm::MDString *Str = llvm::MDString::get(CGM.getLLVMContext(),
243159d1ed5bSDimitry Andric Asm->getLabel());
243239d628a0SDimitry Andric llvm::Metadata *Ops[] = {Str};
243359d1ed5bSDimitry Andric M->addOperand(llvm::MDNode::get(CGM.getLLVMContext(), Ops));
243459d1ed5bSDimitry Andric }
24350623d748SDimitry Andric
24360623d748SDimitry Andric CharUnits Alignment = CGM.getContext().getDeclAlign(VD);
24370623d748SDimitry Andric
24380623d748SDimitry Andric llvm::Value *Ptr =
24390623d748SDimitry Andric llvm::MetadataAsValue::get(CGM.getLLVMContext(), M->getOperand(0));
24400623d748SDimitry Andric return LValue::MakeGlobalReg(Address(Ptr, Alignment), VD->getType());
244159d1ed5bSDimitry Andric }
244259d1ed5bSDimitry Andric
EmitDeclRefLValue(const DeclRefExpr * E)2443f22ef01cSRoman Divacky LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
2444f22ef01cSRoman Divacky const NamedDecl *ND = E->getDecl();
2445dff0c46cSDimitry Andric QualType T = E->getType();
2446dff0c46cSDimitry Andric
244759d1ed5bSDimitry Andric if (const auto *VD = dyn_cast<VarDecl>(ND)) {
244859d1ed5bSDimitry Andric // Global Named registers access via intrinsics only
244959d1ed5bSDimitry Andric if (VD->getStorageClass() == SC_Register &&
245059d1ed5bSDimitry Andric VD->hasAttr<AsmLabelAttr>() && !VD->isLocalVarDecl())
24510623d748SDimitry Andric return EmitGlobalNamedRegister(VD, CGM);
245259d1ed5bSDimitry Andric
24533861d79fSDimitry Andric // A DeclRefExpr for a reference initialized by a constant expression can
24543861d79fSDimitry Andric // appear without being odr-used. Directly emit the constant initializer.
24553861d79fSDimitry Andric const Expr *Init = VD->getAnyInitializer(VD);
24564ba319b5SDimitry Andric const auto *BD = dyn_cast_or_null<BlockDecl>(CurCodeDecl);
24573861d79fSDimitry Andric if (Init && !isa<ParmVarDecl>(VD) && VD->getType()->isReferenceType() &&
24583861d79fSDimitry Andric VD->isUsableInConstantExpressions(getContext()) &&
24590623d748SDimitry Andric VD->checkInitIsICE() &&
24600623d748SDimitry Andric // Do not emit if it is private OpenMP variable.
24619a199699SDimitry Andric !(E->refersToEnclosingVariableOrCapture() &&
24629a199699SDimitry Andric ((CapturedStmtInfo &&
24639a199699SDimitry Andric (LocalDeclMap.count(VD->getCanonicalDecl()) ||
24649a199699SDimitry Andric CapturedStmtInfo->lookup(VD->getCanonicalDecl()))) ||
24659a199699SDimitry Andric LambdaCaptureFields.lookup(VD->getCanonicalDecl()) ||
24664ba319b5SDimitry Andric (BD && BD->capturesVariable(VD))))) {
24673861d79fSDimitry Andric llvm::Constant *Val =
24689a199699SDimitry Andric ConstantEmitter(*this).emitAbstract(E->getLocation(),
24699a199699SDimitry Andric *VD->evaluateValue(),
24709a199699SDimitry Andric VD->getType());
24713861d79fSDimitry Andric assert(Val && "failed to emit reference constant expression");
24723861d79fSDimitry Andric // FIXME: Eventually we will want to emit vector element references.
24730623d748SDimitry Andric
24740623d748SDimitry Andric // Should we be using the alignment of the constant pointer we emitted?
24759a199699SDimitry Andric CharUnits Alignment = getNaturalTypeAlignment(E->getType(),
24769a199699SDimitry Andric /* BaseInfo= */ nullptr,
24779a199699SDimitry Andric /* TBAAInfo= */ nullptr,
24789a199699SDimitry Andric /* forPointeeType= */ true);
24799a199699SDimitry Andric return MakeAddrLValue(Address(Val, Alignment), T, AlignmentSource::Decl);
24803861d79fSDimitry Andric }
248139d628a0SDimitry Andric
248239d628a0SDimitry Andric // Check for captured variables.
248339d628a0SDimitry Andric if (E->refersToEnclosingVariableOrCapture()) {
24849a199699SDimitry Andric VD = VD->getCanonicalDecl();
248539d628a0SDimitry Andric if (auto *FD = LambdaCaptureFields.lookup(VD))
248639d628a0SDimitry Andric return EmitCapturedFieldLValue(*this, FD, CXXABIThisValue);
248739d628a0SDimitry Andric else if (CapturedStmtInfo) {
2488f41fbc90SDimitry Andric auto I = LocalDeclMap.find(VD);
2489f41fbc90SDimitry Andric if (I != LocalDeclMap.end()) {
24909a199699SDimitry Andric if (VD->getType()->isReferenceType())
24919a199699SDimitry Andric return EmitLoadOfReferenceLValue(I->second, VD->getType(),
24929a199699SDimitry Andric AlignmentSource::Decl);
2493f41fbc90SDimitry Andric return MakeAddrLValue(I->second, T);
24940623d748SDimitry Andric }
24950623d748SDimitry Andric LValue CapLVal =
24960623d748SDimitry Andric EmitCapturedFieldLValue(*this, CapturedStmtInfo->lookup(VD),
24970623d748SDimitry Andric CapturedStmtInfo->getContextValue());
24980623d748SDimitry Andric return MakeAddrLValue(
24990623d748SDimitry Andric Address(CapLVal.getPointer(), getContext().getDeclAlign(VD)),
25009a199699SDimitry Andric CapLVal.getType(), LValueBaseInfo(AlignmentSource::Decl),
25019a199699SDimitry Andric CapLVal.getTBAAInfo());
25020623d748SDimitry Andric }
25030623d748SDimitry Andric
250439d628a0SDimitry Andric assert(isa<BlockDecl>(CurCodeDecl));
2505*b5893f02SDimitry Andric Address addr = GetAddrOfBlockDecl(VD);
25069a199699SDimitry Andric return MakeAddrLValue(addr, T, AlignmentSource::Decl);
250739d628a0SDimitry Andric }
25083861d79fSDimitry Andric }
25093861d79fSDimitry Andric
2510dff0c46cSDimitry Andric // FIXME: We should be able to assert this for FunctionDecls as well!
2511dff0c46cSDimitry Andric // FIXME: We should be able to assert this for all DeclRefExprs, not just
2512dff0c46cSDimitry Andric // those with a valid source location.
2513dff0c46cSDimitry Andric assert((ND->isUsed(false) || !isa<VarDecl>(ND) ||
2514dff0c46cSDimitry Andric !E->getLocation().isValid()) &&
2515dff0c46cSDimitry Andric "Should not use decl without marking it used!");
2516f22ef01cSRoman Divacky
2517f22ef01cSRoman Divacky if (ND->hasAttr<WeakRefAttr>()) {
251859d1ed5bSDimitry Andric const auto *VD = cast<ValueDecl>(ND);
25190623d748SDimitry Andric ConstantAddress Aliasee = CGM.GetWeakRefReference(VD);
25209a199699SDimitry Andric return MakeAddrLValue(Aliasee, T, AlignmentSource::Decl);
2521f22ef01cSRoman Divacky }
2522f22ef01cSRoman Divacky
252359d1ed5bSDimitry Andric if (const auto *VD = dyn_cast<VarDecl>(ND)) {
2524f22ef01cSRoman Divacky // Check if this is a global variable.
252559d1ed5bSDimitry Andric if (VD->hasLinkage() || VD->isStaticDataMember())
2526f22ef01cSRoman Divacky return EmitGlobalVarDeclLValue(*this, E, VD);
2527f22ef01cSRoman Divacky
25280623d748SDimitry Andric Address addr = Address::invalid();
2529dff0c46cSDimitry Andric
25300623d748SDimitry Andric // The variable should generally be present in the local decl map.
25310623d748SDimitry Andric auto iter = LocalDeclMap.find(VD);
25320623d748SDimitry Andric if (iter != LocalDeclMap.end()) {
25330623d748SDimitry Andric addr = iter->second;
2534dff0c46cSDimitry Andric
25350623d748SDimitry Andric // Otherwise, it might be static local we haven't emitted yet for
25360623d748SDimitry Andric // some reason; most likely, because it's in an outer function.
25370623d748SDimitry Andric } else if (VD->isStaticLocal()) {
25380623d748SDimitry Andric addr = Address(CGM.getOrCreateStaticVarDecl(
25390623d748SDimitry Andric *VD, CGM.getLLVMLinkageVarDefinition(VD, /*isConstant=*/false)),
25400623d748SDimitry Andric getContext().getDeclAlign(VD));
2541dff0c46cSDimitry Andric
25420623d748SDimitry Andric // No other cases for now.
2543dff0c46cSDimitry Andric } else {
25440623d748SDimitry Andric llvm_unreachable("DeclRefExpr for Decl not entered in LocalDeclMap?");
25450623d748SDimitry Andric }
25460623d748SDimitry Andric
25470623d748SDimitry Andric
25480623d748SDimitry Andric // Check for OpenMP threadprivate variables.
254930785c0eSDimitry Andric if (getLangOpts().OpenMP && !getLangOpts().OpenMPSimd &&
255030785c0eSDimitry Andric VD->hasAttr<OMPThreadPrivateDeclAttr>()) {
25510623d748SDimitry Andric return EmitThreadPrivateVarDeclLValue(
25520623d748SDimitry Andric *this, VD, T, addr, getTypes().ConvertTypeForMem(VD->getType()),
25530623d748SDimitry Andric E->getExprLoc());
25540623d748SDimitry Andric }
25550623d748SDimitry Andric
25560623d748SDimitry Andric // Drill into block byref variables.
2557*b5893f02SDimitry Andric bool isBlockByref = VD->isEscapingByref();
25580623d748SDimitry Andric if (isBlockByref) {
25590623d748SDimitry Andric addr = emitBlockByrefAddress(addr, VD);
25600623d748SDimitry Andric }
25610623d748SDimitry Andric
25620623d748SDimitry Andric // Drill into reference types.
25639a199699SDimitry Andric LValue LV = VD->getType()->isReferenceType() ?
25649a199699SDimitry Andric EmitLoadOfReferenceLValue(addr, VD->getType(), AlignmentSource::Decl) :
25659a199699SDimitry Andric MakeAddrLValue(addr, T, AlignmentSource::Decl);
2566e580952dSDimitry Andric
2567139f7f9bSDimitry Andric bool isLocalStorage = VD->hasLocalStorage();
2568139f7f9bSDimitry Andric
2569139f7f9bSDimitry Andric bool NonGCable = isLocalStorage &&
2570139f7f9bSDimitry Andric !VD->getType()->isReferenceType() &&
25710623d748SDimitry Andric !isBlockByref;
2572e580952dSDimitry Andric if (NonGCable) {
2573e580952dSDimitry Andric LV.getQuals().removeObjCGCAttr();
2574e580952dSDimitry Andric LV.setNonGC(true);
2575e580952dSDimitry Andric }
2576139f7f9bSDimitry Andric
2577139f7f9bSDimitry Andric bool isImpreciseLifetime =
2578139f7f9bSDimitry Andric (isLocalStorage && !VD->hasAttr<ObjCPreciseLifetimeAttr>());
2579139f7f9bSDimitry Andric if (isImpreciseLifetime)
2580139f7f9bSDimitry Andric LV.setARCPreciseLifetime(ARCImpreciseLifetime);
2581f22ef01cSRoman Divacky setObjCGCLValueClass(getContext(), E, LV);
2582f22ef01cSRoman Divacky return LV;
2583f22ef01cSRoman Divacky }
2584f22ef01cSRoman Divacky
258559d1ed5bSDimitry Andric if (const auto *FD = dyn_cast<FunctionDecl>(ND))
2586f785676fSDimitry Andric return EmitFunctionDeclLValue(*this, E, FD);
2587f22ef01cSRoman Divacky
258844290647SDimitry Andric // FIXME: While we're emitting a binding from an enclosing scope, all other
258944290647SDimitry Andric // DeclRefExprs we see should be implicitly treated as if they also refer to
259044290647SDimitry Andric // an enclosing scope.
259144290647SDimitry Andric if (const auto *BD = dyn_cast<BindingDecl>(ND))
259244290647SDimitry Andric return EmitLValue(BD->getBinding());
259344290647SDimitry Andric
25946122f3e6SDimitry Andric llvm_unreachable("Unhandled DeclRefExpr");
2595f22ef01cSRoman Divacky }
2596f22ef01cSRoman Divacky
EmitUnaryOpLValue(const UnaryOperator * E)2597f22ef01cSRoman Divacky LValue CodeGenFunction::EmitUnaryOpLValue(const UnaryOperator *E) {
2598f22ef01cSRoman Divacky // __extension__ doesn't affect lvalue-ness.
2599e580952dSDimitry Andric if (E->getOpcode() == UO_Extension)
2600f22ef01cSRoman Divacky return EmitLValue(E->getSubExpr());
2601f22ef01cSRoman Divacky
2602f22ef01cSRoman Divacky QualType ExprTy = getContext().getCanonicalType(E->getSubExpr()->getType());
2603f22ef01cSRoman Divacky switch (E->getOpcode()) {
26046122f3e6SDimitry Andric default: llvm_unreachable("Unknown unary operator lvalue!");
2605e580952dSDimitry Andric case UO_Deref: {
2606f22ef01cSRoman Divacky QualType T = E->getSubExpr()->getType()->getPointeeType();
2607f22ef01cSRoman Divacky assert(!T.isNull() && "CodeGenFunction::EmitUnaryOpLValue: Illegal type");
2608f22ef01cSRoman Divacky
2609d8866befSDimitry Andric LValueBaseInfo BaseInfo;
26109a199699SDimitry Andric TBAAAccessInfo TBAAInfo;
26119a199699SDimitry Andric Address Addr = EmitPointerWithAlignment(E->getSubExpr(), &BaseInfo,
26129a199699SDimitry Andric &TBAAInfo);
26139a199699SDimitry Andric LValue LV = MakeAddrLValue(Addr, T, BaseInfo, TBAAInfo);
2614e580952dSDimitry Andric LV.getQuals().setAddressSpace(ExprTy.getAddressSpace());
2615f22ef01cSRoman Divacky
2616f22ef01cSRoman Divacky // We should not generate __weak write barrier on indirect reference
2617f22ef01cSRoman Divacky // of a pointer to object; as in void foo (__weak id *param); *param = 0;
2618f22ef01cSRoman Divacky // But, we continue to generate __strong write barrier on indirect write
2619f22ef01cSRoman Divacky // into a pointer to object.
2620*b5893f02SDimitry Andric if (getLangOpts().ObjC &&
26213861d79fSDimitry Andric getLangOpts().getGC() != LangOptions::NonGC &&
2622f22ef01cSRoman Divacky LV.isObjCWeak())
2623e580952dSDimitry Andric LV.setNonGC(!E->isOBJCGCCandidate(getContext()));
2624f22ef01cSRoman Divacky return LV;
2625f22ef01cSRoman Divacky }
2626e580952dSDimitry Andric case UO_Real:
2627e580952dSDimitry Andric case UO_Imag: {
2628f22ef01cSRoman Divacky LValue LV = EmitLValue(E->getSubExpr());
26292754fe60SDimitry Andric assert(LV.isSimple() && "real/imag on non-ordinary l-value");
26302754fe60SDimitry Andric
2631dff0c46cSDimitry Andric // __real is valid on scalars. This is a faster way of testing that.
2632dff0c46cSDimitry Andric // __imag can only produce an rvalue on scalars.
2633dff0c46cSDimitry Andric if (E->getOpcode() == UO_Real &&
26340623d748SDimitry Andric !LV.getAddress().getElementType()->isStructTy()) {
26352754fe60SDimitry Andric assert(E->getSubExpr()->getType()->isArithmeticType());
26362754fe60SDimitry Andric return LV;
26372754fe60SDimitry Andric }
26382754fe60SDimitry Andric
2639f41fbc90SDimitry Andric QualType T = ExprTy->castAs<ComplexType>()->getElementType();
26402754fe60SDimitry Andric
26410623d748SDimitry Andric Address Component =
26420623d748SDimitry Andric (E->getOpcode() == UO_Real
26430623d748SDimitry Andric ? emitAddrOfRealComponent(LV.getAddress(), LV.getType())
26440623d748SDimitry Andric : emitAddrOfImagComponent(LV.getAddress(), LV.getType()));
26459a199699SDimitry Andric LValue ElemLV = MakeAddrLValue(Component, T, LV.getBaseInfo(),
26469a199699SDimitry Andric CGM.getTBAAInfoForSubobject(LV, T));
2647f41fbc90SDimitry Andric ElemLV.getQuals().addQualifiers(LV.getQuals());
2648f41fbc90SDimitry Andric return ElemLV;
2649f22ef01cSRoman Divacky }
2650e580952dSDimitry Andric case UO_PreInc:
2651e580952dSDimitry Andric case UO_PreDec: {
2652f22ef01cSRoman Divacky LValue LV = EmitLValue(E->getSubExpr());
2653e580952dSDimitry Andric bool isInc = E->getOpcode() == UO_PreInc;
2654f22ef01cSRoman Divacky
2655f22ef01cSRoman Divacky if (E->getType()->isAnyComplexType())
2656f22ef01cSRoman Divacky EmitComplexPrePostIncDec(E, LV, isInc, true/*isPre*/);
2657f22ef01cSRoman Divacky else
2658f22ef01cSRoman Divacky EmitScalarPrePostIncDec(E, LV, isInc, true/*isPre*/);
2659f22ef01cSRoman Divacky return LV;
2660f22ef01cSRoman Divacky }
2661f22ef01cSRoman Divacky }
2662f22ef01cSRoman Divacky }
2663f22ef01cSRoman Divacky
EmitStringLiteralLValue(const StringLiteral * E)2664f22ef01cSRoman Divacky LValue CodeGenFunction::EmitStringLiteralLValue(const StringLiteral *E) {
2665e580952dSDimitry Andric return MakeAddrLValue(CGM.GetAddrOfConstantStringFromLiteral(E),
26669a199699SDimitry Andric E->getType(), AlignmentSource::Decl);
2667f22ef01cSRoman Divacky }
2668f22ef01cSRoman Divacky
EmitObjCEncodeExprLValue(const ObjCEncodeExpr * E)2669f22ef01cSRoman Divacky LValue CodeGenFunction::EmitObjCEncodeExprLValue(const ObjCEncodeExpr *E) {
2670e580952dSDimitry Andric return MakeAddrLValue(CGM.GetAddrOfConstantStringFromObjCEncode(E),
26719a199699SDimitry Andric E->getType(), AlignmentSource::Decl);
2672f22ef01cSRoman Divacky }
2673f22ef01cSRoman Divacky
EmitPredefinedLValue(const PredefinedExpr * E)2674e580952dSDimitry Andric LValue CodeGenFunction::EmitPredefinedLValue(const PredefinedExpr *E) {
267539d628a0SDimitry Andric auto SL = E->getFunctionName();
267639d628a0SDimitry Andric assert(SL != nullptr && "No StringLiteral name in PredefinedExpr");
26776122f3e6SDimitry Andric StringRef FnName = CurFn->getName();
2678f22ef01cSRoman Divacky if (FnName.startswith("\01"))
2679f22ef01cSRoman Divacky FnName = FnName.substr(1);
268039d628a0SDimitry Andric StringRef NameItems[] = {
2681*b5893f02SDimitry Andric PredefinedExpr::getIdentKindName(E->getIdentKind()), FnName};
268239d628a0SDimitry Andric std::string GVName = llvm::join(NameItems, NameItems + 2, ".");
26834ba319b5SDimitry Andric if (auto *BD = dyn_cast_or_null<BlockDecl>(CurCodeDecl)) {
268444290647SDimitry Andric std::string Name = SL->getString();
268544290647SDimitry Andric if (!Name.empty()) {
268644290647SDimitry Andric unsigned Discriminator =
268744290647SDimitry Andric CGM.getCXXABI().getMangleContext().getBlockId(BD, true);
268844290647SDimitry Andric if (Discriminator)
268944290647SDimitry Andric Name += "_" + Twine(Discriminator + 1).str();
269044290647SDimitry Andric auto C = CGM.GetAddrOfConstantCString(Name, GVName.c_str());
26919a199699SDimitry Andric return MakeAddrLValue(C, E->getType(), AlignmentSource::Decl);
269244290647SDimitry Andric } else {
26930623d748SDimitry Andric auto C = CGM.GetAddrOfConstantCString(FnName, GVName.c_str());
26949a199699SDimitry Andric return MakeAddrLValue(C, E->getType(), AlignmentSource::Decl);
2695f22ef01cSRoman Divacky }
269644290647SDimitry Andric }
269739d628a0SDimitry Andric auto C = CGM.GetAddrOfConstantStringFromLiteral(SL, GVName);
26989a199699SDimitry Andric return MakeAddrLValue(C, E->getType(), AlignmentSource::Decl);
2699f22ef01cSRoman Divacky }
2700f22ef01cSRoman Divacky
27013861d79fSDimitry Andric /// Emit a type description suitable for use by a runtime sanitizer library. The
27023861d79fSDimitry Andric /// format of a type descriptor is
27033861d79fSDimitry Andric ///
27043861d79fSDimitry Andric /// \code
27053861d79fSDimitry Andric /// { i16 TypeKind, i16 TypeInfo }
27063861d79fSDimitry Andric /// \endcode
27073861d79fSDimitry Andric ///
27083861d79fSDimitry Andric /// followed by an array of i8 containing the type name. TypeKind is 0 for an
27093861d79fSDimitry Andric /// integer, 1 for a floating point value, and -1 for anything else.
EmitCheckTypeDescriptor(QualType T)27103861d79fSDimitry Andric llvm::Constant *CodeGenFunction::EmitCheckTypeDescriptor(QualType T) {
2711f785676fSDimitry Andric // Only emit each type's descriptor once.
271259d1ed5bSDimitry Andric if (llvm::Constant *C = CGM.getTypeDescriptorFromMap(T))
2713f785676fSDimitry Andric return C;
2714f785676fSDimitry Andric
27153861d79fSDimitry Andric uint16_t TypeKind = -1;
27163861d79fSDimitry Andric uint16_t TypeInfo = 0;
2717f22ef01cSRoman Divacky
27183861d79fSDimitry Andric if (T->isIntegerType()) {
27193861d79fSDimitry Andric TypeKind = 0;
27203861d79fSDimitry Andric TypeInfo = (llvm::Log2_32(getContext().getTypeSize(T)) << 1) |
2721139f7f9bSDimitry Andric (T->isSignedIntegerType() ? 1 : 0);
27223861d79fSDimitry Andric } else if (T->isFloatingType()) {
27233861d79fSDimitry Andric TypeKind = 1;
27243861d79fSDimitry Andric TypeInfo = getContext().getTypeSize(T);
2725f22ef01cSRoman Divacky }
2726f22ef01cSRoman Divacky
27273861d79fSDimitry Andric // Format the type name as if for a diagnostic, including quotes and
27283861d79fSDimitry Andric // optionally an 'aka'.
2729139f7f9bSDimitry Andric SmallString<32> Buffer;
27303861d79fSDimitry Andric CGM.getDiags().ConvertArgToString(DiagnosticsEngine::ak_qualtype,
27313861d79fSDimitry Andric (intptr_t)T.getAsOpaquePtr(),
273259d1ed5bSDimitry Andric StringRef(), StringRef(), None, Buffer,
273339d628a0SDimitry Andric None);
27343861d79fSDimitry Andric
27353861d79fSDimitry Andric llvm::Constant *Components[] = {
27363861d79fSDimitry Andric Builder.getInt16(TypeKind), Builder.getInt16(TypeInfo),
27373861d79fSDimitry Andric llvm::ConstantDataArray::getString(getLLVMContext(), Buffer)
27383861d79fSDimitry Andric };
27393861d79fSDimitry Andric llvm::Constant *Descriptor = llvm::ConstantStruct::getAnon(Components);
27403861d79fSDimitry Andric
274159d1ed5bSDimitry Andric auto *GV = new llvm::GlobalVariable(
274259d1ed5bSDimitry Andric CGM.getModule(), Descriptor->getType(),
274359d1ed5bSDimitry Andric /*isConstant=*/true, llvm::GlobalVariable::PrivateLinkage, Descriptor);
2744e7145dcbSDimitry Andric GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
274539d628a0SDimitry Andric CGM.getSanitizerMetadata()->disableSanitizerForGlobal(GV);
2746f785676fSDimitry Andric
2747f785676fSDimitry Andric // Remember the descriptor for this type.
274859d1ed5bSDimitry Andric CGM.setTypeDescriptorInMap(T, GV);
2749f785676fSDimitry Andric
27503861d79fSDimitry Andric return GV;
27513861d79fSDimitry Andric }
27523861d79fSDimitry Andric
EmitCheckValue(llvm::Value * V)27533861d79fSDimitry Andric llvm::Value *CodeGenFunction::EmitCheckValue(llvm::Value *V) {
27543861d79fSDimitry Andric llvm::Type *TargetTy = IntPtrTy;
27553861d79fSDimitry Andric
27569a199699SDimitry Andric if (V->getType() == TargetTy)
27579a199699SDimitry Andric return V;
27589a199699SDimitry Andric
2759139f7f9bSDimitry Andric // Floating-point types which fit into intptr_t are bitcast to integers
2760139f7f9bSDimitry Andric // and then passed directly (after zero-extension, if necessary).
2761139f7f9bSDimitry Andric if (V->getType()->isFloatingPointTy()) {
2762139f7f9bSDimitry Andric unsigned Bits = V->getType()->getPrimitiveSizeInBits();
2763139f7f9bSDimitry Andric if (Bits <= TargetTy->getIntegerBitWidth())
2764139f7f9bSDimitry Andric V = Builder.CreateBitCast(V, llvm::Type::getIntNTy(getLLVMContext(),
2765139f7f9bSDimitry Andric Bits));
2766139f7f9bSDimitry Andric }
2767139f7f9bSDimitry Andric
27683861d79fSDimitry Andric // Integers which fit in intptr_t are zero-extended and passed directly.
27693861d79fSDimitry Andric if (V->getType()->isIntegerTy() &&
27703861d79fSDimitry Andric V->getType()->getIntegerBitWidth() <= TargetTy->getIntegerBitWidth())
27713861d79fSDimitry Andric return Builder.CreateZExt(V, TargetTy);
27723861d79fSDimitry Andric
27733861d79fSDimitry Andric // Pointers are passed directly, everything else is passed by address.
27743861d79fSDimitry Andric if (!V->getType()->isPointerTy()) {
27750623d748SDimitry Andric Address Ptr = CreateDefaultAlignTempAlloca(V->getType());
27763861d79fSDimitry Andric Builder.CreateStore(V, Ptr);
27770623d748SDimitry Andric V = Ptr.getPointer();
27783861d79fSDimitry Andric }
27793861d79fSDimitry Andric return Builder.CreatePtrToInt(V, TargetTy);
27803861d79fSDimitry Andric }
27813861d79fSDimitry Andric
27824ba319b5SDimitry Andric /// Emit a representation of a SourceLocation for passing to a handler
27833861d79fSDimitry Andric /// in a sanitizer runtime library. The format for this data is:
27843861d79fSDimitry Andric /// \code
27853861d79fSDimitry Andric /// struct SourceLocation {
27863861d79fSDimitry Andric /// const char *Filename;
27873861d79fSDimitry Andric /// int32_t Line, Column;
27883861d79fSDimitry Andric /// };
27893861d79fSDimitry Andric /// \endcode
27903861d79fSDimitry Andric /// For an invalid SourceLocation, the Filename pointer is null.
EmitCheckSourceLocation(SourceLocation Loc)27913861d79fSDimitry Andric llvm::Constant *CodeGenFunction::EmitCheckSourceLocation(SourceLocation Loc) {
279259d1ed5bSDimitry Andric llvm::Constant *Filename;
279359d1ed5bSDimitry Andric int Line, Column;
27943861d79fSDimitry Andric
279559d1ed5bSDimitry Andric PresumedLoc PLoc = getContext().getSourceManager().getPresumedLoc(Loc);
279659d1ed5bSDimitry Andric if (PLoc.isValid()) {
2797e7145dcbSDimitry Andric StringRef FilenameString = PLoc.getFilename();
2798e7145dcbSDimitry Andric
2799e7145dcbSDimitry Andric int PathComponentsToStrip =
2800e7145dcbSDimitry Andric CGM.getCodeGenOpts().EmitCheckPathComponentsToStrip;
2801e7145dcbSDimitry Andric if (PathComponentsToStrip < 0) {
2802e7145dcbSDimitry Andric assert(PathComponentsToStrip != INT_MIN);
2803e7145dcbSDimitry Andric int PathComponentsToKeep = -PathComponentsToStrip;
2804e7145dcbSDimitry Andric auto I = llvm::sys::path::rbegin(FilenameString);
2805e7145dcbSDimitry Andric auto E = llvm::sys::path::rend(FilenameString);
2806e7145dcbSDimitry Andric while (I != E && --PathComponentsToKeep)
2807e7145dcbSDimitry Andric ++I;
2808e7145dcbSDimitry Andric
2809e7145dcbSDimitry Andric FilenameString = FilenameString.substr(I - E);
2810e7145dcbSDimitry Andric } else if (PathComponentsToStrip > 0) {
2811e7145dcbSDimitry Andric auto I = llvm::sys::path::begin(FilenameString);
2812e7145dcbSDimitry Andric auto E = llvm::sys::path::end(FilenameString);
2813e7145dcbSDimitry Andric while (I != E && PathComponentsToStrip--)
2814e7145dcbSDimitry Andric ++I;
2815e7145dcbSDimitry Andric
2816e7145dcbSDimitry Andric if (I != E)
2817e7145dcbSDimitry Andric FilenameString =
2818e7145dcbSDimitry Andric FilenameString.substr(I - llvm::sys::path::begin(FilenameString));
2819e7145dcbSDimitry Andric else
2820e7145dcbSDimitry Andric FilenameString = llvm::sys::path::filename(FilenameString);
2821e7145dcbSDimitry Andric }
2822e7145dcbSDimitry Andric
2823e7145dcbSDimitry Andric auto FilenameGV = CGM.GetAddrOfConstantCString(FilenameString, ".src");
28240623d748SDimitry Andric CGM.getSanitizerMetadata()->disableSanitizerForGlobal(
28250623d748SDimitry Andric cast<llvm::GlobalVariable>(FilenameGV.getPointer()));
28260623d748SDimitry Andric Filename = FilenameGV.getPointer();
282759d1ed5bSDimitry Andric Line = PLoc.getLine();
282859d1ed5bSDimitry Andric Column = PLoc.getColumn();
282959d1ed5bSDimitry Andric } else {
283059d1ed5bSDimitry Andric Filename = llvm::Constant::getNullValue(Int8PtrTy);
283159d1ed5bSDimitry Andric Line = Column = 0;
283259d1ed5bSDimitry Andric }
283359d1ed5bSDimitry Andric
283459d1ed5bSDimitry Andric llvm::Constant *Data[] = {Filename, Builder.getInt32(Line),
283559d1ed5bSDimitry Andric Builder.getInt32(Column)};
28363861d79fSDimitry Andric
28373861d79fSDimitry Andric return llvm::ConstantStruct::getAnon(Data);
28383861d79fSDimitry Andric }
28393861d79fSDimitry Andric
284039d628a0SDimitry Andric namespace {
28414ba319b5SDimitry Andric /// Specify under what conditions this check can be recovered
284239d628a0SDimitry Andric enum class CheckRecoverableKind {
284339d628a0SDimitry Andric /// Always terminate program execution if this check fails.
284439d628a0SDimitry Andric Unrecoverable,
284539d628a0SDimitry Andric /// Check supports recovering, runtime has both fatal (noreturn) and
284639d628a0SDimitry Andric /// non-fatal handlers for this check.
284739d628a0SDimitry Andric Recoverable,
284839d628a0SDimitry Andric /// Runtime conditionally aborts, always need to support recovery.
284939d628a0SDimitry Andric AlwaysRecoverable
285039d628a0SDimitry Andric };
285139d628a0SDimitry Andric }
285239d628a0SDimitry Andric
getRecoverableKind(SanitizerMask Kind)285333956c43SDimitry Andric static CheckRecoverableKind getRecoverableKind(SanitizerMask Kind) {
285433956c43SDimitry Andric assert(llvm::countPopulation(Kind) == 1);
285539d628a0SDimitry Andric switch (Kind) {
285639d628a0SDimitry Andric case SanitizerKind::Vptr:
285739d628a0SDimitry Andric return CheckRecoverableKind::AlwaysRecoverable;
285839d628a0SDimitry Andric case SanitizerKind::Return:
285939d628a0SDimitry Andric case SanitizerKind::Unreachable:
286039d628a0SDimitry Andric return CheckRecoverableKind::Unrecoverable;
286139d628a0SDimitry Andric default:
286239d628a0SDimitry Andric return CheckRecoverableKind::Recoverable;
286339d628a0SDimitry Andric }
286439d628a0SDimitry Andric }
286539d628a0SDimitry Andric
286644290647SDimitry Andric namespace {
286744290647SDimitry Andric struct SanitizerHandlerInfo {
286844290647SDimitry Andric char const *const Name;
286944290647SDimitry Andric unsigned Version;
287044290647SDimitry Andric };
287144290647SDimitry Andric }
287244290647SDimitry Andric
287344290647SDimitry Andric const SanitizerHandlerInfo SanitizerHandlers[] = {
287444290647SDimitry Andric #define SANITIZER_CHECK(Enum, Name, Version) {#Name, Version},
287544290647SDimitry Andric LIST_SANITIZER_CHECKS
287644290647SDimitry Andric #undef SANITIZER_CHECK
287744290647SDimitry Andric };
287844290647SDimitry Andric
emitCheckHandlerCall(CodeGenFunction & CGF,llvm::FunctionType * FnType,ArrayRef<llvm::Value * > FnArgs,SanitizerHandler CheckHandler,CheckRecoverableKind RecoverKind,bool IsFatal,llvm::BasicBlock * ContBB)287939d628a0SDimitry Andric static void emitCheckHandlerCall(CodeGenFunction &CGF,
288039d628a0SDimitry Andric llvm::FunctionType *FnType,
288139d628a0SDimitry Andric ArrayRef<llvm::Value *> FnArgs,
288244290647SDimitry Andric SanitizerHandler CheckHandler,
288339d628a0SDimitry Andric CheckRecoverableKind RecoverKind, bool IsFatal,
288439d628a0SDimitry Andric llvm::BasicBlock *ContBB) {
288539d628a0SDimitry Andric assert(IsFatal || RecoverKind != CheckRecoverableKind::Unrecoverable);
2886*b5893f02SDimitry Andric Optional<ApplyDebugLocation> DL;
2887*b5893f02SDimitry Andric if (!CGF.Builder.getCurrentDebugLocation()) {
2888*b5893f02SDimitry Andric // Ensure that the call has at least an artificial debug location.
2889*b5893f02SDimitry Andric DL.emplace(CGF, SourceLocation());
2890*b5893f02SDimitry Andric }
289139d628a0SDimitry Andric bool NeedsAbortSuffix =
289239d628a0SDimitry Andric IsFatal && RecoverKind != CheckRecoverableKind::Unrecoverable;
28939a199699SDimitry Andric bool MinimalRuntime = CGF.CGM.getCodeGenOpts().SanitizeMinimalRuntime;
289444290647SDimitry Andric const SanitizerHandlerInfo &CheckInfo = SanitizerHandlers[CheckHandler];
289544290647SDimitry Andric const StringRef CheckName = CheckInfo.Name;
28969a199699SDimitry Andric std::string FnName = "__ubsan_handle_" + CheckName.str();
28979a199699SDimitry Andric if (CheckInfo.Version && !MinimalRuntime)
28989a199699SDimitry Andric FnName += "_v" + llvm::utostr(CheckInfo.Version);
28999a199699SDimitry Andric if (MinimalRuntime)
29009a199699SDimitry Andric FnName += "_minimal";
29019a199699SDimitry Andric if (NeedsAbortSuffix)
29029a199699SDimitry Andric FnName += "_abort";
290339d628a0SDimitry Andric bool MayReturn =
290439d628a0SDimitry Andric !IsFatal || RecoverKind == CheckRecoverableKind::AlwaysRecoverable;
290539d628a0SDimitry Andric
290639d628a0SDimitry Andric llvm::AttrBuilder B;
290739d628a0SDimitry Andric if (!MayReturn) {
290839d628a0SDimitry Andric B.addAttribute(llvm::Attribute::NoReturn)
290939d628a0SDimitry Andric .addAttribute(llvm::Attribute::NoUnwind);
291039d628a0SDimitry Andric }
291139d628a0SDimitry Andric B.addAttribute(llvm::Attribute::UWTable);
291239d628a0SDimitry Andric
291339d628a0SDimitry Andric llvm::Value *Fn = CGF.CGM.CreateRuntimeFunction(
291439d628a0SDimitry Andric FnType, FnName,
291520e90f04SDimitry Andric llvm::AttributeList::get(CGF.getLLVMContext(),
291620e90f04SDimitry Andric llvm::AttributeList::FunctionIndex, B),
291744290647SDimitry Andric /*Local=*/true);
291839d628a0SDimitry Andric llvm::CallInst *HandlerCall = CGF.EmitNounwindRuntimeCall(Fn, FnArgs);
291939d628a0SDimitry Andric if (!MayReturn) {
292039d628a0SDimitry Andric HandlerCall->setDoesNotReturn();
292139d628a0SDimitry Andric CGF.Builder.CreateUnreachable();
292239d628a0SDimitry Andric } else {
292339d628a0SDimitry Andric CGF.Builder.CreateBr(ContBB);
292439d628a0SDimitry Andric }
292539d628a0SDimitry Andric }
292639d628a0SDimitry Andric
EmitCheck(ArrayRef<std::pair<llvm::Value *,SanitizerMask>> Checked,SanitizerHandler CheckHandler,ArrayRef<llvm::Constant * > StaticArgs,ArrayRef<llvm::Value * > DynamicArgs)292739d628a0SDimitry Andric void CodeGenFunction::EmitCheck(
292833956c43SDimitry Andric ArrayRef<std::pair<llvm::Value *, SanitizerMask>> Checked,
292944290647SDimitry Andric SanitizerHandler CheckHandler, ArrayRef<llvm::Constant *> StaticArgs,
293039d628a0SDimitry Andric ArrayRef<llvm::Value *> DynamicArgs) {
293159d1ed5bSDimitry Andric assert(IsSanitizerScope);
293239d628a0SDimitry Andric assert(Checked.size() > 0);
293344290647SDimitry Andric assert(CheckHandler >= 0 &&
29349a199699SDimitry Andric size_t(CheckHandler) < llvm::array_lengthof(SanitizerHandlers));
293544290647SDimitry Andric const StringRef CheckName = SanitizerHandlers[CheckHandler].Name;
293639d628a0SDimitry Andric
293739d628a0SDimitry Andric llvm::Value *FatalCond = nullptr;
293839d628a0SDimitry Andric llvm::Value *RecoverableCond = nullptr;
29398f0fd8f6SDimitry Andric llvm::Value *TrapCond = nullptr;
294039d628a0SDimitry Andric for (int i = 0, n = Checked.size(); i < n; ++i) {
294139d628a0SDimitry Andric llvm::Value *Check = Checked[i].first;
29428f0fd8f6SDimitry Andric // -fsanitize-trap= overrides -fsanitize-recover=.
294339d628a0SDimitry Andric llvm::Value *&Cond =
29448f0fd8f6SDimitry Andric CGM.getCodeGenOpts().SanitizeTrap.has(Checked[i].second)
29458f0fd8f6SDimitry Andric ? TrapCond
29468f0fd8f6SDimitry Andric : CGM.getCodeGenOpts().SanitizeRecover.has(Checked[i].second)
294739d628a0SDimitry Andric ? RecoverableCond
294839d628a0SDimitry Andric : FatalCond;
294939d628a0SDimitry Andric Cond = Cond ? Builder.CreateAnd(Cond, Check) : Check;
295039d628a0SDimitry Andric }
295139d628a0SDimitry Andric
29528f0fd8f6SDimitry Andric if (TrapCond)
29538f0fd8f6SDimitry Andric EmitTrapCheck(TrapCond);
29548f0fd8f6SDimitry Andric if (!FatalCond && !RecoverableCond)
29558f0fd8f6SDimitry Andric return;
29568f0fd8f6SDimitry Andric
295739d628a0SDimitry Andric llvm::Value *JointCond;
295839d628a0SDimitry Andric if (FatalCond && RecoverableCond)
295939d628a0SDimitry Andric JointCond = Builder.CreateAnd(FatalCond, RecoverableCond);
296039d628a0SDimitry Andric else
296139d628a0SDimitry Andric JointCond = FatalCond ? FatalCond : RecoverableCond;
296239d628a0SDimitry Andric assert(JointCond);
296339d628a0SDimitry Andric
296439d628a0SDimitry Andric CheckRecoverableKind RecoverKind = getRecoverableKind(Checked[0].second);
296539d628a0SDimitry Andric assert(SanOpts.has(Checked[0].second));
296639d628a0SDimitry Andric #ifndef NDEBUG
296739d628a0SDimitry Andric for (int i = 1, n = Checked.size(); i < n; ++i) {
296839d628a0SDimitry Andric assert(RecoverKind == getRecoverableKind(Checked[i].second) &&
296939d628a0SDimitry Andric "All recoverable kinds in a single check must be same!");
297039d628a0SDimitry Andric assert(SanOpts.has(Checked[i].second));
297139d628a0SDimitry Andric }
297239d628a0SDimitry Andric #endif
2973139f7f9bSDimitry Andric
29743861d79fSDimitry Andric llvm::BasicBlock *Cont = createBasicBlock("cont");
297539d628a0SDimitry Andric llvm::BasicBlock *Handlers = createBasicBlock("handler." + CheckName);
297639d628a0SDimitry Andric llvm::Instruction *Branch = Builder.CreateCondBr(JointCond, Cont, Handlers);
2977139f7f9bSDimitry Andric // Give hint that we very much don't expect to execute the handler
2978139f7f9bSDimitry Andric // Value chosen to match UR_NONTAKEN_WEIGHT, see BranchProbabilityInfo.cpp
2979139f7f9bSDimitry Andric llvm::MDBuilder MDHelper(getLLVMContext());
2980139f7f9bSDimitry Andric llvm::MDNode *Node = MDHelper.createBranchWeights((1U << 20) - 1, 1);
2981139f7f9bSDimitry Andric Branch->setMetadata(llvm::LLVMContext::MD_prof, Node);
298239d628a0SDimitry Andric EmitBlock(Handlers);
2983139f7f9bSDimitry Andric
2984e7145dcbSDimitry Andric // Handler functions take an i8* pointing to the (handler-specific) static
2985e7145dcbSDimitry Andric // information block, followed by a sequence of intptr_t arguments
2986e7145dcbSDimitry Andric // representing operand values.
2987139f7f9bSDimitry Andric SmallVector<llvm::Value *, 4> Args;
2988139f7f9bSDimitry Andric SmallVector<llvm::Type *, 4> ArgTypes;
29899a199699SDimitry Andric if (!CGM.getCodeGenOpts().SanitizeMinimalRuntime) {
29903861d79fSDimitry Andric Args.reserve(DynamicArgs.size() + 1);
29913861d79fSDimitry Andric ArgTypes.reserve(DynamicArgs.size() + 1);
29923861d79fSDimitry Andric
2993e7145dcbSDimitry Andric // Emit handler arguments and create handler function type.
2994e7145dcbSDimitry Andric if (!StaticArgs.empty()) {
2995e7145dcbSDimitry Andric llvm::Constant *Info = llvm::ConstantStruct::getAnon(StaticArgs);
2996e7145dcbSDimitry Andric auto *InfoPtr =
2997e7145dcbSDimitry Andric new llvm::GlobalVariable(CGM.getModule(), Info->getType(), false,
2998e7145dcbSDimitry Andric llvm::GlobalVariable::PrivateLinkage, Info);
2999e7145dcbSDimitry Andric InfoPtr->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3000e7145dcbSDimitry Andric CGM.getSanitizerMetadata()->disableSanitizerForGlobal(InfoPtr);
30013861d79fSDimitry Andric Args.push_back(Builder.CreateBitCast(InfoPtr, Int8PtrTy));
30023861d79fSDimitry Andric ArgTypes.push_back(Int8PtrTy);
3003e7145dcbSDimitry Andric }
3004e7145dcbSDimitry Andric
30053861d79fSDimitry Andric for (size_t i = 0, n = DynamicArgs.size(); i != n; ++i) {
30063861d79fSDimitry Andric Args.push_back(EmitCheckValue(DynamicArgs[i]));
30073861d79fSDimitry Andric ArgTypes.push_back(IntPtrTy);
30083861d79fSDimitry Andric }
30099a199699SDimitry Andric }
30103861d79fSDimitry Andric
30113861d79fSDimitry Andric llvm::FunctionType *FnType =
30123861d79fSDimitry Andric llvm::FunctionType::get(CGM.VoidTy, ArgTypes, false);
3013139f7f9bSDimitry Andric
301439d628a0SDimitry Andric if (!FatalCond || !RecoverableCond) {
301539d628a0SDimitry Andric // Simple case: we need to generate a single handler call, either
301639d628a0SDimitry Andric // fatal, or non-fatal.
301744290647SDimitry Andric emitCheckHandlerCall(*this, FnType, Args, CheckHandler, RecoverKind,
301839d628a0SDimitry Andric (FatalCond != nullptr), Cont);
30193861d79fSDimitry Andric } else {
302039d628a0SDimitry Andric // Emit two handler calls: first one for set of unrecoverable checks,
302139d628a0SDimitry Andric // another one for recoverable.
302239d628a0SDimitry Andric llvm::BasicBlock *NonFatalHandlerBB =
302339d628a0SDimitry Andric createBasicBlock("non_fatal." + CheckName);
302439d628a0SDimitry Andric llvm::BasicBlock *FatalHandlerBB = createBasicBlock("fatal." + CheckName);
302539d628a0SDimitry Andric Builder.CreateCondBr(FatalCond, NonFatalHandlerBB, FatalHandlerBB);
302639d628a0SDimitry Andric EmitBlock(FatalHandlerBB);
302744290647SDimitry Andric emitCheckHandlerCall(*this, FnType, Args, CheckHandler, RecoverKind, true,
302839d628a0SDimitry Andric NonFatalHandlerBB);
302939d628a0SDimitry Andric EmitBlock(NonFatalHandlerBB);
303044290647SDimitry Andric emitCheckHandlerCall(*this, FnType, Args, CheckHandler, RecoverKind, false,
303139d628a0SDimitry Andric Cont);
30323861d79fSDimitry Andric }
30333861d79fSDimitry Andric
30343861d79fSDimitry Andric EmitBlock(Cont);
30353861d79fSDimitry Andric }
30363861d79fSDimitry Andric
EmitCfiSlowPathCheck(SanitizerMask Kind,llvm::Value * Cond,llvm::ConstantInt * TypeId,llvm::Value * Ptr,ArrayRef<llvm::Constant * > StaticArgs)3037e7145dcbSDimitry Andric void CodeGenFunction::EmitCfiSlowPathCheck(
3038e7145dcbSDimitry Andric SanitizerMask Kind, llvm::Value *Cond, llvm::ConstantInt *TypeId,
3039e7145dcbSDimitry Andric llvm::Value *Ptr, ArrayRef<llvm::Constant *> StaticArgs) {
30400623d748SDimitry Andric llvm::BasicBlock *Cont = createBasicBlock("cfi.cont");
30410623d748SDimitry Andric
30420623d748SDimitry Andric llvm::BasicBlock *CheckBB = createBasicBlock("cfi.slowpath");
30430623d748SDimitry Andric llvm::BranchInst *BI = Builder.CreateCondBr(Cond, Cont, CheckBB);
30440623d748SDimitry Andric
30450623d748SDimitry Andric llvm::MDBuilder MDHelper(getLLVMContext());
30460623d748SDimitry Andric llvm::MDNode *Node = MDHelper.createBranchWeights((1U << 20) - 1, 1);
30470623d748SDimitry Andric BI->setMetadata(llvm::LLVMContext::MD_prof, Node);
30480623d748SDimitry Andric
30490623d748SDimitry Andric EmitBlock(CheckBB);
30500623d748SDimitry Andric
3051e7145dcbSDimitry Andric bool WithDiag = !CGM.getCodeGenOpts().SanitizeTrap.has(Kind);
3052e7145dcbSDimitry Andric
3053e7145dcbSDimitry Andric llvm::CallInst *CheckCall;
30544ba319b5SDimitry Andric llvm::Constant *SlowPathFn;
3055e7145dcbSDimitry Andric if (WithDiag) {
3056e7145dcbSDimitry Andric llvm::Constant *Info = llvm::ConstantStruct::getAnon(StaticArgs);
3057e7145dcbSDimitry Andric auto *InfoPtr =
3058e7145dcbSDimitry Andric new llvm::GlobalVariable(CGM.getModule(), Info->getType(), false,
3059e7145dcbSDimitry Andric llvm::GlobalVariable::PrivateLinkage, Info);
3060e7145dcbSDimitry Andric InfoPtr->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3061e7145dcbSDimitry Andric CGM.getSanitizerMetadata()->disableSanitizerForGlobal(InfoPtr);
3062e7145dcbSDimitry Andric
30634ba319b5SDimitry Andric SlowPathFn = CGM.getModule().getOrInsertFunction(
3064e7145dcbSDimitry Andric "__cfi_slowpath_diag",
3065e7145dcbSDimitry Andric llvm::FunctionType::get(VoidTy, {Int64Ty, Int8PtrTy, Int8PtrTy},
3066e7145dcbSDimitry Andric false));
3067e7145dcbSDimitry Andric CheckCall = Builder.CreateCall(
30684ba319b5SDimitry Andric SlowPathFn, {TypeId, Ptr, Builder.CreateBitCast(InfoPtr, Int8PtrTy)});
3069e7145dcbSDimitry Andric } else {
30704ba319b5SDimitry Andric SlowPathFn = CGM.getModule().getOrInsertFunction(
30710623d748SDimitry Andric "__cfi_slowpath",
3072e7145dcbSDimitry Andric llvm::FunctionType::get(VoidTy, {Int64Ty, Int8PtrTy}, false));
3073e7145dcbSDimitry Andric CheckCall = Builder.CreateCall(SlowPathFn, {TypeId, Ptr});
3074e7145dcbSDimitry Andric }
3075e7145dcbSDimitry Andric
30764ba319b5SDimitry Andric CGM.setDSOLocal(cast<llvm::GlobalValue>(SlowPathFn->stripPointerCasts()));
30770623d748SDimitry Andric CheckCall->setDoesNotThrow();
30780623d748SDimitry Andric
30790623d748SDimitry Andric EmitBlock(Cont);
30800623d748SDimitry Andric }
30810623d748SDimitry Andric
308220e90f04SDimitry Andric // Emit a stub for __cfi_check function so that the linker knows about this
308320e90f04SDimitry Andric // symbol in LTO mode.
EmitCfiCheckStub()308420e90f04SDimitry Andric void CodeGenFunction::EmitCfiCheckStub() {
308520e90f04SDimitry Andric llvm::Module *M = &CGM.getModule();
308620e90f04SDimitry Andric auto &Ctx = M->getContext();
308720e90f04SDimitry Andric llvm::Function *F = llvm::Function::Create(
308820e90f04SDimitry Andric llvm::FunctionType::get(VoidTy, {Int64Ty, Int8PtrTy, Int8PtrTy}, false),
308920e90f04SDimitry Andric llvm::GlobalValue::WeakAnyLinkage, "__cfi_check", M);
30904ba319b5SDimitry Andric CGM.setDSOLocal(F);
309120e90f04SDimitry Andric llvm::BasicBlock *BB = llvm::BasicBlock::Create(Ctx, "entry", F);
309220e90f04SDimitry Andric // FIXME: consider emitting an intrinsic call like
309320e90f04SDimitry Andric // call void @llvm.cfi_check(i64 %0, i8* %1, i8* %2)
309420e90f04SDimitry Andric // which can be lowered in CrossDSOCFI pass to the actual contents of
309520e90f04SDimitry Andric // __cfi_check. This would allow inlining of __cfi_check calls.
309620e90f04SDimitry Andric llvm::CallInst::Create(
309720e90f04SDimitry Andric llvm::Intrinsic::getDeclaration(M, llvm::Intrinsic::trap), "", BB);
309820e90f04SDimitry Andric llvm::ReturnInst::Create(Ctx, nullptr, BB);
309920e90f04SDimitry Andric }
310020e90f04SDimitry Andric
3101e7145dcbSDimitry Andric // This function is basically a switch over the CFI failure kind, which is
3102e7145dcbSDimitry Andric // extracted from CFICheckFailData (1st function argument). Each case is either
3103e7145dcbSDimitry Andric // llvm.trap or a call to one of the two runtime handlers, based on
3104e7145dcbSDimitry Andric // -fsanitize-trap and -fsanitize-recover settings. Default case (invalid
3105e7145dcbSDimitry Andric // failure kind) traps, but this should really never happen. CFICheckFailData
3106e7145dcbSDimitry Andric // can be nullptr if the calling module has -fsanitize-trap behavior for this
3107e7145dcbSDimitry Andric // check kind; in this case __cfi_check_fail traps as well.
EmitCfiCheckFail()3108e7145dcbSDimitry Andric void CodeGenFunction::EmitCfiCheckFail() {
3109e7145dcbSDimitry Andric SanitizerScope SanScope(this);
3110e7145dcbSDimitry Andric FunctionArgList Args;
3111db17bf38SDimitry Andric ImplicitParamDecl ArgData(getContext(), getContext().VoidPtrTy,
3112db17bf38SDimitry Andric ImplicitParamDecl::Other);
3113db17bf38SDimitry Andric ImplicitParamDecl ArgAddr(getContext(), getContext().VoidPtrTy,
3114db17bf38SDimitry Andric ImplicitParamDecl::Other);
3115e7145dcbSDimitry Andric Args.push_back(&ArgData);
3116e7145dcbSDimitry Andric Args.push_back(&ArgAddr);
3117e7145dcbSDimitry Andric
3118e7145dcbSDimitry Andric const CGFunctionInfo &FI =
3119e7145dcbSDimitry Andric CGM.getTypes().arrangeBuiltinFunctionDeclaration(getContext().VoidTy, Args);
3120e7145dcbSDimitry Andric
3121e7145dcbSDimitry Andric llvm::Function *F = llvm::Function::Create(
3122e7145dcbSDimitry Andric llvm::FunctionType::get(VoidTy, {VoidPtrTy, VoidPtrTy}, false),
3123e7145dcbSDimitry Andric llvm::GlobalValue::WeakODRLinkage, "__cfi_check_fail", &CGM.getModule());
3124e7145dcbSDimitry Andric F->setVisibility(llvm::GlobalValue::HiddenVisibility);
3125e7145dcbSDimitry Andric
3126e7145dcbSDimitry Andric StartFunction(GlobalDecl(), CGM.getContext().VoidTy, F, FI, Args,
3127e7145dcbSDimitry Andric SourceLocation());
3128e7145dcbSDimitry Andric
31294ba319b5SDimitry Andric // This function should not be affected by blacklist. This function does
31304ba319b5SDimitry Andric // not have a source location, but "src:*" would still apply. Revert any
31314ba319b5SDimitry Andric // changes to SanOpts made in StartFunction.
31324ba319b5SDimitry Andric SanOpts = CGM.getLangOpts().Sanitize;
31334ba319b5SDimitry Andric
3134e7145dcbSDimitry Andric llvm::Value *Data =
3135e7145dcbSDimitry Andric EmitLoadOfScalar(GetAddrOfLocalVar(&ArgData), /*Volatile=*/false,
3136e7145dcbSDimitry Andric CGM.getContext().VoidPtrTy, ArgData.getLocation());
3137e7145dcbSDimitry Andric llvm::Value *Addr =
3138e7145dcbSDimitry Andric EmitLoadOfScalar(GetAddrOfLocalVar(&ArgAddr), /*Volatile=*/false,
3139e7145dcbSDimitry Andric CGM.getContext().VoidPtrTy, ArgAddr.getLocation());
3140e7145dcbSDimitry Andric
3141e7145dcbSDimitry Andric // Data == nullptr means the calling module has trap behaviour for this check.
3142e7145dcbSDimitry Andric llvm::Value *DataIsNotNullPtr =
3143e7145dcbSDimitry Andric Builder.CreateICmpNE(Data, llvm::ConstantPointerNull::get(Int8PtrTy));
3144e7145dcbSDimitry Andric EmitTrapCheck(DataIsNotNullPtr);
3145e7145dcbSDimitry Andric
3146e7145dcbSDimitry Andric llvm::StructType *SourceLocationTy =
31475517e702SDimitry Andric llvm::StructType::get(VoidPtrTy, Int32Ty, Int32Ty);
3148e7145dcbSDimitry Andric llvm::StructType *CfiCheckFailDataTy =
31495517e702SDimitry Andric llvm::StructType::get(Int8Ty, SourceLocationTy, VoidPtrTy);
3150e7145dcbSDimitry Andric
3151e7145dcbSDimitry Andric llvm::Value *V = Builder.CreateConstGEP2_32(
3152e7145dcbSDimitry Andric CfiCheckFailDataTy,
3153e7145dcbSDimitry Andric Builder.CreatePointerCast(Data, CfiCheckFailDataTy->getPointerTo(0)), 0,
3154e7145dcbSDimitry Andric 0);
3155e7145dcbSDimitry Andric Address CheckKindAddr(V, getIntAlign());
3156e7145dcbSDimitry Andric llvm::Value *CheckKind = Builder.CreateLoad(CheckKindAddr);
3157e7145dcbSDimitry Andric
3158e7145dcbSDimitry Andric llvm::Value *AllVtables = llvm::MetadataAsValue::get(
3159e7145dcbSDimitry Andric CGM.getLLVMContext(),
3160e7145dcbSDimitry Andric llvm::MDString::get(CGM.getLLVMContext(), "all-vtables"));
3161e7145dcbSDimitry Andric llvm::Value *ValidVtable = Builder.CreateZExt(
3162e7145dcbSDimitry Andric Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::type_test),
3163e7145dcbSDimitry Andric {Addr, AllVtables}),
3164e7145dcbSDimitry Andric IntPtrTy);
3165e7145dcbSDimitry Andric
3166e7145dcbSDimitry Andric const std::pair<int, SanitizerMask> CheckKinds[] = {
3167e7145dcbSDimitry Andric {CFITCK_VCall, SanitizerKind::CFIVCall},
3168e7145dcbSDimitry Andric {CFITCK_NVCall, SanitizerKind::CFINVCall},
3169e7145dcbSDimitry Andric {CFITCK_DerivedCast, SanitizerKind::CFIDerivedCast},
3170e7145dcbSDimitry Andric {CFITCK_UnrelatedCast, SanitizerKind::CFIUnrelatedCast},
3171e7145dcbSDimitry Andric {CFITCK_ICall, SanitizerKind::CFIICall}};
3172e7145dcbSDimitry Andric
3173e7145dcbSDimitry Andric SmallVector<std::pair<llvm::Value *, SanitizerMask>, 5> Checks;
3174e7145dcbSDimitry Andric for (auto CheckKindMaskPair : CheckKinds) {
3175e7145dcbSDimitry Andric int Kind = CheckKindMaskPair.first;
3176e7145dcbSDimitry Andric SanitizerMask Mask = CheckKindMaskPair.second;
3177e7145dcbSDimitry Andric llvm::Value *Cond =
3178e7145dcbSDimitry Andric Builder.CreateICmpNE(CheckKind, llvm::ConstantInt::get(Int8Ty, Kind));
3179e7145dcbSDimitry Andric if (CGM.getLangOpts().Sanitize.has(Mask))
318044290647SDimitry Andric EmitCheck(std::make_pair(Cond, Mask), SanitizerHandler::CFICheckFail, {},
3181e7145dcbSDimitry Andric {Data, Addr, ValidVtable});
3182e7145dcbSDimitry Andric else
3183e7145dcbSDimitry Andric EmitTrapCheck(Cond);
3184e7145dcbSDimitry Andric }
3185e7145dcbSDimitry Andric
3186e7145dcbSDimitry Andric FinishFunction();
3187e7145dcbSDimitry Andric // The only reference to this function will be created during LTO link.
3188e7145dcbSDimitry Andric // Make sure it survives until then.
3189e7145dcbSDimitry Andric CGM.addUsedGlobal(F);
3190e7145dcbSDimitry Andric }
3191e7145dcbSDimitry Andric
EmitUnreachable(SourceLocation Loc)319213ddaa84SDimitry Andric void CodeGenFunction::EmitUnreachable(SourceLocation Loc) {
319313ddaa84SDimitry Andric if (SanOpts.has(SanitizerKind::Unreachable)) {
319413ddaa84SDimitry Andric SanitizerScope SanScope(this);
319513ddaa84SDimitry Andric EmitCheck(std::make_pair(static_cast<llvm::Value *>(Builder.getFalse()),
319613ddaa84SDimitry Andric SanitizerKind::Unreachable),
319713ddaa84SDimitry Andric SanitizerHandler::BuiltinUnreachable,
319813ddaa84SDimitry Andric EmitCheckSourceLocation(Loc), None);
319913ddaa84SDimitry Andric }
320013ddaa84SDimitry Andric Builder.CreateUnreachable();
320113ddaa84SDimitry Andric }
320213ddaa84SDimitry Andric
EmitTrapCheck(llvm::Value * Checked)3203139f7f9bSDimitry Andric void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked) {
32043861d79fSDimitry Andric llvm::BasicBlock *Cont = createBasicBlock("cont");
32053861d79fSDimitry Andric
32063861d79fSDimitry Andric // If we're optimizing, collapse all calls to trap down to just one per
32073861d79fSDimitry Andric // function to save on code size.
32083861d79fSDimitry Andric if (!CGM.getCodeGenOpts().OptimizationLevel || !TrapBB) {
32093861d79fSDimitry Andric TrapBB = createBasicBlock("trap");
32103861d79fSDimitry Andric Builder.CreateCondBr(Checked, Cont, TrapBB);
32113861d79fSDimitry Andric EmitBlock(TrapBB);
32123dac3a9bSDimitry Andric llvm::CallInst *TrapCall = EmitTrapCall(llvm::Intrinsic::trap);
3213f22ef01cSRoman Divacky TrapCall->setDoesNotReturn();
3214f22ef01cSRoman Divacky TrapCall->setDoesNotThrow();
3215f22ef01cSRoman Divacky Builder.CreateUnreachable();
32163861d79fSDimitry Andric } else {
32173861d79fSDimitry Andric Builder.CreateCondBr(Checked, Cont, TrapBB);
32183861d79fSDimitry Andric }
3219f22ef01cSRoman Divacky
3220f22ef01cSRoman Divacky EmitBlock(Cont);
3221f22ef01cSRoman Divacky }
3222f22ef01cSRoman Divacky
EmitTrapCall(llvm::Intrinsic::ID IntrID)32233dac3a9bSDimitry Andric llvm::CallInst *CodeGenFunction::EmitTrapCall(llvm::Intrinsic::ID IntrID) {
3224875ed548SDimitry Andric llvm::CallInst *TrapCall = Builder.CreateCall(CGM.getIntrinsic(IntrID));
32253dac3a9bSDimitry Andric
322644290647SDimitry Andric if (!CGM.getCodeGenOpts().TrapFuncName.empty()) {
322744290647SDimitry Andric auto A = llvm::Attribute::get(getLLVMContext(), "trap-func-name",
32283dac3a9bSDimitry Andric CGM.getCodeGenOpts().TrapFuncName);
322920e90f04SDimitry Andric TrapCall->addAttribute(llvm::AttributeList::FunctionIndex, A);
323044290647SDimitry Andric }
32313dac3a9bSDimitry Andric
32323dac3a9bSDimitry Andric return TrapCall;
32333dac3a9bSDimitry Andric }
32343dac3a9bSDimitry Andric
EmitArrayToPointerDecay(const Expr * E,LValueBaseInfo * BaseInfo,TBAAAccessInfo * TBAAInfo)32350623d748SDimitry Andric Address CodeGenFunction::EmitArrayToPointerDecay(const Expr *E,
32369a199699SDimitry Andric LValueBaseInfo *BaseInfo,
32379a199699SDimitry Andric TBAAAccessInfo *TBAAInfo) {
32380623d748SDimitry Andric assert(E->getType()->isArrayType() &&
32390623d748SDimitry Andric "Array to pointer decay must have array source type!");
32400623d748SDimitry Andric
32410623d748SDimitry Andric // Expressions of array type can't be bitfields or vector elements.
32420623d748SDimitry Andric LValue LV = EmitLValue(E);
32430623d748SDimitry Andric Address Addr = LV.getAddress();
32440623d748SDimitry Andric
32450623d748SDimitry Andric // If the array type was an incomplete type, we need to make sure
32460623d748SDimitry Andric // the decay ends up being the right type.
32470623d748SDimitry Andric llvm::Type *NewTy = ConvertType(E->getType());
32480623d748SDimitry Andric Addr = Builder.CreateElementBitCast(Addr, NewTy);
32490623d748SDimitry Andric
32500623d748SDimitry Andric // Note that VLA pointers are always decayed, so we don't need to do
32510623d748SDimitry Andric // anything here.
32520623d748SDimitry Andric if (!E->getType()->isVariableArrayType()) {
32530623d748SDimitry Andric assert(isa<llvm::ArrayType>(Addr.getElementType()) &&
32540623d748SDimitry Andric "Expected pointer to array");
32550623d748SDimitry Andric Addr = Builder.CreateStructGEP(Addr, 0, CharUnits::Zero(), "arraydecay");
32560623d748SDimitry Andric }
32570623d748SDimitry Andric
32589a199699SDimitry Andric // The result of this decay conversion points to an array element within the
32599a199699SDimitry Andric // base lvalue. However, since TBAA currently does not support representing
32609a199699SDimitry Andric // accesses to elements of member arrays, we conservatively represent accesses
32619a199699SDimitry Andric // to the pointee object as if it had no any base lvalue specified.
32629a199699SDimitry Andric // TODO: Support TBAA for member arrays.
32630623d748SDimitry Andric QualType EltType = E->getType()->castAsArrayTypeUnsafe()->getElementType();
32649a199699SDimitry Andric if (BaseInfo) *BaseInfo = LV.getBaseInfo();
32659a199699SDimitry Andric if (TBAAInfo) *TBAAInfo = CGM.getTBAAAccessInfo(EltType);
32669a199699SDimitry Andric
32670623d748SDimitry Andric return Builder.CreateElementBitCast(Addr, ConvertTypeForMem(EltType));
32680623d748SDimitry Andric }
32690623d748SDimitry Andric
3270ffd1746dSEd Schouten /// isSimpleArrayDecayOperand - If the specified expr is a simple decay from an
3271ffd1746dSEd Schouten /// array to pointer, return the array subexpression.
isSimpleArrayDecayOperand(const Expr * E)3272ffd1746dSEd Schouten static const Expr *isSimpleArrayDecayOperand(const Expr *E) {
3273ffd1746dSEd Schouten // If this isn't just an array->pointer decay, bail out.
327459d1ed5bSDimitry Andric const auto *CE = dyn_cast<CastExpr>(E);
327559d1ed5bSDimitry Andric if (!CE || CE->getCastKind() != CK_ArrayToPointerDecay)
327659d1ed5bSDimitry Andric return nullptr;
3277ffd1746dSEd Schouten
3278ffd1746dSEd Schouten // If this is a decay from variable width array, bail out.
3279ffd1746dSEd Schouten const Expr *SubExpr = CE->getSubExpr();
3280ffd1746dSEd Schouten if (SubExpr->getType()->isVariableArrayType())
328159d1ed5bSDimitry Andric return nullptr;
3282ffd1746dSEd Schouten
3283ffd1746dSEd Schouten return SubExpr;
3284ffd1746dSEd Schouten }
3285ffd1746dSEd Schouten
emitArraySubscriptGEP(CodeGenFunction & CGF,llvm::Value * ptr,ArrayRef<llvm::Value * > indices,bool inbounds,bool signedIndices,SourceLocation loc,const llvm::Twine & name="arrayidx")32860623d748SDimitry Andric static llvm::Value *emitArraySubscriptGEP(CodeGenFunction &CGF,
32870623d748SDimitry Andric llvm::Value *ptr,
32880623d748SDimitry Andric ArrayRef<llvm::Value*> indices,
32890623d748SDimitry Andric bool inbounds,
329024d58133SDimitry Andric bool signedIndices,
3291f9448bf3SDimitry Andric SourceLocation loc,
32920623d748SDimitry Andric const llvm::Twine &name = "arrayidx") {
32930623d748SDimitry Andric if (inbounds) {
3294b40b48b8SDimitry Andric return CGF.EmitCheckedInBoundsGEP(ptr, indices, signedIndices,
3295b40b48b8SDimitry Andric CodeGenFunction::NotSubtraction, loc,
3296b40b48b8SDimitry Andric name);
32970623d748SDimitry Andric } else {
32980623d748SDimitry Andric return CGF.Builder.CreateGEP(ptr, indices, name);
32990623d748SDimitry Andric }
33000623d748SDimitry Andric }
33010623d748SDimitry Andric
getArrayElementAlign(CharUnits arrayAlign,llvm::Value * idx,CharUnits eltSize)33020623d748SDimitry Andric static CharUnits getArrayElementAlign(CharUnits arrayAlign,
33030623d748SDimitry Andric llvm::Value *idx,
33040623d748SDimitry Andric CharUnits eltSize) {
33050623d748SDimitry Andric // If we have a constant index, we can use the exact offset of the
33060623d748SDimitry Andric // element we're accessing.
33070623d748SDimitry Andric if (auto constantIdx = dyn_cast<llvm::ConstantInt>(idx)) {
33080623d748SDimitry Andric CharUnits offset = constantIdx->getZExtValue() * eltSize;
33090623d748SDimitry Andric return arrayAlign.alignmentAtOffset(offset);
33100623d748SDimitry Andric
33110623d748SDimitry Andric // Otherwise, use the worst-case alignment for any element.
33120623d748SDimitry Andric } else {
33130623d748SDimitry Andric return arrayAlign.alignmentOfArrayElement(eltSize);
33140623d748SDimitry Andric }
33150623d748SDimitry Andric }
33160623d748SDimitry Andric
getFixedSizeElementType(const ASTContext & ctx,const VariableArrayType * vla)33170623d748SDimitry Andric static QualType getFixedSizeElementType(const ASTContext &ctx,
33180623d748SDimitry Andric const VariableArrayType *vla) {
33190623d748SDimitry Andric QualType eltType;
33200623d748SDimitry Andric do {
33210623d748SDimitry Andric eltType = vla->getElementType();
33220623d748SDimitry Andric } while ((vla = ctx.getAsVariableArrayType(eltType)));
33230623d748SDimitry Andric return eltType;
33240623d748SDimitry Andric }
33250623d748SDimitry Andric
emitArraySubscriptGEP(CodeGenFunction & CGF,Address addr,ArrayRef<llvm::Value * > indices,QualType eltType,bool inbounds,bool signedIndices,SourceLocation loc,const llvm::Twine & name="arrayidx")33260623d748SDimitry Andric static Address emitArraySubscriptGEP(CodeGenFunction &CGF, Address addr,
33270623d748SDimitry Andric ArrayRef<llvm::Value *> indices,
33280623d748SDimitry Andric QualType eltType, bool inbounds,
332924d58133SDimitry Andric bool signedIndices, SourceLocation loc,
33300623d748SDimitry Andric const llvm::Twine &name = "arrayidx") {
33310623d748SDimitry Andric // All the indices except that last must be zero.
33320623d748SDimitry Andric #ifndef NDEBUG
33330623d748SDimitry Andric for (auto idx : indices.drop_back())
33340623d748SDimitry Andric assert(isa<llvm::ConstantInt>(idx) &&
33350623d748SDimitry Andric cast<llvm::ConstantInt>(idx)->isZero());
33360623d748SDimitry Andric #endif
33370623d748SDimitry Andric
33380623d748SDimitry Andric // Determine the element size of the statically-sized base. This is
33390623d748SDimitry Andric // the thing that the indices are expressed in terms of.
33400623d748SDimitry Andric if (auto vla = CGF.getContext().getAsVariableArrayType(eltType)) {
33410623d748SDimitry Andric eltType = getFixedSizeElementType(CGF.getContext(), vla);
33420623d748SDimitry Andric }
33430623d748SDimitry Andric
33440623d748SDimitry Andric // We can use that to compute the best alignment of the element.
33450623d748SDimitry Andric CharUnits eltSize = CGF.getContext().getTypeSizeInChars(eltType);
33460623d748SDimitry Andric CharUnits eltAlign =
33470623d748SDimitry Andric getArrayElementAlign(addr.getAlignment(), indices.back(), eltSize);
33480623d748SDimitry Andric
334924d58133SDimitry Andric llvm::Value *eltPtr = emitArraySubscriptGEP(
335024d58133SDimitry Andric CGF, addr.getPointer(), indices, inbounds, signedIndices, loc, name);
33510623d748SDimitry Andric return Address(eltPtr, eltAlign);
33520623d748SDimitry Andric }
33530623d748SDimitry Andric
EmitArraySubscriptExpr(const ArraySubscriptExpr * E,bool Accessed)3354139f7f9bSDimitry Andric LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E,
3355139f7f9bSDimitry Andric bool Accessed) {
335644290647SDimitry Andric // The index must always be an integer, which is not an aggregate. Emit it
335744290647SDimitry Andric // in lexical order (this complexity is, sadly, required by C++17).
335844290647SDimitry Andric llvm::Value *IdxPre =
335944290647SDimitry Andric (E->getLHS() == E->getIdx()) ? EmitScalarExpr(E->getIdx()) : nullptr;
336024d58133SDimitry Andric bool SignedIndices = false;
336144290647SDimitry Andric auto EmitIdxAfterBase = [&, IdxPre](bool Promote) -> llvm::Value * {
336244290647SDimitry Andric auto *Idx = IdxPre;
336344290647SDimitry Andric if (E->getLHS() != E->getIdx()) {
336444290647SDimitry Andric assert(E->getRHS() == E->getIdx() && "index was neither LHS nor RHS");
336544290647SDimitry Andric Idx = EmitScalarExpr(E->getIdx());
336644290647SDimitry Andric }
336744290647SDimitry Andric
3368f22ef01cSRoman Divacky QualType IdxTy = E->getIdx()->getType();
3369bd5abe19SDimitry Andric bool IdxSigned = IdxTy->isSignedIntegerOrEnumerationType();
337024d58133SDimitry Andric SignedIndices |= IdxSigned;
3371f22ef01cSRoman Divacky
337239d628a0SDimitry Andric if (SanOpts.has(SanitizerKind::ArrayBounds))
3373139f7f9bSDimitry Andric EmitBoundsCheck(E, E->getBase(), Idx, IdxTy, Accessed);
3374139f7f9bSDimitry Andric
337544290647SDimitry Andric // Extend or truncate the index type to 32 or 64-bits.
337644290647SDimitry Andric if (Promote && Idx->getType() != IntPtrTy)
337744290647SDimitry Andric Idx = Builder.CreateIntCast(Idx, IntPtrTy, IdxSigned, "idxprom");
337844290647SDimitry Andric
337944290647SDimitry Andric return Idx;
338044290647SDimitry Andric };
338144290647SDimitry Andric IdxPre = nullptr;
338244290647SDimitry Andric
3383f22ef01cSRoman Divacky // If the base is a vector type, then we are forming a vector element lvalue
3384f22ef01cSRoman Divacky // with this subscript.
338539d628a0SDimitry Andric if (E->getBase()->getType()->isVectorType() &&
338639d628a0SDimitry Andric !isa<ExtVectorElementExpr>(E->getBase())) {
3387f22ef01cSRoman Divacky // Emit the vector as an lvalue to get its address.
3388f22ef01cSRoman Divacky LValue LHS = EmitLValue(E->getBase());
338944290647SDimitry Andric auto *Idx = EmitIdxAfterBase(/*Promote*/false);
3390f22ef01cSRoman Divacky assert(LHS.isSimple() && "Can only subscript lvalue vectors here!");
33919a199699SDimitry Andric return LValue::MakeVectorElt(LHS.getAddress(), Idx, E->getBase()->getType(),
33929a199699SDimitry Andric LHS.getBaseInfo(), TBAAAccessInfo());
3393f22ef01cSRoman Divacky }
3394f22ef01cSRoman Divacky
33950623d748SDimitry Andric // All the other cases basically behave like simple offsetting.
33960623d748SDimitry Andric
33970623d748SDimitry Andric // Handle the extvector case we ignored above.
339839d628a0SDimitry Andric if (isa<ExtVectorElementExpr>(E->getBase())) {
339939d628a0SDimitry Andric LValue LV = EmitLValue(E->getBase());
340044290647SDimitry Andric auto *Idx = EmitIdxAfterBase(/*Promote*/true);
34010623d748SDimitry Andric Address Addr = EmitExtVectorElementLValue(LV);
34020623d748SDimitry Andric
34030623d748SDimitry Andric QualType EltType = LV.getType()->castAs<VectorType>()->getElementType();
3404f9448bf3SDimitry Andric Addr = emitArraySubscriptGEP(*this, Addr, Idx, EltType, /*inbounds*/ true,
340524d58133SDimitry Andric SignedIndices, E->getExprLoc());
34069a199699SDimitry Andric return MakeAddrLValue(Addr, EltType, LV.getBaseInfo(),
34079a199699SDimitry Andric CGM.getTBAAInfoForSubobject(LV, EltType));
340839d628a0SDimitry Andric }
34090623d748SDimitry Andric
34109a199699SDimitry Andric LValueBaseInfo EltBaseInfo;
34119a199699SDimitry Andric TBAAAccessInfo EltTBAAInfo;
34120623d748SDimitry Andric Address Addr = Address::invalid();
34130623d748SDimitry Andric if (const VariableArrayType *vla =
3414f22ef01cSRoman Divacky getContext().getAsVariableArrayType(E->getType())) {
341517a519f9SDimitry Andric // The base must be a pointer, which is not an aggregate. Emit
341617a519f9SDimitry Andric // it. It needs to be emitted first in case it's what captures
341717a519f9SDimitry Andric // the VLA bounds.
34189a199699SDimitry Andric Addr = EmitPointerWithAlignment(E->getBase(), &EltBaseInfo, &EltTBAAInfo);
341944290647SDimitry Andric auto *Idx = EmitIdxAfterBase(/*Promote*/true);
3420f22ef01cSRoman Divacky
342117a519f9SDimitry Andric // The element count here is the total number of non-VLA elements.
34224ba319b5SDimitry Andric llvm::Value *numElements = getVLASize(vla).NumElts;
3423f22ef01cSRoman Divacky
342417a519f9SDimitry Andric // Effectively, the multiply by the VLA size is part of the GEP.
342517a519f9SDimitry Andric // GEP indexes are signed, and scaling an index isn't permitted to
342617a519f9SDimitry Andric // signed-overflow, so we use the same semantics for our explicit
342717a519f9SDimitry Andric // multiply. We suppress this if overflow is not undefined behavior.
3428dff0c46cSDimitry Andric if (getLangOpts().isSignedOverflowDefined()) {
342917a519f9SDimitry Andric Idx = Builder.CreateMul(Idx, numElements);
343017a519f9SDimitry Andric } else {
343117a519f9SDimitry Andric Idx = Builder.CreateNSWMul(Idx, numElements);
343217a519f9SDimitry Andric }
34330623d748SDimitry Andric
34340623d748SDimitry Andric Addr = emitArraySubscriptGEP(*this, Addr, Idx, vla->getElementType(),
3435f9448bf3SDimitry Andric !getLangOpts().isSignedOverflowDefined(),
343624d58133SDimitry Andric SignedIndices, E->getExprLoc());
34370623d748SDimitry Andric
3438ffd1746dSEd Schouten } else if (const ObjCObjectType *OIT = E->getType()->getAs<ObjCObjectType>()){
3439ffd1746dSEd Schouten // Indexing over an interface, as in "NSString *P; P[4];"
3440f22ef01cSRoman Divacky
34410623d748SDimitry Andric // Emit the base pointer.
34429a199699SDimitry Andric Addr = EmitPointerWithAlignment(E->getBase(), &EltBaseInfo, &EltTBAAInfo);
344344290647SDimitry Andric auto *Idx = EmitIdxAfterBase(/*Promote*/true);
344444290647SDimitry Andric
344544290647SDimitry Andric CharUnits InterfaceSize = getContext().getTypeSizeInChars(OIT);
344644290647SDimitry Andric llvm::Value *InterfaceSizeVal =
344744290647SDimitry Andric llvm::ConstantInt::get(Idx->getType(), InterfaceSize.getQuantity());
344844290647SDimitry Andric
344944290647SDimitry Andric llvm::Value *ScaledIdx = Builder.CreateMul(Idx, InterfaceSizeVal);
34500623d748SDimitry Andric
34510623d748SDimitry Andric // We don't necessarily build correct LLVM struct types for ObjC
34520623d748SDimitry Andric // interfaces, so we can't rely on GEP to do this scaling
34530623d748SDimitry Andric // correctly, so we need to cast to i8*. FIXME: is this actually
34540623d748SDimitry Andric // true? A lot of other things in the fragile ABI would break...
34550623d748SDimitry Andric llvm::Type *OrigBaseTy = Addr.getType();
34560623d748SDimitry Andric Addr = Builder.CreateElementBitCast(Addr, Int8Ty);
34570623d748SDimitry Andric
34580623d748SDimitry Andric // Do the GEP.
34590623d748SDimitry Andric CharUnits EltAlign =
34600623d748SDimitry Andric getArrayElementAlign(Addr.getAlignment(), Idx, InterfaceSize);
346124d58133SDimitry Andric llvm::Value *EltPtr =
346224d58133SDimitry Andric emitArraySubscriptGEP(*this, Addr.getPointer(), ScaledIdx, false,
346324d58133SDimitry Andric SignedIndices, E->getExprLoc());
34640623d748SDimitry Andric Addr = Address(EltPtr, EltAlign);
34650623d748SDimitry Andric
34660623d748SDimitry Andric // Cast back.
34670623d748SDimitry Andric Addr = Builder.CreateBitCast(Addr, OrigBaseTy);
3468ffd1746dSEd Schouten } else if (const Expr *Array = isSimpleArrayDecayOperand(E->getBase())) {
3469ffd1746dSEd Schouten // If this is A[i] where A is an array, the frontend will have decayed the
3470ffd1746dSEd Schouten // base to be a ArrayToPointerDecay implicit cast. While correct, it is
3471ffd1746dSEd Schouten // inefficient at -O0 to emit a "gep A, 0, 0" when codegen'ing it, then a
3472ffd1746dSEd Schouten // "gep x, i" here. Emit one "gep A, 0, i".
3473ffd1746dSEd Schouten assert(Array->getType()->isArrayType() &&
3474ffd1746dSEd Schouten "Array to pointer decay must have array source type!");
3475139f7f9bSDimitry Andric LValue ArrayLV;
3476139f7f9bSDimitry Andric // For simple multidimensional array indexing, set the 'accessed' flag for
3477139f7f9bSDimitry Andric // better bounds-checking of the base expression.
347859d1ed5bSDimitry Andric if (const auto *ASE = dyn_cast<ArraySubscriptExpr>(Array))
3479139f7f9bSDimitry Andric ArrayLV = EmitArraySubscriptExpr(ASE, /*Accessed*/ true);
3480139f7f9bSDimitry Andric else
3481139f7f9bSDimitry Andric ArrayLV = EmitLValue(Array);
348244290647SDimitry Andric auto *Idx = EmitIdxAfterBase(/*Promote*/true);
3483ffd1746dSEd Schouten
34843b0f4066SDimitry Andric // Propagate the alignment from the array itself to the result.
348524d58133SDimitry Andric Addr = emitArraySubscriptGEP(
348624d58133SDimitry Andric *this, ArrayLV.getAddress(), {CGM.getSize(CharUnits::Zero()), Idx},
348724d58133SDimitry Andric E->getType(), !getLangOpts().isSignedOverflowDefined(), SignedIndices,
3488f9448bf3SDimitry Andric E->getExprLoc());
34899a199699SDimitry Andric EltBaseInfo = ArrayLV.getBaseInfo();
34909a199699SDimitry Andric EltTBAAInfo = CGM.getTBAAInfoForSubobject(ArrayLV, E->getType());
3491f22ef01cSRoman Divacky } else {
34920623d748SDimitry Andric // The base must be a pointer; emit it with an estimate of its alignment.
34939a199699SDimitry Andric Addr = EmitPointerWithAlignment(E->getBase(), &EltBaseInfo, &EltTBAAInfo);
349444290647SDimitry Andric auto *Idx = EmitIdxAfterBase(/*Promote*/true);
34950623d748SDimitry Andric Addr = emitArraySubscriptGEP(*this, Addr, Idx, E->getType(),
3496f9448bf3SDimitry Andric !getLangOpts().isSignedOverflowDefined(),
349724d58133SDimitry Andric SignedIndices, E->getExprLoc());
3498f22ef01cSRoman Divacky }
3499f22ef01cSRoman Divacky
35009a199699SDimitry Andric LValue LV = MakeAddrLValue(Addr, E->getType(), EltBaseInfo, EltTBAAInfo);
3501f22ef01cSRoman Divacky
3502*b5893f02SDimitry Andric if (getLangOpts().ObjC &&
35033861d79fSDimitry Andric getLangOpts().getGC() != LangOptions::NonGC) {
3504e580952dSDimitry Andric LV.setNonGC(!E->isOBJCGCCandidate(getContext()));
3505f22ef01cSRoman Divacky setObjCGCLValueClass(getContext(), E, LV);
3506f22ef01cSRoman Divacky }
3507f22ef01cSRoman Divacky return LV;
3508f22ef01cSRoman Divacky }
3509f22ef01cSRoman Divacky
emitOMPArraySectionBase(CodeGenFunction & CGF,const Expr * Base,LValueBaseInfo & BaseInfo,TBAAAccessInfo & TBAAInfo,QualType BaseTy,QualType ElTy,bool IsLowerBound)3510e7145dcbSDimitry Andric static Address emitOMPArraySectionBase(CodeGenFunction &CGF, const Expr *Base,
3511d8866befSDimitry Andric LValueBaseInfo &BaseInfo,
35129a199699SDimitry Andric TBAAAccessInfo &TBAAInfo,
3513e7145dcbSDimitry Andric QualType BaseTy, QualType ElTy,
3514e7145dcbSDimitry Andric bool IsLowerBound) {
3515e7145dcbSDimitry Andric LValue BaseLVal;
3516e7145dcbSDimitry Andric if (auto *ASE = dyn_cast<OMPArraySectionExpr>(Base->IgnoreParenImpCasts())) {
3517e7145dcbSDimitry Andric BaseLVal = CGF.EmitOMPArraySectionExpr(ASE, IsLowerBound);
3518e7145dcbSDimitry Andric if (BaseTy->isArrayType()) {
3519e7145dcbSDimitry Andric Address Addr = BaseLVal.getAddress();
3520d8866befSDimitry Andric BaseInfo = BaseLVal.getBaseInfo();
3521e7145dcbSDimitry Andric
3522e7145dcbSDimitry Andric // If the array type was an incomplete type, we need to make sure
3523e7145dcbSDimitry Andric // the decay ends up being the right type.
3524e7145dcbSDimitry Andric llvm::Type *NewTy = CGF.ConvertType(BaseTy);
3525e7145dcbSDimitry Andric Addr = CGF.Builder.CreateElementBitCast(Addr, NewTy);
3526e7145dcbSDimitry Andric
3527e7145dcbSDimitry Andric // Note that VLA pointers are always decayed, so we don't need to do
3528e7145dcbSDimitry Andric // anything here.
3529e7145dcbSDimitry Andric if (!BaseTy->isVariableArrayType()) {
3530e7145dcbSDimitry Andric assert(isa<llvm::ArrayType>(Addr.getElementType()) &&
3531e7145dcbSDimitry Andric "Expected pointer to array");
3532e7145dcbSDimitry Andric Addr = CGF.Builder.CreateStructGEP(Addr, 0, CharUnits::Zero(),
3533e7145dcbSDimitry Andric "arraydecay");
3534e7145dcbSDimitry Andric }
3535e7145dcbSDimitry Andric
3536e7145dcbSDimitry Andric return CGF.Builder.CreateElementBitCast(Addr,
3537e7145dcbSDimitry Andric CGF.ConvertTypeForMem(ElTy));
3538e7145dcbSDimitry Andric }
35399a199699SDimitry Andric LValueBaseInfo TypeBaseInfo;
35409a199699SDimitry Andric TBAAAccessInfo TypeTBAAInfo;
35419a199699SDimitry Andric CharUnits Align = CGF.getNaturalTypeAlignment(ElTy, &TypeBaseInfo,
35429a199699SDimitry Andric &TypeTBAAInfo);
35439a199699SDimitry Andric BaseInfo.mergeForCast(TypeBaseInfo);
35449a199699SDimitry Andric TBAAInfo = CGF.CGM.mergeTBAAInfoForCast(TBAAInfo, TypeTBAAInfo);
3545e7145dcbSDimitry Andric return Address(CGF.Builder.CreateLoad(BaseLVal.getAddress()), Align);
3546e7145dcbSDimitry Andric }
35479a199699SDimitry Andric return CGF.EmitPointerWithAlignment(Base, &BaseInfo, &TBAAInfo);
3548e7145dcbSDimitry Andric }
3549e7145dcbSDimitry Andric
EmitOMPArraySectionExpr(const OMPArraySectionExpr * E,bool IsLowerBound)35500623d748SDimitry Andric LValue CodeGenFunction::EmitOMPArraySectionExpr(const OMPArraySectionExpr *E,
35510623d748SDimitry Andric bool IsLowerBound) {
3552d4419f6fSDimitry Andric QualType BaseTy = OMPArraySectionExpr::getBaseOriginalType(E->getBase());
35530623d748SDimitry Andric QualType ResultExprTy;
35540623d748SDimitry Andric if (auto *AT = getContext().getAsArrayType(BaseTy))
35550623d748SDimitry Andric ResultExprTy = AT->getElementType();
35560623d748SDimitry Andric else
35570623d748SDimitry Andric ResultExprTy = BaseTy->getPointeeType();
3558e7145dcbSDimitry Andric llvm::Value *Idx = nullptr;
3559e7145dcbSDimitry Andric if (IsLowerBound || E->getColonLoc().isInvalid()) {
35600623d748SDimitry Andric // Requesting lower bound or upper bound, but without provided length and
35610623d748SDimitry Andric // without ':' symbol for the default length -> length = 1.
35620623d748SDimitry Andric // Idx = LowerBound ?: 0;
35630623d748SDimitry Andric if (auto *LowerBound = E->getLowerBound()) {
35640623d748SDimitry Andric Idx = Builder.CreateIntCast(
35650623d748SDimitry Andric EmitScalarExpr(LowerBound), IntPtrTy,
35660623d748SDimitry Andric LowerBound->getType()->hasSignedIntegerRepresentation());
35670623d748SDimitry Andric } else
35680623d748SDimitry Andric Idx = llvm::ConstantInt::getNullValue(IntPtrTy);
35690623d748SDimitry Andric } else {
3570e7145dcbSDimitry Andric // Try to emit length or lower bound as constant. If this is possible, 1
3571e7145dcbSDimitry Andric // is subtracted from constant length or lower bound. Otherwise, emit LLVM
3572e7145dcbSDimitry Andric // IR (LB + Len) - 1.
35730623d748SDimitry Andric auto &C = CGM.getContext();
35740623d748SDimitry Andric auto *Length = E->getLength();
35750623d748SDimitry Andric llvm::APSInt ConstLength;
35760623d748SDimitry Andric if (Length) {
35770623d748SDimitry Andric // Idx = LowerBound + Length - 1;
35780623d748SDimitry Andric if (Length->isIntegerConstantExpr(ConstLength, C)) {
35790623d748SDimitry Andric ConstLength = ConstLength.zextOrTrunc(PointerWidthInBits);
35800623d748SDimitry Andric Length = nullptr;
35810623d748SDimitry Andric }
35820623d748SDimitry Andric auto *LowerBound = E->getLowerBound();
35830623d748SDimitry Andric llvm::APSInt ConstLowerBound(PointerWidthInBits, /*isUnsigned=*/false);
35840623d748SDimitry Andric if (LowerBound && LowerBound->isIntegerConstantExpr(ConstLowerBound, C)) {
35850623d748SDimitry Andric ConstLowerBound = ConstLowerBound.zextOrTrunc(PointerWidthInBits);
35860623d748SDimitry Andric LowerBound = nullptr;
35870623d748SDimitry Andric }
35880623d748SDimitry Andric if (!Length)
35890623d748SDimitry Andric --ConstLength;
35900623d748SDimitry Andric else if (!LowerBound)
35910623d748SDimitry Andric --ConstLowerBound;
3592f22ef01cSRoman Divacky
35930623d748SDimitry Andric if (Length || LowerBound) {
35940623d748SDimitry Andric auto *LowerBoundVal =
35950623d748SDimitry Andric LowerBound
35960623d748SDimitry Andric ? Builder.CreateIntCast(
35970623d748SDimitry Andric EmitScalarExpr(LowerBound), IntPtrTy,
35980623d748SDimitry Andric LowerBound->getType()->hasSignedIntegerRepresentation())
35990623d748SDimitry Andric : llvm::ConstantInt::get(IntPtrTy, ConstLowerBound);
36000623d748SDimitry Andric auto *LengthVal =
36010623d748SDimitry Andric Length
36020623d748SDimitry Andric ? Builder.CreateIntCast(
36030623d748SDimitry Andric EmitScalarExpr(Length), IntPtrTy,
36040623d748SDimitry Andric Length->getType()->hasSignedIntegerRepresentation())
36050623d748SDimitry Andric : llvm::ConstantInt::get(IntPtrTy, ConstLength);
36060623d748SDimitry Andric Idx = Builder.CreateAdd(LowerBoundVal, LengthVal, "lb_add_len",
36070623d748SDimitry Andric /*HasNUW=*/false,
36080623d748SDimitry Andric !getLangOpts().isSignedOverflowDefined());
36090623d748SDimitry Andric if (Length && LowerBound) {
36100623d748SDimitry Andric Idx = Builder.CreateSub(
36110623d748SDimitry Andric Idx, llvm::ConstantInt::get(IntPtrTy, /*V=*/1), "idx_sub_1",
36120623d748SDimitry Andric /*HasNUW=*/false, !getLangOpts().isSignedOverflowDefined());
36130623d748SDimitry Andric }
36140623d748SDimitry Andric } else
36150623d748SDimitry Andric Idx = llvm::ConstantInt::get(IntPtrTy, ConstLength + ConstLowerBound);
36160623d748SDimitry Andric } else {
36170623d748SDimitry Andric // Idx = ArraySize - 1;
3618e7145dcbSDimitry Andric QualType ArrayTy = BaseTy->isPointerType()
3619e7145dcbSDimitry Andric ? E->getBase()->IgnoreParenImpCasts()->getType()
3620e7145dcbSDimitry Andric : BaseTy;
3621e7145dcbSDimitry Andric if (auto *VAT = C.getAsVariableArrayType(ArrayTy)) {
36220623d748SDimitry Andric Length = VAT->getSizeExpr();
36230623d748SDimitry Andric if (Length->isIntegerConstantExpr(ConstLength, C))
36240623d748SDimitry Andric Length = nullptr;
36250623d748SDimitry Andric } else {
3626e7145dcbSDimitry Andric auto *CAT = C.getAsConstantArrayType(ArrayTy);
36270623d748SDimitry Andric ConstLength = CAT->getSize();
36280623d748SDimitry Andric }
36290623d748SDimitry Andric if (Length) {
36300623d748SDimitry Andric auto *LengthVal = Builder.CreateIntCast(
36310623d748SDimitry Andric EmitScalarExpr(Length), IntPtrTy,
36320623d748SDimitry Andric Length->getType()->hasSignedIntegerRepresentation());
36330623d748SDimitry Andric Idx = Builder.CreateSub(
36340623d748SDimitry Andric LengthVal, llvm::ConstantInt::get(IntPtrTy, /*V=*/1), "len_sub_1",
36350623d748SDimitry Andric /*HasNUW=*/false, !getLangOpts().isSignedOverflowDefined());
36360623d748SDimitry Andric } else {
36370623d748SDimitry Andric ConstLength = ConstLength.zextOrTrunc(PointerWidthInBits);
36380623d748SDimitry Andric --ConstLength;
36390623d748SDimitry Andric Idx = llvm::ConstantInt::get(IntPtrTy, ConstLength);
36400623d748SDimitry Andric }
36410623d748SDimitry Andric }
36420623d748SDimitry Andric }
36430623d748SDimitry Andric assert(Idx);
36440623d748SDimitry Andric
3645e7145dcbSDimitry Andric Address EltPtr = Address::invalid();
3646d8866befSDimitry Andric LValueBaseInfo BaseInfo;
36479a199699SDimitry Andric TBAAAccessInfo TBAAInfo;
36480623d748SDimitry Andric if (auto *VLA = getContext().getAsVariableArrayType(ResultExprTy)) {
3649e7145dcbSDimitry Andric // The base must be a pointer, which is not an aggregate. Emit
3650e7145dcbSDimitry Andric // it. It needs to be emitted first in case it's what captures
3651e7145dcbSDimitry Andric // the VLA bounds.
3652e7145dcbSDimitry Andric Address Base =
36539a199699SDimitry Andric emitOMPArraySectionBase(*this, E->getBase(), BaseInfo, TBAAInfo,
36549a199699SDimitry Andric BaseTy, VLA->getElementType(), IsLowerBound);
36550623d748SDimitry Andric // The element count here is the total number of non-VLA elements.
36564ba319b5SDimitry Andric llvm::Value *NumElements = getVLASize(VLA).NumElts;
36570623d748SDimitry Andric
36580623d748SDimitry Andric // Effectively, the multiply by the VLA size is part of the GEP.
36590623d748SDimitry Andric // GEP indexes are signed, and scaling an index isn't permitted to
36600623d748SDimitry Andric // signed-overflow, so we use the same semantics for our explicit
36610623d748SDimitry Andric // multiply. We suppress this if overflow is not undefined behavior.
3662e7145dcbSDimitry Andric if (getLangOpts().isSignedOverflowDefined())
3663e7145dcbSDimitry Andric Idx = Builder.CreateMul(Idx, NumElements);
3664e7145dcbSDimitry Andric else
3665e7145dcbSDimitry Andric Idx = Builder.CreateNSWMul(Idx, NumElements);
3666e7145dcbSDimitry Andric EltPtr = emitArraySubscriptGEP(*this, Base, Idx, VLA->getElementType(),
3667f9448bf3SDimitry Andric !getLangOpts().isSignedOverflowDefined(),
366824d58133SDimitry Andric /*SignedIndices=*/false, E->getExprLoc());
3669e7145dcbSDimitry Andric } else if (const Expr *Array = isSimpleArrayDecayOperand(E->getBase())) {
3670e7145dcbSDimitry Andric // If this is A[i] where A is an array, the frontend will have decayed the
3671e7145dcbSDimitry Andric // base to be a ArrayToPointerDecay implicit cast. While correct, it is
3672e7145dcbSDimitry Andric // inefficient at -O0 to emit a "gep A, 0, 0" when codegen'ing it, then a
3673e7145dcbSDimitry Andric // "gep x, i" here. Emit one "gep A, 0, i".
3674e7145dcbSDimitry Andric assert(Array->getType()->isArrayType() &&
3675e7145dcbSDimitry Andric "Array to pointer decay must have array source type!");
3676e7145dcbSDimitry Andric LValue ArrayLV;
3677e7145dcbSDimitry Andric // For simple multidimensional array indexing, set the 'accessed' flag for
3678e7145dcbSDimitry Andric // better bounds-checking of the base expression.
3679e7145dcbSDimitry Andric if (const auto *ASE = dyn_cast<ArraySubscriptExpr>(Array))
3680e7145dcbSDimitry Andric ArrayLV = EmitArraySubscriptExpr(ASE, /*Accessed*/ true);
3681e7145dcbSDimitry Andric else
3682e7145dcbSDimitry Andric ArrayLV = EmitLValue(Array);
36830623d748SDimitry Andric
3684e7145dcbSDimitry Andric // Propagate the alignment from the array itself to the result.
3685e7145dcbSDimitry Andric EltPtr = emitArraySubscriptGEP(
3686e7145dcbSDimitry Andric *this, ArrayLV.getAddress(), {CGM.getSize(CharUnits::Zero()), Idx},
3687f9448bf3SDimitry Andric ResultExprTy, !getLangOpts().isSignedOverflowDefined(),
368824d58133SDimitry Andric /*SignedIndices=*/false, E->getExprLoc());
3689d8866befSDimitry Andric BaseInfo = ArrayLV.getBaseInfo();
36909a199699SDimitry Andric TBAAInfo = CGM.getTBAAInfoForSubobject(ArrayLV, ResultExprTy);
36910623d748SDimitry Andric } else {
3692d8866befSDimitry Andric Address Base = emitOMPArraySectionBase(*this, E->getBase(), BaseInfo,
36939a199699SDimitry Andric TBAAInfo, BaseTy, ResultExprTy,
36949a199699SDimitry Andric IsLowerBound);
3695e7145dcbSDimitry Andric EltPtr = emitArraySubscriptGEP(*this, Base, Idx, ResultExprTy,
3696f9448bf3SDimitry Andric !getLangOpts().isSignedOverflowDefined(),
369724d58133SDimitry Andric /*SignedIndices=*/false, E->getExprLoc());
36980623d748SDimitry Andric }
36990623d748SDimitry Andric
37009a199699SDimitry Andric return MakeAddrLValue(EltPtr, ResultExprTy, BaseInfo, TBAAInfo);
3701f22ef01cSRoman Divacky }
3702f22ef01cSRoman Divacky
3703f22ef01cSRoman Divacky LValue CodeGenFunction::
EmitExtVectorElementExpr(const ExtVectorElementExpr * E)3704f22ef01cSRoman Divacky EmitExtVectorElementExpr(const ExtVectorElementExpr *E) {
3705f22ef01cSRoman Divacky // Emit the base vector as an l-value.
3706f22ef01cSRoman Divacky LValue Base;
3707f22ef01cSRoman Divacky
3708f22ef01cSRoman Divacky // ExtVectorElementExpr's base can either be a vector or pointer to vector.
3709f22ef01cSRoman Divacky if (E->isArrow()) {
3710f22ef01cSRoman Divacky // If it is a pointer to a vector, emit the address and form an lvalue with
3711f22ef01cSRoman Divacky // it.
3712d8866befSDimitry Andric LValueBaseInfo BaseInfo;
37139a199699SDimitry Andric TBAAAccessInfo TBAAInfo;
37149a199699SDimitry Andric Address Ptr = EmitPointerWithAlignment(E->getBase(), &BaseInfo, &TBAAInfo);
3715f22ef01cSRoman Divacky const PointerType *PT = E->getBase()->getType()->getAs<PointerType>();
37169a199699SDimitry Andric Base = MakeAddrLValue(Ptr, PT->getPointeeType(), BaseInfo, TBAAInfo);
3717e580952dSDimitry Andric Base.getQuals().removeObjCGCAttr();
37182754fe60SDimitry Andric } else if (E->getBase()->isGLValue()) {
3719f22ef01cSRoman Divacky // Otherwise, if the base is an lvalue ( as in the case of foo.x.x),
3720f22ef01cSRoman Divacky // emit the base as an lvalue.
3721f22ef01cSRoman Divacky assert(E->getBase()->getType()->isVectorType());
3722f22ef01cSRoman Divacky Base = EmitLValue(E->getBase());
3723f22ef01cSRoman Divacky } else {
3724f22ef01cSRoman Divacky // Otherwise, the base is a normal rvalue (as in (V+V).x), emit it as such.
372517a519f9SDimitry Andric assert(E->getBase()->getType()->isVectorType() &&
3726f22ef01cSRoman Divacky "Result must be a vector");
3727f22ef01cSRoman Divacky llvm::Value *Vec = EmitScalarExpr(E->getBase());
3728f22ef01cSRoman Divacky
3729f22ef01cSRoman Divacky // Store the vector to memory (because LValue wants an address).
37300623d748SDimitry Andric Address VecMem = CreateMemTemp(E->getBase()->getType());
3731f22ef01cSRoman Divacky Builder.CreateStore(Vec, VecMem);
37320623d748SDimitry Andric Base = MakeAddrLValue(VecMem, E->getBase()->getType(),
37339a199699SDimitry Andric AlignmentSource::Decl);
3734f22ef01cSRoman Divacky }
3735f22ef01cSRoman Divacky
373617a519f9SDimitry Andric QualType type =
373717a519f9SDimitry Andric E->getType().withCVRQualifiers(Base.getQuals().getCVRQualifiers());
373817a519f9SDimitry Andric
3739f22ef01cSRoman Divacky // Encode the element access list into a vector of unsigned indices.
37400623d748SDimitry Andric SmallVector<uint32_t, 4> Indices;
3741f22ef01cSRoman Divacky E->getEncodedElementAccess(Indices);
3742f22ef01cSRoman Divacky
3743f22ef01cSRoman Divacky if (Base.isSimple()) {
37440623d748SDimitry Andric llvm::Constant *CV =
37450623d748SDimitry Andric llvm::ConstantDataVector::get(getLLVMContext(), Indices);
3746dff0c46cSDimitry Andric return LValue::MakeExtVectorElt(Base.getAddress(), CV, type,
37479a199699SDimitry Andric Base.getBaseInfo(), TBAAAccessInfo());
3748f22ef01cSRoman Divacky }
3749f22ef01cSRoman Divacky assert(Base.isExtVectorElt() && "Can only subscript lvalue vec elts here!");
3750f22ef01cSRoman Divacky
3751f22ef01cSRoman Divacky llvm::Constant *BaseElts = Base.getExtVectorElts();
37526122f3e6SDimitry Andric SmallVector<llvm::Constant *, 4> CElts;
3753f22ef01cSRoman Divacky
3754dff0c46cSDimitry Andric for (unsigned i = 0, e = Indices.size(); i != e; ++i)
3755dff0c46cSDimitry Andric CElts.push_back(BaseElts->getAggregateElement(Indices[i]));
37562754fe60SDimitry Andric llvm::Constant *CV = llvm::ConstantVector::get(CElts);
37570623d748SDimitry Andric return LValue::MakeExtVectorElt(Base.getExtVectorAddress(), CV, type,
37589a199699SDimitry Andric Base.getBaseInfo(), TBAAAccessInfo());
3759f22ef01cSRoman Divacky }
3760f22ef01cSRoman Divacky
EmitMemberExpr(const MemberExpr * E)3761f22ef01cSRoman Divacky LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) {
37629a199699SDimitry Andric if (DeclRefExpr *DRE = tryToConvertMemberExprToDeclRefExpr(*this, E)) {
37639a199699SDimitry Andric EmitIgnoredExpr(E->getBase());
37649a199699SDimitry Andric return EmitDeclRefLValue(DRE);
37659a199699SDimitry Andric }
37669a199699SDimitry Andric
3767f22ef01cSRoman Divacky Expr *BaseExpr = E->getBase();
3768f22ef01cSRoman Divacky // If this is s.x, emit s as an lvalue. If it is s->x, emit s as a scalar.
3769cb4dff85SDimitry Andric LValue BaseLV;
37703861d79fSDimitry Andric if (E->isArrow()) {
3771d8866befSDimitry Andric LValueBaseInfo BaseInfo;
37729a199699SDimitry Andric TBAAAccessInfo TBAAInfo;
37739a199699SDimitry Andric Address Addr = EmitPointerWithAlignment(BaseExpr, &BaseInfo, &TBAAInfo);
37743861d79fSDimitry Andric QualType PtrTy = BaseExpr->getType()->getPointeeType();
377520e90f04SDimitry Andric SanitizerSet SkippedChecks;
377620e90f04SDimitry Andric bool IsBaseCXXThis = IsWrappedCXXThis(BaseExpr);
377720e90f04SDimitry Andric if (IsBaseCXXThis)
377820e90f04SDimitry Andric SkippedChecks.set(SanitizerKind::Alignment, true);
377920e90f04SDimitry Andric if (IsBaseCXXThis || isa<DeclRefExpr>(BaseExpr))
378020e90f04SDimitry Andric SkippedChecks.set(SanitizerKind::Null, true);
378120e90f04SDimitry Andric EmitTypeCheck(TCK_MemberAccess, E->getExprLoc(), Addr.getPointer(), PtrTy,
378220e90f04SDimitry Andric /*Alignment=*/CharUnits::Zero(), SkippedChecks);
37839a199699SDimitry Andric BaseLV = MakeAddrLValue(Addr, PtrTy, BaseInfo, TBAAInfo);
37843861d79fSDimitry Andric } else
37853861d79fSDimitry Andric BaseLV = EmitCheckedLValue(BaseExpr, TCK_MemberAccess);
3786f22ef01cSRoman Divacky
3787f22ef01cSRoman Divacky NamedDecl *ND = E->getMemberDecl();
378859d1ed5bSDimitry Andric if (auto *Field = dyn_cast<FieldDecl>(ND)) {
3789cb4dff85SDimitry Andric LValue LV = EmitLValueForField(BaseLV, Field);
3790f22ef01cSRoman Divacky setObjCGCLValueClass(getContext(), E, LV);
3791f22ef01cSRoman Divacky return LV;
3792f22ef01cSRoman Divacky }
3793f22ef01cSRoman Divacky
379459d1ed5bSDimitry Andric if (const auto *FD = dyn_cast<FunctionDecl>(ND))
3795f22ef01cSRoman Divacky return EmitFunctionDeclLValue(*this, E, FD);
3796f22ef01cSRoman Divacky
37976122f3e6SDimitry Andric llvm_unreachable("Unhandled member declaration!");
3798f22ef01cSRoman Divacky }
3799f22ef01cSRoman Divacky
3800284c1978SDimitry Andric /// Given that we are currently emitting a lambda, emit an l-value for
3801284c1978SDimitry Andric /// one of its members.
EmitLValueForLambdaField(const FieldDecl * Field)3802284c1978SDimitry Andric LValue CodeGenFunction::EmitLValueForLambdaField(const FieldDecl *Field) {
3803284c1978SDimitry Andric assert(cast<CXXMethodDecl>(CurCodeDecl)->getParent()->isLambda());
3804284c1978SDimitry Andric assert(cast<CXXMethodDecl>(CurCodeDecl)->getParent() == Field->getParent());
3805284c1978SDimitry Andric QualType LambdaTagType =
3806284c1978SDimitry Andric getContext().getTagDeclType(Field->getParent());
3807284c1978SDimitry Andric LValue LambdaLV = MakeNaturalAlignAddrLValue(CXXABIThisValue, LambdaTagType);
3808284c1978SDimitry Andric return EmitLValueForField(LambdaLV, Field);
3809284c1978SDimitry Andric }
3810284c1978SDimitry Andric
38110623d748SDimitry Andric /// Drill down to the storage of a field without walking into
38120623d748SDimitry Andric /// reference types.
38130623d748SDimitry Andric ///
38140623d748SDimitry Andric /// The resulting address doesn't necessarily have the right type.
emitAddrOfFieldStorage(CodeGenFunction & CGF,Address base,const FieldDecl * field)38150623d748SDimitry Andric static Address emitAddrOfFieldStorage(CodeGenFunction &CGF, Address base,
38160623d748SDimitry Andric const FieldDecl *field) {
38170623d748SDimitry Andric const RecordDecl *rec = field->getParent();
38180623d748SDimitry Andric
38190623d748SDimitry Andric unsigned idx =
38200623d748SDimitry Andric CGF.CGM.getTypes().getCGRecordLayout(rec).getLLVMFieldNo(field);
38210623d748SDimitry Andric
38220623d748SDimitry Andric CharUnits offset;
38230623d748SDimitry Andric // Adjust the alignment down to the given offset.
38240623d748SDimitry Andric // As a special case, if the LLVM field index is 0, we know that this
38250623d748SDimitry Andric // is zero.
38260623d748SDimitry Andric assert((idx != 0 || CGF.getContext().getASTRecordLayout(rec)
38270623d748SDimitry Andric .getFieldOffset(field->getFieldIndex()) == 0) &&
38280623d748SDimitry Andric "LLVM field at index zero had non-zero offset?");
38290623d748SDimitry Andric if (idx != 0) {
38300623d748SDimitry Andric auto &recLayout = CGF.getContext().getASTRecordLayout(rec);
38310623d748SDimitry Andric auto offsetInBits = recLayout.getFieldOffset(field->getFieldIndex());
38320623d748SDimitry Andric offset = CGF.getContext().toCharUnitsFromBits(offsetInBits);
38330623d748SDimitry Andric }
38340623d748SDimitry Andric
38350623d748SDimitry Andric return CGF.Builder.CreateStructGEP(base, idx, offset, field->getName());
38360623d748SDimitry Andric }
38370623d748SDimitry Andric
hasAnyVptr(const QualType Type,const ASTContext & Context)3838f9448bf3SDimitry Andric static bool hasAnyVptr(const QualType Type, const ASTContext &Context) {
3839f9448bf3SDimitry Andric const auto *RD = Type.getTypePtr()->getAsCXXRecordDecl();
3840f9448bf3SDimitry Andric if (!RD)
3841f9448bf3SDimitry Andric return false;
3842f9448bf3SDimitry Andric
3843f9448bf3SDimitry Andric if (RD->isDynamicClass())
3844f9448bf3SDimitry Andric return true;
3845f9448bf3SDimitry Andric
3846f9448bf3SDimitry Andric for (const auto &Base : RD->bases())
3847f9448bf3SDimitry Andric if (hasAnyVptr(Base.getType(), Context))
3848f9448bf3SDimitry Andric return true;
3849f9448bf3SDimitry Andric
3850f9448bf3SDimitry Andric for (const FieldDecl *Field : RD->fields())
3851f9448bf3SDimitry Andric if (hasAnyVptr(Field->getType(), Context))
3852f9448bf3SDimitry Andric return true;
3853f9448bf3SDimitry Andric
3854f9448bf3SDimitry Andric return false;
3855f9448bf3SDimitry Andric }
3856f9448bf3SDimitry Andric
EmitLValueForField(LValue base,const FieldDecl * field)3857cb4dff85SDimitry Andric LValue CodeGenFunction::EmitLValueForField(LValue base,
3858cb4dff85SDimitry Andric const FieldDecl *field) {
3859d8866befSDimitry Andric LValueBaseInfo BaseInfo = base.getBaseInfo();
3860302affcbSDimitry Andric
38617ae0e2c9SDimitry Andric if (field->isBitField()) {
38627ae0e2c9SDimitry Andric const CGRecordLayout &RL =
38637ae0e2c9SDimitry Andric CGM.getTypes().getCGRecordLayout(field->getParent());
38647ae0e2c9SDimitry Andric const CGBitFieldInfo &Info = RL.getBitFieldInfo(field);
38650623d748SDimitry Andric Address Addr = base.getAddress();
3866139f7f9bSDimitry Andric unsigned Idx = RL.getLLVMFieldNo(field);
3867139f7f9bSDimitry Andric if (Idx != 0)
3868139f7f9bSDimitry Andric // For structs, we GEP to the field that the record layout suggests.
38690623d748SDimitry Andric Addr = Builder.CreateStructGEP(Addr, Idx, Info.StorageOffset,
38700623d748SDimitry Andric field->getName());
3871139f7f9bSDimitry Andric // Get the access type.
38720623d748SDimitry Andric llvm::Type *FieldIntTy =
38730623d748SDimitry Andric llvm::Type::getIntNTy(getLLVMContext(), Info.StorageSize);
38740623d748SDimitry Andric if (Addr.getElementType() != FieldIntTy)
38750623d748SDimitry Andric Addr = Builder.CreateElementBitCast(Addr, FieldIntTy);
3876139f7f9bSDimitry Andric
38777ae0e2c9SDimitry Andric QualType fieldType =
38787ae0e2c9SDimitry Andric field->getType().withCVRQualifiers(base.getVRQualifiers());
38799a199699SDimitry Andric // TODO: Support TBAA for bit fields.
38809a199699SDimitry Andric LValueBaseInfo FieldBaseInfo(BaseInfo.getAlignmentSource());
38819a199699SDimitry Andric return LValue::MakeBitfield(Addr, Info, fieldType, FieldBaseInfo,
38829a199699SDimitry Andric TBAAAccessInfo());
38839a199699SDimitry Andric }
38849a199699SDimitry Andric
38859a199699SDimitry Andric // Fields of may-alias structures are may-alias themselves.
38869a199699SDimitry Andric // FIXME: this should get propagated down through anonymous structs
38879a199699SDimitry Andric // and unions.
38889a199699SDimitry Andric QualType FieldType = field->getType();
38899a199699SDimitry Andric const RecordDecl *rec = field->getParent();
38909a199699SDimitry Andric AlignmentSource BaseAlignSource = BaseInfo.getAlignmentSource();
38919a199699SDimitry Andric LValueBaseInfo FieldBaseInfo(getFieldAlignmentSource(BaseAlignSource));
38929a199699SDimitry Andric TBAAAccessInfo FieldTBAAInfo;
38939a199699SDimitry Andric if (base.getTBAAInfo().isMayAlias() ||
38949a199699SDimitry Andric rec->hasAttr<MayAliasAttr>() || FieldType->isVectorType()) {
38959a199699SDimitry Andric FieldTBAAInfo = TBAAAccessInfo::getMayAliasInfo();
38969a199699SDimitry Andric } else if (rec->isUnion()) {
38979a199699SDimitry Andric // TODO: Support TBAA for unions.
38989a199699SDimitry Andric FieldTBAAInfo = TBAAAccessInfo::getMayAliasInfo();
38999a199699SDimitry Andric } else {
39009a199699SDimitry Andric // If no base type been assigned for the base access, then try to generate
39019a199699SDimitry Andric // one for this base lvalue.
39029a199699SDimitry Andric FieldTBAAInfo = base.getTBAAInfo();
39039a199699SDimitry Andric if (!FieldTBAAInfo.BaseType) {
39049a199699SDimitry Andric FieldTBAAInfo.BaseType = CGM.getTBAABaseTypeInfo(base.getType());
39059a199699SDimitry Andric assert(!FieldTBAAInfo.Offset &&
39069a199699SDimitry Andric "Nonzero offset for an access with no base type!");
39079a199699SDimitry Andric }
39089a199699SDimitry Andric
39099a199699SDimitry Andric // Adjust offset to be relative to the base type.
39109a199699SDimitry Andric const ASTRecordLayout &Layout =
39119a199699SDimitry Andric getContext().getASTRecordLayout(field->getParent());
39129a199699SDimitry Andric unsigned CharWidth = getContext().getCharWidth();
39139a199699SDimitry Andric if (FieldTBAAInfo.BaseType)
39149a199699SDimitry Andric FieldTBAAInfo.Offset +=
39159a199699SDimitry Andric Layout.getFieldOffset(field->getFieldIndex()) / CharWidth;
39169a199699SDimitry Andric
391713ddaa84SDimitry Andric // Update the final access type and size.
39189a199699SDimitry Andric FieldTBAAInfo.AccessType = CGM.getTBAATypeInfo(FieldType);
391913ddaa84SDimitry Andric FieldTBAAInfo.Size =
392013ddaa84SDimitry Andric getContext().getTypeSizeInChars(FieldType).getQuantity();
39217ae0e2c9SDimitry Andric }
3922f22ef01cSRoman Divacky
39230623d748SDimitry Andric Address addr = base.getAddress();
39244ba319b5SDimitry Andric if (auto *ClassDef = dyn_cast<CXXRecordDecl>(rec)) {
39254ba319b5SDimitry Andric if (CGM.getCodeGenOpts().StrictVTablePointers &&
39264ba319b5SDimitry Andric ClassDef->isDynamicClass()) {
39274ba319b5SDimitry Andric // Getting to any field of dynamic object requires stripping dynamic
39284ba319b5SDimitry Andric // information provided by invariant.group. This is because accessing
39294ba319b5SDimitry Andric // fields may leak the real address of dynamic object, which could result
39304ba319b5SDimitry Andric // in miscompilation when leaked pointer would be compared.
39314ba319b5SDimitry Andric auto *stripped = Builder.CreateStripInvariantGroup(addr.getPointer());
39324ba319b5SDimitry Andric addr = Address(stripped, addr.getAlignment());
39334ba319b5SDimitry Andric }
39344ba319b5SDimitry Andric }
39354ba319b5SDimitry Andric
39369a199699SDimitry Andric unsigned RecordCVR = base.getVRQualifiers();
3937dd6029ffSDimitry Andric if (rec->isUnion()) {
393817a519f9SDimitry Andric // For unions, there is no pointer adjustment.
39399a199699SDimitry Andric assert(!FieldType->isReferenceType() && "union has reference member");
3940f9448bf3SDimitry Andric if (CGM.getCodeGenOpts().StrictVTablePointers &&
3941f9448bf3SDimitry Andric hasAnyVptr(FieldType, getContext()))
3942f9448bf3SDimitry Andric // Because unions can easily skip invariant.barriers, we need to add
3943f9448bf3SDimitry Andric // a barrier every time CXXRecord field with vptr is referenced.
39444ba319b5SDimitry Andric addr = Address(Builder.CreateLaunderInvariantGroup(addr.getPointer()),
3945f9448bf3SDimitry Andric addr.getAlignment());
3946dd6029ffSDimitry Andric } else {
3947dd6029ffSDimitry Andric // For structs, we GEP to the field that the record layout suggests.
39480623d748SDimitry Andric addr = emitAddrOfFieldStorage(*this, addr, field);
3949dd6029ffSDimitry Andric
3950dd6029ffSDimitry Andric // If this is a reference field, load the reference right now.
39519a199699SDimitry Andric if (FieldType->isReferenceType()) {
39529a199699SDimitry Andric LValue RefLVal = MakeAddrLValue(addr, FieldType, FieldBaseInfo,
39539a199699SDimitry Andric FieldTBAAInfo);
39549a199699SDimitry Andric if (RecordCVR & Qualifiers::Volatile)
3955*b5893f02SDimitry Andric RefLVal.getQuals().addVolatile();
39569a199699SDimitry Andric addr = EmitLoadOfReference(RefLVal, &FieldBaseInfo, &FieldTBAAInfo);
3957dd6029ffSDimitry Andric
39589a199699SDimitry Andric // Qualifiers on the struct don't apply to the referencee.
39599a199699SDimitry Andric RecordCVR = 0;
39609a199699SDimitry Andric FieldType = FieldType->getPointeeType();
3961dd6029ffSDimitry Andric }
3962dd6029ffSDimitry Andric }
3963dd6029ffSDimitry Andric
396417a519f9SDimitry Andric // Make sure that the address is pointing to the right type. This is critical
396517a519f9SDimitry Andric // for both unions and structs. A union needs a bitcast, a struct element
396617a519f9SDimitry Andric // will need a bitcast if the LLVM type laid out doesn't match the desired
396717a519f9SDimitry Andric // type.
39689a199699SDimitry Andric addr = Builder.CreateElementBitCast(
39699a199699SDimitry Andric addr, CGM.getTypes().ConvertTypeForMem(FieldType), field->getName());
397017a519f9SDimitry Andric
39716122f3e6SDimitry Andric if (field->hasAttr<AnnotateAttr>())
39726122f3e6SDimitry Andric addr = EmitFieldAnnotations(field, addr);
39736122f3e6SDimitry Andric
39749a199699SDimitry Andric LValue LV = MakeAddrLValue(addr, FieldType, FieldBaseInfo, FieldTBAAInfo);
39759a199699SDimitry Andric LV.getQuals().addCVRQualifiers(RecordCVR);
3976f22ef01cSRoman Divacky
3977e580952dSDimitry Andric // __weak attribute on a field is ignored.
3978e580952dSDimitry Andric if (LV.getQuals().getObjCGCAttr() == Qualifiers::Weak)
3979e580952dSDimitry Andric LV.getQuals().removeObjCGCAttr();
3980e580952dSDimitry Andric
3981e580952dSDimitry Andric return LV;
3982f22ef01cSRoman Divacky }
3983f22ef01cSRoman Divacky
3984f22ef01cSRoman Divacky LValue
EmitLValueForFieldInitialization(LValue Base,const FieldDecl * Field)3985cb4dff85SDimitry Andric CodeGenFunction::EmitLValueForFieldInitialization(LValue Base,
3986cb4dff85SDimitry Andric const FieldDecl *Field) {
3987f22ef01cSRoman Divacky QualType FieldType = Field->getType();
3988f22ef01cSRoman Divacky
3989f22ef01cSRoman Divacky if (!FieldType->isReferenceType())
3990cb4dff85SDimitry Andric return EmitLValueForField(Base, Field);
3991f22ef01cSRoman Divacky
39920623d748SDimitry Andric Address V = emitAddrOfFieldStorage(*this, Base.getAddress(), Field);
3993f22ef01cSRoman Divacky
39940623d748SDimitry Andric // Make sure that the address is pointing to the right type.
39956122f3e6SDimitry Andric llvm::Type *llvmType = ConvertTypeForMem(FieldType);
39960623d748SDimitry Andric V = Builder.CreateElementBitCast(V, llvmType, Field->getName());
399717a519f9SDimitry Andric
39989a199699SDimitry Andric // TODO: Generate TBAA information that describes this access as a structure
39999a199699SDimitry Andric // member access and not just an access to an object of the field's type. This
40009a199699SDimitry Andric // should be similar to what we do in EmitLValueForField().
4001d8866befSDimitry Andric LValueBaseInfo BaseInfo = Base.getBaseInfo();
40029a199699SDimitry Andric AlignmentSource FieldAlignSource = BaseInfo.getAlignmentSource();
40039a199699SDimitry Andric LValueBaseInfo FieldBaseInfo(getFieldAlignmentSource(FieldAlignSource));
40049a199699SDimitry Andric return MakeAddrLValue(V, FieldType, FieldBaseInfo,
40059a199699SDimitry Andric CGM.getTBAAInfoForSubobject(Base, FieldType));
4006f22ef01cSRoman Divacky }
4007f22ef01cSRoman Divacky
EmitCompoundLiteralLValue(const CompoundLiteralExpr * E)4008f22ef01cSRoman Divacky LValue CodeGenFunction::EmitCompoundLiteralLValue(const CompoundLiteralExpr *E){
4009dff0c46cSDimitry Andric if (E->isFileScope()) {
40100623d748SDimitry Andric ConstantAddress GlobalPtr = CGM.GetAddrOfConstantCompoundLiteral(E);
40119a199699SDimitry Andric return MakeAddrLValue(GlobalPtr, E->getType(), AlignmentSource::Decl);
4012dff0c46cSDimitry Andric }
40137ae0e2c9SDimitry Andric if (E->getType()->isVariablyModifiedType())
40147ae0e2c9SDimitry Andric // make sure to emit the VLA size.
40157ae0e2c9SDimitry Andric EmitVariablyModifiedType(E->getType());
4016dff0c46cSDimitry Andric
40170623d748SDimitry Andric Address DeclPtr = CreateMemTemp(E->getType(), ".compoundliteral");
4018f22ef01cSRoman Divacky const Expr *InitExpr = E->getInitializer();
40199a199699SDimitry Andric LValue Result = MakeAddrLValue(DeclPtr, E->getType(), AlignmentSource::Decl);
4020f22ef01cSRoman Divacky
402117a519f9SDimitry Andric EmitAnyExprToMem(InitExpr, DeclPtr, E->getType().getQualifiers(),
402217a519f9SDimitry Andric /*Init*/ true);
4023f22ef01cSRoman Divacky
4024f22ef01cSRoman Divacky return Result;
4025f22ef01cSRoman Divacky }
4026f22ef01cSRoman Divacky
EmitInitListLValue(const InitListExpr * E)40277ae0e2c9SDimitry Andric LValue CodeGenFunction::EmitInitListLValue(const InitListExpr *E) {
40287ae0e2c9SDimitry Andric if (!E->isGLValue())
40297ae0e2c9SDimitry Andric // Initializing an aggregate temporary in C++11: T{...}.
40307ae0e2c9SDimitry Andric return EmitAggExprToLValue(E);
40317ae0e2c9SDimitry Andric
40327ae0e2c9SDimitry Andric // An lvalue initializer list must be initializing a reference.
403344290647SDimitry Andric assert(E->isTransparent() && "non-transparent glvalue init list");
40347ae0e2c9SDimitry Andric return EmitLValue(E->getInit(0));
40357ae0e2c9SDimitry Andric }
40367ae0e2c9SDimitry Andric
403759d1ed5bSDimitry Andric /// Emit the operand of a glvalue conditional operator. This is either a glvalue
403859d1ed5bSDimitry Andric /// or a (possibly-parenthesized) throw-expression. If this is a throw, no
403959d1ed5bSDimitry Andric /// LValue is returned and the current block has been terminated.
EmitLValueOrThrowExpression(CodeGenFunction & CGF,const Expr * Operand)404059d1ed5bSDimitry Andric static Optional<LValue> EmitLValueOrThrowExpression(CodeGenFunction &CGF,
404159d1ed5bSDimitry Andric const Expr *Operand) {
404259d1ed5bSDimitry Andric if (auto *ThrowExpr = dyn_cast<CXXThrowExpr>(Operand->IgnoreParens())) {
404359d1ed5bSDimitry Andric CGF.EmitCXXThrowExpr(ThrowExpr, /*KeepInsertionPoint*/false);
404459d1ed5bSDimitry Andric return None;
404559d1ed5bSDimitry Andric }
404659d1ed5bSDimitry Andric
404759d1ed5bSDimitry Andric return CGF.EmitLValue(Operand);
404859d1ed5bSDimitry Andric }
404959d1ed5bSDimitry Andric
40502754fe60SDimitry Andric LValue CodeGenFunction::
EmitConditionalOperatorLValue(const AbstractConditionalOperator * expr)40512754fe60SDimitry Andric EmitConditionalOperatorLValue(const AbstractConditionalOperator *expr) {
40522754fe60SDimitry Andric if (!expr->isGLValue()) {
4053f22ef01cSRoman Divacky // ?: here should be an aggregate.
4054139f7f9bSDimitry Andric assert(hasAggregateEvaluationKind(expr->getType()) &&
4055f22ef01cSRoman Divacky "Unexpected conditional operator!");
40562754fe60SDimitry Andric return EmitAggExprToLValue(expr);
40572754fe60SDimitry Andric }
4058f22ef01cSRoman Divacky
4059dff0c46cSDimitry Andric OpaqueValueMapping binding(*this, expr);
4060dff0c46cSDimitry Andric
40612754fe60SDimitry Andric const Expr *condExpr = expr->getCond();
40623b0f4066SDimitry Andric bool CondExprBool;
40633b0f4066SDimitry Andric if (ConstantFoldsToSimpleInteger(condExpr, CondExprBool)) {
40642754fe60SDimitry Andric const Expr *live = expr->getTrueExpr(), *dead = expr->getFalseExpr();
40653b0f4066SDimitry Andric if (!CondExprBool) std::swap(live, dead);
40662754fe60SDimitry Andric
406759d1ed5bSDimitry Andric if (!ContainsLabel(dead)) {
406859d1ed5bSDimitry Andric // If the true case is live, we need to track its region.
406959d1ed5bSDimitry Andric if (CondExprBool)
407033956c43SDimitry Andric incrementProfileCounter(expr);
40712754fe60SDimitry Andric return EmitLValue(live);
40722754fe60SDimitry Andric }
407359d1ed5bSDimitry Andric }
40742754fe60SDimitry Andric
40752754fe60SDimitry Andric llvm::BasicBlock *lhsBlock = createBasicBlock("cond.true");
40762754fe60SDimitry Andric llvm::BasicBlock *rhsBlock = createBasicBlock("cond.false");
40772754fe60SDimitry Andric llvm::BasicBlock *contBlock = createBasicBlock("cond.end");
40782754fe60SDimitry Andric
40792754fe60SDimitry Andric ConditionalEvaluation eval(*this);
408033956c43SDimitry Andric EmitBranchOnBoolExpr(condExpr, lhsBlock, rhsBlock, getProfileCount(expr));
40812754fe60SDimitry Andric
40822754fe60SDimitry Andric // Any temporaries created here are conditional.
40832754fe60SDimitry Andric EmitBlock(lhsBlock);
408433956c43SDimitry Andric incrementProfileCounter(expr);
40852754fe60SDimitry Andric eval.begin(*this);
408659d1ed5bSDimitry Andric Optional<LValue> lhs =
408759d1ed5bSDimitry Andric EmitLValueOrThrowExpression(*this, expr->getTrueExpr());
40882754fe60SDimitry Andric eval.end(*this);
40892754fe60SDimitry Andric
409059d1ed5bSDimitry Andric if (lhs && !lhs->isSimple())
40912754fe60SDimitry Andric return EmitUnsupportedLValue(expr, "conditional operator");
40922754fe60SDimitry Andric
40932754fe60SDimitry Andric lhsBlock = Builder.GetInsertBlock();
409459d1ed5bSDimitry Andric if (lhs)
40952754fe60SDimitry Andric Builder.CreateBr(contBlock);
40962754fe60SDimitry Andric
40972754fe60SDimitry Andric // Any temporaries created here are conditional.
40982754fe60SDimitry Andric EmitBlock(rhsBlock);
40992754fe60SDimitry Andric eval.begin(*this);
410059d1ed5bSDimitry Andric Optional<LValue> rhs =
410159d1ed5bSDimitry Andric EmitLValueOrThrowExpression(*this, expr->getFalseExpr());
41022754fe60SDimitry Andric eval.end(*this);
410359d1ed5bSDimitry Andric if (rhs && !rhs->isSimple())
41042754fe60SDimitry Andric return EmitUnsupportedLValue(expr, "conditional operator");
41052754fe60SDimitry Andric rhsBlock = Builder.GetInsertBlock();
41062754fe60SDimitry Andric
41072754fe60SDimitry Andric EmitBlock(contBlock);
41082754fe60SDimitry Andric
410959d1ed5bSDimitry Andric if (lhs && rhs) {
41100623d748SDimitry Andric llvm::PHINode *phi = Builder.CreatePHI(lhs->getPointer()->getType(),
411159d1ed5bSDimitry Andric 2, "cond-lvalue");
41120623d748SDimitry Andric phi->addIncoming(lhs->getPointer(), lhsBlock);
41130623d748SDimitry Andric phi->addIncoming(rhs->getPointer(), rhsBlock);
41140623d748SDimitry Andric Address result(phi, std::min(lhs->getAlignment(), rhs->getAlignment()));
41150623d748SDimitry Andric AlignmentSource alignSource =
4116d8866befSDimitry Andric std::max(lhs->getBaseInfo().getAlignmentSource(),
4117d8866befSDimitry Andric rhs->getBaseInfo().getAlignmentSource());
41189a199699SDimitry Andric TBAAAccessInfo TBAAInfo = CGM.mergeTBAAInfoForConditionalOperator(
41199a199699SDimitry Andric lhs->getTBAAInfo(), rhs->getTBAAInfo());
41209a199699SDimitry Andric return MakeAddrLValue(result, expr->getType(), LValueBaseInfo(alignSource),
41219a199699SDimitry Andric TBAAInfo);
412259d1ed5bSDimitry Andric } else {
412359d1ed5bSDimitry Andric assert((lhs || rhs) &&
412459d1ed5bSDimitry Andric "both operands of glvalue conditional are throw-expressions?");
412559d1ed5bSDimitry Andric return lhs ? *lhs : *rhs;
412659d1ed5bSDimitry Andric }
4127f22ef01cSRoman Divacky }
4128f22ef01cSRoman Divacky
41297ae0e2c9SDimitry Andric /// EmitCastLValue - Casts are never lvalues unless that cast is to a reference
41307ae0e2c9SDimitry Andric /// type. If the cast is to a reference, we can have the usual lvalue result,
4131f22ef01cSRoman Divacky /// otherwise if a cast is needed by the code generator in an lvalue context,
4132f22ef01cSRoman Divacky /// then it must mean that we need the address of an aggregate in order to
41337ae0e2c9SDimitry Andric /// access one of its members. This can happen for all the reasons that casts
4134f22ef01cSRoman Divacky /// are permitted with aggregate result, including noop aggregate casts, and
4135f22ef01cSRoman Divacky /// cast from scalar to union.
EmitCastLValue(const CastExpr * E)4136f22ef01cSRoman Divacky LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) {
4137f22ef01cSRoman Divacky switch (E->getCastKind()) {
4138e580952dSDimitry Andric case CK_ToVoid:
4139e580952dSDimitry Andric case CK_BitCast:
4140e580952dSDimitry Andric case CK_ArrayToPointerDecay:
4141e580952dSDimitry Andric case CK_FunctionToPointerDecay:
4142e580952dSDimitry Andric case CK_NullToMemberPointer:
41432754fe60SDimitry Andric case CK_NullToPointer:
4144e580952dSDimitry Andric case CK_IntegralToPointer:
4145e580952dSDimitry Andric case CK_PointerToIntegral:
41462754fe60SDimitry Andric case CK_PointerToBoolean:
4147e580952dSDimitry Andric case CK_VectorSplat:
4148e580952dSDimitry Andric case CK_IntegralCast:
4149444ed5c5SDimitry Andric case CK_BooleanToSignedIntegral:
41502754fe60SDimitry Andric case CK_IntegralToBoolean:
4151e580952dSDimitry Andric case CK_IntegralToFloating:
4152e580952dSDimitry Andric case CK_FloatingToIntegral:
41532754fe60SDimitry Andric case CK_FloatingToBoolean:
4154e580952dSDimitry Andric case CK_FloatingCast:
41552754fe60SDimitry Andric case CK_FloatingRealToComplex:
41562754fe60SDimitry Andric case CK_FloatingComplexToReal:
41572754fe60SDimitry Andric case CK_FloatingComplexToBoolean:
41582754fe60SDimitry Andric case CK_FloatingComplexCast:
41592754fe60SDimitry Andric case CK_FloatingComplexToIntegralComplex:
41602754fe60SDimitry Andric case CK_IntegralRealToComplex:
41612754fe60SDimitry Andric case CK_IntegralComplexToReal:
41622754fe60SDimitry Andric case CK_IntegralComplexToBoolean:
41632754fe60SDimitry Andric case CK_IntegralComplexCast:
41642754fe60SDimitry Andric case CK_IntegralComplexToFloatingComplex:
4165e580952dSDimitry Andric case CK_DerivedToBaseMemberPointer:
4166e580952dSDimitry Andric case CK_BaseToDerivedMemberPointer:
4167e580952dSDimitry Andric case CK_MemberPointerToBoolean:
4168dff0c46cSDimitry Andric case CK_ReinterpretMemberPointer:
416917a519f9SDimitry Andric case CK_AnyPointerToBlockPointerCast:
41706122f3e6SDimitry Andric case CK_ARCProduceObject:
41716122f3e6SDimitry Andric case CK_ARCConsumeObject:
41726122f3e6SDimitry Andric case CK_ARCReclaimReturnedObject:
4173dff0c46cSDimitry Andric case CK_ARCExtendBlockObject:
4174f785676fSDimitry Andric case CK_CopyAndAutoreleaseBlockObject:
417544290647SDimitry Andric case CK_IntToOCLSampler:
4176*b5893f02SDimitry Andric case CK_FixedPointCast:
4177*b5893f02SDimitry Andric case CK_FixedPointToBoolean:
4178f785676fSDimitry Andric return EmitUnsupportedLValue(E, "unexpected cast lvalue");
4179f785676fSDimitry Andric
4180f785676fSDimitry Andric case CK_Dependent:
4181f785676fSDimitry Andric llvm_unreachable("dependent cast kind in IR gen!");
4182f785676fSDimitry Andric
4183f785676fSDimitry Andric case CK_BuiltinFnToFnPtr:
4184f785676fSDimitry Andric llvm_unreachable("builtin functions are handled elsewhere");
4185f785676fSDimitry Andric
4186f785676fSDimitry Andric // These are never l-values; just use the aggregate emission code.
4187f785676fSDimitry Andric case CK_NonAtomicToAtomic:
4188f785676fSDimitry Andric case CK_AtomicToNonAtomic:
4189f785676fSDimitry Andric return EmitAggExprToLValue(E);
4190e580952dSDimitry Andric
4191e580952dSDimitry Andric case CK_Dynamic: {
4192e580952dSDimitry Andric LValue LV = EmitLValue(E->getSubExpr());
41930623d748SDimitry Andric Address V = LV.getAddress();
419459d1ed5bSDimitry Andric const auto *DCE = cast<CXXDynamicCastExpr>(E);
41950623d748SDimitry Andric return MakeNaturalAlignAddrLValue(EmitDynamicCast(V, DCE), E->getType());
4196e580952dSDimitry Andric }
4197e580952dSDimitry Andric
4198e580952dSDimitry Andric case CK_ConstructorConversion:
4199e580952dSDimitry Andric case CK_UserDefinedConversion:
42006122f3e6SDimitry Andric case CK_CPointerToObjCPointerCast:
42016122f3e6SDimitry Andric case CK_BlockPointerToObjCPointerCast:
4202f785676fSDimitry Andric case CK_NoOp:
4203f785676fSDimitry Andric case CK_LValueToRValue:
4204f22ef01cSRoman Divacky return EmitLValue(E->getSubExpr());
4205f22ef01cSRoman Divacky
4206e580952dSDimitry Andric case CK_UncheckedDerivedToBase:
4207e580952dSDimitry Andric case CK_DerivedToBase: {
4208f22ef01cSRoman Divacky const RecordType *DerivedClassTy =
4209f22ef01cSRoman Divacky E->getSubExpr()->getType()->getAs<RecordType>();
421059d1ed5bSDimitry Andric auto *DerivedClassDecl = cast<CXXRecordDecl>(DerivedClassTy->getDecl());
4211f22ef01cSRoman Divacky
4212f22ef01cSRoman Divacky LValue LV = EmitLValue(E->getSubExpr());
42130623d748SDimitry Andric Address This = LV.getAddress();
4214f22ef01cSRoman Divacky
4215f22ef01cSRoman Divacky // Perform the derived-to-base conversion
42160623d748SDimitry Andric Address Base = GetAddressOfBaseClass(
421739d628a0SDimitry Andric This, DerivedClassDecl, E->path_begin(), E->path_end(),
421839d628a0SDimitry Andric /*NullCheckValue=*/false, E->getExprLoc());
4219f22ef01cSRoman Divacky
42209a199699SDimitry Andric // TODO: Support accesses to members of base classes in TBAA. For now, we
42219a199699SDimitry Andric // conservatively pretend that the complete object is of the base class
42229a199699SDimitry Andric // type.
42239a199699SDimitry Andric return MakeAddrLValue(Base, E->getType(), LV.getBaseInfo(),
42249a199699SDimitry Andric CGM.getTBAAInfoForSubobject(LV, E->getType()));
4225f22ef01cSRoman Divacky }
4226e580952dSDimitry Andric case CK_ToUnion:
4227f22ef01cSRoman Divacky return EmitAggExprToLValue(E);
4228e580952dSDimitry Andric case CK_BaseToDerived: {
4229f22ef01cSRoman Divacky const RecordType *DerivedClassTy = E->getType()->getAs<RecordType>();
423059d1ed5bSDimitry Andric auto *DerivedClassDecl = cast<CXXRecordDecl>(DerivedClassTy->getDecl());
4231f22ef01cSRoman Divacky
4232f22ef01cSRoman Divacky LValue LV = EmitLValue(E->getSubExpr());
4233f22ef01cSRoman Divacky
4234f22ef01cSRoman Divacky // Perform the base-to-derived conversion
42350623d748SDimitry Andric Address Derived =
4236f22ef01cSRoman Divacky GetAddressOfDerivedClass(LV.getAddress(), DerivedClassDecl,
4237e580952dSDimitry Andric E->path_begin(), E->path_end(),
4238e580952dSDimitry Andric /*NullCheckValue=*/false);
4239f22ef01cSRoman Divacky
4240f785676fSDimitry Andric // C++11 [expr.static.cast]p2: Behavior is undefined if a downcast is
4241f785676fSDimitry Andric // performed and the object is not of the derived type.
424259d1ed5bSDimitry Andric if (sanitizePerformTypeCheck())
4243f785676fSDimitry Andric EmitTypeCheck(TCK_DowncastReference, E->getExprLoc(),
42440623d748SDimitry Andric Derived.getPointer(), E->getType());
4245f785676fSDimitry Andric
424633956c43SDimitry Andric if (SanOpts.has(SanitizerKind::CFIDerivedCast))
42470623d748SDimitry Andric EmitVTablePtrCheckForCast(E->getType(), Derived.getPointer(),
4248*b5893f02SDimitry Andric /*MayBeNull=*/false, CFITCK_DerivedCast,
4249*b5893f02SDimitry Andric E->getBeginLoc());
425033956c43SDimitry Andric
42519a199699SDimitry Andric return MakeAddrLValue(Derived, E->getType(), LV.getBaseInfo(),
42529a199699SDimitry Andric CGM.getTBAAInfoForSubobject(LV, E->getType()));
4253f22ef01cSRoman Divacky }
4254e580952dSDimitry Andric case CK_LValueBitCast: {
4255f22ef01cSRoman Divacky // This must be a reinterpret_cast (or c-style equivalent).
425659d1ed5bSDimitry Andric const auto *CE = cast<ExplicitCastExpr>(E);
4257f22ef01cSRoman Divacky
42580623d748SDimitry Andric CGM.EmitExplicitCastExprType(CE, this);
4259f22ef01cSRoman Divacky LValue LV = EmitLValue(E->getSubExpr());
42600623d748SDimitry Andric Address V = Builder.CreateBitCast(LV.getAddress(),
4261f22ef01cSRoman Divacky ConvertType(CE->getTypeAsWritten()));
426233956c43SDimitry Andric
426333956c43SDimitry Andric if (SanOpts.has(SanitizerKind::CFIUnrelatedCast))
42640623d748SDimitry Andric EmitVTablePtrCheckForCast(E->getType(), V.getPointer(),
4265*b5893f02SDimitry Andric /*MayBeNull=*/false, CFITCK_UnrelatedCast,
4266*b5893f02SDimitry Andric E->getBeginLoc());
426733956c43SDimitry Andric
42689a199699SDimitry Andric return MakeAddrLValue(V, E->getType(), LV.getBaseInfo(),
42699a199699SDimitry Andric CGM.getTBAAInfoForSubobject(LV, E->getType()));
4270e580952dSDimitry Andric }
4271*b5893f02SDimitry Andric case CK_AddressSpaceConversion: {
4272*b5893f02SDimitry Andric LValue LV = EmitLValue(E->getSubExpr());
4273*b5893f02SDimitry Andric QualType DestTy = getContext().getPointerType(E->getType());
4274*b5893f02SDimitry Andric llvm::Value *V = getTargetHooks().performAddrSpaceCast(
4275*b5893f02SDimitry Andric *this, LV.getPointer(), E->getSubExpr()->getType().getAddressSpace(),
4276*b5893f02SDimitry Andric E->getType().getAddressSpace(), ConvertType(DestTy));
4277*b5893f02SDimitry Andric return MakeAddrLValue(Address(V, LV.getAddress().getAlignment()),
4278*b5893f02SDimitry Andric E->getType(), LV.getBaseInfo(), LV.getTBAAInfo());
4279*b5893f02SDimitry Andric }
4280e580952dSDimitry Andric case CK_ObjCObjectLValueCast: {
4281e580952dSDimitry Andric LValue LV = EmitLValue(E->getSubExpr());
42820623d748SDimitry Andric Address V = Builder.CreateElementBitCast(LV.getAddress(),
42830623d748SDimitry Andric ConvertType(E->getType()));
42849a199699SDimitry Andric return MakeAddrLValue(V, E->getType(), LV.getBaseInfo(),
42859a199699SDimitry Andric CGM.getTBAAInfoForSubobject(LV, E->getType()));
4286f22ef01cSRoman Divacky }
4287*b5893f02SDimitry Andric case CK_ZeroToOCLOpaqueType:
4288*b5893f02SDimitry Andric llvm_unreachable("NULL to OpenCL opaque type lvalue cast is not valid");
4289f22ef01cSRoman Divacky }
4290e580952dSDimitry Andric
4291e580952dSDimitry Andric llvm_unreachable("Unhandled lvalue cast kind?");
4292f22ef01cSRoman Divacky }
4293f22ef01cSRoman Divacky
EmitOpaqueValueLValue(const OpaqueValueExpr * e)42942754fe60SDimitry Andric LValue CodeGenFunction::EmitOpaqueValueLValue(const OpaqueValueExpr *e) {
4295dff0c46cSDimitry Andric assert(OpaqueValueMappingData::shouldBindAsLValue(e));
42964ba319b5SDimitry Andric return getOrCreateOpaqueLValueMapping(e);
42974ba319b5SDimitry Andric }
42984ba319b5SDimitry Andric
42994ba319b5SDimitry Andric LValue
getOrCreateOpaqueLValueMapping(const OpaqueValueExpr * e)43004ba319b5SDimitry Andric CodeGenFunction::getOrCreateOpaqueLValueMapping(const OpaqueValueExpr *e) {
43014ba319b5SDimitry Andric assert(OpaqueValueMapping::shouldBindAsLValue(e));
43024ba319b5SDimitry Andric
43034ba319b5SDimitry Andric llvm::DenseMap<const OpaqueValueExpr*,LValue>::iterator
43044ba319b5SDimitry Andric it = OpaqueLValues.find(e);
43054ba319b5SDimitry Andric
43064ba319b5SDimitry Andric if (it != OpaqueLValues.end())
43074ba319b5SDimitry Andric return it->second;
43084ba319b5SDimitry Andric
43094ba319b5SDimitry Andric assert(e->isUnique() && "LValue for a nonunique OVE hasn't been emitted");
43104ba319b5SDimitry Andric return EmitLValue(e->getSourceExpr());
43114ba319b5SDimitry Andric }
43124ba319b5SDimitry Andric
43134ba319b5SDimitry Andric RValue
getOrCreateOpaqueRValueMapping(const OpaqueValueExpr * e)43144ba319b5SDimitry Andric CodeGenFunction::getOrCreateOpaqueRValueMapping(const OpaqueValueExpr *e) {
43154ba319b5SDimitry Andric assert(!OpaqueValueMapping::shouldBindAsLValue(e));
43164ba319b5SDimitry Andric
43174ba319b5SDimitry Andric llvm::DenseMap<const OpaqueValueExpr*,RValue>::iterator
43184ba319b5SDimitry Andric it = OpaqueRValues.find(e);
43194ba319b5SDimitry Andric
43204ba319b5SDimitry Andric if (it != OpaqueRValues.end())
43214ba319b5SDimitry Andric return it->second;
43224ba319b5SDimitry Andric
43234ba319b5SDimitry Andric assert(e->isUnique() && "RValue for a nonunique OVE hasn't been emitted");
43244ba319b5SDimitry Andric return EmitAnyExpr(e->getSourceExpr());
43252754fe60SDimitry Andric }
43262754fe60SDimitry Andric
EmitRValueForField(LValue LV,const FieldDecl * FD,SourceLocation Loc)4327cb4dff85SDimitry Andric RValue CodeGenFunction::EmitRValueForField(LValue LV,
4328f785676fSDimitry Andric const FieldDecl *FD,
4329f785676fSDimitry Andric SourceLocation Loc) {
4330cb4dff85SDimitry Andric QualType FT = FD->getType();
4331cb4dff85SDimitry Andric LValue FieldLV = EmitLValueForField(LV, FD);
4332139f7f9bSDimitry Andric switch (getEvaluationKind(FT)) {
4333139f7f9bSDimitry Andric case TEK_Complex:
4334f785676fSDimitry Andric return RValue::getComplex(EmitLoadOfComplex(FieldLV, Loc));
4335139f7f9bSDimitry Andric case TEK_Aggregate:
4336cb4dff85SDimitry Andric return FieldLV.asAggregateRValue();
4337139f7f9bSDimitry Andric case TEK_Scalar:
4338e7145dcbSDimitry Andric // This routine is used to load fields one-by-one to perform a copy, so
4339e7145dcbSDimitry Andric // don't load reference fields.
4340e7145dcbSDimitry Andric if (FD->getType()->isReferenceType())
4341e7145dcbSDimitry Andric return RValue::get(FieldLV.getPointer());
4342f785676fSDimitry Andric return EmitLoadOfLValue(FieldLV, Loc);
4343cb4dff85SDimitry Andric }
4344139f7f9bSDimitry Andric llvm_unreachable("bad evaluation kind");
4345139f7f9bSDimitry Andric }
434617a519f9SDimitry Andric
4347f22ef01cSRoman Divacky //===--------------------------------------------------------------------===//
4348f22ef01cSRoman Divacky // Expression Emission
4349f22ef01cSRoman Divacky //===--------------------------------------------------------------------===//
4350f22ef01cSRoman Divacky
EmitCallExpr(const CallExpr * E,ReturnValueSlot ReturnValue)4351f22ef01cSRoman Divacky RValue CodeGenFunction::EmitCallExpr(const CallExpr *E,
4352f22ef01cSRoman Divacky ReturnValueSlot ReturnValue) {
4353f22ef01cSRoman Divacky // Builtins never have block type.
4354f22ef01cSRoman Divacky if (E->getCallee()->getType()->isBlockPointerType())
4355f22ef01cSRoman Divacky return EmitBlockCallExpr(E, ReturnValue);
4356f22ef01cSRoman Divacky
435759d1ed5bSDimitry Andric if (const auto *CE = dyn_cast<CXXMemberCallExpr>(E))
4358f22ef01cSRoman Divacky return EmitCXXMemberCallExpr(CE, ReturnValue);
4359f22ef01cSRoman Divacky
436059d1ed5bSDimitry Andric if (const auto *CE = dyn_cast<CUDAKernelCallExpr>(E))
43616122f3e6SDimitry Andric return EmitCUDAKernelCallExpr(CE, ReturnValue);
43626122f3e6SDimitry Andric
436359d1ed5bSDimitry Andric if (const auto *CE = dyn_cast<CXXOperatorCallExpr>(E))
436444290647SDimitry Andric if (const CXXMethodDecl *MD =
436544290647SDimitry Andric dyn_cast_or_null<CXXMethodDecl>(CE->getCalleeDecl()))
4366f22ef01cSRoman Divacky return EmitCXXOperatorMemberCallExpr(CE, MD, ReturnValue);
4367f22ef01cSRoman Divacky
436844290647SDimitry Andric CGCallee callee = EmitCallee(E->getCallee());
436917a519f9SDimitry Andric
437044290647SDimitry Andric if (callee.isBuiltin()) {
437144290647SDimitry Andric return EmitBuiltinExpr(callee.getBuiltinDecl(), callee.getBuiltinID(),
437244290647SDimitry Andric E, ReturnValue);
437344290647SDimitry Andric }
437444290647SDimitry Andric
437544290647SDimitry Andric if (callee.isPseudoDestructor()) {
437644290647SDimitry Andric return EmitCXXPseudoDestructorExpr(callee.getPseudoDestructorExpr());
437744290647SDimitry Andric }
437844290647SDimitry Andric
437944290647SDimitry Andric return EmitCall(E->getCallee()->getType(), callee, E, ReturnValue);
438044290647SDimitry Andric }
438144290647SDimitry Andric
438244290647SDimitry Andric /// Emit a CallExpr without considering whether it might be a subclass.
EmitSimpleCallExpr(const CallExpr * E,ReturnValueSlot ReturnValue)438344290647SDimitry Andric RValue CodeGenFunction::EmitSimpleCallExpr(const CallExpr *E,
438444290647SDimitry Andric ReturnValueSlot ReturnValue) {
438544290647SDimitry Andric CGCallee Callee = EmitCallee(E->getCallee());
438644290647SDimitry Andric return EmitCall(E->getCallee()->getType(), Callee, E, ReturnValue);
438744290647SDimitry Andric }
438844290647SDimitry Andric
EmitDirectCallee(CodeGenFunction & CGF,const FunctionDecl * FD)438944290647SDimitry Andric static CGCallee EmitDirectCallee(CodeGenFunction &CGF, const FunctionDecl *FD) {
439044290647SDimitry Andric if (auto builtinID = FD->getBuiltinID()) {
439144290647SDimitry Andric return CGCallee::forBuiltin(builtinID, FD);
439244290647SDimitry Andric }
439344290647SDimitry Andric
439444290647SDimitry Andric llvm::Constant *calleePtr = EmitFunctionDeclPointer(CGF.CGM, FD);
4395*b5893f02SDimitry Andric return CGCallee::forDirect(calleePtr, GlobalDecl(FD));
439644290647SDimitry Andric }
439744290647SDimitry Andric
EmitCallee(const Expr * E)439844290647SDimitry Andric CGCallee CodeGenFunction::EmitCallee(const Expr *E) {
439944290647SDimitry Andric E = E->IgnoreParens();
440044290647SDimitry Andric
440144290647SDimitry Andric // Look through function-to-pointer decay.
440244290647SDimitry Andric if (auto ICE = dyn_cast<ImplicitCastExpr>(E)) {
440344290647SDimitry Andric if (ICE->getCastKind() == CK_FunctionToPointerDecay ||
440444290647SDimitry Andric ICE->getCastKind() == CK_BuiltinFnToFnPtr) {
440544290647SDimitry Andric return EmitCallee(ICE->getSubExpr());
440644290647SDimitry Andric }
440744290647SDimitry Andric
440844290647SDimitry Andric // Resolve direct calls.
440944290647SDimitry Andric } else if (auto DRE = dyn_cast<DeclRefExpr>(E)) {
441044290647SDimitry Andric if (auto FD = dyn_cast<FunctionDecl>(DRE->getDecl())) {
441144290647SDimitry Andric return EmitDirectCallee(*this, FD);
441244290647SDimitry Andric }
441344290647SDimitry Andric } else if (auto ME = dyn_cast<MemberExpr>(E)) {
441444290647SDimitry Andric if (auto FD = dyn_cast<FunctionDecl>(ME->getMemberDecl())) {
441544290647SDimitry Andric EmitIgnoredExpr(ME->getBase());
441644290647SDimitry Andric return EmitDirectCallee(*this, FD);
441744290647SDimitry Andric }
441844290647SDimitry Andric
441944290647SDimitry Andric // Look through template substitutions.
442044290647SDimitry Andric } else if (auto NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(E)) {
442144290647SDimitry Andric return EmitCallee(NTTP->getReplacement());
442244290647SDimitry Andric
442344290647SDimitry Andric // Treat pseudo-destructor calls differently.
442444290647SDimitry Andric } else if (auto PDE = dyn_cast<CXXPseudoDestructorExpr>(E)) {
442544290647SDimitry Andric return CGCallee::forPseudoDestructor(PDE);
442644290647SDimitry Andric }
442744290647SDimitry Andric
442844290647SDimitry Andric // Otherwise, we have an indirect reference.
442944290647SDimitry Andric llvm::Value *calleePtr;
443044290647SDimitry Andric QualType functionType;
443144290647SDimitry Andric if (auto ptrType = E->getType()->getAs<PointerType>()) {
443244290647SDimitry Andric calleePtr = EmitScalarExpr(E);
443344290647SDimitry Andric functionType = ptrType->getPointeeType();
443417a519f9SDimitry Andric } else {
443544290647SDimitry Andric functionType = E->getType();
443644290647SDimitry Andric calleePtr = EmitLValue(E).getPointer();
443717a519f9SDimitry Andric }
443844290647SDimitry Andric assert(functionType->isFunctionType());
4439*b5893f02SDimitry Andric
4440*b5893f02SDimitry Andric GlobalDecl GD;
4441*b5893f02SDimitry Andric if (const auto *VD =
4442*b5893f02SDimitry Andric dyn_cast_or_null<VarDecl>(E->getReferencedDeclOfCallee()))
4443*b5893f02SDimitry Andric GD = GlobalDecl(VD);
4444*b5893f02SDimitry Andric
4445*b5893f02SDimitry Andric CGCalleeInfo calleeInfo(functionType->getAs<FunctionProtoType>(), GD);
444644290647SDimitry Andric CGCallee callee(calleeInfo, calleePtr);
444744290647SDimitry Andric return callee;
4448f22ef01cSRoman Divacky }
4449f22ef01cSRoman Divacky
EmitBinaryOperatorLValue(const BinaryOperator * E)4450f22ef01cSRoman Divacky LValue CodeGenFunction::EmitBinaryOperatorLValue(const BinaryOperator *E) {
4451f22ef01cSRoman Divacky // Comma expressions just emit their LHS then their RHS as an l-value.
4452e580952dSDimitry Andric if (E->getOpcode() == BO_Comma) {
44532754fe60SDimitry Andric EmitIgnoredExpr(E->getLHS());
4454f22ef01cSRoman Divacky EnsureInsertPoint();
4455f22ef01cSRoman Divacky return EmitLValue(E->getRHS());
4456f22ef01cSRoman Divacky }
4457f22ef01cSRoman Divacky
4458e580952dSDimitry Andric if (E->getOpcode() == BO_PtrMemD ||
4459e580952dSDimitry Andric E->getOpcode() == BO_PtrMemI)
4460f22ef01cSRoman Divacky return EmitPointerToDataMemberBinaryExpr(E);
4461f22ef01cSRoman Divacky
44622754fe60SDimitry Andric assert(E->getOpcode() == BO_Assign && "unexpected binary l-value");
4463f22ef01cSRoman Divacky
446417a519f9SDimitry Andric // Note that in all of these cases, __block variables need the RHS
446517a519f9SDimitry Andric // evaluated first just in case the variable gets moved by the RHS.
446617a519f9SDimitry Andric
4467139f7f9bSDimitry Andric switch (getEvaluationKind(E->getType())) {
4468139f7f9bSDimitry Andric case TEK_Scalar: {
446917a519f9SDimitry Andric switch (E->getLHS()->getType().getObjCLifetime()) {
447017a519f9SDimitry Andric case Qualifiers::OCL_Strong:
447117a519f9SDimitry Andric return EmitARCStoreStrong(E, /*ignored*/ false).first;
447217a519f9SDimitry Andric
447317a519f9SDimitry Andric case Qualifiers::OCL_Autoreleasing:
447417a519f9SDimitry Andric return EmitARCStoreAutoreleasing(E).first;
447517a519f9SDimitry Andric
447617a519f9SDimitry Andric // No reason to do any of these differently.
447717a519f9SDimitry Andric case Qualifiers::OCL_None:
447817a519f9SDimitry Andric case Qualifiers::OCL_ExplicitNone:
447917a519f9SDimitry Andric case Qualifiers::OCL_Weak:
448017a519f9SDimitry Andric break;
448117a519f9SDimitry Andric }
448217a519f9SDimitry Andric
44832754fe60SDimitry Andric RValue RV = EmitAnyExpr(E->getRHS());
44843861d79fSDimitry Andric LValue LV = EmitCheckedLValue(E->getLHS(), TCK_Store);
4485f37b6182SDimitry Andric if (RV.isScalar())
4486f37b6182SDimitry Andric EmitNullabilityCheck(LV, RV.getScalarVal(), E->getExprLoc());
448717a519f9SDimitry Andric EmitStoreThroughLValue(RV, LV);
4488f22ef01cSRoman Divacky return LV;
4489f22ef01cSRoman Divacky }
4490f22ef01cSRoman Divacky
4491139f7f9bSDimitry Andric case TEK_Complex:
44922754fe60SDimitry Andric return EmitComplexAssignmentLValue(E);
44932754fe60SDimitry Andric
4494139f7f9bSDimitry Andric case TEK_Aggregate:
4495f22ef01cSRoman Divacky return EmitAggExprToLValue(E);
4496f22ef01cSRoman Divacky }
4497139f7f9bSDimitry Andric llvm_unreachable("bad evaluation kind");
4498139f7f9bSDimitry Andric }
4499f22ef01cSRoman Divacky
EmitCallExprLValue(const CallExpr * E)4500f22ef01cSRoman Divacky LValue CodeGenFunction::EmitCallExprLValue(const CallExpr *E) {
4501f22ef01cSRoman Divacky RValue RV = EmitCallExpr(E);
4502f22ef01cSRoman Divacky
4503f22ef01cSRoman Divacky if (!RV.isScalar())
45040623d748SDimitry Andric return MakeAddrLValue(RV.getAggregateAddress(), E->getType(),
45059a199699SDimitry Andric AlignmentSource::Decl);
4506f22ef01cSRoman Divacky
450733956c43SDimitry Andric assert(E->getCallReturnType(getContext())->isReferenceType() &&
4508f22ef01cSRoman Divacky "Can't have a scalar return unless the return type is a "
4509f22ef01cSRoman Divacky "reference type!");
4510f22ef01cSRoman Divacky
45110623d748SDimitry Andric return MakeNaturalAlignPointeeAddrLValue(RV.getScalarVal(), E->getType());
4512f22ef01cSRoman Divacky }
4513f22ef01cSRoman Divacky
EmitVAArgExprLValue(const VAArgExpr * E)4514f22ef01cSRoman Divacky LValue CodeGenFunction::EmitVAArgExprLValue(const VAArgExpr *E) {
4515f22ef01cSRoman Divacky // FIXME: This shouldn't require another copy.
4516f22ef01cSRoman Divacky return EmitAggExprToLValue(E);
4517f22ef01cSRoman Divacky }
4518f22ef01cSRoman Divacky
EmitCXXConstructLValue(const CXXConstructExpr * E)4519f22ef01cSRoman Divacky LValue CodeGenFunction::EmitCXXConstructLValue(const CXXConstructExpr *E) {
45202754fe60SDimitry Andric assert(E->getType()->getAsCXXRecordDecl()->hasTrivialDestructor()
45212754fe60SDimitry Andric && "binding l-value to type which needs a temporary");
45226122f3e6SDimitry Andric AggValueSlot Slot = CreateAggTemp(E->getType());
45232754fe60SDimitry Andric EmitCXXConstructExpr(E, Slot);
45249a199699SDimitry Andric return MakeAddrLValue(Slot.getAddress(), E->getType(), AlignmentSource::Decl);
4525f22ef01cSRoman Divacky }
4526f22ef01cSRoman Divacky
4527f22ef01cSRoman Divacky LValue
EmitCXXTypeidLValue(const CXXTypeidExpr * E)4528f22ef01cSRoman Divacky CodeGenFunction::EmitCXXTypeidLValue(const CXXTypeidExpr *E) {
45290623d748SDimitry Andric return MakeNaturalAlignAddrLValue(EmitCXXTypeidExpr(E), E->getType());
4530f22ef01cSRoman Divacky }
4531f22ef01cSRoman Divacky
EmitCXXUuidofExpr(const CXXUuidofExpr * E)45320623d748SDimitry Andric Address CodeGenFunction::EmitCXXUuidofExpr(const CXXUuidofExpr *E) {
45330623d748SDimitry Andric return Builder.CreateElementBitCast(CGM.GetAddrOfUuidDescriptor(E),
45340623d748SDimitry Andric ConvertType(E->getType()));
45353861d79fSDimitry Andric }
45363861d79fSDimitry Andric
EmitCXXUuidofLValue(const CXXUuidofExpr * E)45373861d79fSDimitry Andric LValue CodeGenFunction::EmitCXXUuidofLValue(const CXXUuidofExpr *E) {
45380623d748SDimitry Andric return MakeAddrLValue(EmitCXXUuidofExpr(E), E->getType(),
45399a199699SDimitry Andric AlignmentSource::Decl);
45403861d79fSDimitry Andric }
45413861d79fSDimitry Andric
4542f22ef01cSRoman Divacky LValue
EmitCXXBindTemporaryLValue(const CXXBindTemporaryExpr * E)4543f22ef01cSRoman Divacky CodeGenFunction::EmitCXXBindTemporaryLValue(const CXXBindTemporaryExpr *E) {
45442754fe60SDimitry Andric AggValueSlot Slot = CreateAggTemp(E->getType(), "temp.lvalue");
45456122f3e6SDimitry Andric Slot.setExternallyDestructed();
45462754fe60SDimitry Andric EmitAggExpr(E->getSubExpr(), Slot);
45470623d748SDimitry Andric EmitCXXTemporary(E->getTemporary(), E->getType(), Slot.getAddress());
45489a199699SDimitry Andric return MakeAddrLValue(Slot.getAddress(), E->getType(), AlignmentSource::Decl);
4549dff0c46cSDimitry Andric }
4550dff0c46cSDimitry Andric
4551dff0c46cSDimitry Andric LValue
EmitLambdaLValue(const LambdaExpr * E)4552dff0c46cSDimitry Andric CodeGenFunction::EmitLambdaLValue(const LambdaExpr *E) {
4553dff0c46cSDimitry Andric AggValueSlot Slot = CreateAggTemp(E->getType(), "temp.lvalue");
4554dff0c46cSDimitry Andric EmitLambdaExpr(E, Slot);
45559a199699SDimitry Andric return MakeAddrLValue(Slot.getAddress(), E->getType(), AlignmentSource::Decl);
4556f22ef01cSRoman Divacky }
4557f22ef01cSRoman Divacky
EmitObjCMessageExprLValue(const ObjCMessageExpr * E)4558f22ef01cSRoman Divacky LValue CodeGenFunction::EmitObjCMessageExprLValue(const ObjCMessageExpr *E) {
4559f22ef01cSRoman Divacky RValue RV = EmitObjCMessageExpr(E);
4560ffd1746dSEd Schouten
4561ffd1746dSEd Schouten if (!RV.isScalar())
45620623d748SDimitry Andric return MakeAddrLValue(RV.getAggregateAddress(), E->getType(),
45639a199699SDimitry Andric AlignmentSource::Decl);
4564ffd1746dSEd Schouten
456559d1ed5bSDimitry Andric assert(E->getMethodDecl()->getReturnType()->isReferenceType() &&
4566ffd1746dSEd Schouten "Can't have a scalar return unless the return type is a "
4567ffd1746dSEd Schouten "reference type!");
4568ffd1746dSEd Schouten
45690623d748SDimitry Andric return MakeNaturalAlignPointeeAddrLValue(RV.getScalarVal(), E->getType());
4570ffd1746dSEd Schouten }
4571ffd1746dSEd Schouten
EmitObjCSelectorLValue(const ObjCSelectorExpr * E)4572ffd1746dSEd Schouten LValue CodeGenFunction::EmitObjCSelectorLValue(const ObjCSelectorExpr *E) {
45730623d748SDimitry Andric Address V =
45740623d748SDimitry Andric CGM.getObjCRuntime().GetAddrOfSelector(*this, E->getSelector());
45759a199699SDimitry Andric return MakeAddrLValue(V, E->getType(), AlignmentSource::Decl);
4576f22ef01cSRoman Divacky }
4577f22ef01cSRoman Divacky
EmitIvarOffset(const ObjCInterfaceDecl * Interface,const ObjCIvarDecl * Ivar)4578f22ef01cSRoman Divacky llvm::Value *CodeGenFunction::EmitIvarOffset(const ObjCInterfaceDecl *Interface,
4579f22ef01cSRoman Divacky const ObjCIvarDecl *Ivar) {
4580f22ef01cSRoman Divacky return CGM.getObjCRuntime().EmitIvarOffset(*this, Interface, Ivar);
4581f22ef01cSRoman Divacky }
4582f22ef01cSRoman Divacky
EmitLValueForIvar(QualType ObjectTy,llvm::Value * BaseValue,const ObjCIvarDecl * Ivar,unsigned CVRQualifiers)4583f22ef01cSRoman Divacky LValue CodeGenFunction::EmitLValueForIvar(QualType ObjectTy,
4584f22ef01cSRoman Divacky llvm::Value *BaseValue,
4585f22ef01cSRoman Divacky const ObjCIvarDecl *Ivar,
4586f22ef01cSRoman Divacky unsigned CVRQualifiers) {
4587f22ef01cSRoman Divacky return CGM.getObjCRuntime().EmitObjCValueForIvar(*this, ObjectTy, BaseValue,
4588f22ef01cSRoman Divacky Ivar, CVRQualifiers);
4589f22ef01cSRoman Divacky }
4590f22ef01cSRoman Divacky
EmitObjCIvarRefLValue(const ObjCIvarRefExpr * E)4591f22ef01cSRoman Divacky LValue CodeGenFunction::EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E) {
4592f22ef01cSRoman Divacky // FIXME: A lot of the code below could be shared with EmitMemberExpr.
459359d1ed5bSDimitry Andric llvm::Value *BaseValue = nullptr;
4594f22ef01cSRoman Divacky const Expr *BaseExpr = E->getBase();
4595f22ef01cSRoman Divacky Qualifiers BaseQuals;
4596f22ef01cSRoman Divacky QualType ObjectTy;
4597f22ef01cSRoman Divacky if (E->isArrow()) {
4598f22ef01cSRoman Divacky BaseValue = EmitScalarExpr(BaseExpr);
4599f22ef01cSRoman Divacky ObjectTy = BaseExpr->getType()->getPointeeType();
4600f22ef01cSRoman Divacky BaseQuals = ObjectTy.getQualifiers();
4601f22ef01cSRoman Divacky } else {
4602f22ef01cSRoman Divacky LValue BaseLV = EmitLValue(BaseExpr);
46030623d748SDimitry Andric BaseValue = BaseLV.getPointer();
4604f22ef01cSRoman Divacky ObjectTy = BaseExpr->getType();
4605f22ef01cSRoman Divacky BaseQuals = ObjectTy.getQualifiers();
4606f22ef01cSRoman Divacky }
4607f22ef01cSRoman Divacky
4608f22ef01cSRoman Divacky LValue LV =
4609f22ef01cSRoman Divacky EmitLValueForIvar(ObjectTy, BaseValue, E->getDecl(),
4610f22ef01cSRoman Divacky BaseQuals.getCVRQualifiers());
4611f22ef01cSRoman Divacky setObjCGCLValueClass(getContext(), E, LV);
4612f22ef01cSRoman Divacky return LV;
4613f22ef01cSRoman Divacky }
4614f22ef01cSRoman Divacky
EmitStmtExprLValue(const StmtExpr * E)4615f22ef01cSRoman Divacky LValue CodeGenFunction::EmitStmtExprLValue(const StmtExpr *E) {
4616f22ef01cSRoman Divacky // Can only get l-value for message expression returning aggregate type
4617f22ef01cSRoman Divacky RValue RV = EmitAnyExprToTemp(E);
46180623d748SDimitry Andric return MakeAddrLValue(RV.getAggregateAddress(), E->getType(),
46199a199699SDimitry Andric AlignmentSource::Decl);
4620f22ef01cSRoman Divacky }
4621f22ef01cSRoman Divacky
EmitCall(QualType CalleeType,const CGCallee & OrigCallee,const CallExpr * E,ReturnValueSlot ReturnValue,llvm::Value * Chain)462244290647SDimitry Andric RValue CodeGenFunction::EmitCall(QualType CalleeType, const CGCallee &OrigCallee,
462339d628a0SDimitry Andric const CallExpr *E, ReturnValueSlot ReturnValue,
462444290647SDimitry Andric llvm::Value *Chain) {
4625f22ef01cSRoman Divacky // Get the actual function type. The callee type will always be a pointer to
4626f22ef01cSRoman Divacky // function type or a block pointer type.
4627f22ef01cSRoman Divacky assert(CalleeType->isFunctionPointerType() &&
4628f22ef01cSRoman Divacky "Call must have function pointer type!");
4629f22ef01cSRoman Divacky
4630*b5893f02SDimitry Andric const Decl *TargetDecl =
4631*b5893f02SDimitry Andric OrigCallee.getAbstractInfo().getCalleeDecl().getDecl();
46320623d748SDimitry Andric
46330623d748SDimitry Andric if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl))
46340623d748SDimitry Andric // We can only guarantee that a function is called from the correct
46350623d748SDimitry Andric // context/function based on the appropriate target attributes,
46360623d748SDimitry Andric // so only check in the case where we have both always_inline and target
46370623d748SDimitry Andric // since otherwise we could be making a conditional call after a check for
46380623d748SDimitry Andric // the proper cpu features (and it won't cause code generation issues due to
46390623d748SDimitry Andric // function based code generation).
46400623d748SDimitry Andric if (TargetDecl->hasAttr<AlwaysInlineAttr>() &&
46410623d748SDimitry Andric TargetDecl->hasAttr<TargetAttr>())
46420623d748SDimitry Andric checkTargetFeatures(E, FD);
46430623d748SDimitry Andric
4644f22ef01cSRoman Divacky CalleeType = getContext().getCanonicalType(CalleeType);
4645f22ef01cSRoman Divacky
46464ba319b5SDimitry Andric auto PointeeType = cast<PointerType>(CalleeType)->getPointeeType();
4647f22ef01cSRoman Divacky
464844290647SDimitry Andric CGCallee Callee = OrigCallee;
464944290647SDimitry Andric
465039d628a0SDimitry Andric if (getLangOpts().CPlusPlus && SanOpts.has(SanitizerKind::Function) &&
4651f785676fSDimitry Andric (!TargetDecl || !isa<FunctionDecl>(TargetDecl))) {
4652f785676fSDimitry Andric if (llvm::Constant *PrefixSig =
4653f785676fSDimitry Andric CGM.getTargetCodeGenInfo().getUBSanFunctionSignature(CGM)) {
465459d1ed5bSDimitry Andric SanitizerScope SanScope(this);
46554ba319b5SDimitry Andric // Remove any (C++17) exception specifications, to allow calling e.g. a
46564ba319b5SDimitry Andric // noexcept function through a non-noexcept pointer.
46574ba319b5SDimitry Andric auto ProtoTy =
46584ba319b5SDimitry Andric getContext().getFunctionTypeWithExceptionSpec(PointeeType, EST_None);
4659f785676fSDimitry Andric llvm::Constant *FTRTTIConst =
46604ba319b5SDimitry Andric CGM.GetAddrOfRTTIDescriptor(ProtoTy, /*ForEH=*/true);
46619a199699SDimitry Andric llvm::Type *PrefixStructTyElems[] = {PrefixSig->getType(), Int32Ty};
4662f785676fSDimitry Andric llvm::StructType *PrefixStructTy = llvm::StructType::get(
4663f785676fSDimitry Andric CGM.getLLVMContext(), PrefixStructTyElems, /*isPacked=*/true);
4664f785676fSDimitry Andric
466544290647SDimitry Andric llvm::Value *CalleePtr = Callee.getFunctionPointer();
466644290647SDimitry Andric
4667f785676fSDimitry Andric llvm::Value *CalleePrefixStruct = Builder.CreateBitCast(
466844290647SDimitry Andric CalleePtr, llvm::PointerType::getUnqual(PrefixStructTy));
4669f785676fSDimitry Andric llvm::Value *CalleeSigPtr =
467033956c43SDimitry Andric Builder.CreateConstGEP2_32(PrefixStructTy, CalleePrefixStruct, 0, 0);
46710623d748SDimitry Andric llvm::Value *CalleeSig =
46720623d748SDimitry Andric Builder.CreateAlignedLoad(CalleeSigPtr, getIntAlign());
4673f785676fSDimitry Andric llvm::Value *CalleeSigMatch = Builder.CreateICmpEQ(CalleeSig, PrefixSig);
4674f785676fSDimitry Andric
4675f785676fSDimitry Andric llvm::BasicBlock *Cont = createBasicBlock("cont");
4676f785676fSDimitry Andric llvm::BasicBlock *TypeCheck = createBasicBlock("typecheck");
4677f785676fSDimitry Andric Builder.CreateCondBr(CalleeSigMatch, TypeCheck, Cont);
4678f785676fSDimitry Andric
4679f785676fSDimitry Andric EmitBlock(TypeCheck);
4680f785676fSDimitry Andric llvm::Value *CalleeRTTIPtr =
468133956c43SDimitry Andric Builder.CreateConstGEP2_32(PrefixStructTy, CalleePrefixStruct, 0, 1);
46829a199699SDimitry Andric llvm::Value *CalleeRTTIEncoded =
46830623d748SDimitry Andric Builder.CreateAlignedLoad(CalleeRTTIPtr, getPointerAlign());
46849a199699SDimitry Andric llvm::Value *CalleeRTTI =
46859a199699SDimitry Andric DecodeAddrUsedInPrologue(CalleePtr, CalleeRTTIEncoded);
4686f785676fSDimitry Andric llvm::Value *CalleeRTTIMatch =
4687f785676fSDimitry Andric Builder.CreateICmpEQ(CalleeRTTI, FTRTTIConst);
4688*b5893f02SDimitry Andric llvm::Constant *StaticData[] = {EmitCheckSourceLocation(E->getBeginLoc()),
4689*b5893f02SDimitry Andric EmitCheckTypeDescriptor(CalleeType)};
469039d628a0SDimitry Andric EmitCheck(std::make_pair(CalleeRTTIMatch, SanitizerKind::Function),
469144290647SDimitry Andric SanitizerHandler::FunctionTypeMismatch, StaticData, CalleePtr);
4692f785676fSDimitry Andric
4693f785676fSDimitry Andric Builder.CreateBr(Cont);
4694f785676fSDimitry Andric EmitBlock(Cont);
4695f785676fSDimitry Andric }
4696f785676fSDimitry Andric }
4697f785676fSDimitry Andric
46984ba319b5SDimitry Andric const auto *FnType = cast<FunctionType>(PointeeType);
46994ba319b5SDimitry Andric
47000623d748SDimitry Andric // If we are checking indirect calls and this call is indirect, check that the
47010623d748SDimitry Andric // function pointer is a member of the bit set for the function type.
47020623d748SDimitry Andric if (SanOpts.has(SanitizerKind::CFIICall) &&
47030623d748SDimitry Andric (!TargetDecl || !isa<FunctionDecl>(TargetDecl))) {
47040623d748SDimitry Andric SanitizerScope SanScope(this);
4705e7145dcbSDimitry Andric EmitSanitizerStatReport(llvm::SanStat_CFI_ICall);
47060623d748SDimitry Andric
47079a199699SDimitry Andric llvm::Metadata *MD;
47089a199699SDimitry Andric if (CGM.getCodeGenOpts().SanitizeCfiICallGeneralizePointers)
47099a199699SDimitry Andric MD = CGM.CreateMetadataIdentifierGeneralized(QualType(FnType, 0));
47109a199699SDimitry Andric else
47119a199699SDimitry Andric MD = CGM.CreateMetadataIdentifierForType(QualType(FnType, 0));
47129a199699SDimitry Andric
4713e7145dcbSDimitry Andric llvm::Value *TypeId = llvm::MetadataAsValue::get(getLLVMContext(), MD);
47140623d748SDimitry Andric
471544290647SDimitry Andric llvm::Value *CalleePtr = Callee.getFunctionPointer();
471644290647SDimitry Andric llvm::Value *CastedCallee = Builder.CreateBitCast(CalleePtr, Int8PtrTy);
4717e7145dcbSDimitry Andric llvm::Value *TypeTest = Builder.CreateCall(
4718e7145dcbSDimitry Andric CGM.getIntrinsic(llvm::Intrinsic::type_test), {CastedCallee, TypeId});
47190623d748SDimitry Andric
4720e7145dcbSDimitry Andric auto CrossDsoTypeId = CGM.CreateCrossDsoCfiTypeId(MD);
47210623d748SDimitry Andric llvm::Constant *StaticData[] = {
4722e7145dcbSDimitry Andric llvm::ConstantInt::get(Int8Ty, CFITCK_ICall),
4723*b5893f02SDimitry Andric EmitCheckSourceLocation(E->getBeginLoc()),
47240623d748SDimitry Andric EmitCheckTypeDescriptor(QualType(FnType, 0)),
47250623d748SDimitry Andric };
4726e7145dcbSDimitry Andric if (CGM.getCodeGenOpts().SanitizeCfiCrossDso && CrossDsoTypeId) {
4727e7145dcbSDimitry Andric EmitCfiSlowPathCheck(SanitizerKind::CFIICall, TypeTest, CrossDsoTypeId,
4728e7145dcbSDimitry Andric CastedCallee, StaticData);
4729e7145dcbSDimitry Andric } else {
4730e7145dcbSDimitry Andric EmitCheck(std::make_pair(TypeTest, SanitizerKind::CFIICall),
473144290647SDimitry Andric SanitizerHandler::CFICheckFail, StaticData,
4732e7145dcbSDimitry Andric {CastedCallee, llvm::UndefValue::get(IntPtrTy)});
47330623d748SDimitry Andric }
47340623d748SDimitry Andric }
47350623d748SDimitry Andric
4736f22ef01cSRoman Divacky CallArgList Args;
473739d628a0SDimitry Andric if (Chain)
473839d628a0SDimitry Andric Args.add(RValue::get(Builder.CreateBitCast(Chain, CGM.VoidPtrTy)),
473939d628a0SDimitry Andric CGM.getContext().VoidPtrTy);
474044290647SDimitry Andric
474144290647SDimitry Andric // C++17 requires that we evaluate arguments to a call using assignment syntax
474244290647SDimitry Andric // right-to-left, and that we evaluate arguments to certain other operators
474344290647SDimitry Andric // left-to-right. Note that we allow this to override the order dictated by
474444290647SDimitry Andric // the calling convention on the MS ABI, which means that parameter
474544290647SDimitry Andric // destruction order is not necessarily reverse construction order.
474644290647SDimitry Andric // FIXME: Revisit this based on C++ committee response to unimplementability.
474744290647SDimitry Andric EvaluationOrder Order = EvaluationOrder::Default;
474844290647SDimitry Andric if (auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {
474944290647SDimitry Andric if (OCE->isAssignmentOp())
475044290647SDimitry Andric Order = EvaluationOrder::ForceRightToLeft;
475144290647SDimitry Andric else {
475244290647SDimitry Andric switch (OCE->getOperator()) {
475344290647SDimitry Andric case OO_LessLess:
475444290647SDimitry Andric case OO_GreaterGreater:
475544290647SDimitry Andric case OO_AmpAmp:
475644290647SDimitry Andric case OO_PipePipe:
475744290647SDimitry Andric case OO_Comma:
475844290647SDimitry Andric case OO_ArrowStar:
475944290647SDimitry Andric Order = EvaluationOrder::ForceLeftToRight;
476044290647SDimitry Andric break;
476144290647SDimitry Andric default:
476244290647SDimitry Andric break;
476344290647SDimitry Andric }
476444290647SDimitry Andric }
476544290647SDimitry Andric }
476644290647SDimitry Andric
47670623d748SDimitry Andric EmitCallArgs(Args, dyn_cast<FunctionProtoType>(FnType), E->arguments(),
476844290647SDimitry Andric E->getDirectCallee(), /*ParamsToSkip*/ 0, Order);
4769f22ef01cSRoman Divacky
477039d628a0SDimitry Andric const CGFunctionInfo &FnInfo = CGM.getTypes().arrangeFreeFunctionCall(
477139d628a0SDimitry Andric Args, FnType, /*isChainCall=*/Chain);
47726122f3e6SDimitry Andric
47736122f3e6SDimitry Andric // C99 6.5.2.2p6:
47746122f3e6SDimitry Andric // If the expression that denotes the called function has a type
47756122f3e6SDimitry Andric // that does not include a prototype, [the default argument
47766122f3e6SDimitry Andric // promotions are performed]. If the number of arguments does not
47776122f3e6SDimitry Andric // equal the number of parameters, the behavior is undefined. If
47786122f3e6SDimitry Andric // the function is defined with a type that includes a prototype,
47796122f3e6SDimitry Andric // and either the prototype ends with an ellipsis (, ...) or the
47806122f3e6SDimitry Andric // types of the arguments after promotion are not compatible with
47816122f3e6SDimitry Andric // the types of the parameters, the behavior is undefined. If the
47826122f3e6SDimitry Andric // function is defined with a type that does not include a
47836122f3e6SDimitry Andric // prototype, and the types of the arguments after promotion are
47846122f3e6SDimitry Andric // not compatible with those of the parameters after promotion,
47856122f3e6SDimitry Andric // the behavior is undefined [except in some trivial cases].
47866122f3e6SDimitry Andric // That is, in the general case, we should assume that a call
47876122f3e6SDimitry Andric // through an unprototyped function type works like a *non-variadic*
47886122f3e6SDimitry Andric // call. The way we make this work is to cast to the exact type
47896122f3e6SDimitry Andric // of the promoted arguments.
479039d628a0SDimitry Andric //
479139d628a0SDimitry Andric // Chain calls use this same code path to add the invisible chain parameter
479239d628a0SDimitry Andric // to the function type.
479339d628a0SDimitry Andric if (isa<FunctionNoProtoType>(FnType) || Chain) {
4794dff0c46cSDimitry Andric llvm::Type *CalleeTy = getTypes().GetFunctionType(FnInfo);
47956122f3e6SDimitry Andric CalleeTy = CalleeTy->getPointerTo();
479644290647SDimitry Andric
479744290647SDimitry Andric llvm::Value *CalleePtr = Callee.getFunctionPointer();
479844290647SDimitry Andric CalleePtr = Builder.CreateBitCast(CalleePtr, CalleeTy, "callee.knr.cast");
479944290647SDimitry Andric Callee.setFunctionPointer(CalleePtr);
48006122f3e6SDimitry Andric }
48016122f3e6SDimitry Andric
480213ddaa84SDimitry Andric return EmitCall(FnInfo, Callee, ReturnValue, Args, nullptr, E->getExprLoc());
4803f22ef01cSRoman Divacky }
4804f22ef01cSRoman Divacky
4805f22ef01cSRoman Divacky LValue CodeGenFunction::
EmitPointerToDataMemberBinaryExpr(const BinaryOperator * E)4806f22ef01cSRoman Divacky EmitPointerToDataMemberBinaryExpr(const BinaryOperator *E) {
48070623d748SDimitry Andric Address BaseAddr = Address::invalid();
48080623d748SDimitry Andric if (E->getOpcode() == BO_PtrMemI) {
48090623d748SDimitry Andric BaseAddr = EmitPointerWithAlignment(E->getLHS());
48100623d748SDimitry Andric } else {
48110623d748SDimitry Andric BaseAddr = EmitLValue(E->getLHS()).getAddress();
48120623d748SDimitry Andric }
4813e580952dSDimitry Andric
4814f22ef01cSRoman Divacky llvm::Value *OffsetV = EmitScalarExpr(E->getRHS());
4815f22ef01cSRoman Divacky
4816e580952dSDimitry Andric const MemberPointerType *MPT
4817e580952dSDimitry Andric = E->getRHS()->getType()->getAs<MemberPointerType>();
4818f22ef01cSRoman Divacky
4819d8866befSDimitry Andric LValueBaseInfo BaseInfo;
48209a199699SDimitry Andric TBAAAccessInfo TBAAInfo;
48210623d748SDimitry Andric Address MemberAddr =
48229a199699SDimitry Andric EmitCXXMemberDataPointerAddress(E, BaseAddr, OffsetV, MPT, &BaseInfo,
48239a199699SDimitry Andric &TBAAInfo);
4824e580952dSDimitry Andric
48259a199699SDimitry Andric return MakeAddrLValue(MemberAddr, MPT->getPointeeType(), BaseInfo, TBAAInfo);
4826f22ef01cSRoman Divacky }
48276122f3e6SDimitry Andric
4828139f7f9bSDimitry Andric /// Given the address of a temporary variable, produce an r-value of
4829139f7f9bSDimitry Andric /// its type.
convertTempToRValue(Address addr,QualType type,SourceLocation loc)48300623d748SDimitry Andric RValue CodeGenFunction::convertTempToRValue(Address addr,
4831f785676fSDimitry Andric QualType type,
4832f785676fSDimitry Andric SourceLocation loc) {
48339a199699SDimitry Andric LValue lvalue = MakeAddrLValue(addr, type, AlignmentSource::Decl);
4834139f7f9bSDimitry Andric switch (getEvaluationKind(type)) {
4835139f7f9bSDimitry Andric case TEK_Complex:
4836f785676fSDimitry Andric return RValue::getComplex(EmitLoadOfComplex(lvalue, loc));
4837139f7f9bSDimitry Andric case TEK_Aggregate:
4838139f7f9bSDimitry Andric return lvalue.asAggregateRValue();
4839139f7f9bSDimitry Andric case TEK_Scalar:
4840f785676fSDimitry Andric return RValue::get(EmitLoadOfScalar(lvalue, loc));
48416122f3e6SDimitry Andric }
4842139f7f9bSDimitry Andric llvm_unreachable("bad evaluation kind");
48436122f3e6SDimitry Andric }
4844dff0c46cSDimitry Andric
SetFPAccuracy(llvm::Value * Val,float Accuracy)4845dff0c46cSDimitry Andric void CodeGenFunction::SetFPAccuracy(llvm::Value *Val, float Accuracy) {
4846dff0c46cSDimitry Andric assert(Val->getType()->isFPOrFPVectorTy());
4847dff0c46cSDimitry Andric if (Accuracy == 0.0 || !isa<llvm::Instruction>(Val))
4848dff0c46cSDimitry Andric return;
4849dff0c46cSDimitry Andric
4850cb4dff85SDimitry Andric llvm::MDBuilder MDHelper(getLLVMContext());
4851cb4dff85SDimitry Andric llvm::MDNode *Node = MDHelper.createFPMath(Accuracy);
4852dff0c46cSDimitry Andric
4853cb4dff85SDimitry Andric cast<llvm::Instruction>(Val)->setMetadata(llvm::LLVMContext::MD_fpmath, Node);
4854dff0c46cSDimitry Andric }
4855dff0c46cSDimitry Andric
4856dff0c46cSDimitry Andric namespace {
4857dff0c46cSDimitry Andric struct LValueOrRValue {
4858dff0c46cSDimitry Andric LValue LV;
4859dff0c46cSDimitry Andric RValue RV;
4860dff0c46cSDimitry Andric };
4861dff0c46cSDimitry Andric }
4862dff0c46cSDimitry Andric
emitPseudoObjectExpr(CodeGenFunction & CGF,const PseudoObjectExpr * E,bool forLValue,AggValueSlot slot)4863dff0c46cSDimitry Andric static LValueOrRValue emitPseudoObjectExpr(CodeGenFunction &CGF,
4864dff0c46cSDimitry Andric const PseudoObjectExpr *E,
4865dff0c46cSDimitry Andric bool forLValue,
4866dff0c46cSDimitry Andric AggValueSlot slot) {
4867139f7f9bSDimitry Andric SmallVector<CodeGenFunction::OpaqueValueMappingData, 4> opaques;
4868dff0c46cSDimitry Andric
4869dff0c46cSDimitry Andric // Find the result expression, if any.
4870dff0c46cSDimitry Andric const Expr *resultExpr = E->getResultExpr();
4871dff0c46cSDimitry Andric LValueOrRValue result;
4872dff0c46cSDimitry Andric
4873dff0c46cSDimitry Andric for (PseudoObjectExpr::const_semantics_iterator
4874dff0c46cSDimitry Andric i = E->semantics_begin(), e = E->semantics_end(); i != e; ++i) {
4875dff0c46cSDimitry Andric const Expr *semantic = *i;
4876dff0c46cSDimitry Andric
4877dff0c46cSDimitry Andric // If this semantic expression is an opaque value, bind it
4878dff0c46cSDimitry Andric // to the result of its source expression.
487959d1ed5bSDimitry Andric if (const auto *ov = dyn_cast<OpaqueValueExpr>(semantic)) {
48804ba319b5SDimitry Andric // Skip unique OVEs.
48814ba319b5SDimitry Andric if (ov->isUnique()) {
48824ba319b5SDimitry Andric assert(ov != resultExpr &&
48834ba319b5SDimitry Andric "A unique OVE cannot be used as the result expression");
48844ba319b5SDimitry Andric continue;
48854ba319b5SDimitry Andric }
4886dff0c46cSDimitry Andric
4887dff0c46cSDimitry Andric // If this is the result expression, we may need to evaluate
4888dff0c46cSDimitry Andric // directly into the slot.
4889dff0c46cSDimitry Andric typedef CodeGenFunction::OpaqueValueMappingData OVMA;
4890dff0c46cSDimitry Andric OVMA opaqueData;
4891dff0c46cSDimitry Andric if (ov == resultExpr && ov->isRValue() && !forLValue &&
4892139f7f9bSDimitry Andric CodeGenFunction::hasAggregateEvaluationKind(ov->getType())) {
4893dff0c46cSDimitry Andric CGF.EmitAggExpr(ov->getSourceExpr(), slot);
48940623d748SDimitry Andric LValue LV = CGF.MakeAddrLValue(slot.getAddress(), ov->getType(),
48959a199699SDimitry Andric AlignmentSource::Decl);
4896dff0c46cSDimitry Andric opaqueData = OVMA::bind(CGF, ov, LV);
4897dff0c46cSDimitry Andric result.RV = slot.asRValue();
4898dff0c46cSDimitry Andric
4899dff0c46cSDimitry Andric // Otherwise, emit as normal.
4900dff0c46cSDimitry Andric } else {
4901dff0c46cSDimitry Andric opaqueData = OVMA::bind(CGF, ov, ov->getSourceExpr());
4902dff0c46cSDimitry Andric
4903dff0c46cSDimitry Andric // If this is the result, also evaluate the result now.
4904dff0c46cSDimitry Andric if (ov == resultExpr) {
4905dff0c46cSDimitry Andric if (forLValue)
4906dff0c46cSDimitry Andric result.LV = CGF.EmitLValue(ov);
4907dff0c46cSDimitry Andric else
4908dff0c46cSDimitry Andric result.RV = CGF.EmitAnyExpr(ov, slot);
4909dff0c46cSDimitry Andric }
4910dff0c46cSDimitry Andric }
4911dff0c46cSDimitry Andric
4912dff0c46cSDimitry Andric opaques.push_back(opaqueData);
4913dff0c46cSDimitry Andric
4914dff0c46cSDimitry Andric // Otherwise, if the expression is the result, evaluate it
4915dff0c46cSDimitry Andric // and remember the result.
4916dff0c46cSDimitry Andric } else if (semantic == resultExpr) {
4917dff0c46cSDimitry Andric if (forLValue)
4918dff0c46cSDimitry Andric result.LV = CGF.EmitLValue(semantic);
4919dff0c46cSDimitry Andric else
4920dff0c46cSDimitry Andric result.RV = CGF.EmitAnyExpr(semantic, slot);
4921dff0c46cSDimitry Andric
4922dff0c46cSDimitry Andric // Otherwise, evaluate the expression in an ignored context.
4923dff0c46cSDimitry Andric } else {
4924dff0c46cSDimitry Andric CGF.EmitIgnoredExpr(semantic);
4925dff0c46cSDimitry Andric }
4926dff0c46cSDimitry Andric }
4927dff0c46cSDimitry Andric
4928dff0c46cSDimitry Andric // Unbind all the opaques now.
4929dff0c46cSDimitry Andric for (unsigned i = 0, e = opaques.size(); i != e; ++i)
4930dff0c46cSDimitry Andric opaques[i].unbind(CGF);
4931dff0c46cSDimitry Andric
4932dff0c46cSDimitry Andric return result;
4933dff0c46cSDimitry Andric }
4934dff0c46cSDimitry Andric
EmitPseudoObjectRValue(const PseudoObjectExpr * E,AggValueSlot slot)4935dff0c46cSDimitry Andric RValue CodeGenFunction::EmitPseudoObjectRValue(const PseudoObjectExpr *E,
4936dff0c46cSDimitry Andric AggValueSlot slot) {
4937dff0c46cSDimitry Andric return emitPseudoObjectExpr(*this, E, false, slot).RV;
4938dff0c46cSDimitry Andric }
4939dff0c46cSDimitry Andric
EmitPseudoObjectLValue(const PseudoObjectExpr * E)4940dff0c46cSDimitry Andric LValue CodeGenFunction::EmitPseudoObjectLValue(const PseudoObjectExpr *E) {
4941dff0c46cSDimitry Andric return emitPseudoObjectExpr(*this, E, true, AggValueSlot::ignored()).LV;
4942dff0c46cSDimitry Andric }
4943