From c217fd2b9ca06d51b8c67a7a556e61ae71a25dbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Mon, 28 Oct 2024 22:47:57 +0100 Subject: [PATCH] cbe: Support some more calling conventions. --- src/Zcu.zig | 19 +++++++++++++++++++ src/codegen/c.zig | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/src/Zcu.zig b/src/Zcu.zig index 67c8f14729..d03eb4cc9a 100644 --- a/src/Zcu.zig +++ b/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, 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` }; }