nanofil/bench/profile/checks.nix
The benchmark's programs built for counting executed access checks (checks.py, docs/perf.md item 16): filcc -O2 with its check scheduler in each configuration, and nanofil -O with and without inlining, the nanofil objects assembled with as − L so that every block label of the .s stays a symbol (objdump then names each block), and the .s kept in s/. Neither changes .text.
nix build --impure -f nanofil/bench/profile/checks.nix -o nanofil/bench/profile/checks nix build ... --argstr only ref,ref-fwd # a subset of the variants
| flake | default builtins.getFlaketoString../../.. |
| pkgs | default importflake.inputs.nixpkgs system = "x86_64-linux"; |
| filcc | default flake.packages.x86_64-linux.filcc-staging |
| only | default "" |
filcc with extra flags on compiles (-c) only; FilPizlonator's switches are cl::opts (FilPizlonator.cpp:59, 71).
Forward propagation only: removes checks already established on every path, never moves one earlier.
nix/nanofil-cc.nix, keeping the .s and its local labels.
Every access keeps its own full check (no M7 reuse or renewal).
Half checks (docs/half.md): one bound tested where an earlier check of the object proves the other.
The preprocessed sources nanofil compiles (checkclass.py reads them), with filcc compiling the objects so that the program links.