Skip to content

Commit 8489153

Browse files
avrabeclaude
andauthored
chore(release): v0.11.51 — VCR-MEM-001 layer-1 shadow-stack shrink + pin sweep + changelog (#417)
Headline: #383 native-pointer shadow-stack shrink (--shadow-stack-size B now active), the feature gale held the release for — gust 8 KiB STM32F100 boot unblocked (.bss 1048720→4240), opt-in/default-off, on-silicon confirmed (#383 closed COMPLETED). Also: cross-backend op-parity oracle (#387), register-polymorphic i32 pilot (#386), scry regalloc/stack-depth substrate (#392/#397), DWARF Tier-1 read→compose→emit logic frozen-safe (#399/#403/#413/ #414/#415, toward v0.12.0), and VCR traceability/roadmap (#400/#407/#410/#411). Pin sweep 0.11.50 → 0.11.51 across the workspace + path-deps + MODULE.bazel. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
1 parent f87554e commit 8489153

13 files changed

Lines changed: 92 additions & 42 deletions

File tree

CHANGELOG.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,56 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.11.51] - 2026-06-22
11+
12+
**NATIVE-POINTER SHADOW-STACK SHRINK — #383 (VCR-MEM-001 layer-1): the
13+
`--shadow-stack-size B` flag is now ACTIVE.** Under `--native-pointer-abi` synth
14+
reserved the wasm linear memory up to the declared page top (the `__stack_pointer`
15+
global's init), so a module that declares a large memory but lives in a few KB
16+
(gale's `gust` kernel: `(memory 17)` ≈ 1 MiB) could not be placed on a small-RAM
17+
MCU. `--shadow-stack-size B` re-bases the shadow-stack top to `B` and shrinks the
18+
NOBITS `.bss` reservation accordingly, unblocking the 8 KiB STM32F100 gust boot.
19+
20+
- **#383`--shadow-stack-size B` shrink** (was: honest-Err scaffold, #388).
21+
Re-bases the `__stack_pointer` global slot `sp_init → B` and resizes the
22+
reservation to `B + static-tail`. Measured on `gust_kernel.wasm`:
23+
`--shadow-stack-size 4096``.bss` 1048720 → 4240 B, SP slot 1048576 → 4096,
24+
`.text`/`.data` + all relocations unchanged.
25+
- Correct-by-construction for the verified stack-first geometry (statics
26+
at/above `sp_init` retargeted into the packed `.data` per #354, the only
27+
`.bss` static relocs being addend-0 region-base pointers, stable under the
28+
shrink). **Refuses honestly** (typed Err) for any geometry it cannot prove
29+
safe: one-PROGBITS fallback, `B > sp_init`, a non-zero inline static addend,
30+
a non-Abs32 reservation reloc, or an ambiguous SP global.
31+
- **Opt-in**: default unset reserves the full page ⇒ frozen fixtures
32+
bit-identical. The footprint is ASSERTED (the budget is trusted), not proven;
33+
the budget must cover everything live in linear memory above address 0.
34+
- Verification: flag-off byte-identical on `msgq_put_359` (the native-pointer
35+
path); the native-pointer differential passes; flag-on runtime exercised on
36+
`native_pointer_shadow_stack` (the store through the re-based SP lands
37+
in-region). gale confirmed on-silicon (issue #383 closed COMPLETED).
38+
- Tests `shadow_stack_shrink_383.rs`; tracked `VCR-MEM-001`.
39+
40+
- **Cross-backend op-parity oracle** (#387, `VCR-SEL-005`): the ARM-vs-RISC-V
41+
op-lowering parity ledger surfaces "selector missed an op" gaps (the #223/#232
42+
class) as a gate rather than on silicon.
43+
- **Register-polymorphic i32 lowering pilot** (#386, `VCR-SEL-001`): first
44+
discharge-under-generalization measurement toward the verified selector DSL.
45+
- **scry-for-regalloc + shadow-stack-depth substrate** (#392, #397, `VCR-RA-010`
46+
/ `VCR-MEM-001` layer-2): scry's const-remat signal and longest-path
47+
shadow-stack bound (`scry-sai-core` v1.12) verified in-tree as DEV-dependency
48+
substrate (no production dep).
49+
- **DWARF Tier-1 read→compose→emit logic** (#399, #403, #413, #414, #415,
50+
`VCR-DBG-001`, toward v0.12.0): the decoder records per-op wasm byte offsets;
51+
the input `.debug_line` parses to (offset → file:line); the op-index → source
52+
composer normalizes and joins; and the emit round-trips faithfully — all
53+
frozen-safe (no production gimli dep, no output-ELF change). The gated ELF
54+
wiring is the v0.12.0 release step.
55+
- **Traceability + roadmap**: requirement→test `verifies` bindings for the
56+
implemented VCR features (#410, #411), the VCR-MEM-002 multi-memory structural
57+
isolation decision (#407, meld#300), and the VCR-PERF-001 silicon size-gap
58+
attribution (#391, gale #390). Cross-repo scry traceability (#400).
59+
1060
## [0.11.50] - 2026-06-19
1161

1262
**LARGE LOAD/STORE OFFSET — #382: a static memory `offset > 0xFFF` (4095) no

Cargo.lock

Lines changed: 17 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ resolver = "2"
2727
# semver to publish, so the convention now catches up: workspace
2828
# version follows the release tag, bumped pre-tag in the release
2929
# checklist. See docs/release-process.md.
30-
version = "0.11.50"
30+
version = "0.11.51"
3131
edition = "2024"
3232
rust-version = "1.88"
3333
authors = ["PulseEngine Team"]

MODULE.bazel

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ module(
77
name = "synth",
88
# Kept in lockstep with [workspace.package] version in Cargo.toml.
99
# Both are bumped pre-tag — see docs/release-process.md.
10-
version = "0.11.50",
10+
version = "0.11.51",
1111
)
1212

1313
# Bazel dependencies

crates/synth-backend-awsm/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ categories.workspace = true
1111
description = "aWsm backend integration for the Synth compiler"
1212

1313
[dependencies]
14-
synth-core = { path = "../synth-core", version = "0.11.50" }
14+
synth-core = { path = "../synth-core", version = "0.11.51" }
1515
anyhow.workspace = true
1616
thiserror.workspace = true

crates/synth-backend-riscv/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ categories.workspace = true
1111
description = "RISC-V encoder, ELF builder, PMP allocator, and bare-metal startup for synth"
1212

1313
[dependencies]
14-
synth-core = { path = "../synth-core", version = "0.11.50" }
15-
synth-synthesis = { path = "../synth-synthesis", version = "0.11.50" }
14+
synth-core = { path = "../synth-core", version = "0.11.51" }
15+
synth-synthesis = { path = "../synth-synthesis", version = "0.11.51" }
1616
anyhow.workspace = true
1717
thiserror.workspace = true
1818
tracing.workspace = true

crates/synth-backend-wasker/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ categories.workspace = true
1111
description = "Wasker backend integration for the Synth compiler"
1212

1313
[dependencies]
14-
synth-core = { path = "../synth-core", version = "0.11.50" }
14+
synth-core = { path = "../synth-core", version = "0.11.51" }
1515
anyhow.workspace = true
1616
thiserror.workspace = true

crates/synth-backend/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ default = ["arm-cortex-m"]
1515
arm-cortex-m = ["synth-synthesis"]
1616

1717
[dependencies]
18-
synth-core = { path = "../synth-core", version = "0.11.50" }
19-
synth-synthesis = { path = "../synth-synthesis", version = "0.11.50", optional = true }
18+
synth-core = { path = "../synth-core", version = "0.11.51" }
19+
synth-synthesis = { path = "../synth-synthesis", version = "0.11.51", optional = true }
2020
anyhow.workspace = true
2121
thiserror.workspace = true

crates/synth-cli/Cargo.toml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,18 @@ verify = ["synth-verify"]
2727
# Path deps carry `version` so `cargo publish` rewrites them to the
2828
# crates.io coordinate. Bumping the workspace version requires
2929
# updating these in lockstep — see docs/release-process.md.
30-
synth-core = { path = "../synth-core", version = "0.11.50" }
31-
synth-frontend = { path = "../synth-frontend", version = "0.11.50" }
32-
synth-synthesis = { path = "../synth-synthesis", version = "0.11.50" }
33-
synth-backend = { path = "../synth-backend", version = "0.11.50" }
30+
synth-core = { path = "../synth-core", version = "0.11.51" }
31+
synth-frontend = { path = "../synth-frontend", version = "0.11.51" }
32+
synth-synthesis = { path = "../synth-synthesis", version = "0.11.51" }
33+
synth-backend = { path = "../synth-backend", version = "0.11.51" }
3434

3535
# Optional external backends
36-
synth-backend-awsm = { path = "../synth-backend-awsm", version = "0.11.50", optional = true }
37-
synth-backend-wasker = { path = "../synth-backend-wasker", version = "0.11.50", optional = true }
38-
synth-backend-riscv = { path = "../synth-backend-riscv", version = "0.11.50", optional = true }
36+
synth-backend-awsm = { path = "../synth-backend-awsm", version = "0.11.51", optional = true }
37+
synth-backend-wasker = { path = "../synth-backend-wasker", version = "0.11.51", optional = true }
38+
synth-backend-riscv = { path = "../synth-backend-riscv", version = "0.11.51", optional = true }
3939

4040
# Optional verification (requires z3)
41-
synth-verify = { path = "../synth-verify", version = "0.11.50", optional = true, features = ["z3-solver", "arm"] }
41+
synth-verify = { path = "../synth-verify", version = "0.11.51", optional = true, features = ["z3-solver", "arm"] }
4242

4343
# Optional PulseEngine WASM optimizer
4444
# Uncomment when loom crate is available:

crates/synth-frontend/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ description = "WASM/WAT parser and module decoder frontend for the Synth compile
1414
# Internal path deps carry an explicit version so `cargo publish`
1515
# can rewrite to the crates.io coordinate. `path` is used for
1616
# in-workspace builds; `version` is what crates.io sees.
17-
synth-core = { path = "../synth-core", version = "0.11.50" }
17+
synth-core = { path = "../synth-core", version = "0.11.51" }
1818

1919
wasmparser.workspace = true
2020
wasm-encoder.workspace = true

0 commit comments

Comments
 (0)