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(...@@ -7574,13 +7574,13 @@ fn analyzeCall(
7574 if (try sema.resolveValue(func)) |func_val|7574 if (try sema.resolveValue(func)) |func_val|
7575 if (func_val.isUndef(zcu))7575 if (func_val.isUndef(zcu))
7576 return sema.failWithUseOfUndef(block, call_src);7576 return sema.failWithUseOfUndef(block, call_src);
7577 if (cc == .naked) {7577 if (!callConvIsCallable(cc)) {
7578 const maybe_func_inst = try sema.funcDeclSrcInst(func);7578 const maybe_func_inst = try sema.funcDeclSrcInst(func);
7579 const msg = msg: {7579 const msg = msg: {
7580 const msg = try sema.errMsg(7580 const msg = try sema.errMsg(
7581 func_src,7581 func_src,
7582 "unable to call function with naked calling convention",7582 "unable to call function with calling convention '{s}'",
7583 .{},7583 .{@tagName(cc)},
7584 );7584 );
7585 errdefer msg.destroy(sema.gpa);7585 errdefer msg.destroy(sema.gpa);
75867586
...@@ -9764,6 +9764,33 @@ fn checkCallConvSupportsVarArgs(sema: *Sema, block: *Block, src: LazySrcLoc, cc:...@@ -9764,6 +9764,33 @@ fn checkCallConvSupportsVarArgs(sema: *Sema, block: *Block, src: LazySrcLoc, cc:
9764 }9764 }
9765}9765}
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
9767fn checkMergeAllowed(sema: *Sema, block: *Block, src: LazySrcLoc, peer_ty: Type) !void {9794fn checkMergeAllowed(sema: *Sema, block: *Block, src: LazySrcLoc, peer_ty: Type) !void {
9768 const pt = sema.pt;9795 const pt = sema.pt;
9769 const zcu = pt.zcu;9796 const zcu = pt.zcu;
test/cases/compile_errors/calling_function_with_naked_calling_convention.zig+2-2
...@@ -1,11 +1,11 @@...@@ -1,11 +1,11 @@
1export fn entry() void {1export fn entry() void {
2 foo();2 foo();
3}3}
4fn foo() callconv(.Naked) void {}4fn foo() callconv(.naked) void {}
55
6// error6// error
7// backend=llvm7// backend=llvm
8// target=native8// target=native
9//9//
10// :2:5: error: unable to call function with naked calling convention10// :2:5: error: unable to call function with calling convention 'naked'
11// :4:1: note: function declared here11// :4:1: note: function declared here