fix: resolve audit findings — stale text, dead code, build tags, docs
Assisted-by: MiMo V2.5 Pro
This commit is contained in:
@@ -17,7 +17,7 @@ import (
|
||||
|
||||
func cmdDebug(args []string) int {
|
||||
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
|
||||
single-stepping, breakpoints, register and memory inspection.
|
||||
|
||||
|
||||
+4
-4
@@ -117,9 +117,9 @@ func usage(w io.Writer) {
|
||||
{"parse", "parse and report syntax errors"},
|
||||
{"fmt", "canonicalise formatting (gofmt for assembly)"},
|
||||
{"lint", "run static checks"},
|
||||
{"asm", "assemble .s files to machine code (amd64, riscv64)"},
|
||||
{"verify", "JIT-assemble and run dynamic checks (amd64, riscv64)"},
|
||||
{"debug", "interactive source-level debugger (amd64)"},
|
||||
{"asm", "assemble .s files to machine code (amd64, arm64, riscv64, loong64)"},
|
||||
{"verify", "JIT-assemble and run dynamic checks (amd64, arm64, riscv64, loong64)"},
|
||||
{"debug", "interactive source-level debugger (amd64, arm64, riscv64, loong64)"},
|
||||
{"diff", "compare machine code of two .s files"},
|
||||
{"profile", "show basic-block structure of functions"},
|
||||
{"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).
|
||||
return cmdVerifyARM64(path, *groundTruth, *profile)
|
||||
default:
|
||||
fmt.Fprintln(os.Stderr, "gasm verify: only amd64, riscv64 and loong64 are supported")
|
||||
fmt.Fprintln(os.Stderr, "gasm verify: unsupported architecture")
|
||||
return 1
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
//go:build linux
|
||||
|
||||
package debug
|
||||
|
||||
import "fmt"
|
||||
|
||||
+2
-4
@@ -94,7 +94,7 @@ func REPL(s *Session, bm *Breakpoints, codeBase uint64, funcOffset, funcSize, ar
|
||||
text, instLen, _ := s.Disassemble(pc)
|
||||
if strings.HasPrefix(strings.ToLower(text), "call") || strings.HasPrefix(strings.ToLower(text), "bl") {
|
||||
afterAddr := pc + uint64(instLen)
|
||||
bp, err := bm.Set(afterAddr, "(next)")
|
||||
_, err := bm.Set(afterAddr, "(next)")
|
||||
if err != nil {
|
||||
fmt.Printf("cannot set next breakpoint: %v\n", err)
|
||||
continue
|
||||
@@ -109,7 +109,6 @@ func REPL(s *Session, bm *Breakpoints, codeBase uint64, funcOffset, funcSize, ar
|
||||
}
|
||||
bm.HandleTrap(®s)
|
||||
bm.Clear(afterAddr)
|
||||
_ = bp
|
||||
} else {
|
||||
if err := s.Step(); err != nil {
|
||||
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)
|
||||
continue
|
||||
}
|
||||
bp, err := bm.Set(retAddr, "(finish)")
|
||||
_, err = bm.Set(retAddr, "(finish)")
|
||||
if err != nil {
|
||||
fmt.Printf("cannot set finish breakpoint: %v\n", err)
|
||||
continue
|
||||
@@ -147,7 +146,6 @@ func REPL(s *Session, bm *Breakpoints, codeBase uint64, funcOffset, funcSize, ar
|
||||
bm.HandleTrap(®s)
|
||||
}
|
||||
bm.Clear(retAddr)
|
||||
_ = bp
|
||||
if s.Exited() {
|
||||
fmt.Println("debuggee exited")
|
||||
} else {
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
//go:build linux
|
||||
|
||||
package debug
|
||||
|
||||
// tracer abstracts the minimal ptrace operations needed by the breakpoint
|
||||
|
||||
@@ -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
|
||||
are `unknown-instruction`, `operand-count`, `undefined-label`,
|
||||
`duplicate-label`, `missing-ret`, `missing-textflag-include`, `abi-argsize` and
|
||||
`unreachable-code`. Every diagnostic carries a stable 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.
|
||||
`duplicate-label`, `missing-ret`, `missing-textflag-include`, `abi-argsize`,
|
||||
`unreachable-code`, `register-clobber`, `funcdata-pcdata`, `unused-label`,
|
||||
`invalid-textflag` and `stack-imbalance`. Every diagnostic carries a stable
|
||||
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:
|
||||
|
||||
@@ -365,7 +366,7 @@ masked), reporting any encoding drift.
|
||||
|
||||
### `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
|
||||
`PTRACE_TRACEME`, and stops; the parent attaches via ptrace and controls
|
||||
execution. Breakpoints are patched as INT3 bytes through `/proc/pid/mem`
|
||||
|
||||
+2
-2
@@ -52,7 +52,7 @@ Rules: `unknown-instruction`, `operand-count`, `undefined-label`,
|
||||
|
||||
## `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 |
|
||||
|------|-------------|
|
||||
@@ -90,7 +90,7 @@ return values and any output written to the buffers.
|
||||
|
||||
## `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`).
|
||||
|
||||
| Flag | Description |
|
||||
|
||||
+1
-1
@@ -101,7 +101,7 @@ format/ Canonical formatter
|
||||
lsp/ Language Server Protocol server
|
||||
asm/ Standalone assembler, encoder, object emitters
|
||||
verify/ JIT execution, differential testing, ABI checks
|
||||
debug/ Interactive ptrace debugger (linux/amd64)
|
||||
debug/ Interactive ptrace debugger (all four architectures)
|
||||
_gen/ Instruction table generator
|
||||
testdata/ Test fixtures
|
||||
docs/ Architecture, development, CLI reference
|
||||
|
||||
@@ -71,7 +71,6 @@ const (
|
||||
CodeMissingTextflag = "missing-textflag-include"
|
||||
CodeUnreachable = "unreachable-code"
|
||||
CodeABIArgSize = "abi-argsize"
|
||||
CodeNosplitFrame = "nosplit-frame"
|
||||
CodeRegisterClobber = "register-clobber"
|
||||
CodeFuncdata = "funcdata-pcdata"
|
||||
CodeUnusedLabel = "unused-label"
|
||||
|
||||
+1
-1
@@ -133,7 +133,7 @@ func (s *Server) dispatch(msg *rpcMessage) (exit bool) {
|
||||
},
|
||||
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":
|
||||
|
||||
Reference in New Issue
Block a user