diff options
| author | Florent Revest <revest@chromium.org> | 2023-07-05 14:26:23 +0200 |
|---|---|---|
| committer | Aleksandr Nogikh <nogikh@google.com> | 2024-02-01 10:12:21 +0000 |
| commit | c40f278e4d854c3b6341ec272dd3eb9b84fcff54 (patch) | |
| tree | 0bc92397d6480c0f5d15e60f6e861adc3cea7019 /sys/syz-sysgen | |
| parent | 818c77dd7818d3c56513a0ef417fd61bb8bb5927 (diff) | |
sys/syz-sysgen: save flags's possible values
This extends Target to contain a map of possible values for each int
flag.
Diffstat (limited to 'sys/syz-sysgen')
| -rw-r--r-- | sys/syz-sysgen/sysgen.go | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/sys/syz-sysgen/sysgen.go b/sys/syz-sysgen/sysgen.go index 2ab6cdbab..313cb60d8 100644 --- a/sys/syz-sysgen/sysgen.go +++ b/sys/syz-sysgen/sysgen.go @@ -179,6 +179,19 @@ type Job struct { } func processJob(job *Job, descriptions *ast.Description, constFile *compiler.ConstFile) { + var flags []prog.FlagDesc + for _, decl := range descriptions.Nodes { + switch n := decl.(type) { + case *ast.IntFlags: + var flag prog.FlagDesc + flag.Name = n.Name.Name + for _, val := range n.Values { + flag.Values = append(flag.Values, val.Ident) + } + flags = append(flags, flag) + } + } + eh := func(pos ast.Pos, msg string) { job.Errors = append(job.Errors, fmt.Sprintf("%v: %v\n", pos, msg)) } @@ -193,7 +206,7 @@ func processJob(job *Job, descriptions *ast.Description, constFile *compiler.Con sysFile := filepath.Join(*outDir, "sys", job.Target.OS, "gen", job.Target.Arch+".go") out := new(bytes.Buffer) - generate(job.Target, prog, consts, out) + generate(job.Target, prog, consts, flags, out) rev := hash.String(out.Bytes()) fmt.Fprintf(out, "const revision_%v = %q\n", job.Target.Arch, rev) writeSource(sysFile, out.Bytes()) @@ -210,7 +223,8 @@ func processJob(job *Job, descriptions *ast.Description, constFile *compiler.Con job.OK = len(job.Errors) == 0 } -func generate(target *targets.Target, prg *compiler.Prog, consts map[string]uint64, out io.Writer) { +func generate(target *targets.Target, prg *compiler.Prog, consts map[string]uint64, flags []prog.FlagDesc, + out io.Writer) { tag := fmt.Sprintf("syz_target,syz_os_%v,syz_arch_%v", target.OS, target.Arch) if target.VMArch != "" { tag += fmt.Sprintf(" syz_target,syz_os_%v,syz_arch_%v", target.OS, target.VMArch) @@ -226,11 +240,11 @@ func generate(target *targets.Target, prg *compiler.Prog, consts map[string]uint fmt.Fprintf(out, "\tRegisterTarget(&Target{"+ "OS: %q, Arch: %q, Revision: revision_%v, PtrSize: %v, PageSize: %v, "+ "NumPages: %v, DataOffset: %v, LittleEndian: %v, ExecutorUsesShmem: %v, "+ - "Syscalls: syscalls_%v, Resources: resources_%v, Consts: consts_%v}, "+ - "types_%v, InitTarget)\n}\n\n", + "Syscalls: syscalls_%v, Resources: resources_%v, Consts: consts_%v,"+ + "Flags: flags_%v}, types_%v, InitTarget)\n}\n\n", target.OS, target.Arch, target.Arch, target.PtrSize, target.PageSize, target.NumPages, target.DataOffset, target.LittleEndian, target.ExecutorUsesShmem, - target.Arch, target.Arch, target.Arch, target.Arch) + target.Arch, target.Arch, target.Arch, target.Arch, target.Arch) fmt.Fprintf(out, "var resources_%v = ", target.Arch) serializer.Write(out, prg.Resources) @@ -244,6 +258,10 @@ func generate(target *targets.Target, prg *compiler.Prog, consts map[string]uint serializer.Write(out, prg.Types) fmt.Fprintf(out, "\n\n") + fmt.Fprintf(out, "var flags_%v = ", target.Arch) + serializer.Write(out, flags) + fmt.Fprintf(out, "\n\n") + constArr := make([]prog.ConstValue, 0, len(consts)) for name, val := range consts { constArr = append(constArr, prog.ConstValue{Name: name, Value: val}) |
