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
@@ -3,7 +3,7 @@
|
||||
#include "textflag.h"
|
||||
|
||||
// func GP8() uint8
|
||||
TEXT ·GP8(SB), NOSPLIT, $0-1
|
||||
TEXT ·GP8(SB), NOSPLIT, $8-1
|
||||
MOVB $0x01, AL
|
||||
MOVB $0x02, CL
|
||||
MOVB $0x03, DL
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#include "textflag.h"
|
||||
|
||||
// func Masks() (uint16, uint64)
|
||||
TEXT ·Masks(SB), NOSPLIT, $0-16
|
||||
TEXT ·Masks(SB), NOSPLIT, $8-16
|
||||
MOVQ $0x0001002a, AX
|
||||
MOVQ $0x0002002a, CX
|
||||
MOVQ $0x0003002a, DX
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#include "textflag.h"
|
||||
|
||||
// func Upper32() uint64
|
||||
TEXT ·Upper32(SB), NOSPLIT, $0-8
|
||||
TEXT ·Upper32(SB), NOSPLIT, $8-8
|
||||
// Initialize sum.
|
||||
XORQ AX, AX
|
||||
|
||||
|
||||
Reference in New Issue
Block a user