fix: resolve audit findings — stale text, dead code, build tags, docs
Test / vet (push) Successful in 47s
Test / test (push) Successful in 2m39s
Test / build (push) Successful in 42s

Assisted-by: MiMo V2.5 Pro
This commit is contained in:
2026-08-21 00:50:31 +02:00
parent f9eb4021d6
commit 1bf95a169e
10 changed files with 21 additions and 19 deletions
+1 -1
View File
@@ -17,7 +17,7 @@ import (
func cmdDebug(args []string) int { func cmdDebug(args []string) int {
fs := newCommand("debug", "gasm debug <file.s> --func <name>", ` fs := newCommand("debug", "gasm debug <file.s> --func <name>", `
Interactive debugger for JIT-assembled amd64 functions. Launches the Interactive debugger for JIT-assembled functions. Launches the
function in a traced subprocess (ptrace), then provides a REPL for function in a traced subprocess (ptrace), then provides a REPL for
single-stepping, breakpoints, register and memory inspection. single-stepping, breakpoints, register and memory inspection.
+4 -4
View File
@@ -117,9 +117,9 @@ func usage(w io.Writer) {
{"parse", "parse and report syntax errors"}, {"parse", "parse and report syntax errors"},
{"fmt", "canonicalise formatting (gofmt for assembly)"}, {"fmt", "canonicalise formatting (gofmt for assembly)"},
{"lint", "run static checks"}, {"lint", "run static checks"},
{"asm", "assemble .s files to machine code (amd64, riscv64)"}, {"asm", "assemble .s files to machine code (amd64, arm64, riscv64, loong64)"},
{"verify", "JIT-assemble and run dynamic checks (amd64, riscv64)"}, {"verify", "JIT-assemble and run dynamic checks (amd64, arm64, riscv64, loong64)"},
{"debug", "interactive source-level debugger (amd64)"}, {"debug", "interactive source-level debugger (amd64, arm64, riscv64, loong64)"},
{"diff", "compare machine code of two .s files"}, {"diff", "compare machine code of two .s files"},
{"profile", "show basic-block structure of functions"}, {"profile", "show basic-block structure of functions"},
{"lsp", "run the language server over stdio"}, {"lsp", "run the language server over stdio"},
@@ -1073,7 +1073,7 @@ decoders) that crash on random input but should succeed on valid data.
// AArch64: ground-truth only (no JIT on non-ARM64 hosts). // AArch64: ground-truth only (no JIT on non-ARM64 hosts).
return cmdVerifyARM64(path, *groundTruth, *profile) return cmdVerifyARM64(path, *groundTruth, *profile)
default: default:
fmt.Fprintln(os.Stderr, "gasm verify: only amd64, riscv64 and loong64 are supported") fmt.Fprintln(os.Stderr, "gasm verify: unsupported architecture")
return 1 return 1
} }
+2
View File
@@ -1,6 +1,8 @@
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org) // Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
//go:build linux
package debug package debug
import "fmt" import "fmt"
+2 -4
View File
@@ -94,7 +94,7 @@ func REPL(s *Session, bm *Breakpoints, codeBase uint64, funcOffset, funcSize, ar
text, instLen, _ := s.Disassemble(pc) text, instLen, _ := s.Disassemble(pc)
if strings.HasPrefix(strings.ToLower(text), "call") || strings.HasPrefix(strings.ToLower(text), "bl") { if strings.HasPrefix(strings.ToLower(text), "call") || strings.HasPrefix(strings.ToLower(text), "bl") {
afterAddr := pc + uint64(instLen) afterAddr := pc + uint64(instLen)
bp, err := bm.Set(afterAddr, "(next)") _, err := bm.Set(afterAddr, "(next)")
if err != nil { if err != nil {
fmt.Printf("cannot set next breakpoint: %v\n", err) fmt.Printf("cannot set next breakpoint: %v\n", err)
continue continue
@@ -109,7 +109,6 @@ func REPL(s *Session, bm *Breakpoints, codeBase uint64, funcOffset, funcSize, ar
} }
bm.HandleTrap(&regs) bm.HandleTrap(&regs)
bm.Clear(afterAddr) bm.Clear(afterAddr)
_ = bp
} else { } else {
if err := s.Step(); err != nil { if err := s.Step(); err != nil {
fmt.Println(err) fmt.Println(err)
@@ -130,7 +129,7 @@ func REPL(s *Session, bm *Breakpoints, codeBase uint64, funcOffset, funcSize, ar
fmt.Printf("cannot read return address: %v\n", err) fmt.Printf("cannot read return address: %v\n", err)
continue continue
} }
bp, err := bm.Set(retAddr, "(finish)") _, err = bm.Set(retAddr, "(finish)")
if err != nil { if err != nil {
fmt.Printf("cannot set finish breakpoint: %v\n", err) fmt.Printf("cannot set finish breakpoint: %v\n", err)
continue continue
@@ -147,7 +146,6 @@ func REPL(s *Session, bm *Breakpoints, codeBase uint64, funcOffset, funcSize, ar
bm.HandleTrap(&regs) bm.HandleTrap(&regs)
} }
bm.Clear(retAddr) bm.Clear(retAddr)
_ = bp
if s.Exited() { if s.Exited() {
fmt.Println("debuggee exited") fmt.Println("debuggee exited")
} else { } else {
+2
View File
@@ -1,6 +1,8 @@
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org) // Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
//go:build linux
package debug package debug
// tracer abstracts the minimal ptrace operations needed by the breakpoint // tracer abstracts the minimal ptrace operations needed by the breakpoint
+6 -5
View File
@@ -97,10 +97,11 @@ fixed-arity instructions (`RET`, `NOP`, `JMP`, `CALL`) carry counts at all.
Rules are conservative by design — silence beats a false positive. The rules Rules are conservative by design — silence beats a false positive. The rules
are `unknown-instruction`, `operand-count`, `undefined-label`, are `unknown-instruction`, `operand-count`, `undefined-label`,
`duplicate-label`, `missing-ret`, `missing-textflag-include`, `abi-argsize` and `duplicate-label`, `missing-ret`, `missing-textflag-include`, `abi-argsize`,
`unreachable-code`. Every diagnostic carries a stable code so callers can `unreachable-code`, `register-clobber`, `funcdata-pcdata`, `unused-label`,
disable rules individually, and arch-specific rules switch off entirely when `invalid-textflag` and `stack-imbalance`. Every diagnostic carries a stable
the target architecture cannot be inferred from the file name. code so callers can disable rules individually, and arch-specific rules switch
off entirely when the target architecture cannot be inferred from the file name.
Two things keep the rules honest on real-world code: Two things keep the rules honest on real-world code:
@@ -365,7 +366,7 @@ masked), reporting any encoding drift.
### `debug` ### `debug`
The interactive debugger (Phase 4, linux/amd64). It launches the target The interactive debugger (all four architectures). It launches the target
function in a child process that maps the JIT code, calls function in a child process that maps the JIT code, calls
`PTRACE_TRACEME`, and stops; the parent attaches via ptrace and controls `PTRACE_TRACEME`, and stops; the parent attaches via ptrace and controls
execution. Breakpoints are patched as INT3 bytes through `/proc/pid/mem` execution. Breakpoints are patched as INT3 bytes through `/proc/pid/mem`
+2 -2
View File
@@ -52,7 +52,7 @@ Rules: `unknown-instruction`, `operand-count`, `undefined-label`,
## `gasm asm [--format raw|elf|goobj] [-p pkg] [-o out] <file>` ## `gasm asm [--format raw|elf|goobj] [-p pkg] [-o out] <file>`
Assemble FILE (amd64) to machine code. Assemble FILE to machine code (amd64, arm64, riscv64, loong64).
| Flag | Description | | Flag | Description |
|------|-------------| |------|-------------|
@@ -90,7 +90,7 @@ return values and any output written to the buffers.
## `gasm debug --func <name> [--buf spec] <file.s>` ## `gasm debug --func <name> [--buf spec] <file.s>`
Interactive debugger for JIT-assembled amd64 functions. Requires a Interactive debugger for JIT-assembled functions (amd64, arm64, riscv64, loong64). Requires a
compiled binary on `$PATH` (not `go run`). compiled binary on `$PATH` (not `go run`).
| Flag | Description | | Flag | Description |
+1 -1
View File
@@ -101,7 +101,7 @@ format/ Canonical formatter
lsp/ Language Server Protocol server lsp/ Language Server Protocol server
asm/ Standalone assembler, encoder, object emitters asm/ Standalone assembler, encoder, object emitters
verify/ JIT execution, differential testing, ABI checks verify/ JIT execution, differential testing, ABI checks
debug/ Interactive ptrace debugger (linux/amd64) debug/ Interactive ptrace debugger (all four architectures)
_gen/ Instruction table generator _gen/ Instruction table generator
testdata/ Test fixtures testdata/ Test fixtures
docs/ Architecture, development, CLI reference docs/ Architecture, development, CLI reference
-1
View File
@@ -71,7 +71,6 @@ const (
CodeMissingTextflag = "missing-textflag-include" CodeMissingTextflag = "missing-textflag-include"
CodeUnreachable = "unreachable-code" CodeUnreachable = "unreachable-code"
CodeABIArgSize = "abi-argsize" CodeABIArgSize = "abi-argsize"
CodeNosplitFrame = "nosplit-frame"
CodeRegisterClobber = "register-clobber" CodeRegisterClobber = "register-clobber"
CodeFuncdata = "funcdata-pcdata" CodeFuncdata = "funcdata-pcdata"
CodeUnusedLabel = "unused-label" CodeUnusedLabel = "unused-label"
+1 -1
View File
@@ -133,7 +133,7 @@ func (s *Server) dispatch(msg *rpcMessage) (exit bool) {
}, },
InlayHintProvider: true, InlayHintProvider: true,
}, },
ServerInfo: map[string]string{"name": "gasm", "version": "0.1.0"}, ServerInfo: map[string]string{"name": "gasm", "version": "0.31.1"},
}) })
case "initialized", "textDocument/didSave": case "initialized", "textDocument/didSave":