pass: VerifyMemOperands (#127)
Introduces a pass to verify memory operands. This is added to a new Verify pass, that in future could do much more. Updates #125
This commit is contained in:
committed by
GitHub
parent
ff7a160610
commit
126469f13d
58
pass/verify_test.go
Normal file
58
pass/verify_test.go
Normal file
@@ -0,0 +1,58 @@
|
||||
package pass
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/mmcloughlin/avo/ir"
|
||||
"github.com/mmcloughlin/avo/operand"
|
||||
"github.com/mmcloughlin/avo/reg"
|
||||
)
|
||||
|
||||
func TestVerifyMemOperands(t *testing.T) {
|
||||
i := &ir.Instruction{
|
||||
Operands: []operand.Op{
|
||||
reg.RAX,
|
||||
operand.Mem{
|
||||
Base: reg.R10,
|
||||
Disp: 42,
|
||||
},
|
||||
},
|
||||
}
|
||||
if err := VerifyMemOperands(i); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestVerifyMemOperandsErrors(t *testing.T) {
|
||||
cases := []struct {
|
||||
Operands []operand.Op
|
||||
ErrorSubstring string
|
||||
}{
|
||||
{
|
||||
Operands: []operand.Op{
|
||||
reg.RAX,
|
||||
operand.Mem{
|
||||
Disp: 42,
|
||||
},
|
||||
},
|
||||
ErrorSubstring: "missing base",
|
||||
},
|
||||
{
|
||||
Operands: []operand.Op{
|
||||
operand.Mem{
|
||||
Base: reg.EBX,
|
||||
Index: reg.R9L,
|
||||
},
|
||||
reg.ECX,
|
||||
},
|
||||
ErrorSubstring: "index register with scale 0",
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
i := &ir.Instruction{Operands: c.Operands}
|
||||
if err := VerifyMemOperands(i); err == nil || !strings.Contains(err.Error(), c.ErrorSubstring) {
|
||||
t.Errorf("got error %v; expected error to contain %q", err, c.ErrorSubstring)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user