@@ -170,6 +170,29 @@ class StoreOpLowering : public OpConversionPattern<cxx::StoreOp> {
170170 }
171171};
172172
173+ class BoolConstantOpLowering : public OpConversionPattern <cxx::BoolConstantOp> {
174+ public:
175+ using OpConversionPattern::OpConversionPattern;
176+
177+ auto matchAndRewrite (cxx::BoolConstantOp op, OpAdaptor adaptor,
178+ ConversionPatternRewriter &rewriter) const
179+ -> LogicalResult override {
180+ auto typeConverter = getTypeConverter ();
181+ auto context = getContext ();
182+
183+ auto resultType = typeConverter->convertType (op.getType ());
184+ if (!resultType) {
185+ return rewriter.notifyMatchFailure (
186+ op, " failed to convert boolean constant type" );
187+ }
188+
189+ rewriter.replaceOpWithNewOp <LLVM::ConstantOp>(op, resultType,
190+ adaptor.getValue ());
191+
192+ return success ();
193+ }
194+ };
195+
173196class IntConstantOpLowering : public OpConversionPattern <cxx::IntConstantOp> {
174197 public:
175198 using OpConversionPattern::OpConversionPattern;
@@ -186,8 +209,32 @@ class IntConstantOpLowering : public OpConversionPattern<cxx::IntConstantOp> {
186209 op, " failed to convert integer constant type" );
187210 }
188211
189- auto valueAttr = adaptor.getValueAttr ();
190- rewriter.replaceOpWithNewOp <LLVM::ConstantOp>(op, resultType, valueAttr);
212+ rewriter.replaceOpWithNewOp <LLVM::ConstantOp>(op, resultType,
213+ adaptor.getValue ());
214+
215+ return success ();
216+ }
217+ };
218+
219+ class FloatConstantOpLowering
220+ : public OpConversionPattern<cxx::FloatConstantOp> {
221+ public:
222+ using OpConversionPattern::OpConversionPattern;
223+
224+ auto matchAndRewrite (cxx::FloatConstantOp op, OpAdaptor adaptor,
225+ ConversionPatternRewriter &rewriter) const
226+ -> LogicalResult override {
227+ auto typeConverter = getTypeConverter ();
228+ auto context = getContext ();
229+
230+ auto resultType = typeConverter->convertType (op.getType ());
231+ if (!resultType) {
232+ return rewriter.notifyMatchFailure (
233+ op, " failed to convert float constant type" );
234+ }
235+
236+ rewriter.replaceOpWithNewOp <LLVM::ConstantOp>(op, resultType,
237+ adaptor.getValue ());
191238
192239 return success ();
193240 }
@@ -218,14 +265,60 @@ void CxxToLLVMLoweringPass::runOnOperation() {
218265
219266 // set up the type converter
220267 LLVMTypeConverter typeConverter{context};
268+
269+ typeConverter.addConversion ([](cxx::BoolType type) {
270+ // todo: i8/i32 for data and i1 for control flow
271+ return IntegerType::get (type.getContext (), 8 );
272+ });
273+
221274 typeConverter.addConversion ([](cxx::IntegerType type) {
222275 return IntegerType::get (type.getContext (), type.getWidth ());
223276 });
224277
278+ typeConverter.addConversion ([](cxx::FloatType type) -> Type {
279+ auto width = type.getWidth ();
280+ switch (width) {
281+ case 16 :
282+ return Float16Type::get (type.getContext ());
283+ case 32 :
284+ return Float32Type::get (type.getContext ());
285+ case 64 :
286+ return Float64Type::get (type.getContext ());
287+ default :
288+ return {};
289+ } // switch
290+ });
291+
225292 typeConverter.addConversion ([](cxx::PointerType type) {
226293 return LLVM::LLVMPointerType::get (type.getContext ());
227294 });
228295
296+ DenseMap<cxx::ClassType, Type> convertedClassTypes;
297+ typeConverter.addConversion ([&](cxx::ClassType type) -> Type {
298+ if (auto it = convertedClassTypes.find (type);
299+ it != convertedClassTypes.end ()) {
300+ return it->second ;
301+ }
302+
303+ auto structType =
304+ LLVM::LLVMStructType::getIdentified (type.getContext (), type.getName ());
305+
306+ convertedClassTypes[type] = structType;
307+
308+ SmallVector<Type> fieldTypes;
309+ bool isPacked = false ;
310+
311+ for (auto field : type.getBody ()) {
312+ auto convertedFieldType = typeConverter.convertType (field);
313+ // todo: check if the field type was converted successfully
314+ fieldTypes.push_back (convertedFieldType);
315+ }
316+
317+ structType.setBody (fieldTypes, isPacked);
318+
319+ return structType;
320+ });
321+
229322 // set up the conversion patterns
230323 ConversionTarget target (*context);
231324
@@ -234,8 +327,9 @@ void CxxToLLVMLoweringPass::runOnOperation() {
234327
235328 RewritePatternSet patterns (context);
236329 patterns.insert <FuncOpLowering, ReturnOpLowering, AllocaOpLowering,
237- LoadOpLowering, StoreOpLowering, IntConstantOpLowering>(
238- typeConverter, context);
330+ LoadOpLowering, StoreOpLowering, BoolConstantOpLowering,
331+ IntConstantOpLowering, FloatConstantOpLowering>(typeConverter,
332+ context);
239333
240334 populateFunctionOpInterfaceTypeConversionPattern<cxx::FuncOp>(patterns,
241335 typeConverter);
0 commit comments