aboutsummaryrefslogtreecommitdiffstats
path: root/prog
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-08-28 15:59:22 +0200
committerDmitry Vyukov <dvyukov@google.com>2017-09-02 13:06:53 +0200
commita7206b24cac96c08aecf2f3b4cc3c2e555eec708 (patch)
tree80c678141148ce2eafaab5617f168bd840b8c8a6 /prog
parentaa51461a34f998908d10f551615ad242bdff8fe9 (diff)
pkg/compiler: check and generate types
Move most of the logic from sysgen to pkg/compiler. Update #217
Diffstat (limited to 'prog')
-rw-r--r--prog/encodingexec_test.go14
-rw-r--r--prog/rand.go16
-rw-r--r--prog/validation.go3
3 files changed, 17 insertions, 16 deletions
diff --git a/prog/encodingexec_test.go b/prog/encodingexec_test.go
index 2d96a47e0..6ee9a37af 100644
--- a/prog/encodingexec_test.go
+++ b/prog/encodingexec_test.go
@@ -203,13 +203,12 @@ func TestSerializeForExec(t *testing.T) {
},
},
{
- "syz_test$end0(&(0x7f0000000000)={0x42, 0x42, 0x42, 0x42, 0x42})",
+ "syz_test$end0(&(0x7f0000000000)={0x42, 0x42, 0x42, 0x42})",
[]uint64{
instrCopyin, dataOffset + 0, argConst, 1, 0x42, 0, 0,
instrCopyin, dataOffset + 1, argConst, 2, 0x4200, 0, 0,
instrCopyin, dataOffset + 3, argConst, 4, 0x42000000, 0, 0,
instrCopyin, dataOffset + 7, argConst, 8, 0x4200000000000000, 0, 0,
- instrCopyin, dataOffset + 15, argConst, 8, 0x4200000000000000, 0, 0,
callID("syz_test$end0"), 1, argConst, ptrSize, dataOffset, 0, 0,
instrEOF,
},
@@ -261,11 +260,12 @@ func TestSerializeForExec(t *testing.T) {
buf := make([]byte, ExecBufferSize)
for i, test := range tests {
- p, err := Deserialize([]byte(test.prog))
- if err != nil {
- t.Fatalf("failed to deserialize prog %v: %v", i, err)
- }
- t.Run(fmt.Sprintf("%v:%v", i, p.String()), func(t *testing.T) {
+ i, test := i, test
+ t.Run(fmt.Sprintf("%v:%v", i, test.prog), func(t *testing.T) {
+ p, err := Deserialize([]byte(test.prog))
+ if err != nil {
+ t.Fatalf("failed to deserialize prog %v: %v", i, err)
+ }
if err := p.SerializeForExec(buf, i%16); err != nil {
t.Fatalf("failed to serialize: %v", err)
}
diff --git a/prog/rand.go b/prog/rand.go
index a3cd57039..e962f80c9 100644
--- a/prog/rand.go
+++ b/prog/rand.go
@@ -20,11 +20,11 @@ var pageStartPool = sync.Pool{New: func() interface{} { return new([]uint64) }}
type randGen struct {
*rand.Rand
inCreateResource bool
- recDepth map[sys.Type]int
+ recDepth map[string]int
}
func newRand(rs rand.Source) *randGen {
- return &randGen{rand.New(rs), false, make(map[sys.Type]int)}
+ return &randGen{rand.New(rs), false, make(map[string]int)}
}
func (r *randGen) rand(n int) uint64 {
@@ -620,15 +620,15 @@ func (r *randGen) generateArg(s *state, typ sys.Type) (arg Arg, calls []*Call) {
// Allow infinite recursion for optional pointers.
if pt, ok := typ.(*sys.PtrType); ok && typ.Optional() {
- if _, ok := pt.Type.(*sys.StructType); ok {
- r.recDepth[pt.Type] += 1
+ if str, ok := pt.Type.(*sys.StructType); ok {
+ r.recDepth[str.Name()] += 1
defer func() {
- r.recDepth[pt.Type] -= 1
- if r.recDepth[pt.Type] == 0 {
- delete(r.recDepth, pt.Type)
+ r.recDepth[str.Name()] -= 1
+ if r.recDepth[str.Name()] == 0 {
+ delete(r.recDepth, str.Name())
}
}()
- if r.recDepth[pt.Type] >= 3 {
+ if r.recDepth[str.Name()] >= 3 {
return pointerArg(typ, 0, 0, 0, nil), nil
}
}
diff --git a/prog/validation.go b/prog/validation.go
index b2d7d209f..b3c4ad3e6 100644
--- a/prog/validation.go
+++ b/prog/validation.go
@@ -102,7 +102,8 @@ func (c *Call) validate(ctx *validCtx) error {
switch arg.(type) {
case *GroupArg:
default:
- return fmt.Errorf("syscall %v: struct/array arg '%v' has bad kind %v", c.Meta.Name, arg.Type().Name(), arg)
+ return fmt.Errorf("syscall %v: struct/array arg '%v' has bad kind %#v",
+ c.Meta.Name, arg.Type().Name(), arg)
}
case *sys.UnionType:
switch arg.(type) {