Commit c217fd2b9c

Alex Rønne Petersen <alex@alexrp.com>
2024-10-28 22:47:57
cbe: Support some more calling conventions.
1 parent 3a5142a
Changed files (2)
src
codegen
src/codegen/c.zig
@@ -7622,11 +7622,44 @@ fn toCallingConvention(cc: std.builtin.CallingConvention, zcu: *Zcu) ?[]const u8
 
         .aarch64_vfabi => "aarch64_vector_pcs",
         .aarch64_vfabi_sve => "aarch64_sve_pcs",
+
         .arm_aapcs => "pcs(\"aapcs\")",
         .arm_aapcs_vfp, .arm_aapcs16_vfp => "pcs(\"aapcs-vfp\")",
+
+        .arm_interrupt => |opts| switch (opts.type) {
+            .generic => "interrupt",
+            .irq => "interrupt(\"IRQ\")",
+            .fiq => "interrupt(\"FIQ\")",
+            .swi => "interrupt(\"SWI\")",
+            .abort => "interrupt(\"ABORT\")",
+            .undef => "interrupt(\"UNDEF\")",
+        },
+
+        .avr_signal => "signal",
+
+        .mips_interrupt,
+        .mips64_interrupt,
+        => |opts| switch (opts.mode) {
+            inline else => |m| "interrupt(\"" ++ @tagName(m) ++ "\")",
+        },
+
         .riscv64_lp64_v, .riscv32_ilp32_v => "riscv_vector_cc",
+
+        .riscv32_interrupt,
+        .riscv64_interrupt,
+        => |opts| switch (opts.mode) {
+            inline else => |m| "interrupt(\"" ++ @tagName(m) ++ "\")",
+        },
+
         .m68k_rtd => "m68k_rtd",
 
+        .avr_interrupt,
+        .csky_interrupt,
+        .m68k_interrupt,
+        .x86_interrupt,
+        .x86_64_interrupt,
+        => "interrupt",
+
         else => unreachable, // `Zcu.callconvSupported`
     };
 }
src/Zcu.zig
@@ -3607,17 +3607,21 @@ pub fn callconvSupported(zcu: *Zcu, cc: std.builtin.CallingConvention) union(enu
                 .x86_64_vectorcall,
                 .x86_64_regcall_v3_sysv,
                 .x86_64_regcall_v4_win,
+                .x86_64_interrupt,
                 .x86_fastcall,
                 .x86_thiscall,
                 .x86_vectorcall,
                 .x86_regcall_v3,
                 .x86_regcall_v4_win,
+                .x86_interrupt,
                 .aarch64_vfabi,
                 .aarch64_vfabi_sve,
                 .arm_aapcs,
+                .csky_interrupt,
                 .riscv64_lp64_v,
                 .riscv32_ilp32_v,
                 .m68k_rtd,
+                .m68k_interrupt,
                 => |opts| opts.incoming_stack_alignment == null,
 
                 .arm_aapcs_vfp,
@@ -3625,11 +3629,26 @@ pub fn callconvSupported(zcu: *Zcu, cc: std.builtin.CallingConvention) union(enu
                 .arm_aapcs16_vfp,
                 => |opts| opts.incoming_stack_alignment == null and target.os.tag == .watchos,
 
+                .arm_interrupt,
+                => |opts| opts.incoming_stack_alignment == null,
+
+                .mips_interrupt,
+                .mips64_interrupt,
+                => |opts| opts.incoming_stack_alignment == null,
+
+                .riscv32_interrupt,
+                .riscv64_interrupt,
+                => |opts| opts.incoming_stack_alignment == null,
+
                 .x86_sysv,
                 .x86_win,
                 .x86_stdcall,
                 => |opts| opts.incoming_stack_alignment == null and opts.register_params == 0,
 
+                .avr_interrupt,
+                .avr_signal,
+                => true,
+
                 .naked => true,
 
                 else => false,