Skip to content

Commit af96610

Browse files
committed
[Clang][CodeGen] Address review comments.
1 parent 9a9c7cf commit af96610

File tree

7 files changed

+31
-41
lines changed

7 files changed

+31
-41
lines changed

clang/lib/CodeGen/CGCXXABI.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,9 @@ CGCallee CGCXXABI::EmitLoadOfMemberFunctionPointer(
6060
return CGCallee::forDirect(FnPtr, FPT);
6161
}
6262

63-
llvm::Value *
64-
CGCXXABI::EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
65-
Address Base, llvm::Value *MemPtr,
66-
const MemberPointerType *MPT) {
63+
llvm::Value *CGCXXABI::EmitMemberDataPointerAddress(
64+
CodeGenFunction &CGF, const Expr *E, Address Base, llvm::Value *MemPtr,
65+
const MemberPointerType *MPT, bool IsInBounds) {
6766
ErrorUnsupportedABI(CGF, "loads of member pointers");
6867
llvm::Type *Ty =
6968
llvm::PointerType::get(CGF.getLLVMContext(), Base.getAddressSpace());

clang/lib/CodeGen/CGCXXABI.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ class CGCXXABI {
192192
virtual llvm::Value *
193193
EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
194194
Address Base, llvm::Value *MemPtr,
195-
const MemberPointerType *MPT);
195+
const MemberPointerType *MPT, bool IsInBounds);
196196

197197
/// Perform a derived-to-base, base-to-derived, or bitcast member
198198
/// pointer conversion.

clang/lib/CodeGen/CGClass.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -147,16 +147,13 @@ Address CodeGenFunction::LoadCXXThisAddress() {
147147
/// Emit the address of a field using a member data pointer.
148148
///
149149
/// \param E Only used for emergency diagnostics
150-
Address
151-
CodeGenFunction::EmitCXXMemberDataPointerAddress(const Expr *E, Address base,
152-
llvm::Value *memberPtr,
153-
const MemberPointerType *memberPtrType,
154-
LValueBaseInfo *BaseInfo,
155-
TBAAAccessInfo *TBAAInfo) {
150+
Address CodeGenFunction::EmitCXXMemberDataPointerAddress(
151+
const Expr *E, Address base, llvm::Value *memberPtr,
152+
const MemberPointerType *memberPtrType, bool IsInBounds,
153+
LValueBaseInfo *BaseInfo, TBAAAccessInfo *TBAAInfo) {
156154
// Ask the ABI to compute the actual address.
157-
llvm::Value *ptr =
158-
CGM.getCXXABI().EmitMemberDataPointerAddress(*this, E, base,
159-
memberPtr, memberPtrType);
155+
llvm::Value *ptr = CGM.getCXXABI().EmitMemberDataPointerAddress(
156+
*this, E, base, memberPtr, memberPtrType, IsInBounds);
160157

161158
QualType memberType = memberPtrType->getPointeeType();
162159
CharUnits memberAlign =

clang/lib/CodeGen/CGExpr.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -654,8 +654,8 @@ EmitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *M) {
654654

655655
case SubobjectAdjustment::MemberPointerAdjustment: {
656656
llvm::Value *Ptr = EmitScalarExpr(Adjustment.Ptr.RHS);
657-
Object = EmitCXXMemberDataPointerAddress(E, Object, Ptr,
658-
Adjustment.Ptr.MPT);
657+
Object = EmitCXXMemberDataPointerAddress(
658+
E, Object, Ptr, Adjustment.Ptr.MPT, /*IsInBounds=*/true);
659659
break;
660660
}
661661
}
@@ -6295,9 +6295,10 @@ EmitPointerToDataMemberBinaryExpr(const BinaryOperator *E) {
62956295

62966296
LValueBaseInfo BaseInfo;
62976297
TBAAAccessInfo TBAAInfo;
6298-
Address MemberAddr =
6299-
EmitCXXMemberDataPointerAddress(E, BaseAddr, OffsetV, MPT, &BaseInfo,
6300-
&TBAAInfo);
6298+
bool IsInBounds = !getLangOpts().PointerOverflowDefined &&
6299+
!isUnderlyingBasePointerConstantNull(E->getLHS());
6300+
Address MemberAddr = EmitCXXMemberDataPointerAddress(
6301+
E, BaseAddr, OffsetV, MPT, IsInBounds, &BaseInfo, &TBAAInfo);
63016302

63026303
return MakeAddrLValue(MemberAddr, MPT->getPointeeType(), BaseInfo, TBAAInfo);
63036304
}

clang/lib/CodeGen/CodeGenFunction.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4642,7 +4642,7 @@ class CodeGenFunction : public CodeGenTypeCache {
46424642
// Compute the object pointer.
46434643
Address EmitCXXMemberDataPointerAddress(
46444644
const Expr *E, Address base, llvm::Value *memberPtr,
4645-
const MemberPointerType *memberPtrType,
4645+
const MemberPointerType *memberPtrType, bool IsInBounds,
46464646
LValueBaseInfo *BaseInfo = nullptr, TBAAAccessInfo *TBAAInfo = nullptr);
46474647
RValue EmitCXXMemberPointerCallExpr(const CXXMemberCallExpr *E,
46484648
ReturnValueSlot ReturnValue,

clang/lib/CodeGen/ItaniumCXXABI.cpp

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -130,11 +130,10 @@ class ItaniumCXXABI : public CodeGen::CGCXXABI {
130130
llvm::Value *MemFnPtr,
131131
const MemberPointerType *MPT) override;
132132

133-
llvm::Value *
134-
EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
135-
Address Base,
136-
llvm::Value *MemPtr,
137-
const MemberPointerType *MPT) override;
133+
llvm::Value *EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
134+
Address Base, llvm::Value *MemPtr,
135+
const MemberPointerType *MPT,
136+
bool IsInBounds) override;
138137

139138
llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
140139
const CastExpr *E,
@@ -867,19 +866,16 @@ CGCallee ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
867866
/// base object.
868867
llvm::Value *ItaniumCXXABI::EmitMemberDataPointerAddress(
869868
CodeGenFunction &CGF, const Expr *E, Address Base, llvm::Value *MemPtr,
870-
const MemberPointerType *MPT) {
869+
const MemberPointerType *MPT, bool IsInBounds) {
871870
assert(MemPtr->getType() == CGM.PtrDiffTy);
872871

873872
CGBuilderTy &Builder = CGF.Builder;
874873

875874
// Apply the offset.
876-
// Specially, we don't add inbounds flags if the base pointer is a constant
877-
// null. This is a workaround for old-style container_of macros.
878875
llvm::Value *BaseAddr = Base.emitRawPointer(CGF);
879876
return Builder.CreateGEP(CGF.Int8Ty, BaseAddr, MemPtr, "memptr.offset",
880-
isa<llvm::ConstantPointerNull>(BaseAddr)
881-
? llvm::GEPNoWrapFlags::none()
882-
: llvm::GEPNoWrapFlags::inBounds());
877+
IsInBounds ? llvm::GEPNoWrapFlags::inBounds()
878+
: llvm::GEPNoWrapFlags::none());
883879
}
884880

885881
// See if it's possible to return a constant signed pointer.

clang/lib/CodeGen/MicrosoftCXXABI.cpp

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -689,10 +689,10 @@ class MicrosoftCXXABI : public CGCXXABI {
689689
llvm::Value *MemPtr,
690690
const MemberPointerType *MPT) override;
691691

692-
llvm::Value *
693-
EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
694-
Address Base, llvm::Value *MemPtr,
695-
const MemberPointerType *MPT) override;
692+
llvm::Value *EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
693+
Address Base, llvm::Value *MemPtr,
694+
const MemberPointerType *MPT,
695+
bool IsInBounds) override;
696696

