[flang-commits] [flang] [flang] Add CodeGen target support for WebAssembly (PR #226427)
Anutosh Bhat via flang-commits
flang-commits at lists.llvm.org
Fri Sep 25 03:40:24 PDT 2026
https://github.com/anutosh491 updated https://github.com/llvm/llvm-project/pull/226427
>From ed6076482486c4714fc2d4893b8fa0fe9cb80676 Mon Sep 17 00:00:00 2001
From: anutosh491 <andersonbhat491 at gmail.com>
Date: Fri, 25 Sep 2026 15:45:52 +0530
Subject: [PATCH] [flang] Add CodeGen target support for WebAssembly
---
flang/lib/Optimizer/CodeGen/Target.cpp | 46 ++++++++++++++++++++++++++
flang/test/Fir/target-rewrite-wasm.fir | 30 +++++++++++++++++
2 files changed, 76 insertions(+)
create mode 100644 flang/test/Fir/target-rewrite-wasm.fir
diff --git a/flang/lib/Optimizer/CodeGen/Target.cpp b/flang/lib/Optimizer/CodeGen/Target.cpp
index 3e6a2151fb3113..f18085395d4bd8 100644
--- a/flang/lib/Optimizer/CodeGen/Target.cpp
+++ b/flang/lib/Optimizer/CodeGen/Target.cpp
@@ -2031,6 +2031,44 @@ struct TargetSystemZ : public GenericTarget<TargetSystemZ> {
};
} // namespace
+//===----------------------------------------------------------------------===//
+// WebAssembly (wasm32 / wasm64) target specifics.
+//===----------------------------------------------------------------------===//
+
+namespace {
+template <int Width>
+struct TargetWasm : public GenericTarget<TargetWasm<Width>> {
+ using GenericTarget<TargetWasm<Width>>::GenericTarget;
+ using AT = CodeGenSpecifics::Attributes;
+
+ static constexpr int defaultWidth = Width;
+
+ CodeGenSpecifics::Marshalling complexType(mlir::Type eleTy,
+ bool isResult) const {
+ assert(fir::isa_real(eleTy));
+ CodeGenSpecifics::Marshalling marshal;
+ auto structTy =
+ mlir::TupleType::get(eleTy.getContext(), mlir::TypeRange{eleTy, eleTy});
+ auto alignment = static_cast<unsigned short>(
+ this->getDataLayout().getTypeABIAlignment(eleTy));
+ marshal.emplace_back(fir::ReferenceType::get(structTy),
+ AT{/*alignment=*/alignment, /*byval=*/!isResult,
+ /*sret=*/isResult});
+ return marshal;
+ }
+
+ CodeGenSpecifics::Marshalling
+ complexArgumentType(mlir::Location, mlir::Type eleTy) const override {
+ return complexType(eleTy, /*isResult=*/false);
+ }
+
+ CodeGenSpecifics::Marshalling
+ complexReturnType(mlir::Location, mlir::Type eleTy) const override {
+ return complexType(eleTy, /*isResult=*/true);
+ }
+};
+} // namespace
+
// Instantiate the overloaded target instance based on the triple value.
// TODO: Add other targets to this file as needed.
std::unique_ptr<fir::CodeGenSpecifics> fir::CodeGenSpecifics::get(
@@ -2102,6 +2140,14 @@ std::unique_ptr<fir::CodeGenSpecifics> fir::CodeGenSpecifics::get(
return std::make_unique<TargetSystemZ>(ctx, std::move(trp),
std::move(kindMap), targetCPU,
targetFeatures, targetABI, dl);
+ case llvm::Triple::ArchType::wasm32:
+ return std::make_unique<TargetWasm<32>>(ctx, std::move(trp),
+ std::move(kindMap), targetCPU,
+ targetFeatures, targetABI, dl);
+ case llvm::Triple::ArchType::wasm64:
+ return std::make_unique<TargetWasm<64>>(ctx, std::move(trp),
+ std::move(kindMap), targetCPU,
+ targetFeatures, targetABI, dl);
}
TODO(mlir::UnknownLoc::get(ctx), "target not implemented");
}
diff --git a/flang/test/Fir/target-rewrite-wasm.fir b/flang/test/Fir/target-rewrite-wasm.fir
new file mode 100644
index 00000000000000..6754119d46acac
--- /dev/null
+++ b/flang/test/Fir/target-rewrite-wasm.fir
@@ -0,0 +1,30 @@
+// RUN: fir-opt --target-rewrite="target=wasm32-unknown-emscripten" %s | FileCheck %s
+// RUN: fir-opt --target-rewrite="target=wasm64-unknown-emscripten" %s | FileCheck %s
+
+// Verify the WebAssembly ABI lowering for complex arguments and results.
+
+// CHECK-LABEL: func.func @complex_result_f64(
+// CHECK-SAME: %[[RESULT:.*]]: !fir.ref<tuple<f64, f64>> {llvm.align = 8 : i32, llvm.sret = tuple<f64, f64>})
+func.func @complex_result_f64() -> complex<f64> {
+ %0 = fir.undefined complex<f64>
+ return %0 : complex<f64>
+}
+
+// CHECK-LABEL: func.func @complex_argument_f64(
+// CHECK-SAME: %[[ARG:.*]]: !fir.ref<tuple<f64, f64>> {llvm.align = 8 : i32, llvm.byval = tuple<f64, f64>})
+func.func @complex_argument_f64(%arg0: complex<f64>) {
+ return
+}
+
+// CHECK-LABEL: func.func @complex_result_f32(
+// CHECK-SAME: %[[RESULT:.*]]: !fir.ref<tuple<f32, f32>> {llvm.align = 4 : i32, llvm.sret = tuple<f32, f32>})
+func.func @complex_result_f32() -> complex<f32> {
+ %0 = fir.undefined complex<f32>
+ return %0 : complex<f32>
+}
+
+// CHECK-LABEL: func.func @complex_argument_f32(
+// CHECK-SAME: %[[ARG:.*]]: !fir.ref<tuple<f32, f32>> {llvm.align = 4 : i32, llvm.byval = tuple<f32, f32>})
+func.func @complex_argument_f32(%arg0: complex<f32>) {
+ return
+}
More information about the flang-commits
mailing list