From 0ce7569ee76fda7e5a68b0fe14c93a3e8eb7d108 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Sat, 25 Apr 2020 10:06:37 +0200 Subject: pkg/compiler: deduplicate Types in descriptions Add prog.Ref Type that serves as a proxy for real types and allows to deduplicate Types in generated descriptions. The Ref type is effectively an index in an array of types. Just before serialization pkg/compiler replaces real types with the Ref types and prepares corresponding array of real types. When a Target is registered in prog package, we do the opposite operation and replace Ref's with the corresponding real types. This brings improvements across the board: compiler memory consumption is reduced by 15%, test building time by 25%, descriptions size by 33%. Before: $ du -h sys/linux/gen 54M sys/linux/gen $ time GOMAXPROCS=1 go test -p=1 -c ./prog real 0m54.200s real 0m53.883s $ time GOMAXPROCS=1 go install -p=1 ./tools/syz-execprog real 0m27.911s real 0m27.767s $ TIME="%e %P %M" GOMAXPROCS=1 time go tool compile ./sys/linux/gen 20.59 100% 3200016 20.97 100% 3445976 20.25 100% 3209684 After: $ du -h sys/linux/gen 36M sys/linux/gen $ time GOMAXPROCS=1 go test -p=1 -c ./prog real 0m42.290s real 0m43.230s $ time GOMAXPROCS=1 go install -p=1 ./tools/syz-execprog real 0m24.337s real 0m24.727s $ TIME="%e %P %M" GOMAXPROCS=1 time go tool compile ./sys/linux/gen 19.11 100% 2764952 19.66 100% 2787624 19.35 100% 2749376 Update #1580 --- pkg/compiler/compiler.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'pkg/compiler/compiler.go') diff --git a/pkg/compiler/compiler.go b/pkg/compiler/compiler.go index a9146305b..7316b4d4c 100644 --- a/pkg/compiler/compiler.go +++ b/pkg/compiler/compiler.go @@ -37,6 +37,7 @@ type Prog struct { Resources []*prog.ResourceDesc Syscalls []*prog.Syscall StructDescs []*prog.KeyedStruct + Types []prog.Type // Set of unsupported syscalls/flags. Unsupported map[string]bool // Returned if consts was nil. @@ -103,10 +104,13 @@ func Compile(desc *ast.Description, consts map[string]uint64, target *targets.Ta return nil } syscalls := comp.genSyscalls() + structs := comp.genStructDescs(syscalls) + types := comp.generateTypes(syscalls, structs) prg := &Prog{ Resources: comp.genResources(), Syscalls: syscalls, - StructDescs: comp.genStructDescs(syscalls), + StructDescs: structs, + Types: types, Unsupported: comp.unsupported, } if comp.errors != 0 { -- cgit mrf-deployment