aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/ifuzz
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2020-11-20 19:10:02 +0100
committerDmitry Vyukov <dvyukov@google.com>2020-11-21 08:46:20 +0100
commite1dea42221c13dabdf9d4938428f1ef91863b813 (patch)
treee3006261831248e7a815c3386bc683b1f408bd57 /pkg/ifuzz
parent6e337f5d06138208368afa1ee9f4b6037ef0f069 (diff)
pkg/ifuzz/ifuzzimpl: move IsCompatible from x86
We now can implement IsCompatible portably.
Diffstat (limited to 'pkg/ifuzz')
-rw-r--r--pkg/ifuzz/ifuzzimpl/ifuzzimpl.go17
-rw-r--r--pkg/ifuzz/x86/encode.go2
-rw-r--r--pkg/ifuzz/x86/x86.go16
3 files changed, 18 insertions, 17 deletions
diff --git a/pkg/ifuzz/ifuzzimpl/ifuzzimpl.go b/pkg/ifuzz/ifuzzimpl/ifuzzimpl.go
index 831e1ba3f..32f285250 100644
--- a/pkg/ifuzz/ifuzzimpl/ifuzzimpl.go
+++ b/pkg/ifuzz/ifuzzimpl/ifuzzimpl.go
@@ -82,3 +82,20 @@ func (modeInsns *ModeInsns) Add(insn Insn) {
}
}
}
+
+func (cfg *Config) IsCompatible(insn Insn) bool {
+ _, mode, pseudo, priv := insn.Info()
+ if cfg.Mode < 0 || cfg.Mode >= ModeLast {
+ panic("bad mode")
+ }
+ if priv && !cfg.Priv {
+ return false
+ }
+ if pseudo && !cfg.Exec {
+ return false
+ }
+ if mode&(1<<uint(cfg.Mode)) == 0 {
+ return false
+ }
+ return true
+}
diff --git a/pkg/ifuzz/x86/encode.go b/pkg/ifuzz/x86/encode.go
index 536031b06..9203d51c3 100644
--- a/pkg/ifuzz/x86/encode.go
+++ b/pkg/ifuzz/x86/encode.go
@@ -15,7 +15,7 @@ import (
// nolint: gocyclo, nestif, gocognit, funlen
func (insn *Insn) Encode(cfg *ifuzzimpl.Config, r *rand.Rand) []byte {
- if !insn.isCompatible(cfg) {
+ if !cfg.IsCompatible(insn) {
panic("instruction is not suitable for this mode")
}
if insn.Pseudo {
diff --git a/pkg/ifuzz/x86/x86.go b/pkg/ifuzz/x86/x86.go
index d9fed6cd9..51623aa2f 100644
--- a/pkg/ifuzz/x86/x86.go
+++ b/pkg/ifuzz/x86/x86.go
@@ -83,22 +83,6 @@ func generateArg(cfg *ifuzzimpl.Config, r *rand.Rand, size int) []byte {
return arg
}
-func (insn *Insn) isCompatible(cfg *ifuzzimpl.Config) bool {
- if cfg.Mode < 0 || cfg.Mode >= ifuzzimpl.ModeLast {
- panic("bad mode")
- }
- if insn.Priv && !cfg.Priv {
- return false
- }
- if insn.Pseudo && !cfg.Exec {
- return false
- }
- if insn.Mode&(1<<uint(cfg.Mode)) == 0 {
- return false
- }
- return true
-}
-
func generateInt(cfg *ifuzzimpl.Config, r *rand.Rand, size int) uint64 {
if size != 1 && size != 2 && size != 4 && size != 8 {
panic("bad arg size")