aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authorAlex Rønne Petersen <alex@alexrp.com>2024-10-28 22:47:57 +0100
committerAlex Rønne Petersen <alex@alexrp.com>2024-11-02 10:44:18 +0100
commitc217fd2b9ca06d51b8c67a7a556e61ae71a25dbb (patch)
treee9be8fff60e7b1d1d42305b9c6bfcd910a0ae60b /src/codegen
parent3a5142af8dcafea7062588b9d217ae82735c0bac (diff)
downloadzig-c217fd2b9ca06d51b8c67a7a556e61ae71a25dbb.tar.gz
zig-c217fd2b9ca06d51b8c67a7a556e61ae71a25dbb.zip
cbe: Support some more calling conventions.
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/c.zig33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig
index d7b2ca3d09..a56c1e7951 100644
--- a/src/codegen/c.zig
+++ b/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`
};
}