@@ -1372,7 +1372,7 @@ void populateCIRToMLIRConversionPatterns(mlir::RewritePatternSet &patterns,
1372
1372
patterns.getContext ());
1373
1373
}
1374
1374
1375
- mlir::TypeConverter prepareTypeConverter () {
1375
+ mlir::TypeConverter prepareTypeConverter (mlir::DataLayout &dataLayout ) {
1376
1376
mlir::TypeConverter converter;
1377
1377
converter.addConversion ([&](cir::PointerType type) -> mlir::Type {
1378
1378
auto ty = convertTypeForMemory (converter, type.getPointee ());
@@ -1435,14 +1435,41 @@ mlir::TypeConverter prepareTypeConverter() {
1435
1435
auto ty = converter.convertType (type.getEltType ());
1436
1436
return mlir::VectorType::get (type.getSize (), ty);
1437
1437
});
1438
+ converter.addConversion ([&](cir::StructType type) -> mlir::Type {
1439
+ // FIXME(cir): create separate unions, struct, and classes types.
1440
+ // Convert struct members.
1441
+ llvm::SmallVector<mlir::Type> mlirMembers;
1442
+ switch (type.getKind ()) {
1443
+ case cir::StructType::Class:
1444
+ // TODO(cir): This should be properly validated.
1445
+ case cir::StructType::Struct:
1446
+ for (auto ty : type.getMembers ())
1447
+ mlirMembers.push_back (converter.convertType (ty));
1448
+ break ;
1449
+ // Unions are lowered as only the largest member.
1450
+ case cir::StructType::Union: {
1451
+ auto largestMember = type.getLargestMember (dataLayout);
1452
+ if (largestMember)
1453
+ mlirMembers.push_back (converter.convertType (largestMember));
1454
+ break ;
1455
+ }
1456
+ }
1457
+
1458
+ // Struct has a name: lower as an identified struct.
1459
+ mlir::TupleType tuple;
1460
+ // FIXME(cir): all the following has to be somehow kept. With some
1461
+ // attributes?
1462
+ tuple = mlir::TupleType::get (type.getContext (), mlirMembers);
1463
+ return tuple;
1464
+ });
1438
1465
1439
1466
return converter;
1440
1467
}
1441
1468
1442
1469
void ConvertCIRToMLIRPass::runOnOperation () {
1443
1470
auto module = getOperation ();
1444
-
1445
- auto converter = prepareTypeConverter ();
1471
+ mlir::DataLayout dataLayout{ module };
1472
+ auto converter = prepareTypeConverter (dataLayout );
1446
1473
1447
1474
mlir::RewritePatternSet patterns (&getContext ());
1448
1475
0 commit comments