[clang] [llvm] [RISCV] Add support for Swift calling conventions and error handling (PR #205469)

Sam Elliott via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 24 09:21:37 PDT 2026


================
@@ -399,6 +400,27 @@ static bool CC_RISCV_Impl(unsigned ValNo, MVT ValVT, MVT LocVT,
     }
   }
 
+  if (ArgFlags.isSwiftSelf() || ArgFlags.isSwiftError() ||
+      ArgFlags.isSwiftAsync()) {
+    if (LocVT != XLenVT)
+      reportFatalUsageError(
+          "swiftself, swifterror, and swiftasync arguments must be "
+          "pointer-sized on RISC-V");
+    if (!IsEABI) {
+      MCRegister Reg = RISCV::NoRegister;
+      if (ArgFlags.isSwiftSelf())
+        Reg = State.AllocateReg(RISCV::X18);
+      else if (ArgFlags.isSwiftError())
+        Reg = State.AllocateReg(RISCV::X19);
+      else if (ArgFlags.isSwiftAsync())
+        Reg = State.AllocateReg(RISCV::X20);
+      if (Reg) {
+        State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
+        return false;
+      }
----------------
lenary wrote:

How does this work when these registers are callee-saved?

Please have a reportFatalUsageError if `IsEABI`, or change `supportsSwiftError` to exclude the `IsEABI` case.

https://github.com/llvm/llvm-project/pull/205469


More information about the cfe-commits mailing list