diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2020-04-26 14:14:14 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2020-05-01 13:31:17 +0200 |
| commit | e54e9781a4e043b3140b0c908ba4f4e469fd317e (patch) | |
| tree | 16e6387d78a8577c5f3d9fb8d05a51752da6338e /prog/resources.go | |
| parent | 3f4dbb2f6fff9479d6c250e224bc3cb7f5cd66ed (diff) | |
prog: remove Dir from Type
Having Dir is Type is handy, but forces us to duplicate lots of types.
E.g. if a struct is referenced as both in and out, then we need to
have 2 copies and 2 copies of structs/types it includes.
If also prevents us from having the struct type as struct identity
(because we can have up to 3 of them).
Revert to the old way we used to do it: propagate Dir as we walk
syscall arguments. This moves lots of dir passing from pkg/compiler
to prog package.
Now Arg contains the dir, so once we build the tree, we can use dirs
as before.
Reduces size of sys/linux/gen/amd64.go from 6058336 to 5661150 (-6.6%).
Update #1580
Diffstat (limited to 'prog/resources.go')
| -rw-r--r-- | prog/resources.go | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/prog/resources.go b/prog/resources.go index fa03e6cd6..b7bcecf95 100644 --- a/prog/resources.go +++ b/prog/resources.go @@ -46,10 +46,10 @@ func (target *Target) populateResourceCtors() { // Find resources that are created by each call. callsResources := make([][]*ResourceDesc, len(target.Syscalls)) for call, meta := range target.Syscalls { - ForeachType(meta, func(typ Type) { + foreachType(meta, func(typ Type, ctx typeCtx) { switch typ1 := typ.(type) { case *ResourceType: - if typ1.Dir() != DirIn { + if ctx.Dir != DirIn { callsResources[call] = append(callsResources[call], typ1.Desc) } } @@ -84,21 +84,19 @@ func (target *Target) populateResourceCtors() { // isCompatibleResource returns true if resource of kind src can be passed as an argument of kind dst. func (target *Target) isCompatibleResource(dst, src string) bool { - if dst == target.any.res16.TypeName || - dst == target.any.res32.TypeName || - dst == target.any.res64.TypeName || - dst == target.any.resdec.TypeName || - dst == target.any.reshex.TypeName || - dst == target.any.resoct.TypeName { + if target.isAnyRes(dst) { return true } + if target.isAnyRes(src) { + return false + } dstRes := target.resourceMap[dst] if dstRes == nil { - panic(fmt.Sprintf("unknown resource '%v'", dst)) + panic(fmt.Sprintf("unknown resource %q", dst)) } srcRes := target.resourceMap[src] if srcRes == nil { - panic(fmt.Sprintf("unknown resource '%v'", src)) + panic(fmt.Sprintf("unknown resource %q", src)) } return isCompatibleResourceImpl(dstRes.Kind, srcRes.Kind, false) } @@ -128,8 +126,8 @@ func isCompatibleResourceImpl(dst, src []string, precise bool) bool { func (target *Target) getInputResources(c *Syscall) []*ResourceDesc { var resources []*ResourceDesc - ForeachType(c, func(typ Type) { - if typ.Dir() == DirOut { + foreachType(c, func(typ Type, ctx typeCtx) { + if ctx.Dir == DirOut { return } switch typ1 := typ.(type) { @@ -148,10 +146,10 @@ func (target *Target) getInputResources(c *Syscall) []*ResourceDesc { func (target *Target) getOutputResources(c *Syscall) []*ResourceDesc { var resources []*ResourceDesc - ForeachType(c, func(typ Type) { + foreachType(c, func(typ Type, ctx typeCtx) { switch typ1 := typ.(type) { case *ResourceType: - if typ1.Dir() != DirIn { + if ctx.Dir != DirIn { resources = append(resources, typ1.Desc) } } |
