@@ -66,11 +66,22 @@ class LLVMTypeConverter : public mlir::LLVMTypeConverter {
66
66
});
67
67
addConversion (
68
68
[&](fir::CharacterType charTy) { return convertCharType (charTy); });
69
+ addConversion (
70
+ [&](fir::ComplexType cmplx) { return convertComplexType (cmplx); });
71
+ addConversion ([&](fir::FieldType field) {
72
+ // Convert to i32 because of LLVM GEP indexing restriction.
73
+ return mlir::IntegerType::get (field.getContext (), 32 );
74
+ });
69
75
addConversion ([&](HeapType heap) { return convertPointerLike (heap); });
70
76
addConversion ([&](fir::IntegerType intTy) {
71
77
return mlir::IntegerType::get (
72
78
&getContext (), kindMapping.getIntegerBitsize (intTy.getFKind ()));
73
79
});
80
+ addConversion ([&](fir::LenType field) {
81
+ // Get size of len paramter from the descriptor.
82
+ return getModel<Fortran::runtime::typeInfo::TypeParameterValue>()(
83
+ &getContext ());
84
+ });
74
85
addConversion ([&](fir::LogicalType boolTy) {
75
86
return mlir::IntegerType::get (
76
87
&getContext (), kindMapping.getLogicalBitsize (boolTy.getFKind ()));
@@ -80,21 +91,11 @@ class LLVMTypeConverter : public mlir::LLVMTypeConverter {
80
91
});
81
92
addConversion (
82
93
[&](fir::PointerType pointer) { return convertPointerLike (pointer); });
83
- addConversion ([&](fir::RecordType derived, SmallVectorImpl<Type> &results,
84
- ArrayRef<Type> callStack) {
94
+ addConversion ([&](fir::RecordType derived,
95
+ SmallVectorImpl<mlir::Type> &results,
96
+ ArrayRef<mlir::Type> callStack) {
85
97
return convertRecordType (derived, results, callStack);
86
98
});
87
- addConversion ([&](fir::FieldType field) {
88
- // Convert to i32 because of LLVM GEP indexing restriction.
89
- return mlir::IntegerType::get (field.getContext (), 32 );
90
- });
91
- addConversion ([&](fir::LenType field) {
92
- // Get size of len paramter from the descriptor.
93
- return getModel<Fortran::runtime::typeInfo::TypeParameterValue>()(
94
- &getContext ());
95
- });
96
- addConversion (
97
- [&](fir::ComplexType cmplx) { return convertComplexType (cmplx); });
98
99
addConversion (
99
100
[&](fir::RealType real) { return convertRealType (real.getFKind ()); });
100
101
addConversion (
@@ -134,8 +135,9 @@ class LLVMTypeConverter : public mlir::LLVMTypeConverter {
134
135
135
136
// fir.type<name(p : TY'...){f : TY...}> --> llvm<"%name = { ty... }">
136
137
llvm::Optional<LogicalResult>
137
- convertRecordType (fir::RecordType derived, SmallVectorImpl<Type> &results,
138
- ArrayRef<Type> callStack) {
138
+ convertRecordType (fir::RecordType derived,
139
+ SmallVectorImpl<mlir::Type> &results,
140
+ ArrayRef<mlir::Type> callStack) {
139
141
auto name = derived.getName ();
140
142
auto st = mlir::LLVM::LLVMStructType::getIdentified (&getContext (), name);
141
143
if (llvm::count (callStack, derived) > 1 ) {
@@ -269,12 +271,6 @@ class LLVMTypeConverter : public mlir::LLVMTypeConverter {
269
271
return convertType (specifics->complexMemoryType (eleTy));
270
272
}
271
273
272
- // convert a front-end kind value to either a std or LLVM IR dialect type
273
- // fir.real<n> --> llvm.anyfloat where anyfloat is a kind mapping
274
- mlir::Type convertRealType (fir::KindTy kind) {
275
- return fromRealTypeID (kindMapping.getRealTypeID (kind), kind);
276
- }
277
-
278
274
template <typename A>
279
275
mlir::Type convertPointerLike (A &ty) {
280
276
mlir::Type eleTy = ty.getEleTy ();
@@ -302,6 +298,12 @@ class LLVMTypeConverter : public mlir::LLVMTypeConverter {
302
298
return mlir::LLVM::LLVMPointerType::get (convertType (eleTy));
303
299
}
304
300
301
+ // convert a front-end kind value to either a std or LLVM IR dialect type
302
+ // fir.real<n> --> llvm.anyfloat where anyfloat is a kind mapping
303
+ mlir::Type convertRealType (fir::KindTy kind) {
304
+ return fromRealTypeID (kindMapping.getRealTypeID (kind), kind);
305
+ }
306
+
305
307
// fir.array<c ... :any> --> llvm<"[...[c x any]]">
306
308
mlir::Type convertSequenceType (SequenceType seq) {
307
309
auto baseTy = convertType (seq.getEleTy ());
0 commit comments