diff --git a/flang/lib/Optimizer/CodeGen/TypeConverter.h b/flang/lib/Optimizer/CodeGen/TypeConverter.h --- a/flang/lib/Optimizer/CodeGen/TypeConverter.h +++ b/flang/lib/Optimizer/CodeGen/TypeConverter.h @@ -90,6 +90,9 @@ addConversion([&](fir::SequenceType sequence) { return convertSequenceType(sequence); }); + addConversion([&](fir::TypeDescType tdesc) { + return convertTypeDescType(tdesc.getContext()); + }); addConversion([&](fir::VectorType vecTy) { return mlir::VectorType::get(llvm::ArrayRef(vecTy.getLen()), convertType(vecTy.getEleTy())); @@ -283,6 +286,14 @@ return mlir::LLVM::LLVMPointerType::get(baseTy); } + // fir.tdesc --> llvm<"i8*"> + // TODO: For now use a void*, however pointer identity is not sufficient for + // the f18 object v. class distinction (F2003). + mlir::Type convertTypeDescType(mlir::MLIRContext *ctx) { + return mlir::LLVM::LLVMPointerType::get( + mlir::IntegerType::get(&getContext(), 8)); + } + /// Convert llvm::Type::TypeID to mlir::Type mlir::Type fromRealTypeID(llvm::Type::TypeID typeID, fir::KindTy kind) { switch (typeID) { diff --git a/flang/test/Fir/types-to-llvm.fir b/flang/test/Fir/types-to-llvm.fir --- a/flang/test/Fir/types-to-llvm.fir +++ b/flang/test/Fir/types-to-llvm.fir @@ -321,3 +321,23 @@ func private @foo0(%arg0: !fir.len) // CHECK-LABEL: foo0 // CHECK-SAME: i64 + +// ----- + +// Test `!fir.tdesc` conversion. + +func private @foo0(%arg0: !fir.tdesc>) +// CHECK-LABEL: foo0 +// CHECK-SAME: !llvm.ptr + +func private @foo1(%arg : !fir.tdesc>) +// CHECK-LABEL: foo1 +// CHECK-SAME: !llvm.ptr + +func private @foo2(%arg : !fir.tdesc) +// CHECK-LABEL: foo2 +// CHECK-SAME: !llvm.ptr + +func private @foo3(%arg : !fir.tdesc>) +// CHECK-LABEL: foo3 +// CHECK-SAME: !llvm.ptr