• v0.29.0
    Test / vet (push) Successful in 43s
    Release / build (amd64, linux) (push) Successful in 41s
    Release / build (arm64, linux) (push) Successful in 38s
    Release / build (loong64, linux) (push) Successful in 39s
    Release / build (riscv64, linux) (push) Successful in 38s
    Test / test (push) Successful in 1m58s
    Release / release (push) Successful in 18s
    Test / build (push) Successful in 37s
    Stable

    petrbalvin released this 2026-08-07 19:34:09 +00:00 | 221 commits to main since this release

    RISC-V GOOBJ emission, YMM vector register display, named buffer allocation
    in the debugger, two new CLI commands (diff, profile), go-to-definition in
    the LSP, combined ABI+fuzz verification, and did-you-mean label suggestions.
    A --map flag for diff and --call/--buf flags for verify extend the
    new CLI commands. A signature-parser fix corrects grouped Go parameters.

    Added

    • RISC-V GOOBJ emission — gasm asm --format goobj for RISC-V produces
      linkable Go objects with funcdata, pc-value tables, and RISC-V relocation
      types (same format as amd64 GOOBJ, with the RISC-V architecture marker).
    • gasm diff — compare the machine code of two assembly files byte-for-byte;
      shows which functions differ and the first few differing bytes.
    • gasm profile — show the basic-block structure of each function: labels,
      offsets, frame size, and NOSPLIT flag.
    • LSP go-to-definition — textDocument/definition navigates from a label
      reference to its definition.
    • did-you-mean — when the RISC-V assembler encounters an undefined label, it
      suggests the closest existing label using Levenshtein distance.
    • YMM vector register display — regs in the debugger now shows YMM
      registers via PTRACE_GETFPREGS (falls back to XMM when XSAVE is unavailable).
    • Named buffer allocation — gasm debug --buf name:size:pattern allocates
      buffers in the debuggee filled with zero, ones, seq, or a hex pattern;
      buffer pointers are placed into the argument block at the matching positions.
    • Crash input storage — FuzzResult.CrashInput stores the input that caused
      a crash or mismatch for reproducibility.
    • ABI + fuzz combined — gasm verify --fuzz now runs ABI checks (sentinel
      registers, canary, stack bounds) alongside differential fuzz testing.
    • gasm diff --map — compare functions whose names differ between files
      (e.g. --map wideCopyAVX2=wideCopyAVX512 pairs two variants regardless
      of suffix). Unmapped functions fall back to the original name match.
    • gasm verify --call — invoke a single function with user-supplied buffers
      (--buf name:size:pattern) instead of the smoke/abi/fuzz sweeps. Patterns:
      zero, ones, seq, or a hex blob. Useful for partial functions (e.g.
      decoders) that crash on random input but should succeed on valid data.
      The arg block is printed before and after the call, showing return values.
    • gasm verify --ground-truth now documented in --help (was already a flag,
      just missing from the help text).

    Fixed

    • Signature parser — grouped Go parameters like dst, src []byte are now
      parsed correctly (both get type []byte). Previously the first name was
      treated as its own type (dst with size 8), causing wrong ABI0 arg-block
      layout in both verify --call and the fuzzer.
    • Flaky JIT tests — runtime.KeepAlive guards and package-level buffers
      prevent GC from collecting heap objects whose addresses were passed to JIT
      code via unsafe.Pointer; all verify tests pass 100/100 under -race.

    Cleaned up

    • Removed external kernel test dependencies — the verify test suite no
      longer references production kernels from the separate go-libraries project.
      The remaining test suite uses only testdata/verify/*.s kernels, which are
      part of this repository. Coverage is identical locally and in CI (80.3 %).

    Verified

    • gasm diff detects byte-level differences; --map pairs differently-named
      functions for comparison.
    • gasm verify --call invokes functions with user-supplied buffers; the arg
      block is printed before and after the call, showing return values.
    • LSP go-to-definition resolves labels across functions and files.
    Downloads