697697
llvm::Value *EmitNonNullMemberPointerConversion(
698698
const MemberPointerType *SrcTy, const MemberPointerType *DstTy,
@@ -3240,7 +3240,7 @@ llvm::Value *MicrosoftCXXABI::AdjustVirtualBase(
32403240

32413241
llvm::Value *MicrosoftCXXABI::EmitMemberDataPointerAddress(
32423242
CodeGenFunction &CGF, const Expr *E, Address Base, llvm::Value *MemPtr,
3243-
const MemberPointerType *MPT) {
3243+
const MemberPointerType *MPT, bool IsInBounds) {
32443244
assert(MPT->isMemberDataPointer());
32453245
CGBuilderTy &Builder = CGF.Builder;
32463246
const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
@@ -3270,12 +3270,9 @@ llvm::Value *MicrosoftCXXABI::EmitMemberDataPointerAddress(
32703270
}
32713271

32723272
// Apply the offset.
3273-
// Specially, we don't add inbounds flags if the base pointer is a constant
3274-
// null. This is a workaround for old-style container_of macros.
32753273
return Builder.CreateGEP(CGF.Int8Ty, Addr, FieldOffset, "memptr.offset",
3276-
isa<llvm::ConstantPointerNull>(Addr)
3277-
? llvm::GEPNoWrapFlags::none()
3278-
: llvm::GEPNoWrapFlags::inBounds());
3274+
IsInBounds ? llvm::GEPNoWrapFlags::inBounds()
3275+
: llvm::GEPNoWrapFlags::none());
32793276
}
32803277

32813278
llvm::Value *

0 commit comments

Comments
 (0)