@@ -147,7 +147,11 @@ class CallOpLowering : public OpConversionPattern<cxx::CallOp> {
147
147
148
148
class AllocaOpLowering : public OpConversionPattern <cxx::AllocaOp> {
149
149
public:
150
- using OpConversionPattern::OpConversionPattern;
150
+ AllocaOpLowering (const TypeConverter &typeConverter,
151
+ const DataLayout &dataLayout, MLIRContext *context,
152
+ PatternBenefit benefit = 1 )
153
+ : OpConversionPattern<cxx::AllocaOp>(typeConverter, context, benefit),
154
+ dataLayout_ (dataLayout) {}
151
155
152
156
auto matchAndRewrite (cxx::AllocaOp op, OpAdaptor adaptor,
153
157
ConversionPatternRewriter &rewriter) const
@@ -170,17 +174,25 @@ class AllocaOpLowering : public OpConversionPattern<cxx::AllocaOp> {
170
174
}
171
175
172
176
auto size = rewriter.create <LLVM::ConstantOp>(
173
- op.getLoc (), rewriter.getI64Type (), rewriter.getIndexAttr (1 ));
177
+ op.getLoc (), typeConverter->convertType (rewriter.getIndexType ()),
178
+ rewriter.getIntegerAttr (rewriter.getIndexType (), 1 ));
174
179
175
180
auto x = rewriter.replaceOpWithNewOp <LLVM::AllocaOp>(op, resultType,
176
181
elementType, size);
177
182
return success ();
178
183
}
184
+
185
+ private:
186
+ const DataLayout &dataLayout_;
179
187
};
180
188
181
189
class LoadOpLowering : public OpConversionPattern <cxx::LoadOp> {
182
190
public:
183
- using OpConversionPattern::OpConversionPattern;
191
+ LoadOpLowering (const TypeConverter &typeConverter,
192
+ const DataLayout &dataLayout, MLIRContext *context,
193
+ PatternBenefit benefit = 1 )
194
+ : OpConversionPattern<cxx::LoadOp>(typeConverter, context, benefit),
195
+ dataLayout_ (dataLayout) {}
184
196
185
197
auto matchAndRewrite (cxx::LoadOp op, OpAdaptor adaptor,
186
198
ConversionPatternRewriter &rewriter) const
@@ -195,11 +207,18 @@ class LoadOpLowering : public OpConversionPattern<cxx::LoadOp> {
195
207
196
208
return success ();
197
209
}
210
+
211
+ private:
212
+ const DataLayout &dataLayout_;
198
213
};
199
214
200
215
class StoreOpLowering : public OpConversionPattern <cxx::StoreOp> {
201
216
public:
202
- using OpConversionPattern::OpConversionPattern;
217
+ StoreOpLowering (const TypeConverter &typeConverter,
218
+ const DataLayout &dataLayout, MLIRContext *context,
219
+ PatternBenefit benefit = 1 )
220
+ : OpConversionPattern<cxx::StoreOp>(typeConverter, context, benefit),
221
+ dataLayout_ (dataLayout) {}
203
222
204
223
auto matchAndRewrite (cxx::StoreOp op, OpAdaptor adaptor,
205
224
ConversionPatternRewriter &rewriter) const
@@ -218,34 +237,18 @@ class StoreOpLowering : public OpConversionPattern<cxx::StoreOp> {
218
237
219
238
return success ();
220
239
}
221
- };
222
-
223
- class BoolConstantOpLowering : public OpConversionPattern <cxx::BoolConstantOp> {
224
- public:
225
- using OpConversionPattern::OpConversionPattern;
226
240
227
- auto matchAndRewrite (cxx::BoolConstantOp op, OpAdaptor adaptor,
228
- ConversionPatternRewriter &rewriter) const
229
- -> LogicalResult override {
230
- auto typeConverter = getTypeConverter ();
231
- auto context = getContext ();
232
-
233
- auto resultType = typeConverter->convertType (op.getType ());
234
- if (!resultType) {
235
- return rewriter.notifyMatchFailure (
236
- op, " failed to convert boolean constant type" );
237
- }
238
-
239
- rewriter.replaceOpWithNewOp <LLVM::ConstantOp>(op, resultType,
240
- adaptor.getValue ());
241
-
242
- return success ();
243
- }
241
+ private:
242
+ const DataLayout &dataLayout_;
244
243
};
245
244
246
245
class SubscriptOpLowering : public OpConversionPattern <cxx::SubscriptOp> {
247
246
public:
248
- using OpConversionPattern::OpConversionPattern;
247
+ SubscriptOpLowering (const TypeConverter &typeConverter,
248
+ const DataLayout &dataLayout, MLIRContext *context,
249
+ PatternBenefit benefit = 1 )
250
+ : OpConversionPattern<cxx::SubscriptOp>(typeConverter, context, benefit),
251
+ dataLayout_ (dataLayout) {}
249
252
250
253
auto matchAndRewrite (cxx::SubscriptOp op, OpAdaptor adaptor,
251
254
ConversionPatternRewriter &rewriter) const
@@ -266,8 +269,9 @@ class SubscriptOpLowering : public OpConversionPattern<cxx::SubscriptOp> {
266
269
op, " expected base type of subscript to be an array type" );
267
270
}
268
271
269
- SmallVector<Value > indices;
272
+ SmallVector<LLVM::GEPArg > indices;
270
273
274
+ indices.push_back (0 );
271
275
indices.push_back (adaptor.getIndex ());
272
276
273
277
auto resultType = LLVM::LLVMPointerType::get (context);
@@ -278,6 +282,32 @@ class SubscriptOpLowering : public OpConversionPattern<cxx::SubscriptOp> {
278
282
279
283
return success ();
280
284
}
285
+
286
+ private:
287
+ const DataLayout &dataLayout_;
288
+ };
289
+
290
+ class BoolConstantOpLowering : public OpConversionPattern <cxx::BoolConstantOp> {
291
+ public:
292
+ using OpConversionPattern::OpConversionPattern;
293
+
294
+ auto matchAndRewrite (cxx::BoolConstantOp op, OpAdaptor adaptor,
295
+ ConversionPatternRewriter &rewriter) const
296
+ -> LogicalResult override {
297
+ auto typeConverter = getTypeConverter ();
298
+ auto context = getContext ();
299
+
300
+ auto resultType = typeConverter->convertType (op.getType ());
301
+ if (!resultType) {
302
+ return rewriter.notifyMatchFailure (
303
+ op, " failed to convert boolean constant type" );
304
+ }
305
+
306
+ rewriter.replaceOpWithNewOp <LLVM::ConstantOp>(op, resultType,
307
+ adaptor.getValue ());
308
+
309
+ return success ();
310
+ }
281
311
};
282
312
283
313
class IntConstantOpLowering : public OpConversionPattern <cxx::IntConstantOp> {
@@ -1189,8 +1219,10 @@ void CxxToLLVMLoweringPass::runOnOperation() {
1189
1219
typeConverter, context);
1190
1220
1191
1221
// memory operations
1222
+ DataLayout dataLayout{module };
1223
+
1192
1224
patterns.insert <AllocaOpLowering, LoadOpLowering, StoreOpLowering,
1193
- SubscriptOpLowering>(typeConverter, context);
1225
+ SubscriptOpLowering>(typeConverter, dataLayout, context);
1194
1226
1195
1227
// cast operations
1196
1228
patterns
@@ -1236,7 +1268,20 @@ void CxxToLLVMLoweringPass::runOnOperation() {
1236
1268
1237
1269
if (failed (applyPartialConversion (module , target, std::move (patterns)))) {
1238
1270
signalPassFailure ();
1271
+ return ;
1239
1272
}
1273
+
1274
+ auto targetTriple =
1275
+ mlir::cast<mlir::StringAttr>(module ->getAttr (" cxx.triple" ));
1276
+
1277
+ module ->setAttr (LLVM::LLVMDialect::getTargetTripleAttrName (),
1278
+ mlir::StringAttr::get (context, targetTriple.str ()));
1279
+
1280
+ auto dataLayoutDescr =
1281
+ mlir::cast<mlir::StringAttr>(module ->getAttr (" cxx.data-layout" ));
1282
+
1283
+ module ->setAttr (LLVM::LLVMDialect::getDataLayoutAttrName (),
1284
+ mlir::StringAttr::get (context, dataLayoutDescr.str ()));
1240
1285
}
1241
1286
1242
1287
} // namespace mlir
0 commit comments