[flang-commits] [flang] [flang] RISCV64 (lp64/lp64d) support for BIND(C) derived types (PR #198335)
Philipp Rados via flang-commits
flang-commits at lists.llvm.org
Tue Sep 22 04:19:36 PDT 2026
================
@@ -1425,6 +1428,316 @@ struct TargetRISCV64 : public GenericTarget<TargetRISCV64> {
}
return marshal;
}
+
+ bool hasHardFloatABI(mlir::Location loc) const {
+ auto abi = getTargetABI();
+
+ if (abi == "lp64d")
+ return true;
+ if (abi == "lp64")
+ return false;
+ TODO(loc, "RISCV64 BIND(C) support for " + abi);
+ }
+
+ CodeGenSpecifics::Marshalling
+ passOnTheStack(unsigned short recAlign, mlir::Type ty, bool isResult) const {
+ CodeGenSpecifics::Marshalling marshal;
+ // The stack is always 8 byte aligned
+ unsigned short align = std::max(recAlign, static_cast<unsigned short>(8));
+ marshal.emplace_back(fir::ReferenceType::get(ty),
+ AT{align, /*byval=*/!isResult, /*sret=*/isResult});
+ return marshal;
+ }
+
+ const llvm::SmallVector<mlir::Type>
+ flattenTypeList(mlir::Location loc, const mlir::Type type) const {
+ llvm::SmallVector<mlir::Type> flatTypes;
+
+ llvm::TypeSwitch<mlir::Type>(type)
+ .Case([&](mlir::IntegerType intTy) {
+ if (intTy.getWidth() <= 128)
+ flatTypes.push_back(intTy);
+ else
+ TODO(loc,
+ "integerType with width exceeding 128 bits is unsupported");
+ })
+ .Case([&](mlir::FloatType floatTy) {
+ if (floatTy.getWidth() <= 64)
+ flatTypes.push_back(floatTy);
+ else
+ TODO(loc, "128 bit float is not supported by RISCV64");
+ })
+ .Case([&](mlir::ComplexType cmplx) {
+ const auto *sem = &floatToSemantics(kindMap, cmplx.getElementType());
+ if (sem == &llvm::APFloat::IEEEsingle() ||
+ sem == &llvm::APFloat::IEEEdouble())
+ std::fill_n(std::back_inserter(flatTypes), 2,
+ cmplx.getElementType());
+ else
+ TODO(loc, "unsupported complex type(not IEEEsingle, IEEEdouble"
+ "as a structure component for BIND(C), "
+ "VALUE derived type argument and type return");
+ })
+ .Case([&](fir::LogicalType logicalTy) {
+ const unsigned width =
+ kindMap.getLogicalBitsize(logicalTy.getFKind());
+ flatTypes.push_back(mlir::IntegerType::get(type.getContext(), width));
+ })
+ .Case([&](fir::CharacterType charTy) {
+ if (charTy.getLen() == 1)
+ flatTypes.push_back(mlir::IntegerType::get(type.getContext(), 8));
+ else
+ TODO(loc,
+ "fir.type value arg character components must have length 1");
+ })
+ .Case([&](fir::SequenceType seqTy) {
+ if (!seqTy.hasDynamicExtents()) {
+ const std::uint64_t numOfEle = seqTy.getConstantArraySize();
+ mlir::Type eleTy = seqTy.getEleTy();
+ // Don't check for subtype again if element-type is scalar.
+ if (mlir::isa<mlir::IntegerType, mlir::FloatType, fir::LogicalType>(
+ eleTy)) {
+ std::fill_n(std::back_inserter(flatTypes), numOfEle, eleTy);
----------------
prados-oc wrote:
Done
https://github.com/llvm/llvm-project/pull/198335
More information about the flang-commits
mailing list