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).
20 lines
779 B
Plaintext
20 lines
779 B
Plaintext
// Stream B1 (fibers) — x86_64 sibling of 1800: `abi(.pure)` emits a naked
|
|
// function whose body is raw x86_64 asm (returns 42 in eax, then its own `ret`).
|
|
//
|
|
// Lowered via LLVM's `naked` attribute (no prologue/epilogue/frame). x86_64-
|
|
// pinned via `.build`: ir-only on a non-x86 host — the `.ir` snapshot locks the
|
|
// `naked` attribute + the bare asm body (`movl $42, %eax` / `ret`) and the
|
|
// frame-pointer-free attribute set — and runs end-to-end (exit 42) on
|
|
// x86_64-linux. The IR text (the `naked` attribute, the `call void asm`) is
|
|
// target-independent; only the asm string differs from the aarch64 1800.
|
|
answer :: () -> i64 abi(.pure) {
|
|
asm volatile {
|
|
#string A
|
|
movl $42, %eax
|
|
ret
|
|
A
|
|
};
|
|
}
|
|
|
|
main :: () -> i64 { return answer(); }
|