fibers B1.0b: abi(.pure) emits a real LLVM naked function (green)

Flip the B1.0a emit bail to real emission. The emit_llvm declaration
pass now adds LLVM's naked + noinline + nounwind attributes for an
is_pure function and skips frame-pointer=all (incompatible with a
frameless function); Pass 2 emits the body normally, and the naked
attribute makes the backend emit it verbatim (the inline asm + its own
ret) with no prologue/epilogue.

IR shape verified:
  ; Function Attrs: naked noinline nounwind
  define internal i64 @answer() #0 {
  entry:
    call void asm sideeffect "...ret...", ""()
    unreachable
  }
The caller invokes it as an ordinary () -> i64 call (.pure is
call_conv == .default).

- examples/1800-concurrency-pure-asm.sx: now green, aarch64-pinned
  (.build macos) -> exit 42 + .ir snapshot.
- examples/1801-concurrency-pure-generic.sx (renamed from -bail): the
  generic .pure now emits a correct naked answer__i64 (exit 42),
  proving generic.zig produces a naked body, not a framed one.
- examples/1802-concurrency-pure-asm-x86.sx: x86_64 cross sibling
  (.build x86_64-linux, ir-only here); .ir locks naked + movl $42,%eax.
- unit test in emit_llvm.test.zig asserts the naked attribute is present
  and frame-pointer absent on an abi(.pure) function.

Suite green (724/0).
This commit is contained in:
agra
2026-06-20 16:36:12 +03:00
parent 40424df1b8
commit 4b384788e6
21 changed files with 172 additions and 59 deletions

View File

@@ -0,0 +1 @@
{ "target": "macos" }

View File

@@ -1 +1 @@
1
42

View File

@@ -0,0 +1,15 @@
; Function Attrs: naked noinline nounwind
define internal i64 @answer() #0 {
entry:
call void asm sideeffect " mov x0, #42\0A ret\0A", ""()
unreachable
}
; Function Attrs: nounwind
define i32 @main() #1 {
entry:
%call = call i64 @answer()
%ca.tr = trunc i64 %call to i32
ret i32 %ca.tr
}

View File

@@ -1 +1 @@
error: `abi(.pure)` function 'answer' LLVM emission not yet implemented

View File

@@ -1 +0,0 @@
error: `abi(.pure)` function 'answer__i64' LLVM emission not yet implemented

View File

@@ -0,0 +1 @@
{ "target": "macos" }

View File

@@ -0,0 +1 @@
42

View File

@@ -0,0 +1,15 @@
; Function Attrs: nounwind
define i32 @main() #0 {
entry:
%call = call i64 @answer__i64()
%ca.tr = trunc i64 %call to i32
ret i32 %ca.tr
}
; Function Attrs: naked noinline nounwind
define internal i64 @answer__i64() #1 {
entry:
call void asm sideeffect " mov x0, #42\0A ret\0A", ""()
unreachable
}

View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1 @@
{ "target": "x86_64-linux" }

View File

@@ -0,0 +1 @@
0

View File

@@ -0,0 +1,15 @@
; Function Attrs: naked noinline nounwind
define internal i64 @answer() #0 {
entry:
call void asm sideeffect " movl $$42, %eax\0A ret\0A", ""()
unreachable
}
; Function Attrs: nounwind
define i32 @main() #1 {
entry:
%call = call i64 @answer()
%ca.tr = trunc i64 %call to i32
ret i32 %ca.tr
}

View File

@@ -0,0 +1 @@