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
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.11.6] - 2026-05-30

**Patch: encoder is now total under fuzzing (#186).** The `encoder_no_panic`
fuzz target (which runs with an empty corpus) intermittently found pre-existing
panics, making the Fuzz Smoke gate flaky. The remaining root — after the
PC/R15-operand fix in v0.11.4 (#185) — was arithmetic overflow in the ARM32
branch encoders: `*offset - 2` overflow-panics at `i32::MIN` under
`-Cdebug-assertions`. Now uses `wrapping_sub` (total; identical for any real
branch offset). A 180s sweep then ran **8.8M executions with zero panics**.
Also adds a committed `fuzz/seed_corpus/encoder_no_panic/` (61 inputs) so CI's
60s run starts with coverage rather than exploring cold. The separate
`i64_lowering` fuzz finding (real clobber vs harness false-positive) is tracked
in #188.

**Falsification statement.** v0.11.6 is wrong if `encoder_no_panic` panics on
any input (the encoder must return Ok or Err, never abort).

## [0.11.5] - 2026-05-30

**Patch: high-register Thumb CMN (#184).** Closes the last sibling of the #180
Expand Down
34 changes: 17 additions & 17 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 @@ -27,7 +27,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.11.5"
version = "0.11.6"
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.11.5",
version = "0.11.6",
)

# Bazel dependencies
Expand Down
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.11.5" }
synth-core = { path = "../synth-core", version = "0.11.6" }
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.11.5" }
synth-synthesis = { path = "../synth-synthesis", version = "0.11.5" }
synth-core = { path = "../synth-core", version = "0.11.6" }
synth-synthesis = { path = "../synth-synthesis", version = "0.11.6" }
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.11.5" }
synth-core = { path = "../synth-core", version = "0.11.6" }
anyhow.workspace = true
thiserror.workspace = true
4 changes: 2 additions & 2 deletions crates/synth-backend/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ default = ["arm-cortex-m"]
arm-cortex-m = ["synth-synthesis"]

[dependencies]
synth-core = { path = "../synth-core", version = "0.11.5" }
synth-synthesis = { path = "../synth-synthesis", version = "0.11.5", optional = true }
synth-core = { path = "../synth-core", version = "0.11.6" }
synth-synthesis = { path = "../synth-synthesis", version = "0.11.6", optional = true }
anyhow.workspace = true
thiserror.workspace = true
8 changes: 6 additions & 2 deletions crates/synth-backend/src/arm_encoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -485,7 +485,10 @@ impl ArmEncoder {
// ARM adds PC+8 to the offset, so we need to adjust:
// target = PC + 8 + (offset * 4)
// For backward branch of N instructions: offset = -(N + 2)
let adjusted_offset = *offset - 2; // Account for PC+8
// wrapping_sub keeps the encoder total under fuzzing (#186): an
// extreme i32::MIN offset would otherwise overflow-panic; for any
// real branch offset this is identical to `- 2`.
let adjusted_offset = offset.wrapping_sub(2); // Account for PC+8
let offset_bits = (adjusted_offset as u32) & 0x00FFFFFF;
0xEA000000 | offset_bits
}
Expand All @@ -506,7 +509,8 @@ impl ArmEncoder {
Condition::LE => 0xD,
};
// B<cond> encoding: cond(4) | 1010 | offset(24)
let adjusted_offset = *offset - 2; // Account for PC+8
// wrapping_sub: total under fuzzing (#186), identical for real offsets.
let adjusted_offset = offset.wrapping_sub(2); // Account for PC+8
let offset_bits = (adjusted_offset as u32) & 0x00FFFFFF;
(cond_bits << 28) | 0x0A000000 | offset_bits
}
Expand Down
16 changes: 8 additions & 8 deletions crates/synth-cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,18 +27,18 @@ 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.11.5" }
synth-frontend = { path = "../synth-frontend", version = "0.11.5" }
synth-synthesis = { path = "../synth-synthesis", version = "0.11.5" }
synth-backend = { path = "../synth-backend", version = "0.11.5" }
synth-core = { path = "../synth-core", version = "0.11.6" }
synth-frontend = { path = "../synth-frontend", version = "0.11.6" }
synth-synthesis = { path = "../synth-synthesis", version = "0.11.6" }
synth-backend = { path = "../synth-backend", version = "0.11.6" }

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

# Optional verification (requires z3)
synth-verify = { path = "../synth-verify", version = "0.11.5", optional = true, features = ["z3-solver", "arm"] }
synth-verify = { path = "../synth-verify", version = "0.11.6", optional = true, features = ["z3-solver", "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.11.5" }
synth-core = { path = "../synth-core", version = "0.11.6" }

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.11.5" }
synth-cfg = { path = "../synth-cfg", version = "0.11.6" }

[dev-dependencies]
criterion = { version = "0.5", 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.11.5" }
synth-cfg = { path = "../synth-cfg", version = "0.11.5" }
synth-opt = { path = "../synth-opt", version = "0.11.5" }
synth-core = { path = "../synth-core", version = "0.11.6" }
synth-cfg = { path = "../synth-cfg", version = "0.11.6" }
synth-opt = { path = "../synth-opt", version = "0.11.6" }
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 @@ -17,12 +17,12 @@ arm = ["synth-synthesis"]

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

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

# SMT solver for formal verification
z3 = { version = "0.19", features = ["static-link-z3"], optional = true }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
²ž……ÿ:—°){Ú
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ååååž²/…
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
²„ß
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
¥m…[
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Ų
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
? ~[
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
’Ý’¡ÿÿÿÿÿÿmÑ……
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
²¢€¹m¹¹Ä
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
J!UU
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
=—u„
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ÑCÑC
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
²džë¦•
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ªªªªªm]ë
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
²žm
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
²žüzyÿûÇ0ÿ
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
²mžë
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
­ÚÚÚ
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
²~Z÷zlC…
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
²…žåv/å
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
²~j聾“¼ö
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
—=
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
—²—²„—
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
²~聾“¼÷z
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
²m!!!!!!!!!Të„ß
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Ñ
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
²ž…&…m’…e
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
&žSŒ=’²…hhh
Binary file not shown.
Binary file not shown.
Loading
Loading