test: implement negative rules in asmcheck

Change-Id: I2b507e35cc314100eaf2ec2d1e5107cc2fc9e7cf
Reviewed-on: https://go-review.googlesource.com/97818
Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
Giovanni Bajo 2018-03-01 01:56:07 +01:00
parent 0bcf8bcd99
commit f16cc298d3

View file

@ -1367,27 +1367,33 @@ func (t *test) asmCheck(outStr string, fn string, arch string, fullops map[strin
}
}
var notfound []wantedAsmOpcode
var failed []wantedAsmOpcode
for _, ops := range fullops {
for _, o := range ops {
if !o.found {
notfound = append(notfound, o)
// There's a failure if a negative match was found,
// or a positive match was not found.
if o.negative == o.found {
failed = append(failed, o)
}
}
}
if len(notfound) == 0 {
if len(failed) == 0 {
return
}
// At least one asmcheck failed; report them
sort.Slice(notfound, func(i, j int) bool {
return notfound[i].line < notfound[j].line
sort.Slice(failed, func(i, j int) bool {
return failed[i].line < failed[j].line
})
var errbuf bytes.Buffer
fmt.Fprintln(&errbuf)
for _, o := range notfound {
fmt.Fprintf(&errbuf, "%s:%d: %s: no match for opcode: %q\n", t.goFileName(), o.line, arch, o.opcode.String())
for _, o := range failed {
if o.negative {
fmt.Fprintf(&errbuf, "%s:%d: %s: wrong opcode found: %q\n", t.goFileName(), o.line, arch, o.opcode.String())
} else {
fmt.Fprintf(&errbuf, "%s:%d: %s: opcode not found: %q\n", t.goFileName(), o.line, arch, o.opcode.String())
}
}
err = errors.New(errbuf.String())
return