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