Currently `avo` uses `BP` as a standard general-purpose register. However, `BP` is used for the frame pointer and should be callee-save. Under some circumstances, the Go assembler will do this automatically, but not always. At the moment `avo` can produce code that clobbers the `BP` register. Since Go 1.16 this code will also fail a new `go vet` check. This PR provides a (currently sub-optimal) fix for the issue. It introduces an `EnsureBasePointerCalleeSaved` pass which will check if the base pointer is written to by a function, and if so will artificially ensure that the function has a non-zero frame size. This will trigger the Go assembler to automatically save and restore the BP register. In addition, we update the `asmdecl` tool to `asmvet`, which includes the `framepointer` vet check. Updates #156
Examples
Simple functions:
Features:
- args: Loading function arguments.
- returns: Building return values.
- complex: Working with
complex{64,128}types. - data: Defining
DATAsections. - ext: Interacting with types from external packages.
- pragma: Apply compiler directives to generated functions.
"Real" examples:
- fnv1a: FNV-1a hash function.
- dot: Vector dot product.
- geohash: Integer geohash encoding.
- sha1: SHA-1 cryptographic hash.
- stadtx:
StadtXhash port from dgryski/go-stadtx.