pass: ensure frame pointer register is saved (#174)
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
This commit is contained in:
committed by
GitHub
parent
4592e16ebb
commit
f295bde84c
@@ -1,11 +0,0 @@
|
||||
// Command asmdecl reports mismatches between assembly files and Go declarations.
|
||||
//
|
||||
// Standalone version of the static analyzer in go vet.
|
||||
package main
|
||||
|
||||
import (
|
||||
"golang.org/x/tools/go/analysis/passes/asmdecl"
|
||||
"golang.org/x/tools/go/analysis/singlechecker"
|
||||
)
|
||||
|
||||
func main() { singlechecker.Main(asmdecl.Analyzer) }
|
||||
17
internal/cmd/asmvet/main.go
Normal file
17
internal/cmd/asmvet/main.go
Normal file
@@ -0,0 +1,17 @@
|
||||
// Command asmvet checks for correctness of Go assembly.
|
||||
//
|
||||
// Standalone version of the assembly checks in go vet.
|
||||
package main
|
||||
|
||||
import (
|
||||
"golang.org/x/tools/go/analysis/passes/asmdecl"
|
||||
"golang.org/x/tools/go/analysis/passes/framepointer"
|
||||
"golang.org/x/tools/go/analysis/unitchecker"
|
||||
)
|
||||
|
||||
func main() {
|
||||
unitchecker.Main(
|
||||
asmdecl.Analyzer,
|
||||
framepointer.Analyzer,
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user