docs: state the validation status and correct claims the material contradicts
Assisted-by: DeepSeek V4.1 Flash
This commit is contained in:
+41
-26
@@ -3,9 +3,11 @@
|
||||
The reference below is taken from the program's own `--help`. If the two disagree, the
|
||||
program is right and this file is a defect.
|
||||
|
||||
The same reference is installed as man pages: `just install-man` puts gasm(1) and one
|
||||
page per command into ~/.local/share/man (`MANDIR` overrides), and a test compares each
|
||||
page against the binary so the two cannot drift apart.
|
||||
The same reference is installed as man pages: `just install-man` puts gasm(1) and a page
|
||||
for every command except `version` (which gasm(1) itself documents) into
|
||||
~/.local/share/man (`MANDIR` overrides). A test in `cmd/gasm` keeps the two from
|
||||
drifting: it compares each page's flag set and SYNOPSIS line with the binary's own `-h`
|
||||
output, and gasm(1)'s COMMANDS list with the top-level help. The prose is not compared.
|
||||
|
||||
## Synopsis
|
||||
|
||||
@@ -58,7 +60,8 @@ Usage: gasm parse <file>
|
||||
```
|
||||
|
||||
Parse FILE and report syntax errors on stderr. On success, print how many
|
||||
declarations and TEXT functions the file contains.
|
||||
declarations and TEXT functions the file contains. FILE may be `-` to read
|
||||
standard input.
|
||||
|
||||
```sh
|
||||
gasm parse hello_amd64.s
|
||||
@@ -155,7 +158,9 @@ recognisable suffix (most of GOROOT's, for example `cpu_x86.s`) are
|
||||
assembled. `raw` concatenates the functions and the data section into one
|
||||
self-consistent image; `elf` emits a relocatable object that links with the
|
||||
system toolchain; `goobj` emits the Go toolchain's own object format, which
|
||||
`cmd/link` consumes directly.
|
||||
`cmd/link` consumes directly, and is the one format that needs the toolchain
|
||||
installed: the object preamble is captured from `go tool asm` and the format
|
||||
version from `go version`. `raw` and `elf` need no toolchain at all.
|
||||
|
||||
```sh
|
||||
gasm asm hello_amd64.s
|
||||
@@ -208,7 +213,7 @@ Usage: gasm verify [-smoke] [-abi] [-fuzz] [-ground-truth] [-profile] [-call] <f
|
||||
| `--abi-n` | 100 | ABI check iterations with varied inputs |
|
||||
| `--profile` | off | list the basic-block structure per function |
|
||||
| `--smoke` | off | call each NOSPLIT function with zeroed arguments |
|
||||
| `--call` | empty | invoke a single function with `--buf` instead of the sweeps |
|
||||
| `--call` | empty | invoke a single NOSPLIT function with `--buf` instead of the sweeps |
|
||||
| `--buf` | empty | buffer spec for `--call`: `name:size:pattern[,name:size:pattern]` |
|
||||
| `--args` | empty | scalar args for `--call`: `name=value[,name=value]` (decimal or `0x` hex) |
|
||||
| `--repeat` | 1 | number of times to repeat a `--call` invocation |
|
||||
@@ -219,7 +224,8 @@ The JIT checks run when the host matches the file's architecture; the
|
||||
toolchain comparison works everywhere. `--fuzz`, `--smoke` and `--abi` run each
|
||||
function in its own child process, so a partial function that faults on random
|
||||
input is reported as `CRASH` instead of ending the sweep; `--call` with `--buf`
|
||||
invokes such a function with valid data.
|
||||
invokes such a function with valid data. The function named by `--call` must be
|
||||
NOSPLIT: a function with a stack frame is refused with a diagnostic and exits 1.
|
||||
|
||||
```sh
|
||||
gasm verify --ground-truth hello_amd64.s
|
||||
@@ -262,17 +268,18 @@ Usage: gasm debug <file.s> --func <name>
|
||||
| `-timeout` | 0 | kill the debuggee after this duration, for headless `-script` runs; a timeout exits 3 |
|
||||
| `-cover` | off | run to completion with a breakpoint on every instruction and report which executed |
|
||||
|
||||
The debugger spawns the debuggee from the `gasm` binary on `$PATH`, so install
|
||||
it first with `just install`; `go run` does not work for the traced child.
|
||||
Requires Linux (ptrace) and all four architectures are supported.
|
||||
The debugger re-executes the binary it is running as (`os.Executable()`) for the
|
||||
traced child, so the child is the same `gasm`, whether it is installed on `$PATH`
|
||||
or run with `go run ./cmd/gasm`; nothing has to be installed first. Requires
|
||||
Linux (ptrace), and all four architectures are supported.
|
||||
|
||||
REPL commands:
|
||||
|
||||
| Command | Effect |
|
||||
|---|---|
|
||||
| `break <label\|addr> [if <reg> <op> <val>]` | set a breakpoint, optionally conditional |
|
||||
| `delete <label\|addr>` | remove a breakpoint |
|
||||
| `info break` | list the breakpoints |
|
||||
| `break <label\|addr\|line> [if <reg> <op> <val\|reg\|*addr>]`, `b` | set a breakpoint; the condition compares a register with a constant, another register or the 8-byte word at `*addr` |
|
||||
| `delete <label\|addr>`, `d` | remove a breakpoint |
|
||||
| `info break`, `info breakpoints`, `info b` | list the breakpoints |
|
||||
| `step [n]`, `s` | single-step n instructions |
|
||||
| `next`, `n` | step over a CALL |
|
||||
| `finish`, `fin` | run until the function returns |
|
||||
@@ -346,13 +353,18 @@ Usage: gasm audit-instructions [--corpus [dir]] [amd64|arm64|riscv64|loong64]
|
||||
|
||||
Compare the gasm encoder for the given architecture (default amd64) against the
|
||||
installed `go tool asm` and print the diff: superset encodings (gasm-only
|
||||
spellings, shippable via `gasm asm --format goobj`), known-but-unencodable
|
||||
names (the encoder backlog) and go-only names (feature gaps). The Go side is
|
||||
probed black-box with a battery of operand shapes per mnemonic, so the audit
|
||||
tracks whatever toolchain `go env GOROOT` provides. On non-amd64
|
||||
architectures the backlog is an over-approximation: a name counts as encodable
|
||||
only when a probe shape assembles cleanly, so a name whose real forms the
|
||||
battery misses lands in the backlog.
|
||||
spellings, shippable via `gasm asm --format goobj`) and known-but-unencodable
|
||||
names (the encoder backlog). The Go side is probed black-box one bare mnemonic
|
||||
at a time, classified by the toolchain's diagnostic for an instruction it does
|
||||
not know, so the audit tracks whatever toolchain `go env GOROOT` provides; the
|
||||
gasm side answers from the encoder table on amd64 and from trial assembly over a
|
||||
battery of operand shapes on the other architectures. On non-amd64
|
||||
architectures the backlog is therefore an over-approximation: a name counts as
|
||||
encodable only when a probe shape assembles cleanly, so a name whose real forms
|
||||
the battery misses lands in the backlog. Names the toolchain knows and gasm does
|
||||
not cannot be enumerated by probing at all, because Go's table is visible only
|
||||
through names already in the gasm table; the report closes with a note saying
|
||||
so rather than listing them.
|
||||
|
||||
```sh
|
||||
gasm audit-instructions amd64
|
||||
@@ -360,8 +372,9 @@ gasm audit-instructions amd64
|
||||
|
||||
```text
|
||||
gasm table (amd64, families excluded): 1542 mnemonics
|
||||
gasm encodable: 580 go tool asm recognized: 1542
|
||||
shared: 580
|
||||
gasm encodable: 587 go tool asm recognised: 1542
|
||||
shared: 587
|
||||
...
|
||||
```
|
||||
|
||||
With `--corpus` the audit changes shape: it assembles every `.s` file under
|
||||
@@ -381,10 +394,12 @@ gasm audit-instructions --corpus "$(go env GOROOT)/src/crypto"
|
||||
|
||||
```text
|
||||
corpus /usr/local/go/src: 627 files (365 generic, attempted for all architectures)
|
||||
assemble for every target architecture: 108 (17.2%)
|
||||
amd64: 77/464 attempted
|
||||
148 instruction not encodable
|
||||
assemble for every target architecture: 127 (20.3%)
|
||||
amd64: 82/464 attempted
|
||||
165 unsupported operand form
|
||||
e.g. /usr/local/go/src/cmd/asm/internal/asm/testdata/386enc.s
|
||||
109 instruction not encodable
|
||||
e.g. /usr/local/go/src/cmd/asm/internal/asm/testdata/386.s
|
||||
...
|
||||
```
|
||||
|
||||
@@ -468,5 +483,5 @@ gasm asm --format goobj -p example.com/kernel -o kernel.o kernel_amd64.s
|
||||
Find which labels a failing kernel reaches, headlessly:
|
||||
|
||||
```sh
|
||||
gasm debug --func decodeBlockAVX2 --cover --script cmds.txt --timeout 30s kernel_amd64.s
|
||||
gasm debug --func decodeBlockAVX2 --cover --timeout 30s kernel_amd64.s
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user