"pure" universally means side-effect-free (GCC __attribute__((pure)), FP purity, D's pure) — the opposite of a register-clobbering context switch. The concept is "naked": no compiler-generated prologue/epilogue, body is raw asm that emits its own ret. That is the established term everywhere (LLVM's naked function attribute — which we literally emit — plus Zig callconv(.naked), Rust #[naked], GCC/Clang __attribute__ ((naked))). Rename the keyword + everything keyed off it so concept, surface, field, and the emitted LLVM attribute all agree. - ast.zig: ABI enum variant pure -> naked (+ doc). - parser: accept abi(.naked); error text updated. - IR Function.is_pure -> is_naked; type_resolver/decl/generic/pack/ emit_llvm references updated; diagnostics say abi(.naked). - examples 1800-1803 renamed *-pure-* -> *-naked-* (source + expected/ snapshots; .ir/.exit/.stdout/.stderr are byte-identical — the emitted IR is unchanged, only the keyword spelling differs). - docs (PLAN-FIBERS, CHECKPOINT-FIBERS, PLAN-POST-METATYPE, the design roadmap, the compiler-API checkpoint/design) updated; the naming rationale now records why .naked over .pure. No semantic change — pure cosmetics. Suite green (725/0).
16 lines
338 B
Plaintext
16 lines
338 B
Plaintext
|
|
; Function Attrs: naked noinline nounwind
|
|
define internal i64 @add(i64 %0, i64 %1) #0 {
|
|
entry:
|
|
call void asm sideeffect " add x0, x0, x1\0A ret\0A", ""()
|
|
unreachable
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define i32 @main() #1 {
|
|
entry:
|
|
%call = call i64 @add(i64 40, i64 2)
|
|
%ca.tr = trunc i64 %call to i32
|
|
ret i32 %ca.tr
|
|
}
|