Repository navigation
Tags
Tags
ixdiff: update golang.org/x/arch to ab53fe6c43b6 x/arch v0.31.0 does not decode VEX-encoded MULXQ, which bits.Mul64 can compile to at GOAMD64=v3. The undecodable first byte became a BYTE pseudo-instruction and decoding resumed inside the instruction, so the rest of the function decoded as garbage: junk opcodes in the histogram, wrong instruction and spill counts, and noisy function diffs. The x86 relocation walk failed on such functions and fell back to full analysis. Update to the commit the Go tree vendors, which decodes MULXQ with the same Go syntax as go tool objdump. Add a fixture function written in assembly around a MULXQ, since the compiler emits it only for some code shapes, and tests at the decoder, the relocation walk, and the listing. The x86 decoder still misreads VZEROUPPER, so its length correction stays.
Single-binary mode and disasm v0.1.2 - ixdiff <binary> prints stats: function count, text size, instruction counts by opcode, and the largest packages and functions. - ixdiff --fn <name> <binary> prints the disassembly of one function. - Binaries are loaded via github.com/loov/disasm v0.1.2.
Spill metric split: registers moved vs stack slots touched - SpillDelta is now strictly registers moved to or from the stack (register-pressure events); the amd64 X15 zeroing special case that mixed definitions is removed. - New SlotDelta counts 8-byte stack slots touched: memory traffic, neutral under pair/vector/scalar lowering conversions (MOVUPS 2, STP 2, STPW 1, FSTPQ 4, s390x load/store-multiple by range). - Tables gain a slots column and --sort slots, JSON gains slot_delta, and the library gains Func.StackSlots.
Importable library, spill metric, and Go compile archive support - The analysis core is now an importable package, github.com/loov/ixdiff/ixdiff: open two binaries, pair their functions, and query diffs, opcode deltas, and metrics from Go. - New spill metric: per-function and aggregate deltas of stack accesses, weighted by the registers each access moves (arm64 pairs, s390x load/store-multiple ranges, amd64 X15 zeroing). Accesses through a scratch register holding a stack address are tracked on amd64, 386, arm64, riscv64, and loong64. Ranking tables gain a spills column and --sort spills. - Go compile archives (.a files from go 7D04 tool compile) can be compared directly.
Seven new architectures: 386, arm, riscv64, ppc64/ppc64le, s390x, loo… …ng64, and wasm - Instruction decoding, operand normalization, and cross-build masking for each new architecture, with relocation-only fast paths on 386, arm, riscv64, and loong64. - The amd64 fast path now verifies rip-relative references to text symbols, so a retargeted function reference is no longer classified as relocation noise. - --mask-sp is arch-aware and --blocks splits blocks on every architecture. - Loaders hardened against malformed ELF, Mach-O, PE, and wasm inputs; non-thread-safe x/arch decoders are serialized. - mips remains unsupported pending an upstream golang.org/x/arch disassembler (golang/go#19158).