Allow accessing parameters in a naked function, just disallow return, this fixes #1955.

This commit is contained in:
Christoffer Lerno
2025-07-29 20:38:46 +02:00
parent 51b9cb85bc
commit 3ac9bfc387
6 changed files with 47 additions and 14 deletions

View File

@@ -0,0 +1,28 @@
// #target: macos-x64
module test;
import std;
fn void main()
{
char[8] foo = {255, 0, 0, 0, 0, 0, 0, 0};
io::printn(to_ulong(&foo));
}
fn ulong to_ulong(char[8]* buf) @naked @noinline
{
asm
{
movq $rax, [buf];
ret;
}
unreachable();
}
/* #expect: test.ll
define i64 @test.to_ulong(ptr %0) #1 {
entry:
call void asm sideeffect alignstack "movq ($0), %rax\0Aret \0A", "r,~{rax},~{flags},~{dirflag},~{fspr}"(ptr %0)
unreachable
}
attributes #1 = { naked noinline nounwind uwtable "no-trapping-math"="true" "stack-protector-buffer-size"="8" }

View File

@@ -3,14 +3,15 @@ module test;
alias IntFn = fn int();
IntFn lambda @export = fn () => 1;
IntFn lambda_naked @export = fn () @naked => 2;
IntFn lambda_naked @export = fn () @naked { asm("ret"); };
/* #expect: test.ll
; Function Attrs: naked nounwind uwtable
define internal i32 @"test.$global$lambda2"() #0 {
entry:
ret i32 2
call void asm sideeffect alignstack "ret", "~{dirflag},~{fpsr},~{flags}"()
unreachable
}
; Function Attrs: nounwind uwtable