forked from OSchip/llvm-project
Revert "[NFC] Pass a reference to CodeGenFunction to methods of LValue and"
This reverts commit 8a5b7c3570
. This seems
to have broken UBSan because of a null dereference.
This commit is contained in:
parent
59e69fefab
commit
9f37c0e703
|
@ -139,7 +139,7 @@ namespace {
|
|||
const LValue &getAtomicLValue() const { return LVal; }
|
||||
llvm::Value *getAtomicPointer() const {
|
||||
if (LVal.isSimple())
|
||||
return LVal.getPointer(CGF);
|
||||
return LVal.getPointer();
|
||||
else if (LVal.isBitField())
|
||||
return LVal.getBitFieldPointer();
|
||||
else if (LVal.isVectorElt())
|
||||
|
@ -343,7 +343,7 @@ bool AtomicInfo::requiresMemSetZero(llvm::Type *type) const {
|
|||
|
||||
bool AtomicInfo::emitMemSetZeroIfNecessary() const {
|
||||
assert(LVal.isSimple());
|
||||
llvm::Value *addr = LVal.getPointer(CGF);
|
||||
llvm::Value *addr = LVal.getPointer();
|
||||
if (!requiresMemSetZero(addr->getType()->getPointerElementType()))
|
||||
return false;
|
||||
|
||||
|
@ -1628,7 +1628,7 @@ Address AtomicInfo::materializeRValue(RValue rvalue) const {
|
|||
LValue TempLV = CGF.MakeAddrLValue(CreateTempAlloca(), getAtomicType());
|
||||
AtomicInfo Atomics(CGF, TempLV);
|
||||
Atomics.emitCopyIntoMemory(rvalue);
|
||||
return TempLV.getAddress(CGF);
|
||||
return TempLV.getAddress();
|
||||
}
|
||||
|
||||
llvm::Value *AtomicInfo::convertRValueToInt(RValue RVal) const {
|
||||
|
@ -1975,8 +1975,8 @@ void CodeGenFunction::EmitAtomicStore(RValue rvalue, LValue dest,
|
|||
// If this is an aggregate r-value, it should agree in type except
|
||||
// maybe for address-space qualification.
|
||||
assert(!rvalue.isAggregate() ||
|
||||
rvalue.getAggregateAddress().getElementType() ==
|
||||
dest.getAddress(*this).getElementType());
|
||||
rvalue.getAggregateAddress().getElementType()
|
||||
== dest.getAddress().getElementType());
|
||||
|
||||
AtomicInfo atomics(*this, dest);
|
||||
LValue LVal = atomics.getAtomicLValue();
|
||||
|
@ -2043,10 +2043,10 @@ std::pair<RValue, llvm::Value *> CodeGenFunction::EmitAtomicCompareExchange(
|
|||
// maybe for address-space qualification.
|
||||
assert(!Expected.isAggregate() ||
|
||||
Expected.getAggregateAddress().getElementType() ==
|
||||
Obj.getAddress(*this).getElementType());
|
||||
Obj.getAddress().getElementType());
|
||||
assert(!Desired.isAggregate() ||
|
||||
Desired.getAggregateAddress().getElementType() ==
|
||||
Obj.getAddress(*this).getElementType());
|
||||
Obj.getAddress().getElementType());
|
||||
AtomicInfo Atomics(*this, Obj);
|
||||
|
||||
return Atomics.EmitAtomicCompareExchange(Expected, Desired, Success, Failure,
|
||||
|
@ -2086,11 +2086,13 @@ void CodeGenFunction::EmitAtomicInit(Expr *init, LValue dest) {
|
|||
}
|
||||
|
||||
// Evaluate the expression directly into the destination.
|
||||
AggValueSlot slot = AggValueSlot::forLValue(
|
||||
dest, *this, AggValueSlot::IsNotDestructed,
|
||||
AggValueSlot::DoesNotNeedGCBarriers, AggValueSlot::IsNotAliased,
|
||||
AggValueSlot::DoesNotOverlap,
|
||||
Zeroed ? AggValueSlot::IsZeroed : AggValueSlot::IsNotZeroed);
|
||||
AggValueSlot slot = AggValueSlot::forLValue(dest,
|
||||
AggValueSlot::IsNotDestructed,
|
||||
AggValueSlot::DoesNotNeedGCBarriers,
|
||||
AggValueSlot::IsNotAliased,
|
||||
AggValueSlot::DoesNotOverlap,
|
||||
Zeroed ? AggValueSlot::IsZeroed :
|
||||
AggValueSlot::IsNotZeroed);
|
||||
|
||||
EmitAggExpr(init, slot);
|
||||
return;
|
||||
|
|
|
@ -1076,7 +1076,7 @@ llvm::Value *CodeGenFunction::EmitBlockLiteral(const CGBlockInfo &blockInfo) {
|
|||
/*RefersToEnclosingVariableOrCapture*/ CI.isNested(),
|
||||
type.getNonReferenceType(), VK_LValue,
|
||||
SourceLocation());
|
||||
src = EmitDeclRefLValue(&declRef).getAddress(*this);
|
||||
src = EmitDeclRefLValue(&declRef).getAddress();
|
||||
};
|
||||
|
||||
// For byrefs, we just write the pointer to the byref struct into
|
||||
|
|
|
@ -3367,7 +3367,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
|
|||
return RValue::get(Carry);
|
||||
}
|
||||
case Builtin::BI__builtin_addressof:
|
||||
return RValue::get(EmitLValue(E->getArg(0)).getPointer(*this));
|
||||
return RValue::get(EmitLValue(E->getArg(0)).getPointer());
|
||||
case Builtin::BI__builtin_operator_new:
|
||||
return EmitBuiltinNewDeleteCall(
|
||||
E->getCallee()->getType()->castAs<FunctionProtoType>(), E, false);
|
||||
|
@ -3750,8 +3750,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
|
|||
llvm::Value *Queue = EmitScalarExpr(E->getArg(0));
|
||||
llvm::Value *Flags = EmitScalarExpr(E->getArg(1));
|
||||
LValue NDRangeL = EmitAggExprToLValue(E->getArg(2));
|
||||
llvm::Value *Range = NDRangeL.getAddress(*this).getPointer();
|
||||
llvm::Type *RangeTy = NDRangeL.getAddress(*this).getType();
|
||||
llvm::Value *Range = NDRangeL.getAddress().getPointer();
|
||||
llvm::Type *RangeTy = NDRangeL.getAddress().getType();
|
||||
|
||||
if (NumArgs == 4) {
|
||||
// The most basic form of the call with parameters:
|
||||
|
@ -3770,7 +3770,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
|
|||
Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
|
||||
|
||||
AttrBuilder B;
|
||||
B.addByValAttr(NDRangeL.getAddress(*this).getElementType());
|
||||
B.addByValAttr(NDRangeL.getAddress().getElementType());
|
||||
llvm::AttributeList ByValAttrSet =
|
||||
llvm::AttributeList::get(CGM.getModule().getContext(), 3U, B);
|
||||
|
||||
|
@ -3955,7 +3955,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
|
|||
llvm::Type *GenericVoidPtrTy = Builder.getInt8PtrTy(
|
||||
getContext().getTargetAddressSpace(LangAS::opencl_generic));
|
||||
LValue NDRangeL = EmitAggExprToLValue(E->getArg(0));
|
||||
llvm::Value *NDRange = NDRangeL.getAddress(*this).getPointer();
|
||||
llvm::Value *NDRange = NDRangeL.getAddress().getPointer();
|
||||
auto Info =
|
||||
CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*this, E->getArg(1));
|
||||
Value *Kernel = Builder.CreatePointerCast(Info.Kernel, GenericVoidPtrTy);
|
||||
|
@ -9470,14 +9470,14 @@ Value *CodeGenFunction::EmitBPFBuiltinExpr(unsigned BuiltinID,
|
|||
if (!getDebugInfo()) {
|
||||
CGM.Error(E->getExprLoc(), "using builtin_preserve_field_info() without -g");
|
||||
return IsBitField ? EmitLValue(Arg).getBitFieldPointer()
|
||||
: EmitLValue(Arg).getPointer(*this);
|
||||
: EmitLValue(Arg).getPointer();
|
||||
}
|
||||
|
||||
// Enable underlying preserve_*_access_index() generation.
|
||||
bool OldIsInPreservedAIRegion = IsInPreservedAIRegion;
|
||||
IsInPreservedAIRegion = true;
|
||||
Value *FieldAddr = IsBitField ? EmitLValue(Arg).getBitFieldPointer()
|
||||
: EmitLValue(Arg).getPointer(*this);
|
||||
: EmitLValue(Arg).getPointer();
|
||||
IsInPreservedAIRegion = OldIsInPreservedAIRegion;
|
||||
|
||||
ConstantInt *C = cast<ConstantInt>(EmitScalarExpr(E->getArg(1)));
|
||||
|
|
|
@ -1020,13 +1020,13 @@ void CodeGenFunction::ExpandTypeFromArgs(
|
|||
|
||||
auto Exp = getTypeExpansion(Ty, getContext());
|
||||
if (auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
|
||||
forConstantArrayExpansion(
|
||||
*this, CAExp, LV.getAddress(*this), [&](Address EltAddr) {
|
||||
LValue LV = MakeAddrLValue(EltAddr, CAExp->EltTy);
|
||||
ExpandTypeFromArgs(CAExp->EltTy, LV, AI);
|
||||
});
|
||||
forConstantArrayExpansion(*this, CAExp, LV.getAddress(),
|
||||
[&](Address EltAddr) {
|
||||
LValue LV = MakeAddrLValue(EltAddr, CAExp->EltTy);
|
||||
ExpandTypeFromArgs(CAExp->EltTy, LV, AI);
|
||||
});
|
||||
} else if (auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
|
||||
Address This = LV.getAddress(*this);
|
||||
Address This = LV.getAddress();
|
||||
for (const CXXBaseSpecifier *BS : RExp->Bases) {
|
||||
// Perform a single step derived-to-base conversion.
|
||||
Address Base =
|
||||
|
@ -1057,7 +1057,7 @@ void CodeGenFunction::ExpandTypeToArgs(
|
|||
SmallVectorImpl<llvm::Value *> &IRCallArgs, unsigned &IRCallArgPos) {
|
||||
auto Exp = getTypeExpansion(Ty, getContext());
|
||||
if (auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
|
||||
Address Addr = Arg.hasLValue() ? Arg.getKnownLValue().getAddress(*this)
|
||||
Address Addr = Arg.hasLValue() ? Arg.getKnownLValue().getAddress()
|
||||
: Arg.getKnownRValue().getAggregateAddress();
|
||||
forConstantArrayExpansion(
|
||||
*this, CAExp, Addr, [&](Address EltAddr) {
|
||||
|
@ -1068,7 +1068,7 @@ void CodeGenFunction::ExpandTypeToArgs(
|
|||
IRCallArgPos);
|
||||
});
|
||||
} else if (auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
|
||||
Address This = Arg.hasLValue() ? Arg.getKnownLValue().getAddress(*this)
|
||||
Address This = Arg.hasLValue() ? Arg.getKnownLValue().getAddress()
|
||||
: Arg.getKnownRValue().getAggregateAddress();
|
||||
for (const CXXBaseSpecifier *BS : RExp->Bases) {
|
||||
// Perform a single step derived-to-base conversion.
|
||||
|
@ -3138,7 +3138,7 @@ static bool isProvablyNull(llvm::Value *addr) {
|
|||
static void emitWriteback(CodeGenFunction &CGF,
|
||||
const CallArgList::Writeback &writeback) {
|
||||
const LValue &srcLV = writeback.Source;
|
||||
Address srcAddr = srcLV.getAddress(CGF);
|
||||
Address srcAddr = srcLV.getAddress();
|
||||
assert(!isProvablyNull(srcAddr.getPointer()) &&
|
||||
"shouldn't have writeback for provably null argument");
|
||||
|
||||
|
@ -3246,7 +3246,7 @@ static void emitWritebackArg(CodeGenFunction &CGF, CallArgList &args,
|
|||
CRE->getSubExpr()->getType()->castAs<PointerType>()->getPointeeType();
|
||||
srcLV = CGF.MakeAddrLValue(srcAddr, srcAddrType);
|
||||
}
|
||||
Address srcAddr = srcLV.getAddress(CGF);
|
||||
Address srcAddr = srcLV.getAddress();
|
||||
|
||||
// The dest and src types don't necessarily match in LLVM terms
|
||||
// because of the crazy ObjC compatibility rules.
|
||||
|
@ -3560,7 +3560,7 @@ RValue CallArg::getRValue(CodeGenFunction &CGF) const {
|
|||
CGF.EmitAggregateCopy(Copy, LV, Ty, AggValueSlot::DoesNotOverlap,
|
||||
LV.isVolatile());
|
||||
IsUsed = true;
|
||||
return RValue::getAggregate(Copy.getAddress(CGF));
|
||||
return RValue::getAggregate(Copy.getAddress());
|
||||
}
|
||||
|
||||
void CallArg::copyInto(CodeGenFunction &CGF, Address Addr) const {
|
||||
|
@ -3570,7 +3570,7 @@ void CallArg::copyInto(CodeGenFunction &CGF, Address Addr) const {
|
|||
else if (!HasLV && RV.isComplex())
|
||||
CGF.EmitStoreOfComplex(RV.getComplexVal(), Dst, /*init=*/true);
|
||||
else {
|
||||
auto Addr = HasLV ? LV.getAddress(CGF) : RV.getAggregateAddress();
|
||||
auto Addr = HasLV ? LV.getAddress() : RV.getAggregateAddress();
|
||||
LValue SrcLV = CGF.MakeAddrLValue(Addr, Ty);
|
||||
// We assume that call args are never copied into subobjects.
|
||||
CGF.EmitAggregateCopy(Dst, SrcLV, Ty, AggValueSlot::DoesNotOverlap,
|
||||
|
@ -3933,7 +3933,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
|
|||
if (I->isAggregate()) {
|
||||
// Replace the placeholder with the appropriate argument slot GEP.
|
||||
Address Addr = I->hasLValue()
|
||||
? I->getKnownLValue().getAddress(*this)
|
||||
? I->getKnownLValue().getAddress()
|
||||
: I->getKnownRValue().getAggregateAddress();
|
||||
llvm::Instruction *Placeholder =
|
||||
cast<llvm::Instruction>(Addr.getPointer());
|
||||
|
@ -3978,7 +3978,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
|
|||
// 3. If the argument is byval, but RV is not located in default
|
||||
// or alloca address space.
|
||||
Address Addr = I->hasLValue()
|
||||
? I->getKnownLValue().getAddress(*this)
|
||||
? I->getKnownLValue().getAddress()
|
||||
: I->getKnownRValue().getAggregateAddress();
|
||||
llvm::Value *V = Addr.getPointer();
|
||||
CharUnits Align = ArgInfo.getIndirectAlign();
|
||||
|
@ -4065,7 +4065,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
|
|||
V = I->getKnownRValue().getScalarVal();
|
||||
else
|
||||
V = Builder.CreateLoad(
|
||||
I->hasLValue() ? I->getKnownLValue().getAddress(*this)
|
||||
I->hasLValue() ? I->getKnownLValue().getAddress()
|
||||
: I->getKnownRValue().getAggregateAddress());
|
||||
|
||||
// Implement swifterror by copying into a new swifterror argument.
|
||||
|
@ -4108,7 +4108,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
|
|||
Src = CreateMemTemp(I->Ty, "coerce");
|
||||
I->copyInto(*this, Src);
|
||||
} else {
|
||||
Src = I->hasLValue() ? I->getKnownLValue().getAddress(*this)
|
||||
Src = I->hasLValue() ? I->getKnownLValue().getAddress()
|
||||
: I->getKnownRValue().getAggregateAddress();
|
||||
}
|
||||
|
||||
|
@ -4163,7 +4163,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
|
|||
Address addr = Address::invalid();
|
||||
Address AllocaAddr = Address::invalid();
|
||||
if (I->isAggregate()) {
|
||||
addr = I->hasLValue() ? I->getKnownLValue().getAddress(*this)
|
||||
addr = I->hasLValue() ? I->getKnownLValue().getAddress()
|
||||
: I->getKnownRValue().getAggregateAddress();
|
||||
|
||||
} else {
|
||||
|
|
|
@ -657,7 +657,7 @@ static void EmitMemberInitializer(CodeGenFunction &CGF,
|
|||
// the constructor.
|
||||
QualType::DestructionKind dtorKind = FieldType.isDestructedType();
|
||||
if (CGF.needsEHCleanup(dtorKind))
|
||||
CGF.pushEHDestroy(dtorKind, LHS.getAddress(CGF), FieldType);
|
||||
CGF.pushEHDestroy(dtorKind, LHS.getAddress(), FieldType);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -681,12 +681,16 @@ void CodeGenFunction::EmitInitializerForField(FieldDecl *Field, LValue LHS,
|
|||
EmitComplexExprIntoLValue(Init, LHS, /*isInit*/ true);
|
||||
break;
|
||||
case TEK_Aggregate: {
|
||||
AggValueSlot Slot = AggValueSlot::forLValue(
|
||||
LHS, *this, AggValueSlot::IsDestructed,
|
||||
AggValueSlot::DoesNotNeedGCBarriers, AggValueSlot::IsNotAliased,
|
||||
getOverlapForFieldInit(Field), AggValueSlot::IsNotZeroed,
|
||||
// Checks are made by the code that calls constructor.
|
||||
AggValueSlot::IsSanitizerChecked);
|
||||
AggValueSlot Slot =
|
||||
AggValueSlot::forLValue(
|
||||
LHS,
|
||||
AggValueSlot::IsDestructed,
|
||||
AggValueSlot::DoesNotNeedGCBarriers,
|
||||
AggValueSlot::IsNotAliased,
|
||||
getOverlapForFieldInit(Field),
|
||||
AggValueSlot::IsNotZeroed,
|
||||
// Checks are made by the code that calls constructor.
|
||||
AggValueSlot::IsSanitizerChecked);
|
||||
EmitAggExpr(Init, Slot);
|
||||
break;
|
||||
}
|
||||
|
@ -696,7 +700,7 @@ void CodeGenFunction::EmitInitializerForField(FieldDecl *Field, LValue LHS,
|
|||
// later in the constructor.
|
||||
QualType::DestructionKind dtorKind = FieldType.isDestructedType();
|
||||
if (needsEHCleanup(dtorKind))
|
||||
pushEHDestroy(dtorKind, LHS.getAddress(*this), FieldType);
|
||||
pushEHDestroy(dtorKind, LHS.getAddress(), FieldType);
|
||||
}
|
||||
|
||||
/// Checks whether the given constructor is a valid subject for the
|
||||
|
@ -959,10 +963,9 @@ namespace {
|
|||
LValue SrcLV = CGF.MakeNaturalAlignAddrLValue(SrcPtr, RecordTy);
|
||||
LValue Src = CGF.EmitLValueForFieldInitialization(SrcLV, FirstField);
|
||||
|
||||
emitMemcpyIR(
|
||||
Dest.isBitField() ? Dest.getBitFieldAddress() : Dest.getAddress(CGF),
|
||||
Src.isBitField() ? Src.getBitFieldAddress() : Src.getAddress(CGF),
|
||||
MemcpySize);
|
||||
emitMemcpyIR(Dest.isBitField() ? Dest.getBitFieldAddress() : Dest.getAddress(),
|
||||
Src.isBitField() ? Src.getBitFieldAddress() : Src.getAddress(),
|
||||
MemcpySize);
|
||||
reset();
|
||||
}
|
||||
|
||||
|
@ -1116,7 +1119,7 @@ namespace {
|
|||
continue;
|
||||
LValue FieldLHS = LHS;
|
||||
EmitLValueForAnyFieldInitialization(CGF, MemberInit, FieldLHS);
|
||||
CGF.pushEHDestroy(dtorKind, FieldLHS.getAddress(CGF), FieldType);
|
||||
CGF.pushEHDestroy(dtorKind, FieldLHS.getAddress(), FieldType);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1626,7 +1629,7 @@ namespace {
|
|||
LValue LV = CGF.EmitLValueForField(ThisLV, field);
|
||||
assert(LV.isSimple());
|
||||
|
||||
CGF.emitDestroy(LV.getAddress(CGF), field->getType(), destroyer,
|
||||
CGF.emitDestroy(LV.getAddress(), field->getType(), destroyer,
|
||||
flags.isForNormalCleanup() && useEHCleanupForArray);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -570,7 +570,7 @@ namespace {
|
|||
Var.getType(), VK_LValue, SourceLocation());
|
||||
// Compute the address of the local variable, in case it's a byref
|
||||
// or something.
|
||||
llvm::Value *Addr = CGF.EmitDeclRefLValue(&DRE).getPointer(CGF);
|
||||
llvm::Value *Addr = CGF.EmitDeclRefLValue(&DRE).getPointer();
|
||||
|
||||
// In some cases, the type of the function argument will be different from
|
||||
// the type of the pointer. An example of this is
|
||||
|
@ -685,18 +685,18 @@ static bool tryEmitARCCopyWeakInit(CodeGenFunction &CGF,
|
|||
LValue srcLV = CGF.EmitLValue(srcExpr);
|
||||
|
||||
// Handle a formal type change to avoid asserting.
|
||||
auto srcAddr = srcLV.getAddress(CGF);
|
||||
auto srcAddr = srcLV.getAddress();
|
||||
if (needsCast) {
|
||||
srcAddr = CGF.Builder.CreateElementBitCast(
|
||||
srcAddr, destLV.getAddress(CGF).getElementType());
|
||||
srcAddr = CGF.Builder.CreateElementBitCast(srcAddr,
|
||||
destLV.getAddress().getElementType());
|
||||
}
|
||||
|
||||
// If it was an l-value, use objc_copyWeak.
|
||||
if (srcExpr->getValueKind() == VK_LValue) {
|
||||
CGF.EmitARCCopyWeak(destLV.getAddress(CGF), srcAddr);
|
||||
CGF.EmitARCCopyWeak(destLV.getAddress(), srcAddr);
|
||||
} else {
|
||||
assert(srcExpr->getValueKind() == VK_XValue);
|
||||
CGF.EmitARCMoveWeak(destLV.getAddress(CGF), srcAddr);
|
||||
CGF.EmitARCMoveWeak(destLV.getAddress(), srcAddr);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -714,7 +714,7 @@ static bool tryEmitARCCopyWeakInit(CodeGenFunction &CGF,
|
|||
static void drillIntoBlockVariable(CodeGenFunction &CGF,
|
||||
LValue &lvalue,
|
||||
const VarDecl *var) {
|
||||
lvalue.setAddress(CGF.emitBlockByrefAddress(lvalue.getAddress(CGF), var));
|
||||
lvalue.setAddress(CGF.emitBlockByrefAddress(lvalue.getAddress(), var));
|
||||
}
|
||||
|
||||
void CodeGenFunction::EmitNullabilityCheck(LValue LHS, llvm::Value *RHS,
|
||||
|
@ -774,18 +774,17 @@ void CodeGenFunction::EmitScalarInit(const Expr *init, const ValueDecl *D,
|
|||
if (capturedByInit) {
|
||||
// We can use a simple GEP for this because it can't have been
|
||||
// moved yet.
|
||||
tempLV.setAddress(emitBlockByrefAddress(tempLV.getAddress(*this),
|
||||
tempLV.setAddress(emitBlockByrefAddress(tempLV.getAddress(),
|
||||
cast<VarDecl>(D),
|
||||
/*follow*/ false));
|
||||
}
|
||||
|
||||
auto ty =
|
||||
cast<llvm::PointerType>(tempLV.getAddress(*this).getElementType());
|
||||
auto ty = cast<llvm::PointerType>(tempLV.getAddress().getElementType());
|
||||
llvm::Value *zero = CGM.getNullPointer(ty, tempLV.getType());
|
||||
|
||||
// If __weak, we want to use a barrier under certain conditions.
|
||||
if (lifetime == Qualifiers::OCL_Weak)
|
||||
EmitARCInitWeak(tempLV.getAddress(*this), zero);
|
||||
EmitARCInitWeak(tempLV.getAddress(), zero);
|
||||
|
||||
// Otherwise just do a simple store.
|
||||
else
|
||||
|
@ -828,9 +827,9 @@ void CodeGenFunction::EmitScalarInit(const Expr *init, const ValueDecl *D,
|
|||
|
||||
if (capturedByInit) drillIntoBlockVariable(*this, lvalue, cast<VarDecl>(D));
|
||||
if (accessedByInit)
|
||||
EmitARCStoreWeak(lvalue.getAddress(*this), value, /*ignored*/ true);
|
||||
EmitARCStoreWeak(lvalue.getAddress(), value, /*ignored*/ true);
|
||||
else
|
||||
EmitARCInitWeak(lvalue.getAddress(*this), value);
|
||||
EmitARCInitWeak(lvalue.getAddress(), value);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1898,10 +1897,11 @@ void CodeGenFunction::EmitExprAsInit(const Expr *init, const ValueDecl *D,
|
|||
else if (auto *FD = dyn_cast<FieldDecl>(D))
|
||||
Overlap = getOverlapForFieldInit(FD);
|
||||
// TODO: how can we delay here if D is captured by its initializer?
|
||||
EmitAggExpr(init, AggValueSlot::forLValue(
|
||||
lvalue, *this, AggValueSlot::IsDestructed,
|
||||
AggValueSlot::DoesNotNeedGCBarriers,
|
||||
AggValueSlot::IsNotAliased, Overlap));
|
||||
EmitAggExpr(init, AggValueSlot::forLValue(lvalue,
|
||||
AggValueSlot::IsDestructed,
|
||||
AggValueSlot::DoesNotNeedGCBarriers,
|
||||
AggValueSlot::IsNotAliased,
|
||||
Overlap));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -2457,7 +2457,7 @@ void CodeGenFunction::EmitParmDecl(const VarDecl &D, ParamValue Arg,
|
|||
// objc_storeStrong attempts to release its old value.
|
||||
llvm::Value *Null = CGM.EmitNullConstant(D.getType());
|
||||
EmitStoreOfScalar(Null, lv, /* isInitialization */ true);
|
||||
EmitARCStoreStrongCall(lv.getAddress(*this), ArgVal, true);
|
||||
EmitARCStoreStrongCall(lv.getAddress(), ArgVal, true);
|
||||
DoStore = false;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -54,11 +54,10 @@ static void EmitDeclInit(CodeGenFunction &CGF, const VarDecl &D,
|
|||
CGF.EmitComplexExprIntoLValue(Init, lv, /*isInit*/ true);
|
||||
return;
|
||||
case TEK_Aggregate:
|
||||
CGF.EmitAggExpr(Init,
|
||||
AggValueSlot::forLValue(lv, CGF, AggValueSlot::IsDestructed,
|
||||
AggValueSlot::DoesNotNeedGCBarriers,
|
||||
AggValueSlot::IsNotAliased,
|
||||
AggValueSlot::DoesNotOverlap));
|
||||
CGF.EmitAggExpr(Init, AggValueSlot::forLValue(lv,AggValueSlot::IsDestructed,
|
||||
AggValueSlot::DoesNotNeedGCBarriers,
|
||||
AggValueSlot::IsNotAliased,
|
||||
AggValueSlot::DoesNotOverlap));
|
||||
return;
|
||||
}
|
||||
llvm_unreachable("bad evaluation kind");
|
||||
|
|
|
@ -573,7 +573,7 @@ EmitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *M) {
|
|||
LV = EmitLValueForField(LV, Adjustment.Field);
|
||||
assert(LV.isSimple() &&
|
||||
"materialized temporary field is not a simple lvalue");
|
||||
Object = LV.getAddress(*this);
|
||||
Object = LV.getAddress();
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -594,7 +594,7 @@ CodeGenFunction::EmitReferenceBindingToExpr(const Expr *E) {
|
|||
// Emit the expression as an lvalue.
|
||||
LValue LV = EmitLValue(E);
|
||||
assert(LV.isSimple());
|
||||
llvm::Value *Value = LV.getPointer(*this);
|
||||
llvm::Value *Value = LV.getPointer();
|
||||
|
||||
if (sanitizePerformTypeCheck() && !E->getType()->isFunctionType()) {
|
||||
// C++11 [dcl.ref]p5 (as amended by core issue 453):
|
||||
|
@ -1129,7 +1129,7 @@ Address CodeGenFunction::EmitPointerWithAlignment(const Expr *E,
|
|||
LValue LV = EmitLValue(UO->getSubExpr());
|
||||
if (BaseInfo) *BaseInfo = LV.getBaseInfo();
|
||||
if (TBAAInfo) *TBAAInfo = LV.getTBAAInfo();
|
||||
return LV.getAddress(*this);
|
||||
return LV.getAddress();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1219,8 +1219,8 @@ LValue CodeGenFunction::EmitCheckedLValue(const Expr *E, TypeCheckKind TCK) {
|
|||
if (IsBaseCXXThis || isa<DeclRefExpr>(ME->getBase()))
|
||||
SkippedChecks.set(SanitizerKind::Null, true);
|
||||
}
|
||||
EmitTypeCheck(TCK, E->getExprLoc(), LV.getPointer(*this), E->getType(),
|
||||
LV.getAlignment(), SkippedChecks);
|
||||
EmitTypeCheck(TCK, E->getExprLoc(), LV.getPointer(),
|
||||
E->getType(), LV.getAlignment(), SkippedChecks);
|
||||
}
|
||||
return LV;
|
||||
}
|
||||
|
@ -1307,7 +1307,7 @@ LValue CodeGenFunction::EmitLValue(const Expr *E) {
|
|||
if (LV.isSimple()) {
|
||||
// Defend against branches out of gnu statement expressions surrounded by
|
||||
// cleanups.
|
||||
llvm::Value *V = LV.getPointer(*this);
|
||||
llvm::Value *V = LV.getPointer();
|
||||
Scope.ForceCleanup({&V});
|
||||
return LValue::MakeAddr(Address(V, LV.getAlignment()), LV.getType(),
|
||||
getContext(), LV.getBaseInfo(), LV.getTBAAInfo());
|
||||
|
@ -1523,7 +1523,7 @@ llvm::Value *CodeGenFunction::emitScalarConstant(
|
|||
|
||||
llvm::Value *CodeGenFunction::EmitLoadOfScalar(LValue lvalue,
|
||||
SourceLocation Loc) {
|
||||
return EmitLoadOfScalar(lvalue.getAddress(*this), lvalue.isVolatile(),
|
||||
return EmitLoadOfScalar(lvalue.getAddress(), lvalue.isVolatile(),
|
||||
lvalue.getType(), Loc, lvalue.getBaseInfo(),
|
||||
lvalue.getTBAAInfo(), lvalue.isNontemporal());
|
||||
}
|
||||
|
@ -1763,7 +1763,7 @@ void CodeGenFunction::EmitStoreOfScalar(llvm::Value *Value, Address Addr,
|
|||
|
||||
void CodeGenFunction::EmitStoreOfScalar(llvm::Value *value, LValue lvalue,
|
||||
bool isInit) {
|
||||
EmitStoreOfScalar(value, lvalue.getAddress(*this), lvalue.isVolatile(),
|
||||
EmitStoreOfScalar(value, lvalue.getAddress(), lvalue.isVolatile(),
|
||||
lvalue.getType(), lvalue.getBaseInfo(),
|
||||
lvalue.getTBAAInfo(), isInit, lvalue.isNontemporal());
|
||||
}
|
||||
|
@ -1774,18 +1774,18 @@ void CodeGenFunction::EmitStoreOfScalar(llvm::Value *value, LValue lvalue,
|
|||
RValue CodeGenFunction::EmitLoadOfLValue(LValue LV, SourceLocation Loc) {
|
||||
if (LV.isObjCWeak()) {
|
||||
// load of a __weak object.
|
||||
Address AddrWeakObj = LV.getAddress(*this);
|
||||
Address AddrWeakObj = LV.getAddress();
|
||||
return RValue::get(CGM.getObjCRuntime().EmitObjCWeakRead(*this,
|
||||
AddrWeakObj));
|
||||
}
|
||||
if (LV.getQuals().getObjCLifetime() == Qualifiers::OCL_Weak) {
|
||||
// In MRC mode, we do a load+autorelease.
|
||||
if (!getLangOpts().ObjCAutoRefCount) {
|
||||
return RValue::get(EmitARCLoadWeak(LV.getAddress(*this)));
|
||||
return RValue::get(EmitARCLoadWeak(LV.getAddress()));
|
||||
}
|
||||
|
||||
// In ARC mode, we load retained and then consume the value.
|
||||
llvm::Value *Object = EmitARCLoadWeakRetained(LV.getAddress(*this));
|
||||
llvm::Value *Object = EmitARCLoadWeakRetained(LV.getAddress());
|
||||
Object = EmitObjCConsumeObject(LV.getType(), Object);
|
||||
return RValue::get(Object);
|
||||
}
|
||||
|
@ -1971,10 +1971,9 @@ void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst,
|
|||
case Qualifiers::OCL_Weak:
|
||||
if (isInit)
|
||||
// Initialize and then skip the primitive store.
|
||||
EmitARCInitWeak(Dst.getAddress(*this), Src.getScalarVal());
|
||||
EmitARCInitWeak(Dst.getAddress(), Src.getScalarVal());
|
||||
else
|
||||
EmitARCStoreWeak(Dst.getAddress(*this), Src.getScalarVal(),
|
||||
/*ignore*/ true);
|
||||
EmitARCStoreWeak(Dst.getAddress(), Src.getScalarVal(), /*ignore*/ true);
|
||||
return;
|
||||
|
||||
case Qualifiers::OCL_Autoreleasing:
|
||||
|
@ -1987,7 +1986,7 @@ void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst,
|
|||
|
||||
if (Dst.isObjCWeak() && !Dst.isNonGC()) {
|
||||
// load of a __weak object.
|
||||
Address LvalueDst = Dst.getAddress(*this);
|
||||
Address LvalueDst = Dst.getAddress();
|
||||
llvm::Value *src = Src.getScalarVal();
|
||||
CGM.getObjCRuntime().EmitObjCWeakAssign(*this, src, LvalueDst);
|
||||
return;
|
||||
|
@ -1995,7 +1994,7 @@ void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst,
|
|||
|
||||
if (Dst.isObjCStrong() && !Dst.isNonGC()) {
|
||||
// load of a __strong object.
|
||||
Address LvalueDst = Dst.getAddress(*this);
|
||||
Address LvalueDst = Dst.getAddress();
|
||||
llvm::Value *src = Src.getScalarVal();
|
||||
if (Dst.isObjCIvar()) {
|
||||
assert(Dst.getBaseIvarExp() && "BaseIvarExp is NULL");
|
||||
|
@ -2321,8 +2320,8 @@ Address
|
|||
CodeGenFunction::EmitLoadOfReference(LValue RefLVal,
|
||||
LValueBaseInfo *PointeeBaseInfo,
|
||||
TBAAAccessInfo *PointeeTBAAInfo) {
|
||||
llvm::LoadInst *Load =
|
||||
Builder.CreateLoad(RefLVal.getAddress(*this), RefLVal.isVolatile());
|
||||
llvm::LoadInst *Load = Builder.CreateLoad(RefLVal.getAddress(),
|
||||
RefLVal.isVolatile());
|
||||
CGM.DecorateInstructionWithTBAA(Load, RefLVal.getTBAAInfo());
|
||||
|
||||
CharUnits Align = getNaturalTypeAlignment(RefLVal.getType()->getPointeeType(),
|
||||
|
@ -2578,7 +2577,7 @@ LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
|
|||
EmitCapturedFieldLValue(*this, CapturedStmtInfo->lookup(VD),
|
||||
CapturedStmtInfo->getContextValue());
|
||||
return MakeAddrLValue(
|
||||
Address(CapLVal.getPointer(*this), getContext().getDeclAlign(VD)),
|
||||
Address(CapLVal.getPointer(), getContext().getDeclAlign(VD)),
|
||||
CapLVal.getType(), LValueBaseInfo(AlignmentSource::Decl),
|
||||
CapLVal.getTBAAInfo());
|
||||
}
|
||||
|
@ -2713,7 +2712,7 @@ LValue CodeGenFunction::EmitUnaryOpLValue(const UnaryOperator *E) {
|
|||
// __real is valid on scalars. This is a faster way of testing that.
|
||||
// __imag can only produce an rvalue on scalars.
|
||||
if (E->getOpcode() == UO_Real &&
|
||||
!LV.getAddress(*this).getElementType()->isStructTy()) {
|
||||
!LV.getAddress().getElementType()->isStructTy()) {
|
||||
assert(E->getSubExpr()->getType()->isArithmeticType());
|
||||
return LV;
|
||||
}
|
||||
|
@ -2721,9 +2720,9 @@ LValue CodeGenFunction::EmitUnaryOpLValue(const UnaryOperator *E) {
|
|||
QualType T = ExprTy->castAs<ComplexType>()->getElementType();
|
||||
|
||||
Address Component =
|
||||
(E->getOpcode() == UO_Real
|
||||
? emitAddrOfRealComponent(LV.getAddress(*this), LV.getType())
|
||||
: emitAddrOfImagComponent(LV.getAddress(*this), LV.getType()));
|
||||
(E->getOpcode() == UO_Real
|
||||
? emitAddrOfRealComponent(LV.getAddress(), LV.getType())
|
||||
: emitAddrOfImagComponent(LV.getAddress(), LV.getType()));
|
||||
LValue ElemLV = MakeAddrLValue(Component, T, LV.getBaseInfo(),
|
||||
CGM.getTBAAInfoForSubobject(LV, T));
|
||||
ElemLV.getQuals().addQualifiers(LV.getQuals());
|
||||
|
@ -3323,7 +3322,7 @@ Address CodeGenFunction::EmitArrayToPointerDecay(const Expr *E,
|
|||
|
||||
// Expressions of array type can't be bitfields or vector elements.
|
||||
LValue LV = EmitLValue(E);
|
||||
Address Addr = LV.getAddress(*this);
|
||||
Address Addr = LV.getAddress();
|
||||
|
||||
// If the array type was an incomplete type, we need to make sure
|
||||
// the decay ends up being the right type.
|
||||
|
@ -3526,9 +3525,8 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E,
|
|||
LValue LHS = EmitLValue(E->getBase());
|
||||
auto *Idx = EmitIdxAfterBase(/*Promote*/false);
|
||||
assert(LHS.isSimple() && "Can only subscript lvalue vectors here!");
|
||||
return LValue::MakeVectorElt(LHS.getAddress(*this), Idx,
|
||||
E->getBase()->getType(), LHS.getBaseInfo(),
|
||||
TBAAAccessInfo());
|
||||
return LValue::MakeVectorElt(LHS.getAddress(), Idx, E->getBase()->getType(),
|
||||
LHS.getBaseInfo(), TBAAAccessInfo());
|
||||
}
|
||||
|
||||
// All the other cases basically behave like simple offsetting.
|
||||
|
@ -3623,7 +3621,7 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E,
|
|||
// Propagate the alignment from the array itself to the result.
|
||||
QualType arrayType = Array->getType();
|
||||
Addr = emitArraySubscriptGEP(
|
||||
*this, ArrayLV.getAddress(*this), {CGM.getSize(CharUnits::Zero()), Idx},
|
||||
*this, ArrayLV.getAddress(), {CGM.getSize(CharUnits::Zero()), Idx},
|
||||
E->getType(), !getLangOpts().isSignedOverflowDefined(), SignedIndices,
|
||||
E->getExprLoc(), &arrayType, E->getBase());
|
||||
EltBaseInfo = ArrayLV.getBaseInfo();
|
||||
|
@ -3658,7 +3656,7 @@ static Address emitOMPArraySectionBase(CodeGenFunction &CGF, const Expr *Base,
|
|||
if (auto *ASE = dyn_cast<OMPArraySectionExpr>(Base->IgnoreParenImpCasts())) {
|
||||
BaseLVal = CGF.EmitOMPArraySectionExpr(ASE, IsLowerBound);
|
||||
if (BaseTy->isArrayType()) {
|
||||
Address Addr = BaseLVal.getAddress(CGF);
|
||||
Address Addr = BaseLVal.getAddress();
|
||||
BaseInfo = BaseLVal.getBaseInfo();
|
||||
|
||||
// If the array type was an incomplete type, we need to make sure
|
||||
|
@ -3683,7 +3681,7 @@ static Address emitOMPArraySectionBase(CodeGenFunction &CGF, const Expr *Base,
|
|||
&TypeTBAAInfo);
|
||||
BaseInfo.mergeForCast(TypeBaseInfo);
|
||||
TBAAInfo = CGF.CGM.mergeTBAAInfoForCast(TBAAInfo, TypeTBAAInfo);
|
||||
return Address(CGF.Builder.CreateLoad(BaseLVal.getAddress(CGF)), Align);
|
||||
return Address(CGF.Builder.CreateLoad(BaseLVal.getAddress()), Align);
|
||||
}
|
||||
return CGF.EmitPointerWithAlignment(Base, &BaseInfo, &TBAAInfo);
|
||||
}
|
||||
|
@ -3824,7 +3822,7 @@ LValue CodeGenFunction::EmitOMPArraySectionExpr(const OMPArraySectionExpr *E,
|
|||
|
||||
// Propagate the alignment from the array itself to the result.
|
||||
EltPtr = emitArraySubscriptGEP(
|
||||
*this, ArrayLV.getAddress(*this), {CGM.getSize(CharUnits::Zero()), Idx},
|
||||
*this, ArrayLV.getAddress(), {CGM.getSize(CharUnits::Zero()), Idx},
|
||||
ResultExprTy, !getLangOpts().isSignedOverflowDefined(),
|
||||
/*signedIndices=*/false, E->getExprLoc());
|
||||
BaseInfo = ArrayLV.getBaseInfo();
|
||||
|
@ -3884,7 +3882,7 @@ EmitExtVectorElementExpr(const ExtVectorElementExpr *E) {
|
|||
if (Base.isSimple()) {
|
||||
llvm::Constant *CV =
|
||||
llvm::ConstantDataVector::get(getLLVMContext(), Indices);
|
||||
return LValue::MakeExtVectorElt(Base.getAddress(*this), CV, type,
|
||||
return LValue::MakeExtVectorElt(Base.getAddress(), CV, type,
|
||||
Base.getBaseInfo(), TBAAAccessInfo());
|
||||
}
|
||||
assert(Base.isExtVectorElt() && "Can only subscript lvalue vec elts here!");
|
||||
|
@ -4035,7 +4033,7 @@ LValue CodeGenFunction::EmitLValueForField(LValue base,
|
|||
const CGRecordLayout &RL =
|
||||
CGM.getTypes().getCGRecordLayout(field->getParent());
|
||||
const CGBitFieldInfo &Info = RL.getBitFieldInfo(field);
|
||||
Address Addr = base.getAddress(*this);
|
||||
Address Addr = base.getAddress();
|
||||
unsigned Idx = RL.getLLVMFieldNo(field);
|
||||
const RecordDecl *rec = field->getParent();
|
||||
if (!IsInPreservedAIRegion &&
|
||||
|
@ -4103,7 +4101,7 @@ LValue CodeGenFunction::EmitLValueForField(LValue base,
|
|||
getContext().getTypeSizeInChars(FieldType).getQuantity();
|
||||
}
|
||||
|
||||
Address addr = base.getAddress(*this);
|
||||
Address addr = base.getAddress();
|
||||
if (auto *ClassDef = dyn_cast<CXXRecordDecl>(rec)) {
|
||||
if (CGM.getCodeGenOpts().StrictVTablePointers &&
|
||||
ClassDef->isDynamicClass()) {
|
||||
|
@ -4191,7 +4189,7 @@ CodeGenFunction::EmitLValueForFieldInitialization(LValue Base,
|
|||
if (!FieldType->isReferenceType())
|
||||
return EmitLValueForField(Base, Field);
|
||||
|
||||
Address V = emitAddrOfFieldStorage(*this, Base.getAddress(*this), Field);
|
||||
Address V = emitAddrOfFieldStorage(*this, Base.getAddress(), Field);
|
||||
|
||||
// Make sure that the address is pointing to the right type.
|
||||
llvm::Type *llvmType = ConvertTypeForMem(FieldType);
|
||||
|
@ -4309,10 +4307,10 @@ EmitConditionalOperatorLValue(const AbstractConditionalOperator *expr) {
|
|||
EmitBlock(contBlock);
|
||||
|
||||
if (lhs && rhs) {
|
||||
llvm::PHINode *phi =
|
||||
Builder.CreatePHI(lhs->getPointer(*this)->getType(), 2, "cond-lvalue");
|
||||
phi->addIncoming(lhs->getPointer(*this), lhsBlock);
|
||||
phi->addIncoming(rhs->getPointer(*this), rhsBlock);
|
||||
llvm::PHINode *phi = Builder.CreatePHI(lhs->getPointer()->getType(),
|
||||
2, "cond-lvalue");
|
||||
phi->addIncoming(lhs->getPointer(), lhsBlock);
|
||||
phi->addIncoming(rhs->getPointer(), rhsBlock);
|
||||
Address result(phi, std::min(lhs->getAlignment(), rhs->getAlignment()));
|
||||
AlignmentSource alignSource =
|
||||
std::max(lhs->getBaseInfo().getAlignmentSource(),
|
||||
|
@ -4395,7 +4393,7 @@ LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) {
|
|||
|
||||
case CK_Dynamic: {
|
||||
LValue LV = EmitLValue(E->getSubExpr());
|
||||
Address V = LV.getAddress(*this);
|
||||
Address V = LV.getAddress();
|
||||
const auto *DCE = cast<CXXDynamicCastExpr>(E);
|
||||
return MakeNaturalAlignAddrLValue(EmitDynamicCast(V, DCE), E->getType());
|
||||
}
|
||||
|
@ -4415,7 +4413,7 @@ LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) {
|
|||
auto *DerivedClassDecl = cast<CXXRecordDecl>(DerivedClassTy->getDecl());
|
||||
|
||||
LValue LV = EmitLValue(E->getSubExpr());
|
||||
Address This = LV.getAddress(*this);
|
||||
Address This = LV.getAddress();
|
||||
|
||||
// Perform the derived-to-base conversion
|
||||
Address Base = GetAddressOfBaseClass(
|
||||
|
@ -4437,9 +4435,10 @@ LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) {
|
|||
LValue LV = EmitLValue(E->getSubExpr());
|
||||
|
||||
// Perform the base-to-derived conversion
|
||||
Address Derived = GetAddressOfDerivedClass(
|
||||
LV.getAddress(*this), DerivedClassDecl, E->path_begin(), E->path_end(),
|
||||
/*NullCheckValue=*/false);
|
||||
Address Derived =
|
||||
GetAddressOfDerivedClass(LV.getAddress(), DerivedClassDecl,
|
||||
E->path_begin(), E->path_end(),
|
||||
/*NullCheckValue=*/false);
|
||||
|
||||
// C++11 [expr.static.cast]p2: Behavior is undefined if a downcast is
|
||||
// performed and the object is not of the derived type.
|
||||
|
@ -4461,7 +4460,7 @@ LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) {
|
|||
|
||||
CGM.EmitExplicitCastExprType(CE, this);
|
||||
LValue LV = EmitLValue(E->getSubExpr());
|
||||
Address V = Builder.CreateBitCast(LV.getAddress(*this),
|
||||
Address V = Builder.CreateBitCast(LV.getAddress(),
|
||||
ConvertType(CE->getTypeAsWritten()));
|
||||
|
||||
if (SanOpts.has(SanitizerKind::CFIUnrelatedCast))
|
||||
|
@ -4476,15 +4475,14 @@ LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) {
|
|||
LValue LV = EmitLValue(E->getSubExpr());
|
||||
QualType DestTy = getContext().getPointerType(E->getType());
|
||||
llvm::Value *V = getTargetHooks().performAddrSpaceCast(
|
||||
*this, LV.getPointer(*this),
|
||||
E->getSubExpr()->getType().getAddressSpace(),
|
||||
*this, LV.getPointer(), E->getSubExpr()->getType().getAddressSpace(),
|
||||
E->getType().getAddressSpace(), ConvertType(DestTy));
|
||||
return MakeAddrLValue(Address(V, LV.getAddress(*this).getAlignment()),
|
||||
return MakeAddrLValue(Address(V, LV.getAddress().getAlignment()),
|
||||
E->getType(), LV.getBaseInfo(), LV.getTBAAInfo());
|
||||
}
|
||||
case CK_ObjCObjectLValueCast: {
|
||||
LValue LV = EmitLValue(E->getSubExpr());
|
||||
Address V = Builder.CreateElementBitCast(LV.getAddress(*this),
|
||||
Address V = Builder.CreateElementBitCast(LV.getAddress(),
|
||||
ConvertType(E->getType()));
|
||||
return MakeAddrLValue(V, E->getType(), LV.getBaseInfo(),
|
||||
CGM.getTBAAInfoForSubobject(LV, E->getType()));
|
||||
|
@ -4538,12 +4536,12 @@ RValue CodeGenFunction::EmitRValueForField(LValue LV,
|
|||
case TEK_Complex:
|
||||
return RValue::getComplex(EmitLoadOfComplex(FieldLV, Loc));
|
||||
case TEK_Aggregate:
|
||||
return FieldLV.asAggregateRValue(*this);
|
||||
return FieldLV.asAggregateRValue();
|
||||
case TEK_Scalar:
|
||||
// This routine is used to load fields one-by-one to perform a copy, so
|
||||
// don't load reference fields.
|
||||
if (FD->getType()->isReferenceType())
|
||||
return RValue::get(FieldLV.getPointer(*this));
|
||||
return RValue::get(FieldLV.getPointer());
|
||||
return EmitLoadOfLValue(FieldLV, Loc);
|
||||
}
|
||||
llvm_unreachable("bad evaluation kind");
|
||||
|
@ -4638,7 +4636,7 @@ CGCallee CodeGenFunction::EmitCallee(const Expr *E) {
|
|||
functionType = ptrType->getPointeeType();
|
||||
} else {
|
||||
functionType = E->getType();
|
||||
calleePtr = EmitLValue(E).getPointer(*this);
|
||||
calleePtr = EmitLValue(E).getPointer();
|
||||
}
|
||||
assert(functionType->isFunctionType());
|
||||
|
||||
|
@ -4798,7 +4796,7 @@ LValue CodeGenFunction::EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E) {
|
|||
BaseQuals = ObjectTy.getQualifiers();
|
||||
} else {
|
||||
LValue BaseLV = EmitLValue(BaseExpr);
|
||||
BaseValue = BaseLV.getPointer(*this);
|
||||
BaseValue = BaseLV.getPointer();
|
||||
ObjectTy = BaseExpr->getType();
|
||||
BaseQuals = ObjectTy.getQualifiers();
|
||||
}
|
||||
|
@ -5008,7 +5006,7 @@ EmitPointerToDataMemberBinaryExpr(const BinaryOperator *E) {
|
|||
if (E->getOpcode() == BO_PtrMemI) {
|
||||
BaseAddr = EmitPointerWithAlignment(E->getLHS());
|
||||
} else {
|
||||
BaseAddr = EmitLValue(E->getLHS()).getAddress(*this);
|
||||
BaseAddr = EmitLValue(E->getLHS()).getAddress();
|
||||
}
|
||||
|
||||
llvm::Value *OffsetV = EmitScalarExpr(E->getRHS());
|
||||
|
@ -5035,7 +5033,7 @@ RValue CodeGenFunction::convertTempToRValue(Address addr,
|
|||
case TEK_Complex:
|
||||
return RValue::getComplex(EmitLoadOfComplex(lvalue, loc));
|
||||
case TEK_Aggregate:
|
||||
return lvalue.asAggregateRValue(*this);
|
||||
return lvalue.asAggregateRValue();
|
||||
case TEK_Scalar:
|
||||
return RValue::get(EmitLoadOfScalar(lvalue, loc));
|
||||
}
|
||||
|
|
|
@ -345,9 +345,10 @@ void AggExprEmitter::EmitFinalDestCopy(QualType type, const LValue &src,
|
|||
}
|
||||
}
|
||||
|
||||
AggValueSlot srcAgg = AggValueSlot::forLValue(
|
||||
src, CGF, AggValueSlot::IsDestructed, needsGC(type),
|
||||
AggValueSlot::IsAliased, AggValueSlot::MayOverlap);
|
||||
AggValueSlot srcAgg =
|
||||
AggValueSlot::forLValue(src, AggValueSlot::IsDestructed,
|
||||
needsGC(type), AggValueSlot::IsAliased,
|
||||
AggValueSlot::MayOverlap);
|
||||
EmitCopy(type, Dest, srcAgg);
|
||||
}
|
||||
|
||||
|
@ -385,7 +386,7 @@ AggExprEmitter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
|
|||
ASTContext &Ctx = CGF.getContext();
|
||||
LValue Array = CGF.EmitLValue(E->getSubExpr());
|
||||
assert(Array.isSimple() && "initializer_list array not a simple lvalue");
|
||||
Address ArrayPtr = Array.getAddress(CGF);
|
||||
Address ArrayPtr = Array.getAddress();
|
||||
|
||||
const ConstantArrayType *ArrayType =
|
||||
Ctx.getAsConstantArrayType(E->getSubExpr()->getType());
|
||||
|
@ -687,7 +688,7 @@ void AggExprEmitter::VisitCastExpr(CastExpr *E) {
|
|||
CodeGenFunction::TCK_Load);
|
||||
// FIXME: Do we also need to handle property references here?
|
||||
if (LV.isSimple())
|
||||
CGF.EmitDynamicCast(LV.getAddress(CGF), cast<CXXDynamicCastExpr>(E));
|
||||
CGF.EmitDynamicCast(LV.getAddress(), cast<CXXDynamicCastExpr>(E));
|
||||
else
|
||||
CGF.CGM.ErrorUnsupported(E, "non-simple lvalue dynamic_cast");
|
||||
|
||||
|
@ -722,7 +723,7 @@ void AggExprEmitter::VisitCastExpr(CastExpr *E) {
|
|||
|
||||
LValue SourceLV = CGF.EmitLValue(E->getSubExpr());
|
||||
Address SourceAddress =
|
||||
Builder.CreateElementBitCast(SourceLV.getAddress(CGF), CGF.Int8Ty);
|
||||
Builder.CreateElementBitCast(SourceLV.getAddress(), CGF.Int8Ty);
|
||||
Address DestAddress =
|
||||
Builder.CreateElementBitCast(Dest.getAddress(), CGF.Int8Ty);
|
||||
llvm::Value *SizeVal = llvm::ConstantInt::get(
|
||||
|
@ -1162,7 +1163,7 @@ void AggExprEmitter::VisitBinAssign(const BinaryOperator *E) {
|
|||
}
|
||||
|
||||
EmitCopy(E->getLHS()->getType(),
|
||||
AggValueSlot::forLValue(LHS, CGF, AggValueSlot::IsDestructed,
|
||||
AggValueSlot::forLValue(LHS, AggValueSlot::IsDestructed,
|
||||
needsGC(E->getLHS()->getType()),
|
||||
AggValueSlot::IsAliased,
|
||||
AggValueSlot::MayOverlap),
|
||||
|
@ -1183,9 +1184,11 @@ void AggExprEmitter::VisitBinAssign(const BinaryOperator *E) {
|
|||
}
|
||||
|
||||
// Codegen the RHS so that it stores directly into the LHS.
|
||||
AggValueSlot LHSSlot = AggValueSlot::forLValue(
|
||||
LHS, CGF, AggValueSlot::IsDestructed, needsGC(E->getLHS()->getType()),
|
||||
AggValueSlot::IsAliased, AggValueSlot::MayOverlap);
|
||||
AggValueSlot LHSSlot =
|
||||
AggValueSlot::forLValue(LHS, AggValueSlot::IsDestructed,
|
||||
needsGC(E->getLHS()->getType()),
|
||||
AggValueSlot::IsAliased,
|
||||
AggValueSlot::MayOverlap);
|
||||
// A non-volatile aggregate destination might have volatile member.
|
||||
if (!LHSSlot.isVolatile() &&
|
||||
CGF.hasVolatileMember(E->getLHS()->getType()))
|
||||
|
@ -1317,7 +1320,7 @@ AggExprEmitter::VisitLambdaExpr(LambdaExpr *E) {
|
|||
llvm::Constant::getNullValue(CGF.Int8PtrTy),
|
||||
CharUnits::One()); // placeholder
|
||||
|
||||
CGF.pushDestroy(EHCleanup, LV.getAddress(CGF), CurField->getType(),
|
||||
CGF.pushDestroy(EHCleanup, LV.getAddress(), CurField->getType(),
|
||||
CGF.getDestroyer(DtorKind), false);
|
||||
Cleanups.push_back(CGF.EHStack.stable_begin());
|
||||
}
|
||||
|
@ -1405,11 +1408,12 @@ AggExprEmitter::EmitInitializationToLValue(Expr *E, LValue LV) {
|
|||
CGF.EmitComplexExprIntoLValue(E, LV, /*isInit*/ true);
|
||||
return;
|
||||
case TEK_Aggregate:
|
||||
CGF.EmitAggExpr(
|
||||
E, AggValueSlot::forLValue(LV, CGF, AggValueSlot::IsDestructed,
|
||||
AggValueSlot::DoesNotNeedGCBarriers,
|
||||
AggValueSlot::IsNotAliased,
|
||||
AggValueSlot::MayOverlap, Dest.isZeroed()));
|
||||
CGF.EmitAggExpr(E, AggValueSlot::forLValue(LV,
|
||||
AggValueSlot::IsDestructed,
|
||||
AggValueSlot::DoesNotNeedGCBarriers,
|
||||
AggValueSlot::IsNotAliased,
|
||||
AggValueSlot::MayOverlap,
|
||||
Dest.isZeroed()));
|
||||
return;
|
||||
case TEK_Scalar:
|
||||
if (LV.isSimple()) {
|
||||
|
@ -1445,7 +1449,7 @@ void AggExprEmitter::EmitNullInitializationToLValue(LValue lv) {
|
|||
// There's a potential optimization opportunity in combining
|
||||
// memsets; that would be easy for arrays, but relatively
|
||||
// difficult for structures with the current code.
|
||||
CGF.EmitNullInitialization(lv.getAddress(CGF), lv.getType());
|
||||
CGF.EmitNullInitialization(lv.getAddress(), lv.getType());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1602,7 +1606,7 @@ void AggExprEmitter::VisitInitListExpr(InitListExpr *E) {
|
|||
= field->getType().isDestructedType()) {
|
||||
assert(LV.isSimple());
|
||||
if (CGF.needsEHCleanup(dtorKind)) {
|
||||
CGF.pushDestroy(EHCleanup, LV.getAddress(CGF), field->getType(),
|
||||
CGF.pushDestroy(EHCleanup, LV.getAddress(), field->getType(),
|
||||
CGF.getDestroyer(dtorKind), false);
|
||||
addCleanup(CGF.EHStack.stable_begin());
|
||||
pushedCleanup = true;
|
||||
|
@ -1613,7 +1617,7 @@ void AggExprEmitter::VisitInitListExpr(InitListExpr *E) {
|
|||
// else, clean it up for -O0 builds and general tidiness.
|
||||
if (!pushedCleanup && LV.isSimple())
|
||||
if (llvm::GetElementPtrInst *GEP =
|
||||
dyn_cast<llvm::GetElementPtrInst>(LV.getPointer(CGF)))
|
||||
dyn_cast<llvm::GetElementPtrInst>(LV.getPointer()))
|
||||
if (GEP->use_empty())
|
||||
GEP->eraseFromParent();
|
||||
}
|
||||
|
@ -1695,8 +1699,9 @@ void AggExprEmitter::VisitArrayInitLoopExpr(const ArrayInitLoopExpr *E,
|
|||
if (InnerLoop) {
|
||||
// If the subexpression is an ArrayInitLoopExpr, share its cleanup.
|
||||
auto elementSlot = AggValueSlot::forLValue(
|
||||
elementLV, CGF, AggValueSlot::IsDestructed,
|
||||
AggValueSlot::DoesNotNeedGCBarriers, AggValueSlot::IsNotAliased,
|
||||
elementLV, AggValueSlot::IsDestructed,
|
||||
AggValueSlot::DoesNotNeedGCBarriers,
|
||||
AggValueSlot::IsNotAliased,
|
||||
AggValueSlot::DoesNotOverlap);
|
||||
AggExprEmitter(CGF, elementSlot, false)
|
||||
.VisitArrayInitLoopExpr(InnerLoop, outerBegin);
|
||||
|
@ -1859,10 +1864,10 @@ LValue CodeGenFunction::EmitAggExprToLValue(const Expr *E) {
|
|||
assert(hasAggregateEvaluationKind(E->getType()) && "Invalid argument!");
|
||||
Address Temp = CreateMemTemp(E->getType());
|
||||
LValue LV = MakeAddrLValue(Temp, E->getType());
|
||||
EmitAggExpr(E, AggValueSlot::forLValue(
|
||||
LV, *this, AggValueSlot::IsNotDestructed,
|
||||
AggValueSlot::DoesNotNeedGCBarriers,
|
||||
AggValueSlot::IsNotAliased, AggValueSlot::DoesNotOverlap));
|
||||
EmitAggExpr(E, AggValueSlot::forLValue(LV, AggValueSlot::IsNotDestructed,
|
||||
AggValueSlot::DoesNotNeedGCBarriers,
|
||||
AggValueSlot::IsNotAliased,
|
||||
AggValueSlot::DoesNotOverlap));
|
||||
return LV;
|
||||
}
|
||||
|
||||
|
@ -1911,8 +1916,8 @@ void CodeGenFunction::EmitAggregateCopy(LValue Dest, LValue Src, QualType Ty,
|
|||
bool isVolatile) {
|
||||
assert(!Ty->isAnyComplexType() && "Shouldn't happen for complex");
|
||||
|
||||
Address DestPtr = Dest.getAddress(*this);
|
||||
Address SrcPtr = Src.getAddress(*this);
|
||||
Address DestPtr = Dest.getAddress();
|
||||
Address SrcPtr = Src.getAddress();
|
||||
|
||||
if (getLangOpts().CPlusPlus) {
|
||||
if (const RecordType *RT = Ty->getAs<RecordType>()) {
|
||||
|
|
|
@ -133,7 +133,7 @@ RValue CodeGenFunction::EmitCXXPseudoDestructorExpr(
|
|||
BaseQuals = PTy->getPointeeType().getQualifiers();
|
||||
} else {
|
||||
LValue BaseLV = EmitLValue(BaseExpr);
|
||||
BaseValue = BaseLV.getAddress(*this);
|
||||
BaseValue = BaseLV.getAddress();
|
||||
QualType BaseTy = BaseExpr->getType();
|
||||
BaseQuals = BaseTy.getQualifiers();
|
||||
}
|
||||
|
@ -271,11 +271,11 @@ RValue CodeGenFunction::EmitCXXMemberOrOperatorMemberCallExpr(
|
|||
assert(ReturnValue.isNull() && "Constructor shouldn't have return value");
|
||||
CallArgList Args;
|
||||
commonEmitCXXMemberOrOperatorCall(
|
||||
*this, Ctor, This.getPointer(*this), /*ImplicitParam=*/nullptr,
|
||||
*this, Ctor, This.getPointer(), /*ImplicitParam=*/nullptr,
|
||||
/*ImplicitParamTy=*/QualType(), CE, Args, nullptr);
|
||||
|
||||
EmitCXXConstructorCall(Ctor, Ctor_Complete, /*ForVirtualBase=*/false,
|
||||
/*Delegating=*/false, This.getAddress(*this), Args,
|
||||
/*Delegating=*/false, This.getAddress(), Args,
|
||||
AggValueSlot::DoesNotOverlap, CE->getExprLoc(),
|
||||
/*NewPointerIsChecked=*/false);
|
||||
return RValue::get(nullptr);
|
||||
|
@ -293,7 +293,7 @@ RValue CodeGenFunction::EmitCXXMemberOrOperatorMemberCallExpr(
|
|||
(*(CE->arg_begin() + 1))->getType())
|
||||
: EmitLValue(*CE->arg_begin());
|
||||
EmitAggregateAssign(This, RHS, CE->getType());
|
||||
return RValue::get(This.getPointer(*this));
|
||||
return RValue::get(This.getPointer());
|
||||
}
|
||||
llvm_unreachable("unknown trivial member function");
|
||||
}
|
||||
|
@ -328,8 +328,7 @@ RValue CodeGenFunction::EmitCXXMemberOrOperatorMemberCallExpr(
|
|||
if (IsImplicitObjectCXXThis || isa<DeclRefExpr>(IOA))
|
||||
SkippedChecks.set(SanitizerKind::Null, true);
|
||||
}
|
||||
EmitTypeCheck(CodeGenFunction::TCK_MemberCall, CallLoc,
|
||||
This.getPointer(*this),
|
||||
EmitTypeCheck(CodeGenFunction::TCK_MemberCall, CallLoc, This.getPointer(),
|
||||
C.getRecordType(CalleeDecl->getParent()),
|
||||
/*Alignment=*/CharUnits::Zero(), SkippedChecks);
|
||||
|
||||
|
@ -346,9 +345,9 @@ RValue CodeGenFunction::EmitCXXMemberOrOperatorMemberCallExpr(
|
|||
"Destructor shouldn't have explicit parameters");
|
||||
assert(ReturnValue.isNull() && "Destructor shouldn't have return value");
|
||||
if (UseVirtualCall) {
|
||||
CGM.getCXXABI().EmitVirtualDestructorCall(*this, Dtor, Dtor_Complete,
|
||||
This.getAddress(*this),
|
||||
cast<CXXMemberCallExpr>(CE));
|
||||
CGM.getCXXABI().EmitVirtualDestructorCall(
|
||||
*this, Dtor, Dtor_Complete, This.getAddress(),
|
||||
cast<CXXMemberCallExpr>(CE));
|
||||
} else {
|
||||
GlobalDecl GD(Dtor, Dtor_Complete);
|
||||
CGCallee Callee;
|
||||
|
@ -363,7 +362,7 @@ RValue CodeGenFunction::EmitCXXMemberOrOperatorMemberCallExpr(
|
|||
|
||||
QualType ThisTy =
|
||||
IsArrow ? Base->getType()->getPointeeType() : Base->getType();
|
||||
EmitCXXDestructorCall(GD, Callee, This.getPointer(*this), ThisTy,
|
||||
EmitCXXDestructorCall(GD, Callee, This.getPointer(), ThisTy,
|
||||
/*ImplicitParam=*/nullptr,
|
||||
/*ImplicitParamTy=*/QualType(), nullptr);
|
||||
}
|
||||
|
@ -375,14 +374,15 @@ RValue CodeGenFunction::EmitCXXMemberOrOperatorMemberCallExpr(
|
|||
|
||||
CGCallee Callee;
|
||||
if (UseVirtualCall) {
|
||||
Callee = CGCallee::forVirtual(CE, MD, This.getAddress(*this), Ty);
|
||||
Callee = CGCallee::forVirtual(CE, MD, This.getAddress(), Ty);
|
||||
} else {
|
||||
if (SanOpts.has(SanitizerKind::CFINVCall) &&
|
||||
MD->getParent()->isDynamicClass()) {
|
||||
llvm::Value *VTable;
|
||||
const CXXRecordDecl *RD;
|
||||
std::tie(VTable, RD) = CGM.getCXXABI().LoadVTablePtr(
|
||||
*this, This.getAddress(*this), CalleeDecl->getParent());
|
||||
std::tie(VTable, RD) =
|
||||
CGM.getCXXABI().LoadVTablePtr(*this, This.getAddress(),
|
||||
CalleeDecl->getParent());
|
||||
EmitVTablePtrCheckForCall(RD, VTable, CFITCK_NVCall, CE->getBeginLoc());
|
||||
}
|
||||
|
||||
|
@ -401,12 +401,12 @@ RValue CodeGenFunction::EmitCXXMemberOrOperatorMemberCallExpr(
|
|||
if (MD->isVirtual()) {
|
||||
Address NewThisAddr =
|
||||
CGM.getCXXABI().adjustThisArgumentForVirtualFunctionCall(
|
||||
*this, CalleeDecl, This.getAddress(*this), UseVirtualCall);
|
||||
*this, CalleeDecl, This.getAddress(), UseVirtualCall);
|
||||
This.setAddress(NewThisAddr);
|
||||
}
|
||||
|
||||
return EmitCXXMemberOrOperatorCall(
|
||||
CalleeDecl, Callee, ReturnValue, This.getPointer(*this),
|
||||
CalleeDecl, Callee, ReturnValue, This.getPointer(),
|
||||
/*ImplicitParam=*/nullptr, QualType(), CE, RtlArgs);
|
||||
}
|
||||
|
||||
|
@ -428,7 +428,7 @@ CodeGenFunction::EmitCXXMemberPointerCallExpr(const CXXMemberCallExpr *E,
|
|||
if (BO->getOpcode() == BO_PtrMemI)
|
||||
This = EmitPointerWithAlignment(BaseExpr);
|
||||
else
|
||||
This = EmitLValue(BaseExpr).getAddress(*this);
|
||||
This = EmitLValue(BaseExpr).getAddress();
|
||||
|
||||
EmitTypeCheck(TCK_MemberCall, E->getExprLoc(), This.getPointer(),
|
||||
QualType(MPT->getClass(), 0));
|
||||
|
@ -2103,7 +2103,7 @@ static bool isGLValueFromPointerDeref(const Expr *E) {
|
|||
static llvm::Value *EmitTypeidFromVTable(CodeGenFunction &CGF, const Expr *E,
|
||||
llvm::Type *StdTypeInfoPtrTy) {
|
||||
// Get the vtable pointer.
|
||||
Address ThisPtr = CGF.EmitLValue(E).getAddress(CGF);
|
||||
Address ThisPtr = CGF.EmitLValue(E).getAddress();
|
||||
|
||||
QualType SrcRecordTy = E->getType();
|
||||
|
||||
|
|
|
@ -348,7 +348,7 @@ ComplexPairTy ComplexExprEmitter::EmitLoadOfLValue(LValue lvalue,
|
|||
if (lvalue.getType()->isAtomicType())
|
||||
return CGF.EmitAtomicLoad(lvalue, loc).getComplexVal();
|
||||
|
||||
Address SrcPtr = lvalue.getAddress(CGF);
|
||||
Address SrcPtr = lvalue.getAddress();
|
||||
bool isVolatile = lvalue.isVolatileQualified();
|
||||
|
||||
llvm::Value *Real = nullptr, *Imag = nullptr;
|
||||
|
@ -374,7 +374,7 @@ void ComplexExprEmitter::EmitStoreOfComplex(ComplexPairTy Val, LValue lvalue,
|
|||
(!isInit && CGF.LValueIsSuitableForInlineAtomic(lvalue)))
|
||||
return CGF.EmitAtomicStore(RValue::getComplex(Val), lvalue, isInit);
|
||||
|
||||
Address Ptr = lvalue.getAddress(CGF);
|
||||
Address Ptr = lvalue.getAddress();
|
||||
Address RealPtr = CGF.emitAddrOfRealComponent(Ptr, lvalue.getType());
|
||||
Address ImagPtr = CGF.emitAddrOfImagComponent(Ptr, lvalue.getType());
|
||||
|
||||
|
@ -463,14 +463,14 @@ ComplexPairTy ComplexExprEmitter::EmitCast(CastKind CK, Expr *Op,
|
|||
|
||||
case CK_LValueBitCast: {
|
||||
LValue origLV = CGF.EmitLValue(Op);
|
||||
Address V = origLV.getAddress(CGF);
|
||||
Address V = origLV.getAddress();
|
||||
V = Builder.CreateElementBitCast(V, CGF.ConvertType(DestTy));
|
||||
return EmitLoadOfLValue(CGF.MakeAddrLValue(V, DestTy), Op->getExprLoc());
|
||||
}
|
||||
|
||||
case CK_LValueToRValueBitCast: {
|
||||
LValue SourceLVal = CGF.EmitLValue(Op);
|
||||
Address Addr = Builder.CreateElementBitCast(SourceLVal.getAddress(CGF),
|
||||
Address Addr = Builder.CreateElementBitCast(SourceLVal.getAddress(),
|
||||
CGF.ConvertTypeForMem(DestTy));
|
||||
LValue DestLV = CGF.MakeAddrLValue(Addr, DestTy);
|
||||
DestLV.setTBAAInfo(TBAAAccessInfo::getMayAliasInfo());
|
||||
|
|
|
@ -615,7 +615,7 @@ public:
|
|||
if (isa<MemberPointerType>(E->getType())) // never sugared
|
||||
return CGF.CGM.getMemberPointerConstant(E);
|
||||
|
||||
return EmitLValue(E->getSubExpr()).getPointer(CGF);
|
||||
return EmitLValue(E->getSubExpr()).getPointer();
|
||||
}
|
||||
Value *VisitUnaryDeref(const UnaryOperator *E) {
|
||||
if (E->getType()->isVoidType())
|
||||
|
@ -1979,7 +1979,7 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {
|
|||
|
||||
case CK_LValueBitCast:
|
||||
case CK_ObjCObjectLValueCast: {
|
||||
Address Addr = EmitLValue(E).getAddress(CGF);
|
||||
Address Addr = EmitLValue(E).getAddress();
|
||||
Addr = Builder.CreateElementBitCast(Addr, CGF.ConvertTypeForMem(DestTy));
|
||||
LValue LV = CGF.MakeAddrLValue(Addr, DestTy);
|
||||
return EmitLoadOfLValue(LV, CE->getExprLoc());
|
||||
|
@ -1987,7 +1987,7 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {
|
|||
|
||||
case CK_LValueToRValueBitCast: {
|
||||
LValue SourceLVal = CGF.EmitLValue(E);
|
||||
Address Addr = Builder.CreateElementBitCast(SourceLVal.getAddress(CGF),
|
||||
Address Addr = Builder.CreateElementBitCast(SourceLVal.getAddress(),
|
||||
CGF.ConvertTypeForMem(DestTy));
|
||||
LValue DestLV = CGF.MakeAddrLValue(Addr, DestTy);
|
||||
DestLV.setTBAAInfo(TBAAAccessInfo::getMayAliasInfo());
|
||||
|
@ -2105,7 +2105,7 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {
|
|||
case CK_ArrayToPointerDecay:
|
||||
return CGF.EmitArrayToPointerDecay(E).getPointer();
|
||||
case CK_FunctionToPointerDecay:
|
||||
return EmitLValue(E).getPointer(CGF);
|
||||
return EmitLValue(E).getPointer();
|
||||
|
||||
case CK_NullToPointer:
|
||||
if (MustVisitNullValue(E))
|
||||
|
@ -2370,14 +2370,14 @@ ScalarExprEmitter::EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
|
|||
if (isInc && type->isBooleanType()) {
|
||||
llvm::Value *True = CGF.EmitToMemory(Builder.getTrue(), type);
|
||||
if (isPre) {
|
||||
Builder.CreateStore(True, LV.getAddress(CGF), LV.isVolatileQualified())
|
||||
->setAtomic(llvm::AtomicOrdering::SequentiallyConsistent);
|
||||
Builder.CreateStore(True, LV.getAddress(), LV.isVolatileQualified())
|
||||
->setAtomic(llvm::AtomicOrdering::SequentiallyConsistent);
|
||||
return Builder.getTrue();
|
||||
}
|
||||
// For atomic bool increment, we just store true and return it for
|
||||
// preincrement, do an atomic swap with true for postincrement
|
||||
return Builder.CreateAtomicRMW(
|
||||
llvm::AtomicRMWInst::Xchg, LV.getPointer(CGF), True,
|
||||
llvm::AtomicRMWInst::Xchg, LV.getPointer(), True,
|
||||
llvm::AtomicOrdering::SequentiallyConsistent);
|
||||
}
|
||||
// Special case for atomic increment / decrement on integers, emit
|
||||
|
@ -2394,9 +2394,8 @@ ScalarExprEmitter::EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
|
|||
llvm::Instruction::Sub;
|
||||
llvm::Value *amt = CGF.EmitToMemory(
|
||||
llvm::ConstantInt::get(ConvertType(type), 1, true), type);
|
||||
llvm::Value *old =
|
||||
Builder.CreateAtomicRMW(aop, LV.getPointer(CGF), amt,
|
||||
llvm::AtomicOrdering::SequentiallyConsistent);
|
||||
llvm::Value *old = Builder.CreateAtomicRMW(aop,
|
||||
LV.getPointer(), amt, llvm::AtomicOrdering::SequentiallyConsistent);
|
||||
return isPre ? Builder.CreateBinOp(op, old, amt) : old;
|
||||
}
|
||||
value = EmitLoadOfLValue(LV, E->getExprLoc());
|
||||
|
@ -2937,7 +2936,7 @@ LValue ScalarExprEmitter::EmitCompoundAssignLValue(
|
|||
E->getExprLoc()),
|
||||
LHSTy);
|
||||
Value *OldVal = Builder.CreateAtomicRMW(
|
||||
AtomicOp, LHSLV.getPointer(CGF), Amt,
|
||||
AtomicOp, LHSLV.getPointer(), Amt,
|
||||
llvm::AtomicOrdering::SequentiallyConsistent);
|
||||
|
||||
// Since operation is atomic, the result type is guaranteed to be the
|
||||
|
@ -3983,7 +3982,7 @@ Value *ScalarExprEmitter::VisitBinAssign(const BinaryOperator *E) {
|
|||
case Qualifiers::OCL_Weak:
|
||||
RHS = Visit(E->getRHS());
|
||||
LHS = EmitCheckedLValue(E->getLHS(), CodeGenFunction::TCK_Store);
|
||||
RHS = CGF.EmitARCStoreWeak(LHS.getAddress(CGF), RHS, Ignore);
|
||||
RHS = CGF.EmitARCStoreWeak(LHS.getAddress(), RHS, Ignore);
|
||||
break;
|
||||
|
||||
case Qualifiers::OCL_None:
|
||||
|
@ -4544,7 +4543,7 @@ LValue CodeGenFunction::EmitObjCIsaExpr(const ObjCIsaExpr *E) {
|
|||
if (BaseExpr->isRValue()) {
|
||||
Addr = Address(EmitScalarExpr(BaseExpr), getPointerAlign());
|
||||
} else {
|
||||
Addr = EmitLValue(BaseExpr).getAddress(*this);
|
||||
Addr = EmitLValue(BaseExpr).getAddress();
|
||||
}
|
||||
|
||||
// Cast the address to Class*.
|
||||
|
|
|
@ -707,7 +707,7 @@ struct GenMoveConstructor : GenBinaryFunc<GenMoveConstructor, true> {
|
|||
LValue SrcLV = CGF->MakeAddrLValue(Addrs[SrcIdx], QT);
|
||||
llvm::Value *SrcVal =
|
||||
CGF->EmitLoadOfLValue(SrcLV, SourceLocation()).getScalarVal();
|
||||
CGF->EmitStoreOfScalar(getNullForVariable(SrcLV.getAddress(*CGF)), SrcLV);
|
||||
CGF->EmitStoreOfScalar(getNullForVariable(SrcLV.getAddress()), SrcLV);
|
||||
CGF->EmitStoreOfScalar(SrcVal, CGF->MakeAddrLValue(Addrs[DstIdx], QT),
|
||||
/* isInitialization */ true);
|
||||
}
|
||||
|
@ -770,7 +770,7 @@ struct GenMoveAssignment : GenBinaryFunc<GenMoveAssignment, true> {
|
|||
LValue SrcLV = CGF->MakeAddrLValue(Addrs[SrcIdx], QT);
|
||||
llvm::Value *SrcVal =
|
||||
CGF->EmitLoadOfLValue(SrcLV, SourceLocation()).getScalarVal();
|
||||
CGF->EmitStoreOfScalar(getNullForVariable(SrcLV.getAddress(*CGF)), SrcLV);
|
||||
CGF->EmitStoreOfScalar(getNullForVariable(SrcLV.getAddress()), SrcLV);
|
||||
LValue DstLV = CGF->MakeAddrLValue(Addrs[DstIdx], QT);
|
||||
llvm::Value *DstVal =
|
||||
CGF->EmitLoadOfLValue(DstLV, SourceLocation()).getScalarVal();
|
||||
|
@ -806,8 +806,7 @@ void CodeGenFunction::destroyNonTrivialCStruct(CodeGenFunction &CGF,
|
|||
// such structure.
|
||||
void CodeGenFunction::defaultInitNonTrivialCStructVar(LValue Dst) {
|
||||
GenDefaultInitialize Gen(getContext());
|
||||
Address DstPtr =
|
||||
Builder.CreateBitCast(Dst.getAddress(*this), CGM.Int8PtrPtrTy);
|
||||
Address DstPtr = Builder.CreateBitCast(Dst.getAddress(), CGM.Int8PtrPtrTy);
|
||||
Gen.setCGF(this);
|
||||
QualType QT = Dst.getType();
|
||||
QT = Dst.isVolatile() ? QT.withVolatile() : QT;
|
||||
|
@ -851,7 +850,7 @@ getSpecialFunction(G &&Gen, StringRef FuncName, QualType QT, bool IsVolatile,
|
|||
// Functions to emit calls to the special functions of a non-trivial C struct.
|
||||
void CodeGenFunction::callCStructDefaultConstructor(LValue Dst) {
|
||||
bool IsVolatile = Dst.isVolatile();
|
||||
Address DstPtr = Dst.getAddress(*this);
|
||||
Address DstPtr = Dst.getAddress();
|
||||
QualType QT = Dst.getType();
|
||||
GenDefaultInitializeFuncName GenName(DstPtr.getAlignment(), getContext());
|
||||
std::string FuncName = GenName.getName(QT, IsVolatile);
|
||||
|
@ -875,7 +874,7 @@ std::string CodeGenFunction::getNonTrivialDestructorStr(QualType QT,
|
|||
|
||||
void CodeGenFunction::callCStructDestructor(LValue Dst) {
|
||||
bool IsVolatile = Dst.isVolatile();
|
||||
Address DstPtr = Dst.getAddress(*this);
|
||||
Address DstPtr = Dst.getAddress();
|
||||
QualType QT = Dst.getType();
|
||||
GenDestructorFuncName GenName("__destructor_", DstPtr.getAlignment(),
|
||||
getContext());
|
||||
|
@ -886,7 +885,7 @@ void CodeGenFunction::callCStructDestructor(LValue Dst) {
|
|||
|
||||
void CodeGenFunction::callCStructCopyConstructor(LValue Dst, LValue Src) {
|
||||
bool IsVolatile = Dst.isVolatile() || Src.isVolatile();
|
||||
Address DstPtr = Dst.getAddress(*this), SrcPtr = Src.getAddress(*this);
|
||||
Address DstPtr = Dst.getAddress(), SrcPtr = Src.getAddress();
|
||||
QualType QT = Dst.getType();
|
||||
GenBinaryFuncName<false> GenName("__copy_constructor_", DstPtr.getAlignment(),
|
||||
SrcPtr.getAlignment(), getContext());
|
||||
|
@ -900,7 +899,7 @@ void CodeGenFunction::callCStructCopyAssignmentOperator(LValue Dst, LValue Src
|
|||
|
||||
) {
|
||||
bool IsVolatile = Dst.isVolatile() || Src.isVolatile();
|
||||
Address DstPtr = Dst.getAddress(*this), SrcPtr = Src.getAddress(*this);
|
||||
Address DstPtr = Dst.getAddress(), SrcPtr = Src.getAddress();
|
||||
QualType QT = Dst.getType();
|
||||
GenBinaryFuncName<false> GenName("__copy_assignment_", DstPtr.getAlignment(),
|
||||
SrcPtr.getAlignment(), getContext());
|
||||
|
@ -911,7 +910,7 @@ void CodeGenFunction::callCStructCopyAssignmentOperator(LValue Dst, LValue Src
|
|||
|
||||
void CodeGenFunction::callCStructMoveConstructor(LValue Dst, LValue Src) {
|
||||
bool IsVolatile = Dst.isVolatile() || Src.isVolatile();
|
||||
Address DstPtr = Dst.getAddress(*this), SrcPtr = Src.getAddress(*this);
|
||||
Address DstPtr = Dst.getAddress(), SrcPtr = Src.getAddress();
|
||||
QualType QT = Dst.getType();
|
||||
GenBinaryFuncName<true> GenName("__move_constructor_", DstPtr.getAlignment(),
|
||||
SrcPtr.getAlignment(), getContext());
|
||||
|
@ -925,7 +924,7 @@ void CodeGenFunction::callCStructMoveAssignmentOperator(LValue Dst, LValue Src
|
|||
|
||||
) {
|
||||
bool IsVolatile = Dst.isVolatile() || Src.isVolatile();
|
||||
Address DstPtr = Dst.getAddress(*this), SrcPtr = Src.getAddress(*this);
|
||||
Address DstPtr = Dst.getAddress(), SrcPtr = Src.getAddress();
|
||||
QualType QT = Dst.getType();
|
||||
GenBinaryFuncName<true> GenName("__move_assignment_", DstPtr.getAlignment(),
|
||||
SrcPtr.getAlignment(), getContext());
|
||||
|
|
|
@ -511,7 +511,7 @@ RValue CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E,
|
|||
method->getMethodFamily() == OMF_retain) {
|
||||
if (auto lvalueExpr = findWeakLValue(E->getInstanceReceiver())) {
|
||||
LValue lvalue = EmitLValue(lvalueExpr);
|
||||
llvm::Value *result = EmitARCLoadWeakRetained(lvalue.getAddress(*this));
|
||||
llvm::Value *result = EmitARCLoadWeakRetained(lvalue.getAddress());
|
||||
return AdjustObjCObjectType(*this, E->getType(), RValue::get(result));
|
||||
}
|
||||
}
|
||||
|
@ -749,8 +749,8 @@ static void emitStructGetterCall(CodeGenFunction &CGF, ObjCIvarDecl *ivar,
|
|||
ASTContext &Context = CGF.getContext();
|
||||
|
||||
Address src =
|
||||
CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), CGF.LoadObjCSelf(), ivar, 0)
|
||||
.getAddress(CGF);
|
||||
CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), CGF.LoadObjCSelf(), ivar, 0)
|
||||
.getAddress();
|
||||
|
||||
// objc_copyStruct (ReturnValue, &structIvar,
|
||||
// sizeof (Type of Ivar), isAtomic, false);
|
||||
|
@ -1022,8 +1022,8 @@ static void emitCPPObjectAtomicGetterCall(CodeGenFunction &CGF,
|
|||
|
||||
// The 2nd argument is the address of the ivar.
|
||||
llvm::Value *ivarAddr =
|
||||
CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), CGF.LoadObjCSelf(), ivar, 0)
|
||||
.getPointer(CGF);
|
||||
CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(),
|
||||
CGF.LoadObjCSelf(), ivar, 0).getPointer();
|
||||
ivarAddr = CGF.Builder.CreateBitCast(ivarAddr, CGF.Int8PtrTy);
|
||||
args.add(RValue::get(ivarAddr), CGF.getContext().VoidPtrTy);
|
||||
|
||||
|
@ -1082,7 +1082,7 @@ CodeGenFunction::generateObjCGetterBody(const ObjCImplementationDecl *classImpl,
|
|||
bitcastType = bitcastType->getPointerTo(); // addrspace 0 okay
|
||||
|
||||
// Perform an atomic load. This does not impose ordering constraints.
|
||||
Address ivarAddr = LV.getAddress(*this);
|
||||
Address ivarAddr = LV.getAddress();
|
||||
ivarAddr = Builder.CreateBitCast(ivarAddr, bitcastType);
|
||||
llvm::LoadInst *load = Builder.CreateLoad(ivarAddr, "load");
|
||||
load->setAtomic(llvm::AtomicOrdering::Unordered);
|
||||
|
@ -1183,14 +1183,14 @@ CodeGenFunction::generateObjCGetterBody(const ObjCImplementationDecl *classImpl,
|
|||
case TEK_Scalar: {
|
||||
llvm::Value *value;
|
||||
if (propType->isReferenceType()) {
|
||||
value = LV.getAddress(*this).getPointer();
|
||||
value = LV.getAddress().getPointer();
|
||||
} else {
|
||||
// We want to load and autoreleaseReturnValue ARC __weak ivars.
|
||||
if (LV.getQuals().getObjCLifetime() == Qualifiers::OCL_Weak) {
|
||||
if (getLangOpts().ObjCAutoRefCount) {
|
||||
value = emitARCRetainLoadOfScalar(*this, LV, ivarType);
|
||||
} else {
|
||||
value = EmitARCLoadWeak(LV.getAddress(*this));
|
||||
value = EmitARCLoadWeak(LV.getAddress());
|
||||
}
|
||||
|
||||
// Otherwise we want to do a simple load, suppressing the
|
||||
|
@ -1224,9 +1224,9 @@ static void emitStructSetterCall(CodeGenFunction &CGF, ObjCMethodDecl *OMD,
|
|||
CallArgList args;
|
||||
|
||||
// The first argument is the address of the ivar.
|
||||
llvm::Value *ivarAddr =
|
||||
CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), CGF.LoadObjCSelf(), ivar, 0)
|
||||
.getPointer(CGF);
|
||||
llvm::Value *ivarAddr = CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(),
|
||||
CGF.LoadObjCSelf(), ivar, 0)
|
||||
.getPointer();
|
||||
ivarAddr = CGF.Builder.CreateBitCast(ivarAddr, CGF.Int8PtrTy);
|
||||
args.add(RValue::get(ivarAddr), CGF.getContext().VoidPtrTy);
|
||||
|
||||
|
@ -1235,7 +1235,7 @@ static void emitStructSetterCall(CodeGenFunction &CGF, ObjCMethodDecl *OMD,
|
|||
DeclRefExpr argRef(CGF.getContext(), argVar, false,
|
||||
argVar->getType().getNonReferenceType(), VK_LValue,
|
||||
SourceLocation());
|
||||
llvm::Value *argAddr = CGF.EmitLValue(&argRef).getPointer(CGF);
|
||||
llvm::Value *argAddr = CGF.EmitLValue(&argRef).getPointer();
|
||||
argAddr = CGF.Builder.CreateBitCast(argAddr, CGF.Int8PtrTy);
|
||||
args.add(RValue::get(argAddr), CGF.getContext().VoidPtrTy);
|
||||
|
||||
|
@ -1271,8 +1271,8 @@ static void emitCPPObjectAtomicSetterCall(CodeGenFunction &CGF,
|
|||
|
||||
// The first argument is the address of the ivar.
|
||||
llvm::Value *ivarAddr =
|
||||
CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), CGF.LoadObjCSelf(), ivar, 0)
|
||||
.getPointer(CGF);
|
||||
CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(),
|
||||
CGF.LoadObjCSelf(), ivar, 0).getPointer();
|
||||
ivarAddr = CGF.Builder.CreateBitCast(ivarAddr, CGF.Int8PtrTy);
|
||||
args.add(RValue::get(ivarAddr), CGF.getContext().VoidPtrTy);
|
||||
|
||||
|
@ -1281,7 +1281,7 @@ static void emitCPPObjectAtomicSetterCall(CodeGenFunction &CGF,
|
|||
DeclRefExpr argRef(CGF.getContext(), argVar, false,
|
||||
argVar->getType().getNonReferenceType(), VK_LValue,
|
||||
SourceLocation());
|
||||
llvm::Value *argAddr = CGF.EmitLValue(&argRef).getPointer(CGF);
|
||||
llvm::Value *argAddr = CGF.EmitLValue(&argRef).getPointer();
|
||||
argAddr = CGF.Builder.CreateBitCast(argAddr, CGF.Int8PtrTy);
|
||||
args.add(RValue::get(argAddr), CGF.getContext().VoidPtrTy);
|
||||
|
||||
|
@ -1358,7 +1358,7 @@ CodeGenFunction::generateObjCSetterBody(const ObjCImplementationDecl *classImpl,
|
|||
|
||||
LValue ivarLValue =
|
||||
EmitLValueForIvar(TypeOfSelfObject(), LoadObjCSelf(), ivar, /*quals*/ 0);
|
||||
Address ivarAddr = ivarLValue.getAddress(*this);
|
||||
Address ivarAddr = ivarLValue.getAddress();
|
||||
|
||||
// Currently, all atomic accesses have to be through integer
|
||||
// types, so there's no point in trying to pick a prettier type.
|
||||
|
@ -1535,7 +1535,7 @@ namespace {
|
|||
void Emit(CodeGenFunction &CGF, Flags flags) override {
|
||||
LValue lvalue
|
||||
= CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), addr, ivar, /*CVR*/ 0);
|
||||
CGF.emitDestroy(lvalue.getAddress(CGF), ivar->getType(), destroyer,
|
||||
CGF.emitDestroy(lvalue.getAddress(), ivar->getType(), destroyer,
|
||||
flags.isForNormalCleanup() && useEHCleanupForArray);
|
||||
}
|
||||
};
|
||||
|
@ -1602,7 +1602,7 @@ void CodeGenFunction::GenerateObjCCtorDtorMethod(ObjCImplementationDecl *IMP,
|
|||
LValue LV = EmitLValueForIvar(TypeOfSelfObject(),
|
||||
LoadObjCSelf(), Ivar, 0);
|
||||
EmitAggExpr(IvarInit->getInit(),
|
||||
AggValueSlot::forLValue(LV, *this, AggValueSlot::IsDestructed,
|
||||
AggValueSlot::forLValue(LV, AggValueSlot::IsDestructed,
|
||||
AggValueSlot::DoesNotNeedGCBarriers,
|
||||
AggValueSlot::IsNotAliased,
|
||||
AggValueSlot::DoesNotOverlap));
|
||||
|
@ -2327,7 +2327,7 @@ llvm::Value *CodeGenFunction::EmitARCStoreStrong(LValue dst,
|
|||
!isBlock &&
|
||||
(dst.getAlignment().isZero() ||
|
||||
dst.getAlignment() >= CharUnits::fromQuantity(PointerAlignInBytes))) {
|
||||
return EmitARCStoreStrongCall(dst.getAddress(*this), newValue, ignored);
|
||||
return EmitARCStoreStrongCall(dst.getAddress(), newValue, ignored);
|
||||
}
|
||||
|
||||
// Otherwise, split it out.
|
||||
|
@ -2726,7 +2726,7 @@ static TryEmitResult tryEmitARCRetainLoadOfScalar(CodeGenFunction &CGF,
|
|||
result = CGF.EmitLoadOfLValue(lvalue, SourceLocation()).getScalarVal();
|
||||
} else {
|
||||
assert(type.getObjCLifetime() == Qualifiers::OCL_Weak);
|
||||
result = CGF.EmitARCLoadWeakRetained(lvalue.getAddress(CGF));
|
||||
result = CGF.EmitARCLoadWeakRetained(lvalue.getAddress());
|
||||
}
|
||||
return TryEmitResult(result, !shouldRetain);
|
||||
}
|
||||
|
@ -2750,7 +2750,7 @@ static TryEmitResult tryEmitARCRetainLoadOfScalar(CodeGenFunction &CGF,
|
|||
SourceLocation()).getScalarVal();
|
||||
|
||||
// Set the source pointer to NULL.
|
||||
CGF.EmitStoreOfScalar(getNullForVariable(lv.getAddress(CGF)), lv);
|
||||
CGF.EmitStoreOfScalar(getNullForVariable(lv.getAddress()), lv);
|
||||
|
||||
return TryEmitResult(result, true);
|
||||
}
|
||||
|
|
|
@ -357,7 +357,7 @@ public:
|
|||
VD->getType().getNonReferenceType(), VK_LValue,
|
||||
C.getLocation());
|
||||
PrivScope.addPrivate(
|
||||
VD, [&CGF, &DRE]() { return CGF.EmitLValue(&DRE).getAddress(CGF); });
|
||||
VD, [&CGF, &DRE]() { return CGF.EmitLValue(&DRE).getAddress(); });
|
||||
}
|
||||
(void)PrivScope.Privatize();
|
||||
}
|
||||
|
@ -842,7 +842,7 @@ static void emitInitWithReductionInitializer(CodeGenFunction &CGF,
|
|||
RValue::getComplex(CGF.EmitLoadOfComplex(LV, DRD->getLocation()));
|
||||
break;
|
||||
case TEK_Aggregate:
|
||||
InitRVal = RValue::getAggregate(LV.getAddress(CGF));
|
||||
InitRVal = RValue::getAggregate(LV.getAddress());
|
||||
break;
|
||||
}
|
||||
OpaqueValueExpr OVE(DRD->getLocation(), Ty, VK_RValue);
|
||||
|
@ -966,7 +966,7 @@ void ReductionCodeGen::emitAggregateInitialization(
|
|||
EmitDeclareReductionInit,
|
||||
EmitDeclareReductionInit ? ClausesData[N].ReductionOp
|
||||
: PrivateVD->getInit(),
|
||||
DRD, SharedLVal.getAddress(CGF));
|
||||
DRD, SharedLVal.getAddress());
|
||||
}
|
||||
|
||||
ReductionCodeGen::ReductionCodeGen(ArrayRef<const Expr *> Shareds,
|
||||
|
@ -1007,13 +1007,13 @@ void ReductionCodeGen::emitAggregateType(CodeGenFunction &CGF, unsigned N) {
|
|||
}
|
||||
llvm::Value *Size;
|
||||
llvm::Value *SizeInChars;
|
||||
auto *ElemType = cast<llvm::PointerType>(
|
||||
SharedAddresses[N].first.getPointer(CGF)->getType())
|
||||
->getElementType();
|
||||
auto *ElemType =
|
||||
cast<llvm::PointerType>(SharedAddresses[N].first.getPointer()->getType())
|
||||
->getElementType();
|
||||
auto *ElemSizeOf = llvm::ConstantExpr::getSizeOf(ElemType);
|
||||
if (AsArraySection) {
|
||||
Size = CGF.Builder.CreatePtrDiff(SharedAddresses[N].second.getPointer(CGF),
|
||||
SharedAddresses[N].first.getPointer(CGF));
|
||||
Size = CGF.Builder.CreatePtrDiff(SharedAddresses[N].second.getPointer(),
|
||||
SharedAddresses[N].first.getPointer());
|
||||
Size = CGF.Builder.CreateNUWAdd(
|
||||
Size, llvm::ConstantInt::get(Size->getType(), /*V=*/1));
|
||||
SizeInChars = CGF.Builder.CreateNUWMul(Size, ElemSizeOf);
|
||||
|
@ -1063,7 +1063,7 @@ void ReductionCodeGen::emitInitialization(
|
|||
PrivateAddr, CGF.ConvertTypeForMem(PrivateType));
|
||||
QualType SharedType = SharedAddresses[N].first.getType();
|
||||
SharedLVal = CGF.MakeAddrLValue(
|
||||
CGF.Builder.CreateElementBitCast(SharedLVal.getAddress(CGF),
|
||||
CGF.Builder.CreateElementBitCast(SharedLVal.getAddress(),
|
||||
CGF.ConvertTypeForMem(SharedType)),
|
||||
SharedType, SharedAddresses[N].first.getBaseInfo(),
|
||||
CGF.CGM.getTBAAInfoForSubobject(SharedAddresses[N].first, SharedType));
|
||||
|
@ -1071,7 +1071,7 @@ void ReductionCodeGen::emitInitialization(
|
|||
emitAggregateInitialization(CGF, N, PrivateAddr, SharedLVal, DRD);
|
||||
} else if (DRD && (DRD->getInitializer() || !PrivateVD->hasInit())) {
|
||||
emitInitWithReductionInitializer(CGF, DRD, ClausesData[N].ReductionOp,
|
||||
PrivateAddr, SharedLVal.getAddress(CGF),
|
||||
PrivateAddr, SharedLVal.getAddress(),
|
||||
SharedLVal.getType());
|
||||
} else if (!DefaultInit(CGF) && PrivateVD->hasInit() &&
|
||||
!CGF.isTrivialInitializer(PrivateVD->getInit())) {
|
||||
|
@ -1108,15 +1108,15 @@ static LValue loadToBegin(CodeGenFunction &CGF, QualType BaseTy, QualType ElTy,
|
|||
while ((BaseTy->isPointerType() || BaseTy->isReferenceType()) &&
|
||||
!CGF.getContext().hasSameType(BaseTy, ElTy)) {
|
||||
if (const auto *PtrTy = BaseTy->getAs<PointerType>()) {
|
||||
BaseLV = CGF.EmitLoadOfPointerLValue(BaseLV.getAddress(CGF), PtrTy);
|
||||
BaseLV = CGF.EmitLoadOfPointerLValue(BaseLV.getAddress(), PtrTy);
|
||||
} else {
|
||||
LValue RefLVal = CGF.MakeAddrLValue(BaseLV.getAddress(CGF), BaseTy);
|
||||
LValue RefLVal = CGF.MakeAddrLValue(BaseLV.getAddress(), BaseTy);
|
||||
BaseLV = CGF.EmitLoadOfReferenceLValue(RefLVal);
|
||||
}
|
||||
BaseTy = BaseTy->getPointeeType();
|
||||
}
|
||||
return CGF.MakeAddrLValue(
|
||||
CGF.Builder.CreateElementBitCast(BaseLV.getAddress(CGF),
|
||||
CGF.Builder.CreateElementBitCast(BaseLV.getAddress(),
|
||||
CGF.ConvertTypeForMem(ElTy)),
|
||||
BaseLV.getType(), BaseLV.getBaseInfo(),
|
||||
CGF.CGM.getTBAAInfoForSubobject(BaseLV, BaseLV.getType()));
|
||||
|
@ -1180,15 +1180,15 @@ Address ReductionCodeGen::adjustPrivateAddress(CodeGenFunction &CGF, unsigned N,
|
|||
loadToBegin(CGF, OrigVD->getType(), SharedAddresses[N].first.getType(),
|
||||
OriginalBaseLValue);
|
||||
llvm::Value *Adjustment = CGF.Builder.CreatePtrDiff(
|
||||
BaseLValue.getPointer(CGF), SharedAddresses[N].first.getPointer(CGF));
|
||||
BaseLValue.getPointer(), SharedAddresses[N].first.getPointer());
|
||||
llvm::Value *PrivatePointer =
|
||||
CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(
|
||||
PrivateAddr.getPointer(),
|
||||
SharedAddresses[N].first.getAddress(CGF).getType());
|
||||
SharedAddresses[N].first.getAddress().getType());
|
||||
llvm::Value *Ptr = CGF.Builder.CreateGEP(PrivatePointer, Adjustment);
|
||||
return castToBase(CGF, OrigVD->getType(),
|
||||
SharedAddresses[N].first.getType(),
|
||||
OriginalBaseLValue.getAddress(CGF).getType(),
|
||||
OriginalBaseLValue.getAddress().getType(),
|
||||
OriginalBaseLValue.getAlignment(), Ptr);
|
||||
}
|
||||
BaseDecls.emplace_back(
|
||||
|
@ -1381,12 +1381,12 @@ emitCombinerOrInitializer(CodeGenModule &CGM, QualType Ty,
|
|||
Address AddrIn = CGF.GetAddrOfLocalVar(&OmpInParm);
|
||||
Scope.addPrivate(In, [&CGF, AddrIn, PtrTy]() {
|
||||
return CGF.EmitLoadOfPointerLValue(AddrIn, PtrTy->castAs<PointerType>())
|
||||
.getAddress(CGF);
|
||||
.getAddress();
|
||||
});
|
||||
Address AddrOut = CGF.GetAddrOfLocalVar(&OmpOutParm);
|
||||
Scope.addPrivate(Out, [&CGF, AddrOut, PtrTy]() {
|
||||
return CGF.EmitLoadOfPointerLValue(AddrOut, PtrTy->castAs<PointerType>())
|
||||
.getAddress(CGF);
|
||||
.getAddress();
|
||||
});
|
||||
(void)Scope.Privatize();
|
||||
if (!IsCombiner && Out->hasInit() &&
|
||||
|
@ -1496,7 +1496,7 @@ llvm::Function *CGOpenMPRuntime::emitTaskOutlinedFunction(
|
|||
UpLoc, ThreadID,
|
||||
CGF.EmitLoadOfPointerLValue(CGF.GetAddrOfLocalVar(TaskTVar),
|
||||
TaskTVar->getType()->castAs<PointerType>())
|
||||
.getPointer(CGF)};
|
||||
.getPointer()};
|
||||
CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_omp_task), TaskArgs);
|
||||
};
|
||||
CGOpenMPTaskOutlinedRegionInfo::UntiedTaskActionTy Action(Tied, PartIDVar,
|
||||
|
@ -1707,10 +1707,9 @@ llvm::Value *CGOpenMPRuntime::getThreadID(CodeGenFunction &CGF,
|
|||
if (!CGF.EHStack.requiresLandingPad() || !CGF.getLangOpts().Exceptions ||
|
||||
!CGF.getLangOpts().CXXExceptions ||
|
||||
CGF.Builder.GetInsertBlock() == TopBlock ||
|
||||
!isa<llvm::Instruction>(LVal.getPointer(CGF)) ||
|
||||
cast<llvm::Instruction>(LVal.getPointer(CGF))->getParent() ==
|
||||
TopBlock ||
|
||||
cast<llvm::Instruction>(LVal.getPointer(CGF))->getParent() ==
|
||||
!isa<llvm::Instruction>(LVal.getPointer()) ||
|
||||
cast<llvm::Instruction>(LVal.getPointer())->getParent() == TopBlock ||
|
||||
cast<llvm::Instruction>(LVal.getPointer())->getParent() ==
|
||||
CGF.Builder.GetInsertBlock()) {
|
||||
ThreadID = CGF.EmitLoadOfScalar(LVal, Loc);
|
||||
// If value loaded in entry block, cache it and use it everywhere in
|
||||
|
@ -3120,7 +3119,7 @@ Address CGOpenMPRuntime::emitThreadIDAddress(CodeGenFunction &CGF,
|
|||
if (auto *OMPRegionInfo =
|
||||
dyn_cast_or_null<CGOpenMPRegionInfo>(CGF.CapturedStmtInfo))
|
||||
if (OMPRegionInfo->getThreadIDVariable())
|
||||
return OMPRegionInfo->getThreadIDVariableLValue(CGF).getAddress(CGF);
|
||||
return OMPRegionInfo->getThreadIDVariableLValue(CGF).getAddress();
|
||||
|
||||
llvm::Value *ThreadID = getThreadID(CGF, Loc);
|
||||
QualType Int32Ty =
|
||||
|
@ -3396,8 +3395,7 @@ void CGOpenMPRuntime::emitSingleRegion(CodeGenFunction &CGF,
|
|||
Address Elem = CGF.Builder.CreateConstArrayGEP(CopyprivateList, I);
|
||||
CGF.Builder.CreateStore(
|
||||
CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(
|
||||
CGF.EmitLValue(CopyprivateVars[I]).getPointer(CGF),
|
||||
CGF.VoidPtrTy),
|
||||
CGF.EmitLValue(CopyprivateVars[I]).getPointer(), CGF.VoidPtrTy),
|
||||
Elem);
|
||||
}
|
||||
// Build function that copies private values from single region to all other
|
||||
|
@ -4542,7 +4540,7 @@ emitProxyTaskFunction(CodeGenModule &CGM, SourceLocation Loc,
|
|||
const auto *KmpTaskTQTyRD = cast<RecordDecl>(KmpTaskTQTy->getAsTagDecl());
|
||||
auto PartIdFI = std::next(KmpTaskTQTyRD->field_begin(), KmpTaskTPartId);
|
||||
LValue PartIdLVal = CGF.EmitLValueForField(Base, *PartIdFI);
|
||||
llvm::Value *PartidParam = PartIdLVal.getPointer(CGF);
|
||||
llvm::Value *PartidParam = PartIdLVal.getPointer();
|
||||
|
||||
auto SharedsFI = std::next(KmpTaskTQTyRD->field_begin(), KmpTaskTShareds);
|
||||
LValue SharedsLVal = CGF.EmitLValueForField(Base, *SharedsFI);
|
||||
|
@ -4555,7 +4553,7 @@ emitProxyTaskFunction(CodeGenModule &CGM, SourceLocation Loc,
|
|||
if (PrivatesFI != KmpTaskTWithPrivatesQTyRD->field_end()) {
|
||||
LValue PrivatesLVal = CGF.EmitLValueForField(TDBase, *PrivatesFI);
|
||||
PrivatesParam = CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(
|
||||
PrivatesLVal.getPointer(CGF), CGF.VoidPtrTy);
|
||||
PrivatesLVal.getPointer(), CGF.VoidPtrTy);
|
||||
} else {
|
||||
PrivatesParam = llvm::ConstantPointerNull::get(CGF.VoidPtrTy);
|
||||
}
|
||||
|
@ -4564,7 +4562,7 @@ emitProxyTaskFunction(CodeGenModule &CGM, SourceLocation Loc,
|
|||
TaskPrivatesMap,
|
||||
CGF.Builder
|
||||
.CreatePointerBitCastOrAddrSpaceCast(
|
||||
TDBase.getAddress(CGF), CGF.VoidPtrTy)
|
||||
TDBase.getAddress(), CGF.VoidPtrTy)
|
||||
.getPointer()};
|
||||
SmallVector<llvm::Value *, 16> CallArgs(std::begin(CommonArgs),
|
||||
std::end(CommonArgs));
|
||||
|
@ -4642,7 +4640,7 @@ static llvm::Value *emitDestructorsFunction(CodeGenModule &CGM,
|
|||
if (QualType::DestructionKind DtorKind =
|
||||
Field->getType().isDestructedType()) {
|
||||
LValue FieldLValue = CGF.EmitLValueForField(Base, Field);
|
||||
CGF.pushDestroy(DtorKind, FieldLValue.getAddress(CGF), Field->getType());
|
||||
CGF.pushDestroy(DtorKind, FieldLValue.getAddress(), Field->getType());
|
||||
}
|
||||
}
|
||||
CGF.FinishFunction();
|
||||
|
@ -4740,8 +4738,8 @@ emitTaskPrivateMappingFunction(CodeGenModule &CGM, SourceLocation Loc,
|
|||
LValue RefLVal =
|
||||
CGF.MakeAddrLValue(CGF.GetAddrOfLocalVar(VD), VD->getType());
|
||||
LValue RefLoadLVal = CGF.EmitLoadOfPointerLValue(
|
||||
RefLVal.getAddress(CGF), RefLVal.getType()->castAs<PointerType>());
|
||||
CGF.EmitStoreOfScalar(FieldLVal.getPointer(CGF), RefLoadLVal);
|
||||
RefLVal.getAddress(), RefLVal.getType()->castAs<PointerType>());
|
||||
CGF.EmitStoreOfScalar(FieldLVal.getPointer(), RefLoadLVal);
|
||||
++Counter;
|
||||
}
|
||||
CGF.FinishFunction();
|
||||
|
@ -4806,8 +4804,7 @@ static void emitPrivatesInit(CodeGenFunction &CGF,
|
|||
} else {
|
||||
SharedRefLValue = CGF.EmitLValueForField(SrcBase, SharedField);
|
||||
SharedRefLValue = CGF.MakeAddrLValue(
|
||||
Address(SharedRefLValue.getPointer(CGF),
|
||||
C.getDeclAlign(OriginalVD)),
|
||||
Address(SharedRefLValue.getPointer(), C.getDeclAlign(OriginalVD)),
|
||||
SharedRefLValue.getType(), LValueBaseInfo(AlignmentSource::Decl),
|
||||
SharedRefLValue.getTBAAInfo());
|
||||
}
|
||||
|
@ -4820,8 +4817,7 @@ static void emitPrivatesInit(CodeGenFunction &CGF,
|
|||
// Initialize firstprivate array using element-by-element
|
||||
// initialization.
|
||||
CGF.EmitOMPAggregateAssign(
|
||||
PrivateLValue.getAddress(CGF), SharedRefLValue.getAddress(CGF),
|
||||
Type,
|
||||
PrivateLValue.getAddress(), SharedRefLValue.getAddress(), Type,
|
||||
[&CGF, Elem, Init, &CapturesInfo](Address DestElement,
|
||||
Address SrcElement) {
|
||||
// Clean up any temporaries needed by the initialization.
|
||||
|
@ -4839,8 +4835,8 @@ static void emitPrivatesInit(CodeGenFunction &CGF,
|
|||
}
|
||||
} else {
|
||||
CodeGenFunction::OMPPrivateScope InitScope(CGF);
|
||||
InitScope.addPrivate(Elem, [SharedRefLValue, &CGF]() -> Address {
|
||||
return SharedRefLValue.getAddress(CGF);
|
||||
InitScope.addPrivate(Elem, [SharedRefLValue]() -> Address {
|
||||
return SharedRefLValue.getAddress();
|
||||
});
|
||||
(void)InitScope.Privatize();
|
||||
CodeGenFunction::CGCapturedStmtRAII CapInfoRAII(CGF, &CapturesInfo);
|
||||
|
@ -5240,10 +5236,10 @@ void CGOpenMPRuntime::emitTaskCall(CodeGenFunction &CGF, SourceLocation Loc,
|
|||
dyn_cast<OMPArraySectionExpr>(E->IgnoreParenImpCasts())) {
|
||||
LValue UpAddrLVal =
|
||||
CGF.EmitOMPArraySectionExpr(ASE, /*IsLowerBound=*/false);
|
||||
llvm::Value *UpAddr = CGF.Builder.CreateConstGEP1_32(
|
||||
UpAddrLVal.getPointer(CGF), /*Idx0=*/1);
|
||||
llvm::Value *UpAddr =
|
||||
CGF.Builder.CreateConstGEP1_32(UpAddrLVal.getPointer(), /*Idx0=*/1);
|
||||
llvm::Value *LowIntPtr =
|
||||
CGF.Builder.CreatePtrToInt(Addr.getPointer(CGF), CGM.SizeTy);
|
||||
CGF.Builder.CreatePtrToInt(Addr.getPointer(), CGM.SizeTy);
|
||||
llvm::Value *UpIntPtr = CGF.Builder.CreatePtrToInt(UpAddr, CGM.SizeTy);
|
||||
Size = CGF.Builder.CreateNUWSub(UpIntPtr, LowIntPtr);
|
||||
} else {
|
||||
|
@ -5256,7 +5252,7 @@ void CGOpenMPRuntime::emitTaskCall(CodeGenFunction &CGF, SourceLocation Loc,
|
|||
LValue BaseAddrLVal = CGF.EmitLValueForField(
|
||||
Base, *std::next(KmpDependInfoRD->field_begin(), BaseAddr));
|
||||
CGF.EmitStoreOfScalar(
|
||||
CGF.Builder.CreatePtrToInt(Addr.getPointer(CGF), CGF.IntPtrTy),
|
||||
CGF.Builder.CreatePtrToInt(Addr.getPointer(), CGF.IntPtrTy),
|
||||
BaseAddrLVal);
|
||||
// deps[i].len = sizeof(<Dependences[i].second>);
|
||||
LValue LenLVal = CGF.EmitLValueForField(
|
||||
|
@ -5410,24 +5406,21 @@ void CGOpenMPRuntime::emitTaskLoopCall(CodeGenFunction &CGF, SourceLocation Loc,
|
|||
*std::next(Result.KmpTaskTQTyRD->field_begin(), KmpTaskTLowerBound));
|
||||
const auto *LBVar =
|
||||
cast<VarDecl>(cast<DeclRefExpr>(D.getLowerBoundVariable())->getDecl());
|
||||
CGF.EmitAnyExprToMem(LBVar->getInit(), LBLVal.getAddress(CGF),
|
||||
LBLVal.getQuals(),
|
||||
CGF.EmitAnyExprToMem(LBVar->getInit(), LBLVal.getAddress(), LBLVal.getQuals(),
|
||||
/*IsInitializer=*/true);
|
||||
LValue UBLVal = CGF.EmitLValueForField(
|
||||
Result.TDBase,
|
||||
*std::next(Result.KmpTaskTQTyRD->field_begin(), KmpTaskTUpperBound));
|
||||
const auto *UBVar =
|
||||
cast<VarDecl>(cast<DeclRefExpr>(D.getUpperBoundVariable())->getDecl());
|
||||
CGF.EmitAnyExprToMem(UBVar->getInit(), UBLVal.getAddress(CGF),
|
||||
UBLVal.getQuals(),
|
||||
CGF.EmitAnyExprToMem(UBVar->getInit(), UBLVal.getAddress(), UBLVal.getQuals(),
|
||||
/*IsInitializer=*/true);
|
||||
LValue StLVal = CGF.EmitLValueForField(
|
||||
Result.TDBase,
|
||||
*std::next(Result.KmpTaskTQTyRD->field_begin(), KmpTaskTStride));
|
||||
const auto *StVar =
|
||||
cast<VarDecl>(cast<DeclRefExpr>(D.getStrideVariable())->getDecl());
|
||||
CGF.EmitAnyExprToMem(StVar->getInit(), StLVal.getAddress(CGF),
|
||||
StLVal.getQuals(),
|
||||
CGF.EmitAnyExprToMem(StVar->getInit(), StLVal.getAddress(), StLVal.getQuals(),
|
||||
/*IsInitializer=*/true);
|
||||
// Store reductions address.
|
||||
LValue RedLVal = CGF.EmitLValueForField(
|
||||
|
@ -5436,7 +5429,7 @@ void CGOpenMPRuntime::emitTaskLoopCall(CodeGenFunction &CGF, SourceLocation Loc,
|
|||
if (Data.Reductions) {
|
||||
CGF.EmitStoreOfScalar(Data.Reductions, RedLVal);
|
||||
} else {
|
||||
CGF.EmitNullInitialization(RedLVal.getAddress(CGF),
|
||||
CGF.EmitNullInitialization(RedLVal.getAddress(),
|
||||
CGF.getContext().VoidPtrTy);
|
||||
}
|
||||
enum { NoSchedule = 0, Grainsize = 1, NumTasks = 2 };
|
||||
|
@ -5445,11 +5438,11 @@ void CGOpenMPRuntime::emitTaskLoopCall(CodeGenFunction &CGF, SourceLocation Loc,
|
|||
ThreadID,
|
||||
Result.NewTask,
|
||||
IfVal,
|
||||
LBLVal.getPointer(CGF),
|
||||
UBLVal.getPointer(CGF),
|
||||
LBLVal.getPointer(),
|
||||
UBLVal.getPointer(),
|
||||
CGF.EmitLoadOfScalar(StLVal, Loc),
|
||||
llvm::ConstantInt::getSigned(
|
||||
CGF.IntTy, 1), // Always 1 because taskgroup emitted by the compiler
|
||||
CGF.IntTy, 1), // Always 1 because taskgroup emitted by the compiler
|
||||
llvm::ConstantInt::getSigned(
|
||||
CGF.IntTy, Data.Schedule.getPointer()
|
||||
? Data.Schedule.getInt() ? NumTasks : Grainsize
|
||||
|
@ -5761,7 +5754,7 @@ void CGOpenMPRuntime::emitReduction(CodeGenFunction &CGF, SourceLocation Loc,
|
|||
Address Elem = CGF.Builder.CreateConstArrayGEP(ReductionList, Idx);
|
||||
CGF.Builder.CreateStore(
|
||||
CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(
|
||||
CGF.EmitLValue(RHSExprs[I]).getPointer(CGF), CGF.VoidPtrTy),
|
||||
CGF.EmitLValue(RHSExprs[I]).getPointer(), CGF.VoidPtrTy),
|
||||
Elem);
|
||||
if ((*IPriv)->getType()->isVariablyModifiedType()) {
|
||||
// Store array size.
|
||||
|
@ -6241,7 +6234,7 @@ llvm::Value *CGOpenMPRuntime::emitTaskReductionInit(
|
|||
LValue SharedLVal = CGF.EmitLValueForField(ElemLVal, SharedFD);
|
||||
RCG.emitSharedLValue(CGF, Cnt);
|
||||
llvm::Value *CastedShared =
|
||||
CGF.EmitCastToVoidPtr(RCG.getSharedLValue(Cnt).getPointer(CGF));
|
||||
CGF.EmitCastToVoidPtr(RCG.getSharedLValue(Cnt).getPointer());
|
||||
CGF.EmitStoreOfScalar(CastedShared, SharedLVal);
|
||||
RCG.emitAggregateType(CGF, Cnt);
|
||||
llvm::Value *SizeValInChars;
|
||||
|
@ -6284,8 +6277,7 @@ llvm::Value *CGOpenMPRuntime::emitTaskReductionInit(
|
|||
llvm::ConstantInt::get(CGM.Int32Ty, /*V=*/1, /*isSigned=*/true),
|
||||
FlagsLVal);
|
||||
} else
|
||||
CGF.EmitNullInitialization(FlagsLVal.getAddress(CGF),
|
||||
FlagsLVal.getType());
|
||||
CGF.EmitNullInitialization(FlagsLVal.getAddress(), FlagsLVal.getType());
|
||||
}
|
||||
// Build call void *__kmpc_task_reduction_init(int gtid, int num_data, void
|
||||
// *data);
|
||||
|
@ -6321,7 +6313,7 @@ void CGOpenMPRuntime::emitTaskReductionFixups(CodeGenFunction &CGF,
|
|||
generateUniqueName(CGM, "reduction", RCG.getRefExpr(N)));
|
||||
CGF.Builder.CreateStore(
|
||||
CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(
|
||||
RCG.getSharedLValue(N).getPointer(CGF), CGM.VoidPtrTy),
|
||||
RCG.getSharedLValue(N).getPointer(), CGM.VoidPtrTy),
|
||||
SharedAddr, /*IsVolatile=*/false);
|
||||
}
|
||||
}
|
||||
|
@ -6332,12 +6324,12 @@ Address CGOpenMPRuntime::getTaskReductionItem(CodeGenFunction &CGF,
|
|||
LValue SharedLVal) {
|
||||
// Build call void *__kmpc_task_reduction_get_th_data(int gtid, void *tg, void
|
||||
// *d);
|
||||
llvm::Value *Args[] = {CGF.Builder.CreateIntCast(getThreadID(CGF, Loc),
|
||||
CGM.IntTy,
|
||||
/*isSigned=*/true),
|
||||
ReductionsPtr,
|
||||
CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(
|
||||
SharedLVal.getPointer(CGF), CGM.VoidPtrTy)};
|
||||
llvm::Value *Args[] = {
|
||||
CGF.Builder.CreateIntCast(getThreadID(CGF, Loc), CGM.IntTy,
|
||||
/*isSigned=*/true),
|
||||
ReductionsPtr,
|
||||
CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(SharedLVal.getPointer(),
|
||||
CGM.VoidPtrTy)};
|
||||
return Address(
|
||||
CGF.EmitRuntimeCall(
|
||||
createRuntimeFunction(OMPRTL__kmpc_task_reduction_get_th_data), Args),
|
||||
|
@ -7522,11 +7514,11 @@ private:
|
|||
} else if ((AE && isa<CXXThisExpr>(AE->getBase()->IgnoreParenImpCasts())) ||
|
||||
(OASE &&
|
||||
isa<CXXThisExpr>(OASE->getBase()->IgnoreParenImpCasts()))) {
|
||||
BP = CGF.EmitOMPSharedLValue(AssocExpr).getAddress(CGF);
|
||||
BP = CGF.EmitOMPSharedLValue(AssocExpr).getAddress();
|
||||
} else {
|
||||
// The base is the reference to the variable.
|
||||
// BP = &Var.
|
||||
BP = CGF.EmitOMPSharedLValue(AssocExpr).getAddress(CGF);
|
||||
BP = CGF.EmitOMPSharedLValue(AssocExpr).getAddress();
|
||||
if (const auto *VD =
|
||||
dyn_cast_or_null<VarDecl>(I->getAssociatedDeclaration())) {
|
||||
if (llvm::Optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
|
||||
|
@ -7620,8 +7612,8 @@ private:
|
|||
isa<OMPArraySectionExpr>(Next->getAssociatedExpression())) &&
|
||||
"Unexpected expression");
|
||||
|
||||
Address LB = CGF.EmitOMPSharedLValue(I->getAssociatedExpression())
|
||||
.getAddress(CGF);
|
||||
Address LB =
|
||||
CGF.EmitOMPSharedLValue(I->getAssociatedExpression()).getAddress();
|
||||
|
||||
// If this component is a pointer inside the base struct then we don't
|
||||
// need to create any entry for it - it will be combined with the object
|
||||
|
@ -7668,7 +7660,7 @@ private:
|
|||
if (MC.getAssociatedDeclaration()) {
|
||||
ComponentLB =
|
||||
CGF.EmitOMPSharedLValue(MC.getAssociatedExpression())
|
||||
.getAddress(CGF);
|
||||
.getAddress();
|
||||
Size = CGF.Builder.CreatePtrDiff(
|
||||
CGF.EmitCastToVoidPtr(ComponentLB.getPointer()),
|
||||
CGF.EmitCastToVoidPtr(LB.getPointer()));
|
||||
|
@ -8072,7 +8064,7 @@ public:
|
|||
auto CI = DeferredInfo.find(M.first);
|
||||
if (CI != DeferredInfo.end()) {
|
||||
for (const DeferredDevicePtrEntryTy &L : CI->second) {
|
||||
llvm::Value *BasePtr = this->CGF.EmitLValue(L.IE).getPointer(CGF);
|
||||
llvm::Value *BasePtr = this->CGF.EmitLValue(L.IE).getPointer();
|
||||
llvm::Value *Ptr = this->CGF.EmitLoadOfScalar(
|
||||
this->CGF.EmitLValue(L.IE), L.IE->getExprLoc());
|
||||
CurBasePointers.emplace_back(BasePtr, L.VD);
|
||||
|
@ -8194,10 +8186,9 @@ public:
|
|||
LValue ThisLVal =
|
||||
CGF.EmitLValueForFieldInitialization(VDLVal, ThisCapture);
|
||||
LValue ThisLValVal = CGF.EmitLValueForField(VDLVal, ThisCapture);
|
||||
LambdaPointers.try_emplace(ThisLVal.getPointer(CGF),
|
||||
VDLVal.getPointer(CGF));
|
||||
BasePointers.push_back(ThisLVal.getPointer(CGF));
|
||||
Pointers.push_back(ThisLValVal.getPointer(CGF));
|
||||
LambdaPointers.try_emplace(ThisLVal.getPointer(), VDLVal.getPointer());
|
||||
BasePointers.push_back(ThisLVal.getPointer());
|
||||
Pointers.push_back(ThisLValVal.getPointer());
|
||||
Sizes.push_back(
|
||||
CGF.Builder.CreateIntCast(CGF.getTypeSize(CGF.getContext().VoidPtrTy),
|
||||
CGF.Int64Ty, /*isSigned=*/true));
|
||||
|
@ -8215,19 +8206,17 @@ public:
|
|||
LValue VarLVal = CGF.EmitLValueForFieldInitialization(VDLVal, It->second);
|
||||
if (LC.getCaptureKind() == LCK_ByRef) {
|
||||
LValue VarLValVal = CGF.EmitLValueForField(VDLVal, It->second);
|
||||
LambdaPointers.try_emplace(VarLVal.getPointer(CGF),
|
||||
VDLVal.getPointer(CGF));
|
||||
BasePointers.push_back(VarLVal.getPointer(CGF));
|
||||
Pointers.push_back(VarLValVal.getPointer(CGF));
|
||||
LambdaPointers.try_emplace(VarLVal.getPointer(), VDLVal.getPointer());
|
||||
BasePointers.push_back(VarLVal.getPointer());
|
||||
Pointers.push_back(VarLValVal.getPointer());
|
||||
Sizes.push_back(CGF.Builder.CreateIntCast(
|
||||
CGF.getTypeSize(
|
||||
VD->getType().getCanonicalType().getNonReferenceType()),
|
||||
CGF.Int64Ty, /*isSigned=*/true));
|
||||
} else {
|
||||
RValue VarRVal = CGF.EmitLoadOfLValue(VarLVal, RD->getLocation());
|
||||
LambdaPointers.try_emplace(VarLVal.getPointer(CGF),
|
||||
VDLVal.getPointer(CGF));
|
||||
BasePointers.push_back(VarLVal.getPointer(CGF));
|
||||
LambdaPointers.try_emplace(VarLVal.getPointer(), VDLVal.getPointer());
|
||||
BasePointers.push_back(VarLVal.getPointer());
|
||||
Pointers.push_back(VarRVal.getScalarVal());
|
||||
Sizes.push_back(llvm::ConstantInt::get(CGF.Int64Ty, 0));
|
||||
}
|
||||
|
@ -8533,7 +8522,7 @@ public:
|
|||
CGF.CGM.getOpenMPRuntime().registerTargetFirstprivateCopy(CGF, VD);
|
||||
// Copy the value of the original variable to the new global copy.
|
||||
CGF.Builder.CreateMemCpy(
|
||||
CGF.MakeNaturalAlignAddrLValue(Addr, ElementType).getAddress(CGF),
|
||||
CGF.MakeNaturalAlignAddrLValue(Addr, ElementType).getAddress(),
|
||||
Address(CV, CGF.getContext().getTypeAlignInChars(ElementType)),
|
||||
CurSizes.back(), /*IsVolatile=*/false);
|
||||
// Use new global variable as the base pointers.
|
||||
|
@ -8940,10 +8929,10 @@ void CGOpenMPRuntime::emitUserDefinedMapper(const OMPDeclareMapperDecl *D,
|
|||
.alignmentOfArrayElement(ElementSize));
|
||||
// Privatize the declared variable of mapper to be the current array element.
|
||||
CodeGenFunction::OMPPrivateScope Scope(MapperCGF);
|
||||
Scope.addPrivate(MapperVarDecl, [&MapperCGF, PtrCurrent, PtrTy, CGF]() {
|
||||
Scope.addPrivate(MapperVarDecl, [&MapperCGF, PtrCurrent, PtrTy]() {
|
||||
return MapperCGF
|
||||
.EmitLoadOfPointerLValue(PtrCurrent, PtrTy->castAs<PointerType>())
|
||||
.getAddress(*CGF);
|
||||
.getAddress();
|
||||
});
|
||||
(void)Scope.Privatize();
|
||||
|
||||
|
|
|
@ -2318,7 +2318,7 @@ void CGOpenMPRuntimeNVPTX::emitGenericVarsProlog(CodeGenFunction &CGF,
|
|||
VarTy = Rec.second.FD->getType();
|
||||
} else {
|
||||
llvm::Value *Ptr = CGF.Builder.CreateInBoundsGEP(
|
||||
VarAddr.getAddress(CGF).getPointer(),
|
||||
VarAddr.getAddress().getPointer(),
|
||||
{Bld.getInt32(0), getNVPTXLaneID(CGF)});
|
||||
VarTy =
|
||||
Rec.second.FD->getType()->castAsArrayTypeUnsafe()->getElementType();
|
||||
|
@ -2326,7 +2326,7 @@ void CGOpenMPRuntimeNVPTX::emitGenericVarsProlog(CodeGenFunction &CGF,
|
|||
Address(Ptr, CGM.getContext().getDeclAlign(Rec.first)), VarTy,
|
||||
AlignmentSource::Decl);
|
||||
}
|
||||
Rec.second.PrivateAddr = VarAddr.getAddress(CGF);
|
||||
Rec.second.PrivateAddr = VarAddr.getAddress();
|
||||
if (!IsInTTDRegion &&
|
||||
(WithSPMDCheck ||
|
||||
getExecutionMode() == CGOpenMPRuntimeNVPTX::EM_Unknown)) {
|
||||
|
@ -2337,10 +2337,10 @@ void CGOpenMPRuntimeNVPTX::emitGenericVarsProlog(CodeGenFunction &CGF,
|
|||
"Secondary glob data must be one per team.");
|
||||
LValue SecVarAddr = CGF.EmitLValueForField(SecBase, SecIt->second.FD);
|
||||
VarAddr.setAddress(
|
||||
Address(Bld.CreateSelect(IsTTD, SecVarAddr.getPointer(CGF),
|
||||
VarAddr.getPointer(CGF)),
|
||||
Address(Bld.CreateSelect(IsTTD, SecVarAddr.getPointer(),
|
||||
VarAddr.getPointer()),
|
||||
VarAddr.getAlignment()));
|
||||
Rec.second.PrivateAddr = VarAddr.getAddress(CGF);
|
||||
Rec.second.PrivateAddr = VarAddr.getAddress();
|
||||
}
|
||||
Address GlobalPtr = Rec.second.PrivateAddr;
|
||||
Address LocalAddr = CGF.CreateMemTemp(VarTy, Rec.second.FD->getName());
|
||||
|
@ -2352,8 +2352,7 @@ void CGOpenMPRuntimeNVPTX::emitGenericVarsProlog(CodeGenFunction &CGF,
|
|||
if (EscapedParam) {
|
||||
const auto *VD = cast<VarDecl>(Rec.first);
|
||||
CGF.EmitStoreOfScalar(ParValue, VarAddr);
|
||||
I->getSecond().MappedParams->setVarAddr(CGF, VD,
|
||||
VarAddr.getAddress(CGF));
|
||||
I->getSecond().MappedParams->setVarAddr(CGF, VD, VarAddr.getAddress());
|
||||
}
|
||||
if (IsTTD)
|
||||
++SecIt;
|
||||
|
@ -2387,7 +2386,7 @@ void CGOpenMPRuntimeNVPTX::emitGenericVarsProlog(CodeGenFunction &CGF,
|
|||
CGM.getContext().getDeclAlign(VD),
|
||||
AlignmentSource::Decl);
|
||||
I->getSecond().MappedParams->setVarAddr(CGF, cast<VarDecl>(VD),
|
||||
Base.getAddress(CGF));
|
||||
Base.getAddress());
|
||||
I->getSecond().EscapedVariableLengthDeclsAddrs.emplace_back(GlobalRecValue);
|
||||
}
|
||||
I->getSecond().MappedParams->apply(CGF);
|
||||
|
@ -3691,8 +3690,7 @@ static llvm::Value *emitListToGlobalCopyFunction(
|
|||
const FieldDecl *FD = VarFieldMap.lookup(VD);
|
||||
LValue GlobLVal = CGF.EmitLValueForField(
|
||||
CGF.MakeNaturalAlignAddrLValue(BufferArrPtr, StaticTy), FD);
|
||||
llvm::Value *BufferPtr =
|
||||
Bld.CreateInBoundsGEP(GlobLVal.getPointer(CGF), Idxs);
|
||||
llvm::Value *BufferPtr = Bld.CreateInBoundsGEP(GlobLVal.getPointer(), Idxs);
|
||||
GlobLVal.setAddress(Address(BufferPtr, GlobLVal.getAlignment()));
|
||||
switch (CGF.getEvaluationKind(Private->getType())) {
|
||||
case TEK_Scalar: {
|
||||
|
@ -3789,8 +3787,7 @@ static llvm::Value *emitListToGlobalReduceFunction(
|
|||
const FieldDecl *FD = VarFieldMap.lookup(VD);
|
||||
LValue GlobLVal = CGF.EmitLValueForField(
|
||||
CGF.MakeNaturalAlignAddrLValue(BufferArrPtr, StaticTy), FD);
|
||||
llvm::Value *BufferPtr =
|
||||
Bld.CreateInBoundsGEP(GlobLVal.getPointer(CGF), Idxs);
|
||||
llvm::Value *BufferPtr = Bld.CreateInBoundsGEP(GlobLVal.getPointer(), Idxs);
|
||||
llvm::Value *Ptr = CGF.EmitCastToVoidPtr(BufferPtr);
|
||||
CGF.EmitStoreOfScalar(Ptr, Elem, /*Volatile=*/false, C.VoidPtrTy);
|
||||
if ((*IPriv)->getType()->isVariablyModifiedType()) {
|
||||
|
@ -3894,8 +3891,7 @@ static llvm::Value *emitGlobalToListCopyFunction(
|
|||
const FieldDecl *FD = VarFieldMap.lookup(VD);
|
||||
LValue GlobLVal = CGF.EmitLValueForField(
|
||||
CGF.MakeNaturalAlignAddrLValue(BufferArrPtr, StaticTy), FD);
|
||||
llvm::Value *BufferPtr =
|
||||
Bld.CreateInBoundsGEP(GlobLVal.getPointer(CGF), Idxs);
|
||||
llvm::Value *BufferPtr = Bld.CreateInBoundsGEP(GlobLVal.getPointer(), Idxs);
|
||||
GlobLVal.setAddress(Address(BufferPtr, GlobLVal.getAlignment()));
|
||||
switch (CGF.getEvaluationKind(Private->getType())) {
|
||||
case TEK_Scalar: {
|
||||
|
@ -3991,8 +3987,7 @@ static llvm::Value *emitGlobalToListReduceFunction(
|
|||
const FieldDecl *FD = VarFieldMap.lookup(VD);
|
||||
LValue GlobLVal = CGF.EmitLValueForField(
|
||||
CGF.MakeNaturalAlignAddrLValue(BufferArrPtr, StaticTy), FD);
|
||||
llvm::Value *BufferPtr =
|
||||
Bld.CreateInBoundsGEP(GlobLVal.getPointer(CGF), Idxs);
|
||||
llvm::Value *BufferPtr = Bld.CreateInBoundsGEP(GlobLVal.getPointer(), Idxs);
|
||||
llvm::Value *Ptr = CGF.EmitCastToVoidPtr(BufferPtr);
|
||||
CGF.EmitStoreOfScalar(Ptr, Elem, /*Volatile=*/false, C.VoidPtrTy);
|
||||
if ((*IPriv)->getType()->isVariablyModifiedType()) {
|
||||
|
@ -4315,7 +4310,7 @@ void CGOpenMPRuntimeNVPTX::emitReduction(
|
|||
Address Elem = CGF.Builder.CreateConstArrayGEP(ReductionList, Idx);
|
||||
CGF.Builder.CreateStore(
|
||||
CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(
|
||||
CGF.EmitLValue(RHSExprs[I]).getPointer(CGF), CGF.VoidPtrTy),
|
||||
CGF.EmitLValue(RHSExprs[I]).getPointer(), CGF.VoidPtrTy),
|
||||
Elem);
|
||||
if ((*IPriv)->getType()->isVariablyModifiedType()) {
|
||||
// Store array size.
|
||||
|
@ -4897,7 +4892,7 @@ void CGOpenMPRuntimeNVPTX::adjustTargetSpecificDataForLambdas(
|
|||
if (VD->getType().getCanonicalType()->isReferenceType())
|
||||
VDAddr = CGF.EmitLoadOfReferenceLValue(VDAddr,
|
||||
VD->getType().getCanonicalType())
|
||||
.getAddress(CGF);
|
||||
.getAddress();
|
||||
CGF.EmitStoreOfScalar(VDAddr.getPointer(), VarLVal);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1834,15 +1834,15 @@ CodeGenFunction::EmitAsmInputLValue(const TargetInfo::ConstraintInfo &Info,
|
|||
Ty = llvm::IntegerType::get(getLLVMContext(), Size);
|
||||
Ty = llvm::PointerType::getUnqual(Ty);
|
||||
|
||||
Arg = Builder.CreateLoad(
|
||||
Builder.CreateBitCast(InputValue.getAddress(*this), Ty));
|
||||
Arg = Builder.CreateLoad(Builder.CreateBitCast(InputValue.getAddress(),
|
||||
Ty));
|
||||
} else {
|
||||
Arg = InputValue.getPointer(*this);
|
||||
Arg = InputValue.getPointer();
|
||||
ConstraintStr += '*';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Arg = InputValue.getPointer(*this);
|
||||
Arg = InputValue.getPointer();
|
||||
ConstraintStr += '*';
|
||||
}
|
||||
|
||||
|
@ -2091,8 +2091,8 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
|
|||
LargestVectorWidth = std::max((uint64_t)LargestVectorWidth,
|
||||
VT->getPrimitiveSizeInBits().getFixedSize());
|
||||
} else {
|
||||
ArgTypes.push_back(Dest.getAddress(*this).getType());
|
||||
Args.push_back(Dest.getPointer(*this));
|
||||
ArgTypes.push_back(Dest.getAddress().getType());
|
||||
Args.push_back(Dest.getPointer());
|
||||
Constraints += "=*";
|
||||
Constraints += OutputConstraint;
|
||||
ReadOnly = ReadNone = false;
|
||||
|
@ -2334,7 +2334,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
|
|||
// ResultTypeRequiresCast.size() elements of RegResults.
|
||||
if ((i < ResultTypeRequiresCast.size()) && ResultTypeRequiresCast[i]) {
|
||||
unsigned Size = getContext().getTypeSize(ResultRegQualTys[i]);
|
||||
Address A = Builder.CreateBitCast(Dest.getAddress(*this),
|
||||
Address A = Builder.CreateBitCast(Dest.getAddress(),
|
||||
ResultRegTypes[i]->getPointerTo());
|
||||
QualType Ty = getContext().getIntTypeForBitwidth(Size, /*Signed*/ false);
|
||||
if (Ty.isNull()) {
|
||||
|
@ -2387,14 +2387,14 @@ CodeGenFunction::EmitCapturedStmt(const CapturedStmt &S, CapturedRegionKind K) {
|
|||
delete CGF.CapturedStmtInfo;
|
||||
|
||||
// Emit call to the helper function.
|
||||
EmitCallOrInvoke(F, CapStruct.getPointer(*this));
|
||||
EmitCallOrInvoke(F, CapStruct.getPointer());
|
||||
|
||||
return F;
|
||||
}
|
||||
|
||||
Address CodeGenFunction::GenerateCapturedStmtArgument(const CapturedStmt &S) {
|
||||
LValue CapStruct = InitCapturedStruct(S);
|
||||
return CapStruct.getAddress(*this);
|
||||
return CapStruct.getAddress();
|
||||
}
|
||||
|
||||
/// Creates the outlined function for a CapturedStmt.
|
||||
|
|
|
@ -77,7 +77,7 @@ public:
|
|||
InlinedShareds.isGlobalVarCaptured(VD)),
|
||||
VD->getType().getNonReferenceType(), VK_LValue, C.getLocation());
|
||||
InlinedShareds.addPrivate(VD, [&CGF, &DRE]() -> Address {
|
||||
return CGF.EmitLValue(&DRE).getAddress(CGF);
|
||||
return CGF.EmitLValue(&DRE).getAddress();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -232,7 +232,7 @@ public:
|
|||
VD->getType().getNonReferenceType(), VK_LValue,
|
||||
C.getLocation());
|
||||
InlinedShareds.addPrivate(VD, [&CGF, &DRE]() -> Address {
|
||||
return CGF.EmitLValue(&DRE).getAddress(CGF);
|
||||
return CGF.EmitLValue(&DRE).getAddress();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -325,7 +325,7 @@ void CodeGenFunction::GenerateOpenMPCapturedVars(
|
|||
CapturedVars.push_back(CV);
|
||||
} else {
|
||||
assert(CurCap->capturesVariable() && "Expected capture by reference.");
|
||||
CapturedVars.push_back(EmitLValue(*I).getAddress(*this).getPointer());
|
||||
CapturedVars.push_back(EmitLValue(*I).getAddress().getPointer());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -336,11 +336,11 @@ static Address castValueFromUintptr(CodeGenFunction &CGF, SourceLocation Loc,
|
|||
ASTContext &Ctx = CGF.getContext();
|
||||
|
||||
llvm::Value *CastedPtr = CGF.EmitScalarConversion(
|
||||
AddrLV.getAddress(CGF).getPointer(), Ctx.getUIntPtrType(),
|
||||
AddrLV.getAddress().getPointer(), Ctx.getUIntPtrType(),
|
||||
Ctx.getPointerType(DstType), Loc);
|
||||
Address TmpAddr =
|
||||
CGF.MakeNaturalAlignAddrLValue(CastedPtr, Ctx.getPointerType(DstType))
|
||||
.getAddress(CGF);
|
||||
.getAddress();
|
||||
return TmpAddr;
|
||||
}
|
||||
|
||||
|
@ -519,7 +519,7 @@ static llvm::Function *emitOutlinedFunctionPrologue(
|
|||
} else if (I->capturesVariable()) {
|
||||
const VarDecl *Var = I->getCapturedVar();
|
||||
QualType VarTy = Var->getType();
|
||||
Address ArgAddr = ArgLVal.getAddress(CGF);
|
||||
Address ArgAddr = ArgLVal.getAddress();
|
||||
if (ArgLVal.getType()->isLValueReferenceType()) {
|
||||
ArgAddr = CGF.EmitLoadOfReference(ArgLVal);
|
||||
} else if (!VarTy->isVariablyModifiedType() || !VarTy->isPointerType()) {
|
||||
|
@ -541,12 +541,12 @@ static llvm::Function *emitOutlinedFunctionPrologue(
|
|||
? castValueFromUintptr(
|
||||
CGF, I->getLocation(), FD->getType(),
|
||||
Args[Cnt]->getName(), ArgLVal)
|
||||
: ArgLVal.getAddress(CGF)}});
|
||||
: ArgLVal.getAddress()}});
|
||||
} else {
|
||||
// If 'this' is captured, load it into CXXThisValue.
|
||||
assert(I->capturesThis());
|
||||
CXXThisValue = CGF.EmitLoadOfScalar(ArgLVal, I->getLocation());
|
||||
LocalAddrs.insert({Args[Cnt], {nullptr, ArgLVal.getAddress(CGF)}});
|
||||
LocalAddrs.insert({Args[Cnt], {nullptr, ArgLVal.getAddress()}});
|
||||
}
|
||||
++Cnt;
|
||||
++I;
|
||||
|
@ -830,8 +830,8 @@ bool CodeGenFunction::EmitOMPFirstprivateClause(const OMPExecutableDirective &D,
|
|||
EmitAggregateAssign(Dest, OriginalLVal, Type);
|
||||
} else {
|
||||
EmitOMPAggregateAssign(
|
||||
Emission.getAllocatedAddress(),
|
||||
OriginalLVal.getAddress(*this), Type,
|
||||
Emission.getAllocatedAddress(), OriginalLVal.getAddress(),
|
||||
Type,
|
||||
[this, VDInit, Init](Address DestElement,
|
||||
Address SrcElement) {
|
||||
// Clean up any temporaries needed by the
|
||||
|
@ -849,7 +849,7 @@ bool CodeGenFunction::EmitOMPFirstprivateClause(const OMPExecutableDirective &D,
|
|||
return Emission.getAllocatedAddress();
|
||||
});
|
||||
} else {
|
||||
Address OriginalAddr = OriginalLVal.getAddress(*this);
|
||||
Address OriginalAddr = OriginalLVal.getAddress();
|
||||
IsRegistered = PrivateScope.addPrivate(
|
||||
OrigVD, [this, VDInit, OriginalAddr, VD]() {
|
||||
// Emit private VarDecl with copy init.
|
||||
|
@ -926,7 +926,7 @@ bool CodeGenFunction::EmitOMPCopyinClause(const OMPExecutableDirective &D) {
|
|||
"Copyin threadprivates should have been captured!");
|
||||
DeclRefExpr DRE(getContext(), const_cast<VarDecl *>(VD), true,
|
||||
(*IRef)->getType(), VK_LValue, (*IRef)->getExprLoc());
|
||||
MasterAddr = EmitLValue(&DRE).getAddress(*this);
|
||||
MasterAddr = EmitLValue(&DRE).getAddress();
|
||||
LocalDeclMap.erase(VD);
|
||||
} else {
|
||||
MasterAddr =
|
||||
|
@ -935,7 +935,7 @@ bool CodeGenFunction::EmitOMPCopyinClause(const OMPExecutableDirective &D) {
|
|||
getContext().getDeclAlign(VD));
|
||||
}
|
||||
// Get the address of the threadprivate variable.
|
||||
Address PrivateAddr = EmitLValue(*IRef).getAddress(*this);
|
||||
Address PrivateAddr = EmitLValue(*IRef).getAddress();
|
||||
if (CopiedVars.size() == 1) {
|
||||
// At first check if current thread is a master thread. If it is, no
|
||||
// need to copy data.
|
||||
|
@ -1003,7 +1003,7 @@ bool CodeGenFunction::EmitOMPLastprivateClauseInit(
|
|||
/*RefersToEnclosingVariableOrCapture=*/
|
||||
CapturedStmtInfo->lookup(OrigVD) != nullptr,
|
||||
(*IRef)->getType(), VK_LValue, (*IRef)->getExprLoc());
|
||||
return EmitLValue(&DRE).getAddress(*this);
|
||||
return EmitLValue(&DRE).getAddress();
|
||||
});
|
||||
// Check if the variable is also a firstprivate: in this case IInit is
|
||||
// not generated. Initialization of this variable will happen in codegen
|
||||
|
@ -1160,8 +1160,8 @@ void CodeGenFunction::EmitOMPReductionClauseInit(
|
|||
if (isaOMPArraySectionExpr && Type->isVariablyModifiedType()) {
|
||||
// Store the address of the original variable associated with the LHS
|
||||
// implicit variable.
|
||||
PrivateScope.addPrivate(LHSVD, [&RedCG, Count, this]() {
|
||||
return RedCG.getSharedLValue(Count).getAddress(*this);
|
||||
PrivateScope.addPrivate(LHSVD, [&RedCG, Count]() {
|
||||
return RedCG.getSharedLValue(Count).getAddress();
|
||||
});
|
||||
PrivateScope.addPrivate(
|
||||
RHSVD, [this, PrivateVD]() { return GetAddrOfLocalVar(PrivateVD); });
|
||||
|
@ -1169,8 +1169,8 @@ void CodeGenFunction::EmitOMPReductionClauseInit(
|
|||
isa<ArraySubscriptExpr>(IRef)) {
|
||||
// Store the address of the original variable associated with the LHS
|
||||
// implicit variable.
|
||||
PrivateScope.addPrivate(LHSVD, [&RedCG, Count, this]() {
|
||||
return RedCG.getSharedLValue(Count).getAddress(*this);
|
||||
PrivateScope.addPrivate(LHSVD, [&RedCG, Count]() {
|
||||
return RedCG.getSharedLValue(Count).getAddress();
|
||||
});
|
||||
PrivateScope.addPrivate(RHSVD, [this, PrivateVD, RHSVD]() {
|
||||
return Builder.CreateElementBitCast(GetAddrOfLocalVar(PrivateVD),
|
||||
|
@ -1180,7 +1180,7 @@ void CodeGenFunction::EmitOMPReductionClauseInit(
|
|||
} else {
|
||||
QualType Type = PrivateVD->getType();
|
||||
bool IsArray = getContext().getAsArrayType(Type) != nullptr;
|
||||
Address OriginalAddr = RedCG.getSharedLValue(Count).getAddress(*this);
|
||||
Address OriginalAddr = RedCG.getSharedLValue(Count).getAddress();
|
||||
// Store the address of the original variable associated with the LHS
|
||||
// implicit variable.
|
||||
if (IsArray) {
|
||||
|
@ -1529,7 +1529,7 @@ void CodeGenFunction::EmitOMPLinearClauseFinal(
|
|||
DeclRefExpr DRE(getContext(), const_cast<VarDecl *>(OrigVD),
|
||||
CapturedStmtInfo->lookup(OrigVD) != nullptr,
|
||||
(*IC)->getType(), VK_LValue, (*IC)->getExprLoc());
|
||||
Address OrigAddr = EmitLValue(&DRE).getAddress(*this);
|
||||
Address OrigAddr = EmitLValue(&DRE).getAddress();
|
||||
CodeGenFunction::OMPPrivateScope VarScope(*this);
|
||||
VarScope.addPrivate(OrigVD, [OrigAddr]() { return OrigAddr; });
|
||||
(void)VarScope.Privatize();
|
||||
|
@ -1599,7 +1599,7 @@ void CodeGenFunction::EmitOMPPrivateLoopCounters(
|
|||
DeclRefExpr DRE(getContext(), const_cast<VarDecl *>(VD),
|
||||
LocalDeclMap.count(VD) || CapturedStmtInfo->lookup(VD),
|
||||
E->getType(), VK_LValue, E->getExprLoc());
|
||||
return EmitLValue(&DRE).getAddress(*this);
|
||||
return EmitLValue(&DRE).getAddress();
|
||||
});
|
||||
} else {
|
||||
(void)LoopScope.addPrivate(PrivateVD, [&VarEmission]() {
|
||||
|
@ -1762,13 +1762,12 @@ void CodeGenFunction::EmitOMPSimdFinal(
|
|||
}
|
||||
Address OrigAddr = Address::invalid();
|
||||
if (CED) {
|
||||
OrigAddr =
|
||||
EmitLValue(CED->getInit()->IgnoreImpCasts()).getAddress(*this);
|
||||
OrigAddr = EmitLValue(CED->getInit()->IgnoreImpCasts()).getAddress();
|
||||
} else {
|
||||
DeclRefExpr DRE(getContext(), const_cast<VarDecl *>(PrivateVD),
|
||||
/*RefersToEnclosingVariableOrCapture=*/false,
|
||||
(*IPC)->getType(), VK_LValue, (*IPC)->getExprLoc());
|
||||
OrigAddr = EmitLValue(&DRE).getAddress(*this);
|
||||
OrigAddr = EmitLValue(&DRE).getAddress();
|
||||
}
|
||||
OMPPrivateScope VarScope(*this);
|
||||
VarScope.addPrivate(OrigVD, [OrigAddr]() { return OrigAddr; });
|
||||
|
@ -2278,16 +2277,14 @@ static void emitDistributeParallelForDistributeInnerBoundParams(
|
|||
const auto &Dir = cast<OMPLoopDirective>(S);
|
||||
LValue LB =
|
||||
CGF.EmitLValue(cast<DeclRefExpr>(Dir.getCombinedLowerBoundVariable()));
|
||||
llvm::Value *LBCast =
|
||||
CGF.Builder.CreateIntCast(CGF.Builder.CreateLoad(LB.getAddress(CGF)),
|
||||
CGF.SizeTy, /*isSigned=*/false);
|
||||
llvm::Value *LBCast = CGF.Builder.CreateIntCast(
|
||||
CGF.Builder.CreateLoad(LB.getAddress()), CGF.SizeTy, /*isSigned=*/false);
|
||||
CapturedVars.push_back(LBCast);
|
||||
LValue UB =
|
||||
CGF.EmitLValue(cast<DeclRefExpr>(Dir.getCombinedUpperBoundVariable()));
|
||||
|
||||
llvm::Value *UBCast =
|
||||
CGF.Builder.CreateIntCast(CGF.Builder.CreateLoad(UB.getAddress(CGF)),
|
||||
CGF.SizeTy, /*isSigned=*/false);
|
||||
llvm::Value *UBCast = CGF.Builder.CreateIntCast(
|
||||
CGF.Builder.CreateLoad(UB.getAddress()), CGF.SizeTy, /*isSigned=*/false);
|
||||
CapturedVars.push_back(UBCast);
|
||||
}
|
||||
|
||||
|
@ -2524,8 +2521,8 @@ bool CodeGenFunction::EmitOMPWorksharingLoop(
|
|||
// one chunk is distributed to each thread. Note that the size of
|
||||
// the chunks is unspecified in this case.
|
||||
CGOpenMPRuntime::StaticRTInput StaticInit(
|
||||
IVSize, IVSigned, Ordered, IL.getAddress(CGF),
|
||||
LB.getAddress(CGF), UB.getAddress(CGF), ST.getAddress(CGF),
|
||||
IVSize, IVSigned, Ordered, IL.getAddress(), LB.getAddress(),
|
||||
UB.getAddress(), ST.getAddress(),
|
||||
StaticChunkedOne ? Chunk : nullptr);
|
||||
CGF.CGM.getOpenMPRuntime().emitForStaticInit(
|
||||
CGF, S.getBeginLoc(), S.getDirectiveKind(), ScheduleKind,
|
||||
|
@ -2574,9 +2571,9 @@ bool CodeGenFunction::EmitOMPWorksharingLoop(
|
|||
ScheduleKind.M2 == OMPC_SCHEDULE_MODIFIER_monotonic;
|
||||
// Emit the outer loop, which requests its work chunk [LB..UB] from
|
||||
// runtime and runs the inner loop to process it.
|
||||
const OMPLoopArguments LoopArguments(
|
||||
LB.getAddress(*this), UB.getAddress(*this), ST.getAddress(*this),
|
||||
IL.getAddress(*this), Chunk, EUB);
|
||||
const OMPLoopArguments LoopArguments(LB.getAddress(), UB.getAddress(),
|
||||
ST.getAddress(), IL.getAddress(),
|
||||
Chunk, EUB);
|
||||
EmitOMPForOuterLoop(ScheduleKind, IsMonotonic, S, LoopScope, Ordered,
|
||||
LoopArguments, CGDispatchBounds);
|
||||
}
|
||||
|
@ -2780,8 +2777,8 @@ void CodeGenFunction::EmitSections(const OMPExecutableDirective &S) {
|
|||
OpenMPScheduleTy ScheduleKind;
|
||||
ScheduleKind.Schedule = OMPC_SCHEDULE_static;
|
||||
CGOpenMPRuntime::StaticRTInput StaticInit(
|
||||
/*IVSize=*/32, /*IVSigned=*/true, /*Ordered=*/false, IL.getAddress(CGF),
|
||||
LB.getAddress(CGF), UB.getAddress(CGF), ST.getAddress(CGF));
|
||||
/*IVSize=*/32, /*IVSigned=*/true, /*Ordered=*/false, IL.getAddress(),
|
||||
LB.getAddress(), UB.getAddress(), ST.getAddress());
|
||||
CGF.CGM.getOpenMPRuntime().emitForStaticInit(
|
||||
CGF, S.getBeginLoc(), S.getDirectiveKind(), ScheduleKind, StaticInit);
|
||||
// UB = min(UB, GlobalUB);
|
||||
|
@ -3115,7 +3112,7 @@ void CodeGenFunction::EmitOMPTaskBasedDirective(
|
|||
Pair.second->getType(), VK_LValue,
|
||||
Pair.second->getExprLoc());
|
||||
Scope.addPrivate(Pair.first, [&CGF, &DRE]() {
|
||||
return CGF.EmitLValue(&DRE).getAddress(CGF);
|
||||
return CGF.EmitLValue(&DRE).getAddress();
|
||||
});
|
||||
}
|
||||
for (const auto &Pair : PrivatePtrs) {
|
||||
|
@ -3573,8 +3570,8 @@ void CodeGenFunction::EmitOMPDistributeLoop(const OMPLoopDirective &S,
|
|||
if (isOpenMPSimdDirective(S.getDirectiveKind()))
|
||||
EmitOMPSimdInit(S, /*IsMonotonic=*/true);
|
||||
CGOpenMPRuntime::StaticRTInput StaticInit(
|
||||
IVSize, IVSigned, /* Ordered = */ false, IL.getAddress(*this),
|
||||
LB.getAddress(*this), UB.getAddress(*this), ST.getAddress(*this),
|
||||
IVSize, IVSigned, /* Ordered = */ false, IL.getAddress(),
|
||||
LB.getAddress(), UB.getAddress(), ST.getAddress(),
|
||||
StaticChunked ? Chunk : nullptr);
|
||||
RT.emitDistributeStaticInit(*this, S.getBeginLoc(), ScheduleKind,
|
||||
StaticInit);
|
||||
|
@ -3640,8 +3637,8 @@ void CodeGenFunction::EmitOMPDistributeLoop(const OMPLoopDirective &S,
|
|||
// Emit the outer loop, which requests its work chunk [LB..UB] from
|
||||
// runtime and runs the inner loop to process it.
|
||||
const OMPLoopArguments LoopArguments = {
|
||||
LB.getAddress(*this), UB.getAddress(*this), ST.getAddress(*this),
|
||||
IL.getAddress(*this), Chunk};
|
||||
LB.getAddress(), UB.getAddress(), ST.getAddress(), IL.getAddress(),
|
||||
Chunk};
|
||||
EmitOMPDistributeOuterLoop(ScheduleKind, S, LoopScope, LoopArguments,
|
||||
CodeGenLoop);
|
||||
}
|
||||
|
@ -3841,11 +3838,11 @@ static std::pair<bool, RValue> emitOMPAtomicRMW(CodeGenFunction &CGF, LValue X,
|
|||
// expression is simple and atomic is allowed for the given type for the
|
||||
// target platform.
|
||||
if (BO == BO_Comma || !Update.isScalar() ||
|
||||
!Update.getScalarVal()->getType()->isIntegerTy() || !X.isSimple() ||
|
||||
(!isa<llvm::ConstantInt>(Update.getScalarVal()) &&
|
||||
(Update.getScalarVal()->getType() !=
|
||||
X.getAddress(CGF).getElementType())) ||
|
||||
!X.getAddress(CGF).getElementType()->isIntegerTy() ||
|
||||
!Update.getScalarVal()->getType()->isIntegerTy() ||
|
||||
!X.isSimple() || (!isa<llvm::ConstantInt>(Update.getScalarVal()) &&
|
||||
(Update.getScalarVal()->getType() !=
|
||||
X.getAddress().getElementType())) ||
|
||||
!X.getAddress().getElementType()->isIntegerTy() ||
|
||||
!Context.getTargetInfo().hasBuiltinAtomic(
|
||||
Context.getTypeSize(X.getType()), Context.toBits(X.getAlignment())))
|
||||
return std::make_pair(false, RValue::get(nullptr));
|
||||
|
@ -3917,11 +3914,11 @@ static std::pair<bool, RValue> emitOMPAtomicRMW(CodeGenFunction &CGF, LValue X,
|
|||
llvm::Value *UpdateVal = Update.getScalarVal();
|
||||
if (auto *IC = dyn_cast<llvm::ConstantInt>(UpdateVal)) {
|
||||
UpdateVal = CGF.Builder.CreateIntCast(
|
||||
IC, X.getAddress(CGF).getElementType(),
|
||||
IC, X.getAddress().getElementType(),
|
||||
X.getType()->hasSignedIntegerRepresentation());
|
||||
}
|
||||
llvm::Value *Res =
|
||||
CGF.Builder.CreateAtomicRMW(RMWOp, X.getPointer(CGF), UpdateVal, AO);
|
||||
CGF.Builder.CreateAtomicRMW(RMWOp, X.getPointer(), UpdateVal, AO);
|
||||
return std::make_pair(true, RValue::get(Res));
|
||||
}
|
||||
|
||||
|
@ -5284,7 +5281,7 @@ void CodeGenFunction::EmitSimpleOMPExecutableDirective(
|
|||
const OMPExecutableDirective &D) {
|
||||
if (!D.hasAssociatedStmt() || !D.getAssociatedStmt())
|
||||
return;
|
||||
auto &&CodeGen = [&D, this](CodeGenFunction &CGF, PrePostActionTy &Action) {
|
||||
auto &&CodeGen = [&D](CodeGenFunction &CGF, PrePostActionTy &Action) {
|
||||
if (isOpenMPSimdDirective(D.getDirectiveKind())) {
|
||||
emitOMPSimdRegion(CGF, cast<OMPLoopDirective>(D), Action);
|
||||
} else {
|
||||
|
@ -5295,7 +5292,7 @@ void CodeGenFunction::EmitSimpleOMPExecutableDirective(
|
|||
if (!VD->hasLocalStorage() && !CGF.LocalDeclMap.count(VD)) {
|
||||
LValue GlobLVal = CGF.EmitLValue(E);
|
||||
LoopGlobals.addPrivate(
|
||||
VD, [&GlobLVal, this]() { return GlobLVal.getAddress(*this); });
|
||||
VD, [&GlobLVal]() { return GlobLVal.getAddress(); });
|
||||
}
|
||||
if (isa<OMPCapturedExprDecl>(VD)) {
|
||||
// Emit only those that were not explicitly referenced in clauses.
|
||||
|
|
|
@ -29,7 +29,6 @@ namespace llvm {
|
|||
namespace clang {
|
||||
namespace CodeGen {
|
||||
class AggValueSlot;
|
||||
class CodeGenFunction;
|
||||
struct CGBitFieldInfo;
|
||||
|
||||
/// RValue - This trivial value class is used to represent the result of an
|
||||
|
@ -320,13 +319,11 @@ public:
|
|||
void setBaseInfo(LValueBaseInfo Info) { BaseInfo = Info; }
|
||||
|
||||
// simple lvalue
|
||||
llvm::Value *getPointer(CodeGenFunction &CGF) const {
|
||||
llvm::Value *getPointer() const {
|
||||
assert(isSimple());
|
||||
return V;
|
||||
}
|
||||
Address getAddress(CodeGenFunction &CGF) const {
|
||||
return Address(getPointer(CGF), getAlignment());
|
||||
}
|
||||
Address getAddress() const { return Address(getPointer(), getAlignment()); }
|
||||
void setAddress(Address address) {
|
||||
assert(isSimple());
|
||||
V = address.getPointer();
|
||||
|
@ -430,8 +427,8 @@ public:
|
|||
return R;
|
||||
}
|
||||
|
||||
RValue asAggregateRValue(CodeGenFunction &CGF) const {
|
||||
return RValue::getAggregate(getAddress(CGF), isVolatileQualified());
|
||||
RValue asAggregateRValue() const {
|
||||
return RValue::getAggregate(getAddress(), isVolatileQualified());
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -539,12 +536,14 @@ public:
|
|||
return AV;
|
||||
}
|
||||
|
||||
static AggValueSlot
|
||||
forLValue(const LValue &LV, CodeGenFunction &CGF, IsDestructed_t isDestructed,
|
||||
NeedsGCBarriers_t needsGC, IsAliased_t isAliased,
|
||||
Overlap_t mayOverlap, IsZeroed_t isZeroed = IsNotZeroed,
|
||||
IsSanitizerChecked_t isChecked = IsNotSanitizerChecked) {
|
||||
return forAddr(LV.getAddress(CGF), LV.getQuals(), isDestructed, needsGC,
|
||||
static AggValueSlot forLValue(const LValue &LV,
|
||||
IsDestructed_t isDestructed,
|
||||
NeedsGCBarriers_t needsGC,
|
||||
IsAliased_t isAliased,
|
||||
Overlap_t mayOverlap,
|
||||
IsZeroed_t isZeroed = IsNotZeroed,
|
||||
IsSanitizerChecked_t isChecked = IsNotSanitizerChecked) {
|
||||
return forAddr(LV.getAddress(), LV.getQuals(), isDestructed, needsGC,
|
||||
isAliased, mayOverlap, isZeroed, isChecked);
|
||||
}
|
||||
|
||||
|
|
|
@ -976,7 +976,7 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
|
|||
LValue ThisFieldLValue = EmitLValueForLambdaField(LambdaThisCaptureField);
|
||||
if (!LambdaThisCaptureField->getType()->isPointerType()) {
|
||||
// If the enclosing object was captured by value, just use its address.
|
||||
CXXThisValue = ThisFieldLValue.getAddress(*this).getPointer();
|
||||
CXXThisValue = ThisFieldLValue.getAddress().getPointer();
|
||||
} else {
|
||||
// Load the lvalue pointed to by the field, since '*this' was captured
|
||||
// by reference.
|
||||
|
@ -2013,11 +2013,11 @@ void CodeGenFunction::EmitVariablyModifiedType(QualType type) {
|
|||
Address CodeGenFunction::EmitVAListRef(const Expr* E) {
|
||||
if (getContext().getBuiltinVaListType()->isArrayType())
|
||||
return EmitPointerWithAlignment(E);
|
||||
return EmitLValue(E).getAddress(*this);
|
||||
return EmitLValue(E).getAddress();
|
||||
}
|
||||
|
||||
Address CodeGenFunction::EmitMSVAListRef(const Expr *E) {
|
||||
return EmitLValue(E).getAddress(*this);
|
||||
return EmitLValue(E).getAddress();
|
||||
}
|
||||
|
||||
void CodeGenFunction::EmitDeclRefExprDbgValue(const DeclRefExpr *E,
|
||||
|
|
|
@ -1225,7 +1225,7 @@ void X86_32TargetCodeGenInfo::addReturnRegisterOutputs(
|
|||
ResultTruncRegTypes.push_back(CoerceTy);
|
||||
|
||||
// Coerce the integer by bitcasting the return slot pointer.
|
||||
ReturnSlot.setAddress(CGF.Builder.CreateBitCast(ReturnSlot.getAddress(CGF),
|
||||
ReturnSlot.setAddress(CGF.Builder.CreateBitCast(ReturnSlot.getAddress(),
|
||||
CoerceTy->getPointerTo()));
|
||||
ResultRegDests.push_back(ReturnSlot);
|
||||
|
||||
|
|
Loading…
Reference in New Issue