authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-10-28 21:57:29+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-11-02 10:44:18+01:00
loge4e3d7ab4140ae6f078d3ffd72fce4c0a5e6e59f
tree6229a776e8a65739b4a0f6b377c8cd76d4b9b4d5
parentf508e227052bb13943bad16b324944ae72d8af4e
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

Sema: Disallow calling functions with certain special calling conventions.


2 files changed, 32 insertions(+), 5 deletions(-)

src/Sema.zig+30-3
......@@ -7574,13 +7574,13 @@ fn analyzeCall(
75747574 if (try sema.resolveValue(func)) |func_val|
75757575 if (func_val.isUndef(zcu))
75767576 return sema.failWithUseOfUndef(block, call_src);
7577 if (cc == .naked) {
7577 if (!callConvIsCallable(cc)) {
75787578 const maybe_func_inst = try sema.funcDeclSrcInst(func);
75797579 const msg = msg: {
75807580 const msg = try sema.errMsg(
75817581 func_src,
7582 "unable to call function with naked calling convention",
7583 .{},
7582 "unable to call function with calling convention '{s}'",
7583 .{@tagName(cc)},
75847584 );
75857585 errdefer msg.destroy(sema.gpa);
75867586
......@@ -9764,6 +9764,33 @@ fn checkCallConvSupportsVarArgs(sema: *Sema, block: *Block, src: LazySrcLoc, cc:
97649764 }
97659765}
97669766
9767fn callConvIsCallable(cc: std.builtin.CallingConvention.Tag) bool {
9768 return switch (cc) {
9769 .naked,
9770
9771 .arm_interrupt,
9772 .avr_interrupt,
9773 .avr_signal,
9774 .csky_interrupt,
9775 .m68k_interrupt,
9776 .mips_interrupt,
9777 .mips64_interrupt,
9778 .riscv32_interrupt,
9779 .riscv64_interrupt,
9780 .x86_interrupt,
9781 .x86_64_interrupt,
9782
9783 .amdgcn_kernel,
9784 .nvptx_kernel,
9785 .spirv_kernel,
9786 .spirv_fragment,
9787 .spirv_vertex,
9788 => false,
9789
9790 else => true,
9791 };
9792}
9793
97679794fn checkMergeAllowed(sema: *Sema, block: *Block, src: LazySrcLoc, peer_ty: Type) !void {
97689795 const pt = sema.pt;
97699796 const zcu = pt.zcu;
test/cases/compile_errors/calling_function_with_naked_calling_convention.zig+2-2
......@@ -1,11 +1,11 @@
11export fn entry() void {
22 foo();
33}
4fn foo() callconv(.Naked) void {}
4fn foo() callconv(.naked) void {}
55
66// error
77// backend=llvm
88// target=native
99//
10// :2:5: error: unable to call function with naked calling convention
10// :2:5: error: unable to call function with calling convention 'naked'
1111// :4:1: note: function declared here