Files
vercel-labs--zerolang/native/zero-c/docs/backend-contract.md
T
wehub-resource-sync e7738de6d2
CI / Deep Native Runtime Cases (1/6) (push) Has been skipped
CI / Native Preflight (push) Failing after 1s
CI / Native Runtime Cases (1/2) (push) Failing after 0s
CI / Native Runtime Cases (2/2) (push) Failing after 1s
CI / Native Metadata Reports (push) Failing after 0s
CI / Native Direct Backend Artifacts (push) Failing after 0s
CI / Native Sanitizer Smoke (push) Failing after 1s
CI / Command Contract Snapshots (push) Failing after 1s
CI / Deep Conformance Suite (push) Has been skipped
CI / Graph Build Perf (push) Failing after 1s
CI / Deep Native Preflight (push) Has been skipped
CI / Deep Native Runtime Cases (2/6) (push) Has been skipped
CI / Deep Native Runtime Cases (3/6) (push) Has been skipped
CI / Conformance Suite (push) Failing after 1s
CI / Workspace Checks (push) Failing after 0s
CI / Deep Native Runtime Cases (5/6) (push) Has been skipped
CI / Deep Native Runtime Cases (6/6) (push) Has been skipped
CI / Deep Native Runtime Cases (4/6) (push) Has been skipped
CI / Deep Graph Build Perf (push) Has been skipped
chore: import upstream snapshot with attribution
2026-07-13 12:29:30 +08:00

114 lines
4.4 KiB
Markdown

# Backend Contract
Zero backend selection is a compiler contract below the typed program and MIR.
The parser, checker, ProgramGraph, canonical source, and semantic facts must not
depend on a backend family.
## Selection
Backend selection has these dimensions:
- target: a supported Zero target name such as `linux-musl-x64`;
- backend family: `direct` or `llvm`;
- backend emitter: an implementation-specific emitter such as `zero-elf64`;
- artifact kind: `exe`, `obj`, or `llvm-ir`.
`direct` is the default backend family. A missing `--backend` means `direct`.
`--backend direct` also selects the direct family without selecting a specific
direct emitter. Direct emitter names such as `zero-elf64` remain exact direct
backend requests.
`llvm` is a known experimental backend family. It is explicit-only: it is not
the default backend and not release eligible. Direct emitters remain the
supported release path. LLVM can emit deterministic textual LLVM IR when
selected with `--backend llvm --emit llvm-ir`. Native LLVM executable artifacts
are buildable only for supported host targets with a ready clang toolchain.
LLVM lowering currently supports scalar code, direct calls, branches, loops,
primitive fixed arrays, byte views, readonly strings, and primitive `std.mem`
helpers. Native LLVM object output, unsupported targets, and unsupported MIR
constructs must report a structured backend blocker; they must not fall back to
direct emitters.
Textual LLVM IR artifacts that reference Zero runtime helpers must report that
dependency in `objectBackend.linking.targetLibraries` and
`objectBackend.linkerPlan.staticLibraries`. Emitting the `.ll` file still does
not compile or link the runtime object.
`zero size --backend llvm` is a metadata report, not a build fallback. It may
report LLVM target triple, optimization level, retained runtime/helper facts,
and direct-vs-LLVM comparison rows without writing a native artifact.
Unknown backend names are command errors. Known-but-unavailable backend names
are buildability errors.
## MIR Input
Backends consume Zero MIR. They do not lower from source tokens, parser trees,
checker scopes, or generated textual views. MIR input must carry enough facts
for backend diagnostics to explain the unsupported construct, target, object
format, selected backend, and failing stage.
MIR verification remains backend-independent. Backend-specific buildability
checks may reject a verified MIR program when the selected backend cannot lower
the selected feature or artifact kind.
## Readiness
Target readiness answers whether the selected target, backend family, emitter,
artifact kind, and MIR subset are buildable.
Readiness JSON must include:
- `target`;
- `emit`;
- `objectFormat`;
- `backend`;
- `stage`;
- `languageOk`;
- `buildable`;
- structured diagnostics with optional `backendBlocker`.
The `backendBlocker` fields are:
- `target`;
- `objectFormat`;
- `backend`;
- `stage`;
- `unsupportedFeature`.
## Diagnostic Stages
Backend diagnostics distinguish these stages:
- `backend-selection`: the backend family is known but unavailable;
- `target-selection`: the backend family does not support the target;
- `lower`: MIR contains a feature the backend cannot lower;
- `buildability`: the backend cannot build the selected artifact kind or entry
shape;
- `toolchain`: an external backend toolchain is required but missing;
- `emit`: a backend invariant failed after buildability accepted the program.
`BLD002` is used for unknown backend names. `BLD004` is used for ordinary
backend blockers. Code generation invariant failures remain `CGEN004`.
## Target Facts
`zero targets` exposes backend families separately from direct emitter facts.
`directBackend` remains the detailed direct-emitter record. `backendFamilies`
reports the default family, known families, currently available families, and
the no-fallback policy.
LLVM facts may claim textual IR emission and host executable output only when
Zero can build the selected artifact through the LLVM path for that target.
LLVM facts must also carry `backendLifecycle` so tools can distinguish explicit
experimental readiness from supported release eligibility.
## Fallback Policy
Backend fallback is never implicit:
- direct requests do not fall back to LLVM;
- LLVM requests do not fall back to direct;
- removed C backend flags do not act as a debug or compatibility path;
- graph and source entry points follow the same backend contract.