Files
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

4.4 KiB

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.