@@ -73,6 +73,18 @@ class ItaniumCXXABI : public CIRCXXABI {
73
73
mlir::Value lowerDerivedDataMember (cir::DerivedDataMemberOp op,
74
74
mlir::Value loweredSrc,
75
75
mlir::OpBuilder &builder) const override ;
76
+
77
+ mlir::Value lowerDataMemberCmp (cir::CmpOp op, mlir::Value loweredLhs,
78
+ mlir::Value loweredRhs,
79
+ mlir::OpBuilder &builder) const override ;
80
+
81
+ mlir::Value lowerDataMemberBitcast (cir::CastOp op, mlir::Type loweredDstTy,
82
+ mlir::Value loweredSrc,
83
+ mlir::OpBuilder &builder) const override ;
84
+
85
+ mlir::Value
86
+ lowerDataMemberToBoolCast (cir::CastOp op, mlir::Value loweredSrc,
87
+ mlir::OpBuilder &builder) const override ;
76
88
};
77
89
78
90
} // namespace
@@ -89,18 +101,23 @@ bool ItaniumCXXABI::classifyReturnType(LowerFunctionInfo &FI) const {
89
101
return false ;
90
102
}
91
103
92
- mlir::Type ItaniumCXXABI::lowerDataMemberType (
93
- cir::DataMemberType type, const mlir::TypeConverter &typeConverter) const {
104
+ static mlir::Type getABITypeForDataMember (LowerModule &lowerMod) {
94
105
// Itanium C++ ABI 2.3:
95
106
// A pointer to data member is an offset from the base address of
96
107
// the class object containing it, represented as a ptrdiff_t
97
- const clang::TargetInfo &target = LM .getTarget ();
108
+ const clang::TargetInfo &target = lowerMod .getTarget ();
98
109
clang::TargetInfo::IntType ptrdiffTy =
99
110
target.getPtrDiffType (clang::LangAS::Default);
100
- return cir::IntType::get (type.getContext (), target.getTypeWidth (ptrdiffTy),
111
+ return cir::IntType::get (lowerMod.getMLIRContext (),
112
+ target.getTypeWidth (ptrdiffTy),
101
113
target.isTypeSigned (ptrdiffTy));
102
114
}
103
115
116
+ mlir::Type ItaniumCXXABI::lowerDataMemberType (
117
+ cir::DataMemberType type, const mlir::TypeConverter &typeConverter) const {
118
+ return getABITypeForDataMember (LM);
119
+ }
120
+
104
121
mlir::TypedAttr ItaniumCXXABI::lowerDataMemberConstant (
105
122
cir::DataMemberAttr attr, const mlir::DataLayout &layout,
106
123
const mlir::TypeConverter &typeConverter) const {
@@ -175,6 +192,33 @@ ItaniumCXXABI::lowerDerivedDataMember(cir::DerivedDataMemberOp op,
175
192
/* isDerivedToBase=*/ false , builder);
176
193
}
177
194
195
+ mlir::Value ItaniumCXXABI::lowerDataMemberCmp (cir::CmpOp op,
196
+ mlir::Value loweredLhs,
197
+ mlir::Value loweredRhs,
198
+ mlir::OpBuilder &builder) const {
199
+ return builder.create <cir::CmpOp>(op.getLoc (), op.getKind (), loweredLhs,
200
+ loweredRhs);
201
+ }
202
+
203
+ mlir::Value
204
+ ItaniumCXXABI::lowerDataMemberBitcast (cir::CastOp op, mlir::Type loweredDstTy,
205
+ mlir::Value loweredSrc,
206
+ mlir::OpBuilder &builder) const {
207
+ return builder.create <cir::CastOp>(op.getLoc (), loweredDstTy,
208
+ cir::CastKind::bitcast, loweredSrc);
209
+ }
210
+
211
+ mlir::Value
212
+ ItaniumCXXABI::lowerDataMemberToBoolCast (cir::CastOp op, mlir::Value loweredSrc,
213
+ mlir::OpBuilder &builder) const {
214
+ // Itanium C++ ABI 2.3:
215
+ // A NULL pointer is represented as -1.
216
+ auto nullAttr = cir::IntAttr::get (getABITypeForDataMember (LM), -1 );
217
+ auto nullValue = builder.create <cir::ConstantOp>(op.getLoc (), nullAttr);
218
+ return builder.create <cir::CmpOp>(op.getLoc (), cir::CmpOpKind::ne, loweredSrc,
219
+ nullValue);
220
+ }
221
+
178
222
CIRCXXABI *CreateItaniumCXXABI (LowerModule &LM) {
179
223
switch (LM.getCXXABIKind ()) {
180
224
// Note that AArch64 uses the generic ItaniumCXXABI class since it doesn't
0 commit comments