Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.45.2] - 2026-07-16

**Soundness patch — #776 closed (aarch64 rotl clobber).**

### Fixed (soundness)

- **aarch64 `i32.rotl`/`i64.rotl` clobbered a computed rotate operand (#776).**
Rotate-left lowers to `neg + rorv` (A64 has no native rotate-left). The pre-fix
code reused `dst = alloc_temp()` as the `neg` scratch (`neg(dst,k);
rorv(dst,n,dst)`); when the rotated operand `n` is a **computed** value,
`alloc_temp` can return n's freed register, so `neg(dst,k)` destroyed `n` before
`rorv` read it — a silent wrong result. Param-only rotates escaped it (n sits in
a distinct argument register), which is why it slipped through #769's
param-operand differential. Fix: compute `-k` in `k`'s own now-dead register
(`neg(k,k); rorv(dst,n,k)`) — reads-before-write safe for any `dst` aliasing.
Red-first `i32_rotl_computed`/`i64_rotl_computed` cases added to the aarch64 m2
differential (n = an add temp): RED on the pre-fix binary (7 cases, e.g.
`A64=-49` vs `wasmtime=1183502082`), GREEN after (182/182). Introduced by #769
(aarch64 milestone 2, v0.45.0).

## [0.45.1] - 2026-07-16

**Soundness patch — #757 closed (root-caused + fixed on gale's exact module).**
Expand Down
36 changes: 18 additions & 18 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ resolver = "2"
# semver to publish, so the convention now catches up: workspace
# version follows the release tag, bumped pre-tag in the release
# checklist. See docs/release-process.md.
version = "0.45.1"
version = "0.45.2"
edition = "2024"
rust-version = "1.88"
authors = ["PulseEngine Team"]
Expand Down
2 changes: 1 addition & 1 deletion MODULE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ module(
name = "synth",
# Kept in lockstep with [workspace.package] version in Cargo.toml.
# Both are bumped pre-tag — see docs/release-process.md.
version = "0.45.1",
version = "0.45.2",
)

# Bazel dependencies
Expand Down
2 changes: 1 addition & 1 deletion crates/synth-backend-aarch64/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ categories.workspace = true
description = "AArch64 (A64) host-native backend for synth — integer subset (milestone 1, #538)"

[dependencies]
synth-core = { path = "../synth-core", version = "0.45.1" }
synth-core = { path = "../synth-core", version = "0.45.2" }
thiserror.workspace = true
tracing.workspace = true
2 changes: 1 addition & 1 deletion crates/synth-backend-awsm/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ categories.workspace = true
description = "aWsm backend integration for the Synth compiler"

[dependencies]
synth-core = { path = "../synth-core", version = "0.45.1" }
synth-core = { path = "../synth-core", version = "0.45.2" }
anyhow.workspace = true
thiserror.workspace = true
4 changes: 2 additions & 2 deletions crates/synth-backend-riscv/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ categories.workspace = true
description = "RISC-V encoder, ELF builder, PMP allocator, and bare-metal startup for synth"

[dependencies]
synth-core = { path = "../synth-core", version = "0.45.1" }
synth-synthesis = { path = "../synth-synthesis", version = "0.45.1" }
synth-core = { path = "../synth-core", version = "0.45.2" }
synth-synthesis = { path = "../synth-synthesis", version = "0.45.2" }
anyhow.workspace = true
thiserror.workspace = true
tracing.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/synth-backend-wasker/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ categories.workspace = true
description = "Wasker backend integration for the Synth compiler"

[dependencies]
synth-core = { path = "../synth-core", version = "0.45.1" }
synth-core = { path = "../synth-core", version = "0.45.2" }
anyhow.workspace = true
thiserror.workspace = true
6 changes: 3 additions & 3 deletions crates/synth-backend/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@ default = ["arm-cortex-m"]
arm-cortex-m = ["synth-synthesis"]

[dependencies]
synth-core = { path = "../synth-core", version = "0.45.1" }
synth-synthesis = { path = "../synth-synthesis", version = "0.45.1", optional = true }
synth-core = { path = "../synth-core", version = "0.45.2" }
synth-synthesis = { path = "../synth-synthesis", version = "0.45.2", optional = true }
anyhow.workspace = true
thiserror.workspace = true

[dev-dependencies]
# #667 move 2: the i64 pseudo-op expansion certification oracle
# (tests/i64_expansion_certification.rs) feeds THIS crate's emitted encoder
# bytes to the synth-verify expansion validator. Dev-only — no prod-dep edge.
synth-verify = { path = "../synth-verify", version = "0.45.1", features = ["arm"] }
synth-verify = { path = "../synth-verify", version = "0.45.2", features = ["arm"] }
18 changes: 9 additions & 9 deletions crates/synth-cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -52,23 +52,23 @@ verify = ["synth-verify"]
# Path deps carry `version` so `cargo publish` rewrites them to the
# crates.io coordinate. Bumping the workspace version requires
# updating these in lockstep — see docs/release-process.md.
synth-core = { path = "../synth-core", version = "0.45.1" }
synth-frontend = { path = "../synth-frontend", version = "0.45.1" }
synth-synthesis = { path = "../synth-synthesis", version = "0.45.1" }
synth-backend = { path = "../synth-backend", version = "0.45.1" }
synth-core = { path = "../synth-core", version = "0.45.2" }
synth-frontend = { path = "../synth-frontend", version = "0.45.2" }
synth-synthesis = { path = "../synth-synthesis", version = "0.45.2" }
synth-backend = { path = "../synth-backend", version = "0.45.2" }

# AArch64 host-native backend (#538) — small pure-Rust crate, always on.
synth-backend-aarch64 = { path = "../synth-backend-aarch64", version = "0.45.1" }
synth-backend-aarch64 = { path = "../synth-backend-aarch64", version = "0.45.2" }

# Optional external backends
synth-backend-awsm = { path = "../synth-backend-awsm", version = "0.45.1", optional = true }
synth-backend-wasker = { path = "../synth-backend-wasker", version = "0.45.1", optional = true }
synth-backend-riscv = { path = "../synth-backend-riscv", version = "0.45.1", optional = true }
synth-backend-awsm = { path = "../synth-backend-awsm", version = "0.45.2", optional = true }
synth-backend-wasker = { path = "../synth-backend-wasker", version = "0.45.2", optional = true }
synth-backend-riscv = { path = "../synth-backend-riscv", version = "0.45.2", optional = true }

# Optional translation validation — pure-Rust ordeal engine by default (#553),
# no C++ toolchain needed. For the Z3 differential oracle build with
# `--features verify,synth-verify/z3-solver` (+ SYNTH_SOLVER_DIFF=1 at runtime).
synth-verify = { path = "../synth-verify", version = "0.45.1", optional = true, features = ["arm"] }
synth-verify = { path = "../synth-verify", version = "0.45.2", optional = true, features = ["arm"] }

# Optional PulseEngine WASM optimizer
# Uncomment when loom crate is available:
Expand Down
2 changes: 1 addition & 1 deletion crates/synth-frontend/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ description = "WASM/WAT parser and module decoder frontend for the Synth compile
# Internal path deps carry an explicit version so `cargo publish`
# can rewrite to the crates.io coordinate. `path` is used for
# in-workspace builds; `version` is what crates.io sees.
synth-core = { path = "../synth-core", version = "0.45.1" }
synth-core = { path = "../synth-core", version = "0.45.2" }

wasmparser.workspace = true
wasm-encoder.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/synth-opt/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ categories.workspace = true
description = "Peephole optimization passes for the Synth compiler"

[dependencies]
synth-cfg = { path = "../synth-cfg", version = "0.45.1" }
synth-cfg = { path = "../synth-cfg", version = "0.45.2" }

[dev-dependencies]
criterion = { version = "0.8", features = ["html_reports"] }
Expand Down
6 changes: 3 additions & 3 deletions crates/synth-synthesis/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ categories.workspace = true
description = "WASM-to-ARM instruction selection and peephole optimizer"

[dependencies]
synth-core = { path = "../synth-core", version = "0.45.1" }
synth-cfg = { path = "../synth-cfg", version = "0.45.1" }
synth-opt = { path = "../synth-opt", version = "0.45.1" }
synth-core = { path = "../synth-core", version = "0.45.2" }
synth-cfg = { path = "../synth-cfg", version = "0.45.2" }
synth-opt = { path = "../synth-opt", version = "0.45.2" }
serde.workspace = true
anyhow.workspace = true
thiserror.workspace = true
Expand Down
8 changes: 4 additions & 4 deletions crates/synth-verify/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ arm = ["synth-synthesis"]

[dependencies]
# Core dependencies (always required)
synth-core = { path = "../synth-core", version = "0.45.1" }
synth-cfg = { path = "../synth-cfg", version = "0.45.1" }
synth-opt = { path = "../synth-opt", version = "0.45.1" }
synth-core = { path = "../synth-core", version = "0.45.2" }
synth-cfg = { path = "../synth-cfg", version = "0.45.2" }
synth-opt = { path = "../synth-opt", version = "0.45.2" }

# ARM synthesis (optional, behind 'arm' feature)
synth-synthesis = { path = "../synth-synthesis", version = "0.45.1", optional = true }
synth-synthesis = { path = "../synth-synthesis", version = "0.45.2", optional = true }

# Default SMT engine: pure-Rust, certificate-checked QF_BV solver (#553).
# 0.9 adds the `ordeal::trap` module (trap-preservation VCs, VCR-VER-002 / #166);
Expand Down
2 changes: 1 addition & 1 deletion npm/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@pulseengine/synth",
"version": "0.45.1",
"version": "0.45.2",
"description": "synth — a WebAssembly-to-ARM/RISC-V/AArch64 compiler with mechanized correctness proofs. Produces bare-metal ELF binaries for embedded targets.",
"bin": {
"synth": "./run.js"
Expand Down
Loading