Skip to content

Commit f139ae3

Browse files
committed
[NFC] Pass a reference to CodeGenFunction to methods of LValue and
AggValueSlot This reapplies 8a5b7c3 after a null dereference bug in CGOpenMPRuntime::emitUserDefinedMapper. Original commit message: This is needed for the pointer authentication work we plan to do in the near future. https://github.com/apple/llvm-project/blob/a63a81bd9911f87a0b5dcd5bdd7ccdda7124af87/clang/docs/PointerAuthentication.rst
1 parent 0cfb4a6 commit f139ae3

21 files changed

+397
-382
lines changed

clang/lib/CodeGen/CGAtomic.cpp

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ namespace {
139139
const LValue &getAtomicLValue() const { return LVal; }
140140
llvm::Value *getAtomicPointer() const {
141141
if (LVal.isSimple())
142-
return LVal.getPointer();
142+
return LVal.getPointer(CGF);
143143
else if (LVal.isBitField())
144144
return LVal.getBitFieldPointer();
145145
else if (LVal.isVectorElt())
@@ -343,7 +343,7 @@ bool AtomicInfo::requiresMemSetZero(llvm::Type *type) const {
343343

344344
bool AtomicInfo::emitMemSetZeroIfNecessary() const {
345345
assert(LVal.isSimple());
346-
llvm::Value *addr = LVal.getPointer();
346+
llvm::Value *addr = LVal.getPointer(CGF);
347347
if (!requiresMemSetZero(addr->getType()->getPointerElementType()))
348348
return false;
349349

@@ -1628,7 +1628,7 @@ Address AtomicInfo::materializeRValue(RValue rvalue) const {
16281628
LValue TempLV = CGF.MakeAddrLValue(CreateTempAlloca(), getAtomicType());
16291629
AtomicInfo Atomics(CGF, TempLV);
16301630
Atomics.emitCopyIntoMemory(rvalue);
1631-
return TempLV.getAddress();
1631+
return TempLV.getAddress(CGF);
16321632
}
16331633

16341634
llvm::Value *AtomicInfo::convertRValueToInt(RValue RVal) const {
@@ -1975,8 +1975,8 @@ void CodeGenFunction::EmitAtomicStore(RValue rvalue, LValue dest,
19751975
// If this is an aggregate r-value, it should agree in type except
19761976
// maybe for address-space qualification.
19771977
assert(!rvalue.isAggregate() ||
1978-
rvalue.getAggregateAddress().getElementType()
1979-
== dest.getAddress().getElementType());
1978+
rvalue.getAggregateAddress().getElementType() ==
1979+
dest.getAddress(*this).getElementType());
19801980

19811981
AtomicInfo atomics(*this, dest);
19821982
LValue LVal = atomics.getAtomicLValue();
@@ -2043,10 +2043,10 @@ std::pair<RValue, llvm::Value *> CodeGenFunction::EmitAtomicCompareExchange(
20432043
// maybe for address-space qualification.
20442044
assert(!Expected.isAggregate() ||
20452045
Expected.getAggregateAddress().getElementType() ==
2046-
Obj.getAddress().getElementType());
2046+
Obj.getAddress(*this).getElementType());
20472047
assert(!Desired.isAggregate() ||
20482048
Desired.getAggregateAddress().getElementType() ==
2049-
Obj.getAddress().getElementType());
2049+
Obj.getAddress(*this).getElementType());
20502050
AtomicInfo Atomics(*this, Obj);
20512051

20522052
return Atomics.EmitAtomicCompareExchange(Expected, Desired, Success, Failure,
@@ -2086,13 +2086,11 @@ void CodeGenFunction::EmitAtomicInit(Expr *init, LValue dest) {
20862086
}
20872087

20882088
// Evaluate the expression directly into the destination.
2089-
AggValueSlot slot = AggValueSlot::forLValue(dest,
2090-
AggValueSlot::IsNotDestructed,
2091-
AggValueSlot::DoesNotNeedGCBarriers,
2092-
AggValueSlot::IsNotAliased,
2093-
AggValueSlot::DoesNotOverlap,
2094-
Zeroed ? AggValueSlot::IsZeroed :
2095-
AggValueSlot::IsNotZeroed);
2089+
AggValueSlot slot = AggValueSlot::forLValue(
2090+
dest, *this, AggValueSlot::IsNotDestructed,
2091+
AggValueSlot::DoesNotNeedGCBarriers, AggValueSlot::IsNotAliased,
2092+
AggValueSlot::DoesNotOverlap,
2093+
Zeroed ? AggValueSlot::IsZeroed : AggValueSlot::IsNotZeroed);
20962094

20972095
EmitAggExpr(init, slot);
20982096
return;

clang/lib/CodeGen/CGBlocks.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1076,7 +1076,7 @@ llvm::Value *CodeGenFunction::EmitBlockLiteral(const CGBlockInfo &blockInfo) {
10761076
/*RefersToEnclosingVariableOrCapture*/ CI.isNested(),
10771077
type.getNonReferenceType(), VK_LValue,
10781078
SourceLocation());
1079-
src = EmitDeclRefLValue(&declRef).getAddress();
1079+
src = EmitDeclRefLValue(&declRef).getAddress(*this);
10801080
};
10811081

10821082
// For byrefs, we just write the pointer to the byref struct into

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3367,7 +3367,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
33673367
return RValue::get(Carry);
33683368
}
33693369
case Builtin::BI__builtin_addressof:
3370-
return RValue::get(EmitLValue(E->getArg(0)).getPointer());
3370+
return RValue::get(EmitLValue(E->getArg(0)).getPointer(*this));
33713371
case Builtin::BI__builtin_operator_new:
33723372
return EmitBuiltinNewDeleteCall(
33733373
E->getCallee()->getType()->castAs<FunctionProtoType>(), E, false);
@@ -3750,8 +3750,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
37503750
llvm::Value *Queue = EmitScalarExpr(E->getArg(0));
37513751
llvm::Value *Flags = EmitScalarExpr(E->getArg(1));
37523752
LValue NDRangeL = EmitAggExprToLValue(E->getArg(2));
3753-
llvm::Value *Range = NDRangeL.getAddress().getPointer();
3754-
llvm::Type *RangeTy = NDRangeL.getAddress().getType();
3753+
llvm::Value *Range = NDRangeL.getAddress(*this).getPointer();
3754+
llvm::Type *RangeTy = NDRangeL.getAddress(*this).getType();
37553755

37563756
if (NumArgs == 4) {
37573757
// The most basic form of the call with parameters:
@@ -3770,7 +3770,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
37703770
Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
37713771

37723772
AttrBuilder B;
3773-
B.addByValAttr(NDRangeL.getAddress().getElementType());
3773+
B.addByValAttr(NDRangeL.getAddress(*this).getElementType());
37743774
llvm::AttributeList ByValAttrSet =
37753775
llvm::AttributeList::get(CGM.getModule().getContext(), 3U, B);
37763776

@@ -3955,7 +3955,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
39553955
llvm::Type *GenericVoidPtrTy = Builder.getInt8PtrTy(
39563956
getContext().getTargetAddressSpace(LangAS::opencl_generic));
39573957
LValue NDRangeL = EmitAggExprToLValue(E->getArg(0));
3958-
llvm::Value *NDRange = NDRangeL.getAddress().getPointer();
3958+
llvm::Value *NDRange = NDRangeL.getAddress(*this).getPointer();
39593959
auto Info =
39603960
CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*this, E->getArg(1));
39613961
Value *Kernel = Builder.CreatePointerCast(Info.Kernel, GenericVoidPtrTy);
@@ -9470,14 +9470,14 @@ Value *CodeGenFunction::EmitBPFBuiltinExpr(unsigned BuiltinID,
94709470
if (!getDebugInfo()) {
94719471
CGM.Error(E->getExprLoc(), "using builtin_preserve_field_info() without -g");
94729472
return IsBitField ? EmitLValue(Arg).getBitFieldPointer()
9473-
: EmitLValue(Arg).getPointer();
9473+
: EmitLValue(Arg).getPointer(*this);
94749474
}
94759475

94769476
// Enable underlying preserve_*_access_index() generation.
94779477
bool OldIsInPreservedAIRegion = IsInPreservedAIRegion;
94789478
IsInPreservedAIRegion = true;
94799479
Value *FieldAddr = IsBitField ? EmitLValue(Arg).getBitFieldPointer()
9480-
: EmitLValue(Arg).getPointer();
9480+
: EmitLValue(Arg).getPointer(*this);
94819481
IsInPreservedAIRegion = OldIsInPreservedAIRegion;
94829482

94839483
ConstantInt *C = cast<ConstantInt>(EmitScalarExpr(E->getArg(1)));

clang/lib/CodeGen/CGCall.cpp

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,13 +1020,13 @@ void CodeGenFunction::ExpandTypeFromArgs(
10201020

10211021
auto Exp = getTypeExpansion(Ty, getContext());
10221022
if (auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
1023-
forConstantArrayExpansion(*this, CAExp, LV.getAddress(),
1024-
[&](Address EltAddr) {
1025-
LValue LV = MakeAddrLValue(EltAddr, CAExp->EltTy);
1026-
ExpandTypeFromArgs(CAExp->EltTy, LV, AI);
1027-
});
1023+
forConstantArrayExpansion(
1024+
*this, CAExp, LV.getAddress(*this), [&](Address EltAddr) {
1025+
LValue LV = MakeAddrLValue(EltAddr, CAExp->EltTy);
1026+
ExpandTypeFromArgs(CAExp->EltTy, LV, AI);
1027+
});
10281028
} else if (auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
1029-
Address This = LV.getAddress();
1029+
Address This = LV.getAddress(*this);
10301030
for (const CXXBaseSpecifier *BS : RExp->Bases) {
10311031
// Perform a single step derived-to-base conversion.
10321032
Address Base =
@@ -1057,7 +1057,7 @@ void CodeGenFunction::ExpandTypeToArgs(
10571057
SmallVectorImpl<llvm::Value *> &IRCallArgs, unsigned &IRCallArgPos) {
10581058
auto Exp = getTypeExpansion(Ty, getContext());
10591059
if (auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
1060-
Address Addr = Arg.hasLValue() ? Arg.getKnownLValue().getAddress()
1060+
Address Addr = Arg.hasLValue() ? Arg.getKnownLValue().getAddress(*this)
10611061
: Arg.getKnownRValue().getAggregateAddress();
10621062
forConstantArrayExpansion(
10631063
*this, CAExp, Addr, [&](Address EltAddr) {
@@ -1068,7 +1068,7 @@ void CodeGenFunction::ExpandTypeToArgs(
10681068
IRCallArgPos);
10691069
});
10701070
} else if (auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
1071-
Address This = Arg.hasLValue() ? Arg.getKnownLValue().getAddress()
1071+
Address This = Arg.hasLValue() ? Arg.getKnownLValue().getAddress(*this)
10721072
: Arg.getKnownRValue().getAggregateAddress();
10731073
for (const CXXBaseSpecifier *BS : RExp->Bases) {
10741074
// Perform a single step derived-to-base conversion.
@@ -3138,7 +3138,7 @@ static bool isProvablyNull(llvm::Value *addr) {
31383138
static void emitWriteback(CodeGenFunction &CGF,
31393139
const CallArgList::Writeback &writeback) {
31403140
const LValue &srcLV = writeback.Source;
3141-
Address srcAddr = srcLV.getAddress();
3141+
Address srcAddr = srcLV.getAddress(CGF);
31423142
assert(!isProvablyNull(srcAddr.getPointer()) &&
31433143
"shouldn't have writeback for provably null argument");
31443144

@@ -3246,7 +3246,7 @@ static void emitWritebackArg(CodeGenFunction &CGF, CallArgList &args,
32463246
CRE->getSubExpr()->getType()->castAs<PointerType>()->getPointeeType();
32473247
srcLV = CGF.MakeAddrLValue(srcAddr, srcAddrType);
32483248
}
3249-
Address srcAddr = srcLV.getAddress();
3249+
Address srcAddr = srcLV.getAddress(CGF);
32503250

32513251
// The dest and src types don't necessarily match in LLVM terms
32523252
// because of the crazy ObjC compatibility rules.
@@ -3560,7 +3560,7 @@ RValue CallArg::getRValue(CodeGenFunction &CGF) const {
35603560
CGF.EmitAggregateCopy(Copy, LV, Ty, AggValueSlot::DoesNotOverlap,
35613561
LV.isVolatile());
35623562
IsUsed = true;
3563-
return RValue::getAggregate(Copy.getAddress());
3563+
return RValue::getAggregate(Copy.getAddress(CGF));
35643564
}
35653565

35663566
void CallArg::copyInto(CodeGenFunction &CGF, Address Addr) const {
@@ -3570,7 +3570,7 @@ void CallArg::copyInto(CodeGenFunction &CGF, Address Addr) const {
35703570
else if (!HasLV && RV.isComplex())
35713571
CGF.EmitStoreOfComplex(RV.getComplexVal(), Dst, /*init=*/true);
35723572
else {
3573-
auto Addr = HasLV ? LV.getAddress() : RV.getAggregateAddress();
3573+
auto Addr = HasLV ? LV.getAddress(CGF) : RV.getAggregateAddress();
35743574
LValue SrcLV = CGF.MakeAddrLValue(Addr, Ty);
35753575
// We assume that call args are never copied into subobjects.
35763576
CGF.EmitAggregateCopy(Dst, SrcLV, Ty, AggValueSlot::DoesNotOverlap,
@@ -3933,7 +3933,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
39333933
if (I->isAggregate()) {
39343934
// Replace the placeholder with the appropriate argument slot GEP.
39353935
Address Addr = I->hasLValue()
3936-
? I->getKnownLValue().getAddress()
3936+
? I->getKnownLValue().getAddress(*this)
39373937
: I->getKnownRValue().getAggregateAddress();
39383938
llvm::Instruction *Placeholder =
39393939
cast<llvm::Instruction>(Addr.getPointer());
@@ -3978,7 +3978,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
39783978
// 3. If the argument is byval, but RV is not located in default
39793979
// or alloca address space.
39803980
Address Addr = I->hasLValue()
3981-
? I->getKnownLValue().getAddress()
3981+
? I->getKnownLValue().getAddress(*this)
39823982
: I->getKnownRValue().getAggregateAddress();
39833983
llvm::Value *V = Addr.getPointer();
39843984
CharUnits Align = ArgInfo.getIndirectAlign();
@@ -4065,7 +4065,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
40654065
V = I->getKnownRValue().getScalarVal();
40664066
else
40674067
V = Builder.CreateLoad(
4068-
I->hasLValue() ? I->getKnownLValue().getAddress()
4068+
I->hasLValue() ? I->getKnownLValue().getAddress(*this)
40694069
: I->getKnownRValue().getAggregateAddress());
40704070

40714071
// Implement swifterror by copying into a new swifterror argument.
@@ -4108,7 +4108,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
41084108
Src = CreateMemTemp(I->Ty, "coerce");
41094109
I->copyInto(*this, Src);
41104110
} else {
4111-
Src = I->hasLValue() ? I->getKnownLValue().getAddress()
4111+
Src = I->hasLValue() ? I->getKnownLValue().getAddress(*this)
41124112
: I->getKnownRValue().getAggregateAddress();
41134113
}
41144114

@@ -4163,7 +4163,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
41634163
Address addr = Address::invalid();
41644164
Address AllocaAddr = Address::invalid();
41654165
if (I->isAggregate()) {
4166-
addr = I->hasLValue() ? I->getKnownLValue().getAddress()
4166+
addr = I->hasLValue() ? I->getKnownLValue().getAddress(*this)
41674167
: I->getKnownRValue().getAggregateAddress();
41684168

41694169
} else {

clang/lib/CodeGen/CGClass.cpp

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,7 @@ static void EmitMemberInitializer(CodeGenFunction &CGF,
657657
// the constructor.
658658
QualType::DestructionKind dtorKind = FieldType.isDestructedType();
659659
if (CGF.needsEHCleanup(dtorKind))
660-
CGF.pushEHDestroy(dtorKind, LHS.getAddress(), FieldType);
660+
CGF.pushEHDestroy(dtorKind, LHS.getAddress(CGF), FieldType);
661661
return;
662662
}
663663
}
@@ -681,16 +681,12 @@ void CodeGenFunction::EmitInitializerForField(FieldDecl *Field, LValue LHS,
681681
EmitComplexExprIntoLValue(Init, LHS, /*isInit*/ true);
682682
break;
683683
case TEK_Aggregate: {
684-
AggValueSlot Slot =
685-
AggValueSlot::forLValue(
686-
LHS,
687-
AggValueSlot::IsDestructed,
688-
AggValueSlot::DoesNotNeedGCBarriers,
689-
AggValueSlot::IsNotAliased,
690-
getOverlapForFieldInit(Field),
691-
AggValueSlot::IsNotZeroed,
692-
// Checks are made by the code that calls constructor.
693-
AggValueSlot::IsSanitizerChecked);
684+
AggValueSlot Slot = AggValueSlot::forLValue(
685+
LHS, *this, AggValueSlot::IsDestructed,
686+
AggValueSlot::DoesNotNeedGCBarriers, AggValueSlot::IsNotAliased,
687+
getOverlapForFieldInit(Field), AggValueSlot::IsNotZeroed,
688+
// Checks are made by the code that calls constructor.
689+
AggValueSlot::IsSanitizerChecked);
694690
EmitAggExpr(Init, Slot);
695691
break;
696692
}
@@ -700,7 +696,7 @@ void CodeGenFunction::EmitInitializerForField(FieldDecl *Field, LValue LHS,
700696
// later in the constructor.
701697
QualType::DestructionKind dtorKind = FieldType.isDestructedType();
702698
if (needsEHCleanup(dtorKind))
703-
pushEHDestroy(dtorKind, LHS.getAddress(), FieldType);
699+
pushEHDestroy(dtorKind, LHS.getAddress(*this), FieldType);
704700
}
705701

706702
/// Checks whether the given constructor is a valid subject for the
@@ -963,9 +959,10 @@ namespace {
963959
LValue SrcLV = CGF.MakeNaturalAlignAddrLValue(SrcPtr, RecordTy);
964960
LValue Src = CGF.EmitLValueForFieldInitialization(SrcLV, FirstField);
965961

966-
emitMemcpyIR(Dest.isBitField() ? Dest.getBitFieldAddress() : Dest.getAddress(),
967-
Src.isBitField() ? Src.getBitFieldAddress() : Src.getAddress(),
968-
MemcpySize);
962+
emitMemcpyIR(
963+
Dest.isBitField() ? Dest.getBitFieldAddress() : Dest.getAddress(CGF),
964+
Src.isBitField() ? Src.getBitFieldAddress() : Src.getAddress(CGF),
965+
MemcpySize);
969966
reset();
970967
}
971968

@@ -1119,7 +1116,7 @@ namespace {
11191116
continue;
11201117
LValue FieldLHS = LHS;
11211118
EmitLValueForAnyFieldInitialization(CGF, MemberInit, FieldLHS);
1122-
CGF.pushEHDestroy(dtorKind, FieldLHS.getAddress(), FieldType);
1119+
CGF.pushEHDestroy(dtorKind, FieldLHS.getAddress(CGF), FieldType);
11231120
}
11241121
}
11251122

@@ -1629,7 +1626,7 @@ namespace {
16291626
LValue LV = CGF.EmitLValueForField(ThisLV, field);
16301627
assert(LV.isSimple());
16311628

1632-
CGF.emitDestroy(LV.getAddress(), field->getType(), destroyer,
1629+
CGF.emitDestroy(LV.getAddress(CGF), field->getType(), destroyer,
16331630
flags.isForNormalCleanup() && useEHCleanupForArray);
16341631
}
16351632
};

0 commit comments

Comments
 (0)