aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/ifuzz/ifuzzimpl/ifuzzimpl.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2020-11-20 19:07:23 +0100
committerDmitry Vyukov <dvyukov@google.com>2020-11-21 08:46:20 +0100
commit6e337f5d06138208368afa1ee9f4b6037ef0f069 (patch)
treee192889f8e77ed1b95bf677d79e8719f9cb2402a /pkg/ifuzz/ifuzzimpl/ifuzzimpl.go
parent647ed6d0868f745bcfbf4cdbd521ea99377f278e (diff)
pkg/ifuzz/x86: deduplicate modeInsns population logic
It's currently duplicated in x86 and powerpc. Move to ifuzzimpl.
Diffstat (limited to 'pkg/ifuzz/ifuzzimpl/ifuzzimpl.go')
-rw-r--r--pkg/ifuzz/ifuzzimpl/ifuzzimpl.go23
1 files changed, 22 insertions, 1 deletions
diff --git a/pkg/ifuzz/ifuzzimpl/ifuzzimpl.go b/pkg/ifuzz/ifuzzimpl/ifuzzimpl.go
index 31ca522cd..831e1ba3f 100644
--- a/pkg/ifuzz/ifuzzimpl/ifuzzimpl.go
+++ b/pkg/ifuzz/ifuzzimpl/ifuzzimpl.go
@@ -20,7 +20,7 @@ type (
)
type Insn interface {
- Info() (string, bool)
+ Info() (name string, mode Mode, pseudo, priv bool)
Encode(cfg *Config, r *rand.Rand) []byte
}
@@ -61,3 +61,24 @@ const (
)
var SpecialNumbers = [...]uint64{0, 1 << 15, 1 << 16, 1 << 31, 1 << 32, 1 << 47, 1 << 47, 1 << 63}
+
+type ModeInsns [ModeLast][TypeLast][]Insn
+
+func (modeInsns *ModeInsns) Add(insn Insn) {
+ _, mode, pseudo, priv := insn.Info()
+ for m := Mode(0); m < ModeLast; m++ {
+ if mode&(1<<uint(m)) == 0 {
+ continue
+ }
+ set := &modeInsns[m]
+ if pseudo {
+ set[TypeExec] = append(set[TypeExec], insn)
+ } else if priv {
+ set[TypePriv] = append(set[TypePriv], insn)
+ set[TypeAll] = append(set[TypeAll], insn)
+ } else {
+ set[TypeUser] = append(set[TypeUser], insn)
+ set[TypeAll] = append(set[TypeAll], insn)
+ }
+ }
+}