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