forked from OSchip/llvm-project
Thread a SourceLocation into the EmitCheck for "load_invalid_value". This occurs
when scalars are loaded / undergo lvalue-to-rvalue conversion. llvm-svn: 191808
This commit is contained in:
parent
b7aa592c19
commit
2d84e84236
|
@ -106,7 +106,8 @@ namespace {
|
|||
|
||||
/// Turn an atomic-layout object into an r-value.
|
||||
RValue convertTempToRValue(llvm::Value *addr,
|
||||
AggValueSlot resultSlot) const;
|
||||
AggValueSlot resultSlot,
|
||||
SourceLocation loc) const;
|
||||
|
||||
/// Copy an atomic r-value into atomic-layout memory.
|
||||
void emitCopyIntoMemory(RValue rvalue, LValue lvalue) const;
|
||||
|
@ -321,11 +322,12 @@ EmitValToTemp(CodeGenFunction &CGF, Expr *E) {
|
|||
|
||||
static void
|
||||
AddDirectArgument(CodeGenFunction &CGF, CallArgList &Args,
|
||||
bool UseOptimizedLibcall, llvm::Value *Val, QualType ValTy) {
|
||||
bool UseOptimizedLibcall, llvm::Value *Val, QualType ValTy,
|
||||
SourceLocation Loc) {
|
||||
if (UseOptimizedLibcall) {
|
||||
// Load value and pass it to the function directly.
|
||||
unsigned Align = CGF.getContext().getTypeAlignInChars(ValTy).getQuantity();
|
||||
Val = CGF.EmitLoadOfScalar(Val, false, Align, ValTy);
|
||||
Val = CGF.EmitLoadOfScalar(Val, false, Align, ValTy, Loc);
|
||||
Args.add(RValue::get(Val), ValTy);
|
||||
} else {
|
||||
// Non-optimized functions always take a reference.
|
||||
|
@ -490,9 +492,9 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E, llvm::Value *Dest) {
|
|||
LibCallName = "__atomic_compare_exchange";
|
||||
RetTy = getContext().BoolTy;
|
||||
HaveRetTy = true;
|
||||
Args.add(RValue::get(EmitCastToVoidPtr(Val1)),
|
||||
getContext().VoidPtrTy);
|
||||
AddDirectArgument(*this, Args, UseOptimizedLibcall, Val2, MemTy);
|
||||
Args.add(RValue::get(EmitCastToVoidPtr(Val1)), getContext().VoidPtrTy);
|
||||
AddDirectArgument(*this, Args, UseOptimizedLibcall, Val2, MemTy,
|
||||
E->getExprLoc());
|
||||
Args.add(RValue::get(Order), getContext().IntTy);
|
||||
Order = OrderFail;
|
||||
break;
|
||||
|
@ -503,7 +505,8 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E, llvm::Value *Dest) {
|
|||
case AtomicExpr::AO__atomic_exchange_n:
|
||||
case AtomicExpr::AO__atomic_exchange:
|
||||
LibCallName = "__atomic_exchange";
|
||||
AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1, MemTy);
|
||||
AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1, MemTy,
|
||||
E->getExprLoc());
|
||||
break;
|
||||
// void __atomic_store(size_t size, void *mem, void *val, int order)
|
||||
// void __atomic_store_N(T *mem, T val, int order)
|
||||
|
@ -513,7 +516,8 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E, llvm::Value *Dest) {
|
|||
LibCallName = "__atomic_store";
|
||||
RetTy = getContext().VoidTy;
|
||||
HaveRetTy = true;
|
||||
AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1, MemTy);
|
||||
AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1, MemTy,
|
||||
E->getExprLoc());
|
||||
break;
|
||||
// void __atomic_load(size_t size, void *mem, void *return, int order)
|
||||
// T __atomic_load_N(T *mem, int order)
|
||||
|
@ -526,31 +530,36 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E, llvm::Value *Dest) {
|
|||
case AtomicExpr::AO__c11_atomic_fetch_add:
|
||||
case AtomicExpr::AO__atomic_fetch_add:
|
||||
LibCallName = "__atomic_fetch_add";
|
||||
AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1, MemTy);
|
||||
AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1, MemTy,
|
||||
E->getExprLoc());
|
||||
break;
|
||||
// T __atomic_fetch_and_N(T *mem, T val, int order)
|
||||
case AtomicExpr::AO__c11_atomic_fetch_and:
|
||||
case AtomicExpr::AO__atomic_fetch_and:
|
||||
LibCallName = "__atomic_fetch_and";
|
||||
AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1, MemTy);
|
||||
AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1, MemTy,
|
||||
E->getExprLoc());
|
||||
break;
|
||||
// T __atomic_fetch_or_N(T *mem, T val, int order)
|
||||
case AtomicExpr::AO__c11_atomic_fetch_or:
|
||||
case AtomicExpr::AO__atomic_fetch_or:
|
||||
LibCallName = "__atomic_fetch_or";
|
||||
AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1, MemTy);
|
||||
AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1, MemTy,
|
||||
E->getExprLoc());
|
||||
break;
|
||||
// T __atomic_fetch_sub_N(T *mem, T val, int order)
|
||||
case AtomicExpr::AO__c11_atomic_fetch_sub:
|
||||
case AtomicExpr::AO__atomic_fetch_sub:
|
||||
LibCallName = "__atomic_fetch_sub";
|
||||
AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1, MemTy);
|
||||
AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1, MemTy,
|
||||
E->getExprLoc());
|
||||
break;
|
||||
// T __atomic_fetch_xor_N(T *mem, T val, int order)
|
||||
case AtomicExpr::AO__c11_atomic_fetch_xor:
|
||||
case AtomicExpr::AO__atomic_fetch_xor:
|
||||
LibCallName = "__atomic_fetch_xor";
|
||||
AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1, MemTy);
|
||||
AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1, MemTy,
|
||||
E->getExprLoc());
|
||||
break;
|
||||
default: return EmitUnsupportedRValue(E, "atomic library call");
|
||||
}
|
||||
|
@ -584,7 +593,7 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E, llvm::Value *Dest) {
|
|||
return Res;
|
||||
if (E->getType()->isVoidType())
|
||||
return RValue::get(0);
|
||||
return convertTempToRValue(Dest, E->getType());
|
||||
return convertTempToRValue(Dest, E->getType(), E->getExprLoc());
|
||||
}
|
||||
|
||||
bool IsStore = E->getOp() == AtomicExpr::AO__c11_atomic_store ||
|
||||
|
@ -639,7 +648,7 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E, llvm::Value *Dest) {
|
|||
}
|
||||
if (E->getType()->isVoidType())
|
||||
return RValue::get(0);
|
||||
return convertTempToRValue(OrigDest, E->getType());
|
||||
return convertTempToRValue(OrigDest, E->getType(), E->getExprLoc());
|
||||
}
|
||||
|
||||
// Long case, when Order isn't obviously constant.
|
||||
|
@ -701,7 +710,7 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E, llvm::Value *Dest) {
|
|||
Builder.SetInsertPoint(ContBB);
|
||||
if (E->getType()->isVoidType())
|
||||
return RValue::get(0);
|
||||
return convertTempToRValue(OrigDest, E->getType());
|
||||
return convertTempToRValue(OrigDest, E->getType(), E->getExprLoc());
|
||||
}
|
||||
|
||||
llvm::Value *AtomicInfo::emitCastToAtomicIntPointer(llvm::Value *addr) const {
|
||||
|
@ -713,7 +722,8 @@ llvm::Value *AtomicInfo::emitCastToAtomicIntPointer(llvm::Value *addr) const {
|
|||
}
|
||||
|
||||
RValue AtomicInfo::convertTempToRValue(llvm::Value *addr,
|
||||
AggValueSlot resultSlot) const {
|
||||
AggValueSlot resultSlot,
|
||||
SourceLocation loc) const {
|
||||
if (EvaluationKind == TEK_Aggregate)
|
||||
return resultSlot.asRValue();
|
||||
|
||||
|
@ -723,12 +733,13 @@ RValue AtomicInfo::convertTempToRValue(llvm::Value *addr,
|
|||
|
||||
// Otherwise, just convert the temporary to an r-value using the
|
||||
// normal conversion routine.
|
||||
return CGF.convertTempToRValue(addr, getValueType());
|
||||
return CGF.convertTempToRValue(addr, getValueType(), loc);
|
||||
}
|
||||
|
||||
/// Emit a load from an l-value of atomic type. Note that the r-value
|
||||
/// we produce is an r-value of the atomic *value* type.
|
||||
RValue CodeGenFunction::EmitAtomicLoad(LValue src, AggValueSlot resultSlot) {
|
||||
RValue CodeGenFunction::EmitAtomicLoad(LValue src, SourceLocation loc,
|
||||
AggValueSlot resultSlot) {
|
||||
AtomicInfo atomics(*this, src);
|
||||
|
||||
// Check whether we should use a library call.
|
||||
|
@ -755,7 +766,7 @@ RValue CodeGenFunction::EmitAtomicLoad(LValue src, AggValueSlot resultSlot) {
|
|||
emitAtomicLibcall(*this, "__atomic_load", getContext().VoidTy, args);
|
||||
|
||||
// Produce the r-value.
|
||||
return atomics.convertTempToRValue(tempAddr, resultSlot);
|
||||
return atomics.convertTempToRValue(tempAddr, resultSlot, loc);
|
||||
}
|
||||
|
||||
// Okay, we're doing this natively.
|
||||
|
@ -813,7 +824,7 @@ RValue CodeGenFunction::EmitAtomicLoad(LValue src, AggValueSlot resultSlot) {
|
|||
Builder.CreateAlignedStore(result, castTemp, tempAlignment.getQuantity())
|
||||
->setVolatile(tempIsVolatile);
|
||||
|
||||
return atomics.convertTempToRValue(temp, resultSlot);
|
||||
return atomics.convertTempToRValue(temp, resultSlot, loc);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -834,7 +834,7 @@ llvm::Value *CodeGenFunction::EmitBlockLiteral(const CGBlockInfo &blockInfo) {
|
|||
type->isBlockPointerType()) {
|
||||
// Load the block and do a simple retain.
|
||||
LValue srcLV = MakeAddrLValue(src, type, align);
|
||||
llvm::Value *value = EmitLoadOfScalar(srcLV);
|
||||
llvm::Value *value = EmitLoadOfScalar(srcLV, SourceLocation());
|
||||
value = EmitARCRetainNonBlock(value);
|
||||
|
||||
// Do a primitive store to the block field.
|
||||
|
@ -931,7 +931,7 @@ llvm::Type *CodeGenModule::getGenericBlockLiteralType() {
|
|||
}
|
||||
|
||||
|
||||
RValue CodeGenFunction::EmitBlockCallExpr(const CallExpr* E,
|
||||
RValue CodeGenFunction::EmitBlockCallExpr(const CallExpr *E,
|
||||
ReturnValueSlot ReturnValue) {
|
||||
const BlockPointerType *BPT =
|
||||
E->getCallee()->getType()->getAs<BlockPointerType>();
|
||||
|
|
|
@ -1291,7 +1291,8 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
|
|||
} else {
|
||||
// Load scalar value from indirect argument.
|
||||
CharUnits Alignment = getContext().getTypeAlignInChars(Ty);
|
||||
V = EmitLoadOfScalar(V, false, Alignment.getQuantity(), Ty);
|
||||
V = EmitLoadOfScalar(V, false, Alignment.getQuantity(), Ty,
|
||||
Arg->getLocStart());
|
||||
|
||||
if (isPromoted)
|
||||
V = emitArgumentDemotion(*this, Arg, V);
|
||||
|
@ -1406,7 +1407,7 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
|
|||
|
||||
// Match to what EmitParmDecl is expecting for this type.
|
||||
if (CodeGenFunction::hasScalarEvaluationKind(Ty)) {
|
||||
V = EmitLoadOfScalar(V, false, AlignmentToUse, Ty);
|
||||
V = EmitLoadOfScalar(V, false, AlignmentToUse, Ty, Arg->getLocStart());
|
||||
if (isPromoted)
|
||||
V = emitArgumentDemotion(*this, Arg, V);
|
||||
}
|
||||
|
@ -1645,7 +1646,8 @@ static llvm::StoreInst *findDominatingStoreToReturnValue(CodeGenFunction &CGF) {
|
|||
}
|
||||
|
||||
void CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI,
|
||||
bool EmitRetDbgLoc) {
|
||||
bool EmitRetDbgLoc,
|
||||
SourceLocation EndLoc) {
|
||||
// Functions with no result always return void.
|
||||
if (ReturnValue == 0) {
|
||||
Builder.CreateRetVoid();
|
||||
|
@ -1662,7 +1664,8 @@ void CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI,
|
|||
switch (getEvaluationKind(RetTy)) {
|
||||
case TEK_Complex: {
|
||||
ComplexPairTy RT =
|
||||
EmitLoadOfComplex(MakeNaturalAlignAddrLValue(ReturnValue, RetTy));
|
||||
EmitLoadOfComplex(MakeNaturalAlignAddrLValue(ReturnValue, RetTy),
|
||||
EndLoc);
|
||||
EmitStoreOfComplex(RT,
|
||||
MakeNaturalAlignAddrLValue(CurFn->arg_begin(), RetTy),
|
||||
/*isInit*/ true);
|
||||
|
@ -1746,7 +1749,8 @@ void CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI,
|
|||
}
|
||||
|
||||
void CodeGenFunction::EmitDelegateCallArg(CallArgList &args,
|
||||
const VarDecl *param) {
|
||||
const VarDecl *param,
|
||||
SourceLocation loc) {
|
||||
// StartFunction converted the ABI-lowered parameter(s) into a
|
||||
// local alloca. We need to turn that into an r-value suitable
|
||||
// for EmitCall.
|
||||
|
@ -1767,7 +1771,7 @@ void CodeGenFunction::EmitDelegateCallArg(CallArgList &args,
|
|||
return args.add(RValue::get(Builder.CreateLoad(local)), type);
|
||||
}
|
||||
|
||||
args.add(convertTempToRValue(local, type), type);
|
||||
args.add(convertTempToRValue(local, type, loc), type);
|
||||
}
|
||||
|
||||
static bool isProvablyNull(llvm::Value *addr) {
|
||||
|
@ -1826,7 +1830,7 @@ static void emitWriteback(CodeGenFunction &CGF,
|
|||
CGF.EmitARCIntrinsicUse(writeback.ToUse);
|
||||
|
||||
// Load the old value (primitively).
|
||||
llvm::Value *oldValue = CGF.EmitLoadOfScalar(srcLV);
|
||||
llvm::Value *oldValue = CGF.EmitLoadOfScalar(srcLV, SourceLocation());
|
||||
|
||||
// Put the new value in place (primitively).
|
||||
CGF.EmitStoreOfScalar(value, srcLV, /*init*/ false);
|
||||
|
@ -1955,7 +1959,7 @@ static void emitWritebackArg(CodeGenFunction &CGF, CallArgList &args,
|
|||
|
||||
// Perform a copy if necessary.
|
||||
if (shouldCopy) {
|
||||
RValue srcRV = CGF.EmitLoadOfLValue(srcLV);
|
||||
RValue srcRV = CGF.EmitLoadOfLValue(srcLV, SourceLocation());
|
||||
assert(srcRV.isScalar());
|
||||
|
||||
llvm::Value *src = srcRV.getScalarVal();
|
||||
|
@ -2191,7 +2195,7 @@ void CodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV,
|
|||
llvm::Value *Addr = RV.getAggregateAddr();
|
||||
for (unsigned Elt = 0; Elt < NumElts; ++Elt) {
|
||||
llvm::Value *EltAddr = Builder.CreateConstGEP2_32(Addr, 0, Elt);
|
||||
RValue EltRV = convertTempToRValue(EltAddr, EltTy);
|
||||
RValue EltRV = convertTempToRValue(EltAddr, EltTy, SourceLocation());
|
||||
ExpandTypeToArgs(EltTy, EltRV, Args, IRFuncTy);
|
||||
}
|
||||
} else if (const RecordType *RT = Ty->getAs<RecordType>()) {
|
||||
|
@ -2215,7 +2219,7 @@ void CodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV,
|
|||
}
|
||||
}
|
||||
if (LargestFD) {
|
||||
RValue FldRV = EmitRValueForField(LV, LargestFD);
|
||||
RValue FldRV = EmitRValueForField(LV, LargestFD, SourceLocation());
|
||||
ExpandTypeToArgs(LargestFD->getType(), FldRV, Args, IRFuncTy);
|
||||
}
|
||||
} else {
|
||||
|
@ -2223,7 +2227,7 @@ void CodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV,
|
|||
i != e; ++i) {
|
||||
FieldDecl *FD = *i;
|
||||
|
||||
RValue FldRV = EmitRValueForField(LV, FD);
|
||||
RValue FldRV = EmitRValueForField(LV, FD, SourceLocation());
|
||||
ExpandTypeToArgs(FD->getType(), FldRV, Args, IRFuncTy);
|
||||
}
|
||||
}
|
||||
|
@ -2541,7 +2545,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
|
|||
|
||||
switch (RetAI.getKind()) {
|
||||
case ABIArgInfo::Indirect:
|
||||
return convertTempToRValue(Args[0], RetTy);
|
||||
return convertTempToRValue(Args[0], RetTy, SourceLocation());
|
||||
|
||||
case ABIArgInfo::Ignore:
|
||||
// If we are ignoring an argument that had a result, make sure to
|
||||
|
@ -2599,7 +2603,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
|
|||
}
|
||||
CreateCoercedStore(CI, StorePtr, DestIsVolatile, *this);
|
||||
|
||||
return convertTempToRValue(DestPtr, RetTy);
|
||||
return convertTempToRValue(DestPtr, RetTy, SourceLocation());
|
||||
}
|
||||
|
||||
case ABIArgInfo::Expand:
|
||||
|
|
|
@ -704,7 +704,7 @@ void CodeGenFunction::EmitConstructorBody(FunctionArgList &Args) {
|
|||
CGM.getTarget().getCXXABI().hasConstructorVariants()) {
|
||||
if (CGDebugInfo *DI = getDebugInfo())
|
||||
DI->EmitLocation(Builder, Ctor->getLocEnd());
|
||||
EmitDelegateCXXConstructorCall(Ctor, Ctor_Base, Args);
|
||||
EmitDelegateCXXConstructorCall(Ctor, Ctor_Base, Args, Ctor->getLocEnd());
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1742,7 +1742,8 @@ CodeGenFunction::EmitSynthesizedCXXCopyCtorCall(const CXXConstructorDecl *D,
|
|||
void
|
||||
CodeGenFunction::EmitDelegateCXXConstructorCall(const CXXConstructorDecl *Ctor,
|
||||
CXXCtorType CtorType,
|
||||
const FunctionArgList &Args) {
|
||||
const FunctionArgList &Args,
|
||||
SourceLocation Loc) {
|
||||
CallArgList DelegateArgs;
|
||||
|
||||
FunctionArgList::const_iterator I = Args.begin(), E = Args.end();
|
||||
|
@ -1769,7 +1770,8 @@ CodeGenFunction::EmitDelegateCXXConstructorCall(const CXXConstructorDecl *Ctor,
|
|||
// Explicit arguments.
|
||||
for (; I != E; ++I) {
|
||||
const VarDecl *param = *I;
|
||||
EmitDelegateCallArg(DelegateArgs, param);
|
||||
// FIXME: per-argument source location
|
||||
EmitDelegateCallArg(DelegateArgs, param, Loc);
|
||||
}
|
||||
|
||||
llvm::Value *Callee = CGM.GetAddrOfCXXConstructor(Ctor, CtorType);
|
||||
|
@ -2156,7 +2158,7 @@ void CodeGenFunction::EmitLambdaBlockInvokeBody() {
|
|||
for (BlockDecl::param_const_iterator I = BD->param_begin(),
|
||||
E = BD->param_end(); I != E; ++I) {
|
||||
ParmVarDecl *param = *I;
|
||||
EmitDelegateCallArg(CallArgs, param);
|
||||
EmitDelegateCallArg(CallArgs, param, param->getLocStart());
|
||||
}
|
||||
assert(!Lambda->isGenericLambda() &&
|
||||
"generic lambda interconversion to block not implemented");
|
||||
|
@ -2188,7 +2190,7 @@ void CodeGenFunction::EmitLambdaDelegatingInvokeBody(const CXXMethodDecl *MD) {
|
|||
for (FunctionDecl::param_const_iterator I = MD->param_begin(),
|
||||
E = MD->param_end(); I != E; ++I) {
|
||||
ParmVarDecl *param = *I;
|
||||
EmitDelegateCallArg(CallArgs, param);
|
||||
EmitDelegateCallArg(CallArgs, param, param->getLocStart());
|
||||
}
|
||||
const CXXMethodDecl *CallOp = Lambda->getLambdaCallOperator();
|
||||
// For a generic lambda, find the corresponding call operator specialization
|
||||
|
|
|
@ -425,7 +425,8 @@ namespace {
|
|||
// byref or something.
|
||||
DeclRefExpr DRE(const_cast<VarDecl*>(&Var), false,
|
||||
Var.getType(), VK_LValue, SourceLocation());
|
||||
llvm::Value *value = CGF.EmitLoadOfScalar(CGF.EmitDeclRefLValue(&DRE));
|
||||
llvm::Value *value = CGF.EmitLoadOfScalar(CGF.EmitDeclRefLValue(&DRE),
|
||||
SourceLocation());
|
||||
CGF.EmitExtendGCLifetime(value);
|
||||
}
|
||||
};
|
||||
|
@ -652,7 +653,7 @@ void CodeGenFunction::EmitScalarInit(const Expr *init,
|
|||
// might have to initialize with a barrier. We have to do this for
|
||||
// both __weak and __strong, but __weak got filtered out above.
|
||||
if (accessedByInit && lifetime == Qualifiers::OCL_Strong) {
|
||||
llvm::Value *oldValue = EmitLoadOfScalar(lvalue);
|
||||
llvm::Value *oldValue = EmitLoadOfScalar(lvalue, init->getExprLoc());
|
||||
EmitStoreOfScalar(value, lvalue, /* isInitialization */ true);
|
||||
EmitARCRelease(oldValue, ARCImpreciseLifetime);
|
||||
return;
|
||||
|
@ -1688,7 +1689,7 @@ void CodeGenFunction::EmitParmDecl(const VarDecl &D, llvm::Value *Arg,
|
|||
// use objc_storeStrong(&dest, value) for retaining the
|
||||
// object. But first, store a null into 'dest' because
|
||||
// objc_storeStrong attempts to release its old value.
|
||||
llvm::Value * Null = CGM.EmitNullConstant(D.getType());
|
||||
llvm::Value *Null = CGM.EmitNullConstant(D.getType());
|
||||
EmitStoreOfScalar(Null, lv, /* isInitialization */ true);
|
||||
EmitARCStoreStrongCall(lv.getAddress(), Arg, true);
|
||||
doStore = false;
|
||||
|
|
|
@ -945,7 +945,8 @@ static llvm::Value *CallBeginCatch(CodeGenFunction &CGF,
|
|||
/// parameter during catch initialization.
|
||||
static void InitCatchParam(CodeGenFunction &CGF,
|
||||
const VarDecl &CatchParam,
|
||||
llvm::Value *ParamAddr) {
|
||||
llvm::Value *ParamAddr,
|
||||
SourceLocation Loc) {
|
||||
// Load the exception from where the landing pad saved it.
|
||||
llvm::Value *Exn = CGF.getExceptionFromSlot();
|
||||
|
||||
|
@ -1052,11 +1053,11 @@ static void InitCatchParam(CodeGenFunction &CGF,
|
|||
CGF.getContext().getDeclAlign(&CatchParam));
|
||||
switch (TEK) {
|
||||
case TEK_Complex:
|
||||
CGF.EmitStoreOfComplex(CGF.EmitLoadOfComplex(srcLV), destLV,
|
||||
CGF.EmitStoreOfComplex(CGF.EmitLoadOfComplex(srcLV, Loc), destLV,
|
||||
/*init*/ true);
|
||||
return;
|
||||
case TEK_Scalar: {
|
||||
llvm::Value *ExnLoad = CGF.EmitLoadOfScalar(srcLV);
|
||||
llvm::Value *ExnLoad = CGF.EmitLoadOfScalar(srcLV, Loc);
|
||||
CGF.EmitStoreOfScalar(ExnLoad, destLV, /*init*/ true);
|
||||
return;
|
||||
}
|
||||
|
@ -1150,7 +1151,7 @@ static void BeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *S) {
|
|||
|
||||
// Emit the local.
|
||||
CodeGenFunction::AutoVarEmission var = CGF.EmitAutoVarAlloca(*CatchParam);
|
||||
InitCatchParam(CGF, *CatchParam, var.getObjectAddress(CGF));
|
||||
InitCatchParam(CGF, *CatchParam, var.getObjectAddress(CGF), S->getLocStart());
|
||||
CGF.EmitAutoVarCleanups(var);
|
||||
}
|
||||
|
||||
|
|
|
@ -664,7 +664,7 @@ void CodeGenFunction::EmitBoundsCheck(const Expr *E, const Expr *Base,
|
|||
CodeGenFunction::ComplexPairTy CodeGenFunction::
|
||||
EmitComplexPrePostIncDec(const UnaryOperator *E, LValue LV,
|
||||
bool isInc, bool isPre) {
|
||||
ComplexPairTy InVal = EmitLoadOfComplex(LV);
|
||||
ComplexPairTy InVal = EmitLoadOfComplex(LV, E->getExprLoc());
|
||||
|
||||
llvm::Value *NextVal;
|
||||
if (isa<llvm::IntegerType>(InVal.first->getType())) {
|
||||
|
@ -984,10 +984,11 @@ CodeGenFunction::tryEmitAsConstant(DeclRefExpr *refExpr) {
|
|||
return ConstantEmission::forValue(C);
|
||||
}
|
||||
|
||||
llvm::Value *CodeGenFunction::EmitLoadOfScalar(LValue lvalue) {
|
||||
llvm::Value *CodeGenFunction::EmitLoadOfScalar(LValue lvalue,
|
||||
SourceLocation Loc) {
|
||||
return EmitLoadOfScalar(lvalue.getAddress(), lvalue.isVolatile(),
|
||||
lvalue.getAlignment().getQuantity(),
|
||||
lvalue.getType(), lvalue.getTBAAInfo(),
|
||||
lvalue.getType(), Loc, lvalue.getTBAAInfo(),
|
||||
lvalue.getTBAABaseType(), lvalue.getTBAAOffset());
|
||||
}
|
||||
|
||||
|
@ -1049,10 +1050,11 @@ llvm::MDNode *CodeGenFunction::getRangeForLoadFromType(QualType Ty) {
|
|||
}
|
||||
|
||||
llvm::Value *CodeGenFunction::EmitLoadOfScalar(llvm::Value *Addr, bool Volatile,
|
||||
unsigned Alignment, QualType Ty,
|
||||
llvm::MDNode *TBAAInfo,
|
||||
QualType TBAABaseType,
|
||||
uint64_t TBAAOffset) {
|
||||
unsigned Alignment, QualType Ty,
|
||||
SourceLocation Loc,
|
||||
llvm::MDNode *TBAAInfo,
|
||||
QualType TBAABaseType,
|
||||
uint64_t TBAAOffset) {
|
||||
// For better performance, handle vector loads differently.
|
||||
if (Ty->isVectorType()) {
|
||||
llvm::Value *V;
|
||||
|
@ -1096,7 +1098,7 @@ llvm::Value *CodeGenFunction::EmitLoadOfScalar(llvm::Value *Addr, bool Volatile,
|
|||
LValue lvalue = LValue::MakeAddr(Addr, Ty,
|
||||
CharUnits::fromQuantity(Alignment),
|
||||
getContext(), TBAAInfo);
|
||||
return EmitAtomicLoad(lvalue).getScalarVal();
|
||||
return EmitAtomicLoad(lvalue, Loc).getScalarVal();
|
||||
}
|
||||
|
||||
llvm::LoadInst *Load = Builder.CreateLoad(Addr);
|
||||
|
@ -1126,9 +1128,12 @@ llvm::Value *CodeGenFunction::EmitLoadOfScalar(llvm::Value *Addr, bool Volatile,
|
|||
Load, llvm::ConstantInt::get(getLLVMContext(), Min));
|
||||
Check = Builder.CreateAnd(Upper, Lower);
|
||||
}
|
||||
// FIXME: Provide a SourceLocation.
|
||||
EmitCheck(Check, "load_invalid_value", EmitCheckTypeDescriptor(Ty),
|
||||
EmitCheckValue(Load), CRK_Recoverable);
|
||||
llvm::Constant *StaticArgs[] = {
|
||||
EmitCheckSourceLocation(Loc),
|
||||
EmitCheckTypeDescriptor(Ty)
|
||||
};
|
||||
EmitCheck(Check, "load_invalid_value", StaticArgs, EmitCheckValue(Load),
|
||||
CRK_Recoverable);
|
||||
}
|
||||
} else if (CGM.getCodeGenOpts().OptimizationLevel > 0)
|
||||
if (llvm::MDNode *RangeInfo = getRangeForLoadFromType(Ty))
|
||||
|
@ -1232,7 +1237,7 @@ void CodeGenFunction::EmitStoreOfScalar(llvm::Value *value, LValue lvalue,
|
|||
/// EmitLoadOfLValue - Given an expression that represents a value lvalue, this
|
||||
/// method emits the address of the lvalue, then loads the result as an rvalue,
|
||||
/// returning the rvalue.
|
||||
RValue CodeGenFunction::EmitLoadOfLValue(LValue LV) {
|
||||
RValue CodeGenFunction::EmitLoadOfLValue(LValue LV, SourceLocation Loc) {
|
||||
if (LV.isObjCWeak()) {
|
||||
// load of a __weak object.
|
||||
llvm::Value *AddrWeakObj = LV.getAddress();
|
||||
|
@ -1249,7 +1254,7 @@ RValue CodeGenFunction::EmitLoadOfLValue(LValue LV) {
|
|||
assert(!LV.getType()->isFunctionType());
|
||||
|
||||
// Everything needs a load.
|
||||
return RValue::get(EmitLoadOfScalar(LV));
|
||||
return RValue::get(EmitLoadOfScalar(LV, Loc));
|
||||
}
|
||||
|
||||
if (LV.isVectorElt()) {
|
||||
|
@ -2816,16 +2821,17 @@ LValue CodeGenFunction::EmitOpaqueValueLValue(const OpaqueValueExpr *e) {
|
|||
}
|
||||
|
||||
RValue CodeGenFunction::EmitRValueForField(LValue LV,
|
||||
const FieldDecl *FD) {
|
||||
const FieldDecl *FD,
|
||||
SourceLocation Loc) {
|
||||
QualType FT = FD->getType();
|
||||
LValue FieldLV = EmitLValueForField(LV, FD);
|
||||
switch (getEvaluationKind(FT)) {
|
||||
case TEK_Complex:
|
||||
return RValue::getComplex(EmitLoadOfComplex(FieldLV));
|
||||
return RValue::getComplex(EmitLoadOfComplex(FieldLV, Loc));
|
||||
case TEK_Aggregate:
|
||||
return FieldLV.asAggregateRValue();
|
||||
case TEK_Scalar:
|
||||
return EmitLoadOfLValue(FieldLV);
|
||||
return EmitLoadOfLValue(FieldLV, Loc);
|
||||
}
|
||||
llvm_unreachable("bad evaluation kind");
|
||||
}
|
||||
|
@ -3167,15 +3173,16 @@ EmitPointerToDataMemberBinaryExpr(const BinaryOperator *E) {
|
|||
/// Given the address of a temporary variable, produce an r-value of
|
||||
/// its type.
|
||||
RValue CodeGenFunction::convertTempToRValue(llvm::Value *addr,
|
||||
QualType type) {
|
||||
QualType type,
|
||||
SourceLocation loc) {
|
||||
LValue lvalue = MakeNaturalAlignAddrLValue(addr, type);
|
||||
switch (getEvaluationKind(type)) {
|
||||
case TEK_Complex:
|
||||
return RValue::getComplex(EmitLoadOfComplex(lvalue));
|
||||
return RValue::getComplex(EmitLoadOfComplex(lvalue, loc));
|
||||
case TEK_Aggregate:
|
||||
return lvalue.asAggregateRValue();
|
||||
case TEK_Scalar:
|
||||
return RValue::get(EmitLoadOfScalar(lvalue));
|
||||
return RValue::get(EmitLoadOfScalar(lvalue, loc));
|
||||
}
|
||||
llvm_unreachable("bad evaluation kind");
|
||||
}
|
||||
|
|
|
@ -208,7 +208,7 @@ void AggExprEmitter::EmitAggLoadOfLValue(const Expr *E) {
|
|||
|
||||
// If the type of the l-value is atomic, then do an atomic load.
|
||||
if (LV.getType()->isAtomicType()) {
|
||||
CGF.EmitAtomicLoad(LV, Dest);
|
||||
CGF.EmitAtomicLoad(LV, E->getExprLoc(), Dest);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1010,7 +1010,7 @@ static bool isSimpleZero(const Expr *E, CodeGenFunction &CGF) {
|
|||
|
||||
|
||||
void
|
||||
AggExprEmitter::EmitInitializationToLValue(Expr* E, LValue LV) {
|
||||
AggExprEmitter::EmitInitializationToLValue(Expr *E, LValue LV) {
|
||||
QualType type = LV.getType();
|
||||
// FIXME: Ignore result?
|
||||
// FIXME: Are initializers affected by volatile?
|
||||
|
|
|
@ -70,10 +70,10 @@ public:
|
|||
/// value l-value, this method emits the address of the l-value, then loads
|
||||
/// and returns the result.
|
||||
ComplexPairTy EmitLoadOfLValue(const Expr *E) {
|
||||
return EmitLoadOfLValue(CGF.EmitLValue(E));
|
||||
return EmitLoadOfLValue(CGF.EmitLValue(E), E->getExprLoc());
|
||||
}
|
||||
|
||||
ComplexPairTy EmitLoadOfLValue(LValue LV);
|
||||
ComplexPairTy EmitLoadOfLValue(LValue LV, SourceLocation Loc);
|
||||
|
||||
/// EmitStoreOfComplex - Store the specified real/imag parts into the
|
||||
/// specified value pointer.
|
||||
|
@ -113,7 +113,8 @@ public:
|
|||
ComplexPairTy VisitDeclRefExpr(DeclRefExpr *E) {
|
||||
if (CodeGenFunction::ConstantEmission result = CGF.tryEmitAsConstant(E)) {
|
||||
if (result.isReference())
|
||||
return EmitLoadOfLValue(result.getReferenceLValue(CGF, E));
|
||||
return EmitLoadOfLValue(result.getReferenceLValue(CGF, E),
|
||||
E->getExprLoc());
|
||||
|
||||
llvm::Constant *pair = result.getValue();
|
||||
return ComplexPairTy(pair->getAggregateElement(0U),
|
||||
|
@ -131,7 +132,7 @@ public:
|
|||
ComplexPairTy VisitMemberExpr(const Expr *E) { return EmitLoadOfLValue(E); }
|
||||
ComplexPairTy VisitOpaqueValueExpr(OpaqueValueExpr *E) {
|
||||
if (E->isGLValue())
|
||||
return EmitLoadOfLValue(CGF.getOpaqueLValueMapping(E));
|
||||
return EmitLoadOfLValue(CGF.getOpaqueLValueMapping(E), E->getExprLoc());
|
||||
return CGF.getOpaqueRValueMapping(E).getComplexVal();
|
||||
}
|
||||
|
||||
|
@ -291,10 +292,11 @@ public:
|
|||
|
||||
/// EmitLoadOfLValue - Given an RValue reference for a complex, emit code to
|
||||
/// load the real and imaginary pieces, returning them as Real/Imag.
|
||||
ComplexPairTy ComplexExprEmitter::EmitLoadOfLValue(LValue lvalue) {
|
||||
ComplexPairTy ComplexExprEmitter::EmitLoadOfLValue(LValue lvalue,
|
||||
SourceLocation loc) {
|
||||
assert(lvalue.isSimple() && "non-simple complex l-value?");
|
||||
if (lvalue.getType()->isAtomicType())
|
||||
return CGF.EmitAtomicLoad(lvalue).getComplexVal();
|
||||
return CGF.EmitAtomicLoad(lvalue, loc).getComplexVal();
|
||||
|
||||
llvm::Value *SrcPtr = lvalue.getAddress();
|
||||
bool isVolatile = lvalue.isVolatileQualified();
|
||||
|
@ -377,7 +379,8 @@ ComplexPairTy ComplexExprEmitter::VisitStmtExpr(const StmtExpr *E) {
|
|||
CodeGenFunction::StmtExprEvaluation eval(CGF);
|
||||
llvm::Value *RetAlloca = CGF.EmitCompoundStmt(*E->getSubStmt(), true);
|
||||
assert(RetAlloca && "Expected complex return value");
|
||||
return EmitLoadOfLValue(CGF.MakeAddrLValue(RetAlloca, E->getType()));
|
||||
return EmitLoadOfLValue(CGF.MakeAddrLValue(RetAlloca, E->getType()),
|
||||
E->getExprLoc());
|
||||
}
|
||||
|
||||
/// EmitComplexToComplexCast - Emit a cast from complex value Val to DestType.
|
||||
|
@ -427,7 +430,8 @@ ComplexPairTy ComplexExprEmitter::EmitCast(CastExpr::CastKind CK, Expr *Op,
|
|||
V = Builder.CreateBitCast(V,
|
||||
CGF.ConvertType(CGF.getContext().getPointerType(DestTy)));
|
||||
return EmitLoadOfLValue(CGF.MakeAddrLValue(V, DestTy,
|
||||
origLV.getAlignment()));
|
||||
origLV.getAlignment()),
|
||||
Op->getExprLoc());
|
||||
}
|
||||
|
||||
case CK_BitCast:
|
||||
|
@ -653,10 +657,10 @@ EmitCompoundAssignLValue(const CompoundAssignOperator *E,
|
|||
|
||||
// Load from the l-value and convert it.
|
||||
if (LHSTy->isAnyComplexType()) {
|
||||
ComplexPairTy LHSVal = EmitLoadOfLValue(LHS);
|
||||
ComplexPairTy LHSVal = EmitLoadOfLValue(LHS, E->getExprLoc());
|
||||
OpInfo.LHS = EmitComplexToComplexCast(LHSVal, LHSTy, OpInfo.Ty);
|
||||
} else {
|
||||
llvm::Value *LHSVal = CGF.EmitLoadOfScalar(LHS);
|
||||
llvm::Value *LHSVal = CGF.EmitLoadOfScalar(LHS, E->getExprLoc());
|
||||
OpInfo.LHS = EmitScalarToComplexCast(LHSVal, LHSTy, OpInfo.Ty);
|
||||
}
|
||||
|
||||
|
@ -693,7 +697,7 @@ EmitCompoundAssign(const CompoundAssignOperator *E,
|
|||
if (!LV.isVolatileQualified())
|
||||
return Val.getComplexVal();
|
||||
|
||||
return EmitLoadOfLValue(LV);
|
||||
return EmitLoadOfLValue(LV, E->getExprLoc());
|
||||
}
|
||||
|
||||
LValue ComplexExprEmitter::EmitBinAssignLValue(const BinaryOperator *E,
|
||||
|
@ -728,7 +732,7 @@ ComplexPairTy ComplexExprEmitter::VisitBinAssign(const BinaryOperator *E) {
|
|||
if (!LV.isVolatileQualified())
|
||||
return Val;
|
||||
|
||||
return EmitLoadOfLValue(LV);
|
||||
return EmitLoadOfLValue(LV, E->getExprLoc());
|
||||
}
|
||||
|
||||
ComplexPairTy ComplexExprEmitter::VisitBinComma(const BinaryOperator *E) {
|
||||
|
@ -817,8 +821,8 @@ ComplexPairTy ComplexExprEmitter::VisitVAArgExpr(VAArgExpr *E) {
|
|||
return ComplexPairTy(U, U);
|
||||
}
|
||||
|
||||
return EmitLoadOfLValue(
|
||||
CGF.MakeNaturalAlignAddrLValue(ArgPtr, E->getType()));
|
||||
return EmitLoadOfLValue(CGF.MakeNaturalAlignAddrLValue(ArgPtr, E->getType()),
|
||||
E->getExprLoc());
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -852,8 +856,9 @@ void CodeGenFunction::EmitStoreOfComplex(ComplexPairTy V, LValue dest,
|
|||
}
|
||||
|
||||
/// EmitLoadOfComplex - Load a complex number from the specified address.
|
||||
ComplexPairTy CodeGenFunction::EmitLoadOfComplex(LValue src) {
|
||||
return ComplexExprEmitter(*this).EmitLoadOfLValue(src);
|
||||
ComplexPairTy CodeGenFunction::EmitLoadOfComplex(LValue src,
|
||||
SourceLocation loc) {
|
||||
return ComplexExprEmitter(*this).EmitLoadOfLValue(src, loc);
|
||||
}
|
||||
|
||||
LValue CodeGenFunction::EmitComplexAssignmentLValue(const BinaryOperator *E) {
|
||||
|
|
|
@ -87,15 +87,16 @@ public:
|
|||
|
||||
void EmitBinOpCheck(Value *Check, const BinOpInfo &Info);
|
||||
|
||||
Value *EmitLoadOfLValue(LValue LV) {
|
||||
return CGF.EmitLoadOfLValue(LV).getScalarVal();
|
||||
Value *EmitLoadOfLValue(LValue LV, SourceLocation Loc) {
|
||||
return CGF.EmitLoadOfLValue(LV, Loc).getScalarVal();
|
||||
}
|
||||
|
||||
/// EmitLoadOfLValue - Given an expression with complex type that represents a
|
||||
/// value l-value, this method emits the address of the l-value, then loads
|
||||
/// and returns the result.
|
||||
Value *EmitLoadOfLValue(const Expr *E) {
|
||||
return EmitLoadOfLValue(EmitCheckedLValue(E, CodeGenFunction::TCK_Load));
|
||||
return EmitLoadOfLValue(EmitCheckedLValue(E, CodeGenFunction::TCK_Load),
|
||||
E->getExprLoc());
|
||||
}
|
||||
|
||||
/// EmitConversionToBool - Convert the specified expression value to a
|
||||
|
@ -217,7 +218,7 @@ public:
|
|||
|
||||
Value *VisitOpaqueValueExpr(OpaqueValueExpr *E) {
|
||||
if (E->isGLValue())
|
||||
return EmitLoadOfLValue(CGF.getOpaqueLValueMapping(E));
|
||||
return EmitLoadOfLValue(CGF.getOpaqueLValueMapping(E), E->getExprLoc());
|
||||
|
||||
// Otherwise, assume the mapping is the scalar directly.
|
||||
return CGF.getOpaqueRValueMapping(E).getScalarVal();
|
||||
|
@ -227,7 +228,8 @@ public:
|
|||
Value *VisitDeclRefExpr(DeclRefExpr *E) {
|
||||
if (CodeGenFunction::ConstantEmission result = CGF.tryEmitAsConstant(E)) {
|
||||
if (result.isReference())
|
||||
return EmitLoadOfLValue(result.getReferenceLValue(CGF, E));
|
||||
return EmitLoadOfLValue(result.getReferenceLValue(CGF, E),
|
||||
E->getExprLoc());
|
||||
return result.getValue();
|
||||
}
|
||||
return EmitLoadOfLValue(E);
|
||||
|
@ -251,7 +253,7 @@ public:
|
|||
|
||||
Value *VisitObjCIsaExpr(ObjCIsaExpr *E) {
|
||||
LValue LV = CGF.EmitObjCIsaExpr(E);
|
||||
Value *V = CGF.EmitLoadOfLValue(LV).getScalarVal();
|
||||
Value *V = CGF.EmitLoadOfLValue(LV, E->getExprLoc()).getScalarVal();
|
||||
return V;
|
||||
}
|
||||
|
||||
|
@ -1288,7 +1290,8 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {
|
|||
Value *V = EmitLValue(E).getAddress();
|
||||
V = Builder.CreateBitCast(V,
|
||||
ConvertType(CGF.getContext().getPointerType(DestTy)));
|
||||
return EmitLoadOfLValue(CGF.MakeNaturalAlignAddrLValue(V, DestTy));
|
||||
return EmitLoadOfLValue(CGF.MakeNaturalAlignAddrLValue(V, DestTy),
|
||||
CE->getExprLoc());
|
||||
}
|
||||
|
||||
case CK_CPointerToObjCPointerCast:
|
||||
|
@ -1497,8 +1500,8 @@ Value *ScalarExprEmitter::VisitStmtExpr(const StmtExpr *E) {
|
|||
!E->getType()->isVoidType());
|
||||
if (!RetAlloca)
|
||||
return 0;
|
||||
return CGF.EmitLoadOfScalar(CGF.MakeAddrLValue(RetAlloca, E->getType()));
|
||||
|
||||
return CGF.EmitLoadOfScalar(CGF.MakeAddrLValue(RetAlloca, E->getType()),
|
||||
E->getExprLoc());
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -1574,7 +1577,7 @@ ScalarExprEmitter::EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
|
|||
LV.getAddress(), amt, llvm::SequentiallyConsistent);
|
||||
return isPre ? Builder.CreateBinOp(op, old, amt) : old;
|
||||
}
|
||||
value = EmitLoadOfLValue(LV);
|
||||
value = EmitLoadOfLValue(LV, E->getExprLoc());
|
||||
input = value;
|
||||
// For every other atomic operation, we need to emit a load-op-cmpxchg loop
|
||||
llvm::BasicBlock *startBB = Builder.GetInsertBlock();
|
||||
|
@ -1586,7 +1589,7 @@ ScalarExprEmitter::EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
|
|||
atomicPHI->addIncoming(value, startBB);
|
||||
value = atomicPHI;
|
||||
} else {
|
||||
value = EmitLoadOfLValue(LV);
|
||||
value = EmitLoadOfLValue(LV, E->getExprLoc());
|
||||
input = value;
|
||||
}
|
||||
|
||||
|
@ -1928,7 +1931,8 @@ Value *ScalarExprEmitter::VisitUnaryReal(const UnaryOperator *E) {
|
|||
// Note that we have to ask E because Op might be an l-value that
|
||||
// this won't work for, e.g. an Obj-C property.
|
||||
if (E->isGLValue())
|
||||
return CGF.EmitLoadOfLValue(CGF.EmitLValue(E)).getScalarVal();
|
||||
return CGF.EmitLoadOfLValue(CGF.EmitLValue(E),
|
||||
E->getExprLoc()).getScalarVal();
|
||||
|
||||
// Otherwise, calculate and project.
|
||||
return CGF.EmitComplexExpr(Op, false, true).first;
|
||||
|
@ -1944,7 +1948,8 @@ Value *ScalarExprEmitter::VisitUnaryImag(const UnaryOperator *E) {
|
|||
// Note that we have to ask E because Op might be an l-value that
|
||||
// this won't work for, e.g. an Obj-C property.
|
||||
if (Op->isGLValue())
|
||||
return CGF.EmitLoadOfLValue(CGF.EmitLValue(E)).getScalarVal();
|
||||
return CGF.EmitLoadOfLValue(CGF.EmitLValue(E),
|
||||
E->getExprLoc()).getScalarVal();
|
||||
|
||||
// Otherwise, calculate and project.
|
||||
return CGF.EmitComplexExpr(Op, true, false).second;
|
||||
|
@ -2041,7 +2046,7 @@ LValue ScalarExprEmitter::EmitCompoundAssignLValue(
|
|||
// floating point environment in the loop.
|
||||
llvm::BasicBlock *startBB = Builder.GetInsertBlock();
|
||||
llvm::BasicBlock *opBB = CGF.createBasicBlock("atomic_op", CGF.CurFn);
|
||||
OpInfo.LHS = EmitLoadOfLValue(LHSLV);
|
||||
OpInfo.LHS = EmitLoadOfLValue(LHSLV, E->getExprLoc());
|
||||
OpInfo.LHS = CGF.EmitToMemory(OpInfo.LHS, type);
|
||||
Builder.CreateBr(opBB);
|
||||
Builder.SetInsertPoint(opBB);
|
||||
|
@ -2050,7 +2055,7 @@ LValue ScalarExprEmitter::EmitCompoundAssignLValue(
|
|||
OpInfo.LHS = atomicPHI;
|
||||
}
|
||||
else
|
||||
OpInfo.LHS = EmitLoadOfLValue(LHSLV);
|
||||
OpInfo.LHS = EmitLoadOfLValue(LHSLV, E->getExprLoc());
|
||||
|
||||
OpInfo.LHS = EmitScalarConversion(OpInfo.LHS, LHSTy,
|
||||
E->getComputationLHSType());
|
||||
|
@ -2104,7 +2109,7 @@ Value *ScalarExprEmitter::EmitCompoundAssign(const CompoundAssignOperator *E,
|
|||
return RHS;
|
||||
|
||||
// Otherwise, reload the value.
|
||||
return EmitLoadOfLValue(LHS);
|
||||
return EmitLoadOfLValue(LHS, E->getExprLoc());
|
||||
}
|
||||
|
||||
void ScalarExprEmitter::EmitUndefinedBehaviorIntegerDivAndRemCheck(
|
||||
|
@ -2857,7 +2862,7 @@ Value *ScalarExprEmitter::VisitBinAssign(const BinaryOperator *E) {
|
|||
return RHS;
|
||||
|
||||
// Otherwise, reload the value.
|
||||
return EmitLoadOfLValue(LHS);
|
||||
return EmitLoadOfLValue(LHS, E->getExprLoc());
|
||||
}
|
||||
|
||||
Value *ScalarExprEmitter::VisitBinLAnd(const BinaryOperator *E) {
|
||||
|
@ -3296,7 +3301,7 @@ LValue CodeGenFunction::EmitObjCIsaExpr(const ObjCIsaExpr *E) {
|
|||
llvm::Value *Src = EmitScalarExpr(BaseExpr);
|
||||
Builder.CreateStore(Src, V);
|
||||
V = ScalarExprEmitter(*this).EmitLoadOfLValue(
|
||||
MakeNaturalAlignAddrLValue(V, E->getType()));
|
||||
MakeNaturalAlignAddrLValue(V, E->getType()), E->getExprLoc());
|
||||
} else {
|
||||
if (E->isArrow())
|
||||
V = ScalarExprEmitter(*this).EmitLoadOfLValue(BaseExpr);
|
||||
|
|
|
@ -925,7 +925,7 @@ CodeGenFunction::generateObjCGetterBody(const ObjCImplementationDecl *classImpl,
|
|||
QualType ivarType = ivar->getType();
|
||||
switch (getEvaluationKind(ivarType)) {
|
||||
case TEK_Complex: {
|
||||
ComplexPairTy pair = EmitLoadOfComplex(LV);
|
||||
ComplexPairTy pair = EmitLoadOfComplex(LV, SourceLocation());
|
||||
EmitStoreOfComplex(pair,
|
||||
MakeNaturalAlignAddrLValue(ReturnValue, ivarType),
|
||||
/*init*/ true);
|
||||
|
@ -949,7 +949,7 @@ CodeGenFunction::generateObjCGetterBody(const ObjCImplementationDecl *classImpl,
|
|||
// Otherwise we want to do a simple load, suppressing the
|
||||
// final autorelease.
|
||||
} else {
|
||||
value = EmitLoadOfLValue(LV).getScalarVal();
|
||||
value = EmitLoadOfLValue(LV, SourceLocation()).getScalarVal();
|
||||
AutoreleaseResult = false;
|
||||
}
|
||||
|
||||
|
@ -1402,7 +1402,7 @@ llvm::Value *CodeGenFunction::LoadObjCSelf() {
|
|||
VarDecl *Self = cast<ObjCMethodDecl>(CurFuncDecl)->getSelfDecl();
|
||||
DeclRefExpr DRE(Self, /*is enclosing local*/ (CurFuncDecl != CurCodeDecl),
|
||||
Self->getType(), VK_LValue, SourceLocation());
|
||||
return EmitLoadOfScalar(EmitDeclRefLValue(&DRE));
|
||||
return EmitLoadOfScalar(EmitDeclRefLValue(&DRE), SourceLocation());
|
||||
}
|
||||
|
||||
QualType CodeGenFunction::TypeOfSelfObject() {
|
||||
|
@ -2082,7 +2082,7 @@ llvm::Value *CodeGenFunction::EmitARCStoreStrong(LValue dst,
|
|||
newValue = EmitARCRetain(type, newValue);
|
||||
|
||||
// Read the old value.
|
||||
llvm::Value *oldValue = EmitLoadOfScalar(dst);
|
||||
llvm::Value *oldValue = EmitLoadOfScalar(dst, SourceLocation());
|
||||
|
||||
// Store. We do this before the release so that any deallocs won't
|
||||
// see the old value.
|
||||
|
@ -2353,7 +2353,8 @@ static TryEmitResult tryEmitARCRetainLoadOfScalar(CodeGenFunction &CGF,
|
|||
case Qualifiers::OCL_ExplicitNone:
|
||||
case Qualifiers::OCL_Strong:
|
||||
case Qualifiers::OCL_Autoreleasing:
|
||||
return TryEmitResult(CGF.EmitLoadOfLValue(lvalue).getScalarVal(),
|
||||
return TryEmitResult(CGF.EmitLoadOfLValue(lvalue,
|
||||
SourceLocation()).getScalarVal(),
|
||||
false);
|
||||
|
||||
case Qualifiers::OCL_Weak:
|
||||
|
@ -2379,7 +2380,8 @@ static TryEmitResult tryEmitARCRetainLoadOfScalar(CodeGenFunction &CGF,
|
|||
LValue lv = CGF.EmitLValue(e);
|
||||
|
||||
// Load the object pointer.
|
||||
llvm::Value *result = CGF.EmitLoadOfLValue(lv).getScalarVal();
|
||||
llvm::Value *result = CGF.EmitLoadOfLValue(lv,
|
||||
SourceLocation()).getScalarVal();
|
||||
|
||||
// Set the source pointer to NULL.
|
||||
CGF.EmitStoreOfScalar(getNullForVariable(lv.getAddress()), lv);
|
||||
|
|
|
@ -1411,11 +1411,12 @@ AddVariableConstraints(const std::string &Constraint, const Expr &AsmExpr,
|
|||
llvm::Value*
|
||||
CodeGenFunction::EmitAsmInputLValue(const TargetInfo::ConstraintInfo &Info,
|
||||
LValue InputValue, QualType InputType,
|
||||
std::string &ConstraintStr) {
|
||||
std::string &ConstraintStr,
|
||||
SourceLocation Loc) {
|
||||
llvm::Value *Arg;
|
||||
if (Info.allowsRegister() || !Info.allowsMemory()) {
|
||||
if (CodeGenFunction::hasScalarEvaluationKind(InputType)) {
|
||||
Arg = EmitLoadOfLValue(InputValue).getScalarVal();
|
||||
Arg = EmitLoadOfLValue(InputValue, Loc).getScalarVal();
|
||||
} else {
|
||||
llvm::Type *Ty = ConvertType(InputType);
|
||||
uint64_t Size = CGM.getDataLayout().getTypeSizeInBits(Ty);
|
||||
|
@ -1448,7 +1449,8 @@ llvm::Value* CodeGenFunction::EmitAsmInput(
|
|||
|
||||
InputExpr = InputExpr->IgnoreParenNoopCasts(getContext());
|
||||
LValue Dest = EmitLValue(InputExpr);
|
||||
return EmitAsmInputLValue(Info, Dest, InputExpr->getType(), ConstraintStr);
|
||||
return EmitAsmInputLValue(Info, Dest, InputExpr->getType(), ConstraintStr,
|
||||
InputExpr->getExprLoc());
|
||||
}
|
||||
|
||||
/// getAsmSrcLocInfo - Return the !srcloc metadata node to attach to an inline
|
||||
|
@ -1593,7 +1595,8 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
|
|||
|
||||
const Expr *InputExpr = S.getOutputExpr(i);
|
||||
llvm::Value *Arg = EmitAsmInputLValue(Info, Dest, InputExpr->getType(),
|
||||
InOutConstraints);
|
||||
InOutConstraints,
|
||||
InputExpr->getExprLoc());
|
||||
|
||||
if (llvm::Type* AdjTy =
|
||||
getTargetHooks().adjustInlineAsmType(*this, OutputConstraint,
|
||||
|
@ -1804,7 +1807,7 @@ CodeGenFunction::EmitCapturedStmt(const CapturedStmt &S, CapturedRegionKind K) {
|
|||
// Emit the CapturedDecl
|
||||
CodeGenFunction CGF(CGM, true);
|
||||
CGF.CapturedStmtInfo = new CGCapturedStmtInfo(S, K);
|
||||
llvm::Function *F = CGF.GenerateCapturedStmtFunction(CD, RD);
|
||||
llvm::Function *F = CGF.GenerateCapturedStmtFunction(CD, RD, S.getLocStart());
|
||||
delete CGF.CapturedStmtInfo;
|
||||
|
||||
// Emit call to the helper function.
|
||||
|
@ -1816,7 +1819,8 @@ CodeGenFunction::EmitCapturedStmt(const CapturedStmt &S, CapturedRegionKind K) {
|
|||
/// Creates the outlined function for a CapturedStmt.
|
||||
llvm::Function *
|
||||
CodeGenFunction::GenerateCapturedStmtFunction(const CapturedDecl *CD,
|
||||
const RecordDecl *RD) {
|
||||
const RecordDecl *RD,
|
||||
SourceLocation Loc) {
|
||||
assert(CapturedStmtInfo &&
|
||||
"CapturedStmtInfo should be set when generating the captured function");
|
||||
|
||||
|
@ -1851,8 +1855,7 @@ CodeGenFunction::GenerateCapturedStmtFunction(const CapturedDecl *CD,
|
|||
LValue LV = MakeNaturalAlignAddrLValue(CapturedStmtInfo->getContextValue(),
|
||||
Ctx.getTagDeclType(RD));
|
||||
LValue ThisLValue = EmitLValueForField(LV, FD);
|
||||
|
||||
CXXThisValue = EmitLoadOfLValue(ThisLValue).getScalarVal();
|
||||
CXXThisValue = EmitLoadOfLValue(ThisLValue, Loc).getScalarVal();
|
||||
}
|
||||
|
||||
CapturedStmtInfo->EmitBody(*this, CD->getBody());
|
||||
|
|
|
@ -337,7 +337,7 @@ void CodeGenFunction::GenerateThunk(llvm::Function *Fn,
|
|||
for (FunctionDecl::param_const_iterator I = MD->param_begin(),
|
||||
E = MD->param_end(); I != E; ++I) {
|
||||
ParmVarDecl *param = *I;
|
||||
EmitDelegateCallArg(CallArgs, param);
|
||||
EmitDelegateCallArg(CallArgs, param, param->getLocStart());
|
||||
}
|
||||
|
||||
// Get our callee.
|
||||
|
|
|
@ -238,7 +238,7 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) {
|
|||
DI->EmitFunctionEnd(Builder);
|
||||
}
|
||||
|
||||
EmitFunctionEpilog(*CurFnInfo, EmitRetDbgLoc);
|
||||
EmitFunctionEpilog(*CurFnInfo, EmitRetDbgLoc, EndLoc);
|
||||
EmitEndEHSpec(CurCodeDecl);
|
||||
|
||||
assert(EHStack.empty() &&
|
||||
|
@ -591,7 +591,8 @@ void CodeGenFunction::StartFunction(GlobalDecl GD,
|
|||
if (LambdaThisCaptureField) {
|
||||
// If this lambda captures this, load it.
|
||||
LValue ThisLValue = EmitLValueForLambdaField(LambdaThisCaptureField);
|
||||
CXXThisValue = EmitLoadOfLValue(ThisLValue).getScalarVal();
|
||||
CXXThisValue = EmitLoadOfLValue(ThisLValue,
|
||||
SourceLocation()).getScalarVal();
|
||||
}
|
||||
} else {
|
||||
// Not in a lambda; just use 'this' from the method.
|
||||
|
|
|
@ -1221,7 +1221,8 @@ public:
|
|||
|
||||
/// EmitFunctionEpilog - Emit the target specific LLVM code to return the
|
||||
/// given temporary.
|
||||
void EmitFunctionEpilog(const CGFunctionInfo &FI, bool EmitRetDbgLoc);
|
||||
void EmitFunctionEpilog(const CGFunctionInfo &FI, bool EmitRetDbgLoc,
|
||||
SourceLocation EndLoc);
|
||||
|
||||
/// EmitStartEHSpec - Emit the start of the exception spec.
|
||||
void EmitStartEHSpec(const Decl *D);
|
||||
|
@ -1568,7 +1569,8 @@ public:
|
|||
|
||||
void EmitDelegateCXXConstructorCall(const CXXConstructorDecl *Ctor,
|
||||
CXXCtorType CtorType,
|
||||
const FunctionArgList &Args);
|
||||
const FunctionArgList &Args,
|
||||
SourceLocation Loc);
|
||||
// It's important not to confuse this and the previous function. Delegating
|
||||
// constructors are the C++0x feature. The constructor delegate optimization
|
||||
// is used to reduce duplication in the base and complete consturctors where
|
||||
|
@ -1843,7 +1845,8 @@ public:
|
|||
|
||||
llvm::Function *EmitCapturedStmt(const CapturedStmt &S, CapturedRegionKind K);
|
||||
llvm::Function *GenerateCapturedStmtFunction(const CapturedDecl *CD,
|
||||
const RecordDecl *RD);
|
||||
const RecordDecl *RD,
|
||||
SourceLocation Loc);
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// LValue Expression Emission
|
||||
|
@ -1886,11 +1889,12 @@ public:
|
|||
/// that the address will be used to access the object.
|
||||
LValue EmitCheckedLValue(const Expr *E, TypeCheckKind TCK);
|
||||
|
||||
RValue convertTempToRValue(llvm::Value *addr, QualType type);
|
||||
RValue convertTempToRValue(llvm::Value *addr, QualType type,
|
||||
SourceLocation Loc);
|
||||
|
||||
void EmitAtomicInit(Expr *E, LValue lvalue);
|
||||
|
||||
RValue EmitAtomicLoad(LValue lvalue,
|
||||
RValue EmitAtomicLoad(LValue lvalue, SourceLocation loc,
|
||||
AggValueSlot slot = AggValueSlot::ignored());
|
||||
|
||||
void EmitAtomicStore(RValue rvalue, LValue lvalue, bool isInit);
|
||||
|
@ -1908,6 +1912,7 @@ public:
|
|||
/// the LLVM value representation.
|
||||
llvm::Value *EmitLoadOfScalar(llvm::Value *Addr, bool Volatile,
|
||||
unsigned Alignment, QualType Ty,
|
||||
SourceLocation Loc,
|
||||
llvm::MDNode *TBAAInfo = 0,
|
||||
QualType TBAABaseTy = QualType(),
|
||||
uint64_t TBAAOffset = 0);
|
||||
|
@ -1916,7 +1921,7 @@ public:
|
|||
/// care to appropriately convert from the memory representation to
|
||||
/// the LLVM value representation. The l-value must be a simple
|
||||
/// l-value.
|
||||
llvm::Value *EmitLoadOfScalar(LValue lvalue);
|
||||
llvm::Value *EmitLoadOfScalar(LValue lvalue, SourceLocation Loc);
|
||||
|
||||
/// EmitStoreOfScalar - Store a scalar value to an address, taking
|
||||
/// care to appropriately convert from the memory representation to
|
||||
|
@ -1937,7 +1942,7 @@ public:
|
|||
/// EmitLoadOfLValue - Given an expression that represents a value lvalue,
|
||||
/// this method emits the address of the lvalue, then loads the result as an
|
||||
/// rvalue, returning the rvalue.
|
||||
RValue EmitLoadOfLValue(LValue V);
|
||||
RValue EmitLoadOfLValue(LValue V, SourceLocation Loc);
|
||||
RValue EmitLoadOfExtVectorElementLValue(LValue V);
|
||||
RValue EmitLoadOfBitfieldLValue(LValue LV);
|
||||
|
||||
|
@ -1947,8 +1952,8 @@ public:
|
|||
void EmitStoreThroughLValue(RValue Src, LValue Dst, bool isInit=false);
|
||||
void EmitStoreThroughExtVectorComponentLValue(RValue Src, LValue Dst);
|
||||
|
||||
/// EmitStoreThroughLValue - Store Src into Dst with same constraints as
|
||||
/// EmitStoreThroughLValue.
|
||||
/// EmitStoreThroughBitfieldLValue - Store Src into Dst with same constraints
|
||||
/// as EmitStoreThroughLValue.
|
||||
///
|
||||
/// \param Result [out] - If non-null, this will be set to a Value* for the
|
||||
/// bit-field contents after the store, appropriate for use as the result of
|
||||
|
@ -1986,7 +1991,7 @@ public:
|
|||
LValue EmitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E);
|
||||
LValue EmitOpaqueValueLValue(const OpaqueValueExpr *e);
|
||||
|
||||
RValue EmitRValueForField(LValue LV, const FieldDecl *FD);
|
||||
RValue EmitRValueForField(LValue LV, const FieldDecl *FD, SourceLocation Loc);
|
||||
|
||||
class ConstantEmission {
|
||||
llvm::PointerIntPair<llvm::Constant*, 1, bool> ValueAndIsReference;
|
||||
|
@ -2282,7 +2287,7 @@ public:
|
|||
void EmitStoreOfComplex(ComplexPairTy V, LValue dest, bool isInit);
|
||||
|
||||
/// EmitLoadOfComplex - Load a complex number from the specified l-value.
|
||||
ComplexPairTy EmitLoadOfComplex(LValue src);
|
||||
ComplexPairTy EmitLoadOfComplex(LValue src, SourceLocation loc);
|
||||
|
||||
/// CreateStaticVarDecl - Create a zero-initialized LLVM global for
|
||||
/// a static local variable.
|
||||
|
@ -2438,7 +2443,8 @@ public:
|
|||
/// EmitDelegateCallArg - We are performing a delegate call; that
|
||||
/// is, the current function is delegating to another one. Produce
|
||||
/// a r-value suitable for passing the given parameter.
|
||||
void EmitDelegateCallArg(CallArgList &args, const VarDecl *param);
|
||||
void EmitDelegateCallArg(CallArgList &args, const VarDecl *param,
|
||||
SourceLocation loc);
|
||||
|
||||
/// SetFPAccuracy - Set the minimum required accuracy of the given floating
|
||||
/// point operation, expressed as the maximum relative error in ulp.
|
||||
|
@ -2470,7 +2476,8 @@ private:
|
|||
|
||||
llvm::Value* EmitAsmInputLValue(const TargetInfo::ConstraintInfo &Info,
|
||||
LValue InputValue, QualType InputType,
|
||||
std::string &ConstraintStr);
|
||||
std::string &ConstraintStr,
|
||||
SourceLocation Loc);
|
||||
|
||||
/// EmitCallArgs - Emit call arguments for a function.
|
||||
/// The CallArgTypeInfo parameter is used for iterating over the known
|
||||
|
|
Loading…
Reference in New Issue