diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2015-10-16 18:16:10 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2015-10-16 18:16:10 +0200 |
| commit | f8f416fb8f2ce79d0cbf980ee53ddb68fac850ca (patch) | |
| tree | 16fc267a129cafde8432c62b575a9c4497054e55 /sysgen | |
| parent | 587db99baa54c04e23c207aaf6a5d05d0e1bb791 (diff) | |
preliminary description of kdbus syscalls
Diffstat (limited to 'sysgen')
| -rw-r--r-- | sysgen/sysgen.go | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/sysgen/sysgen.go b/sysgen/sysgen.go index 6431b3bad..25e1c4c7d 100644 --- a/sysgen/sysgen.go +++ b/sysgen/sysgen.go @@ -31,7 +31,7 @@ func main() { intFlags, flagVals := compileFlags(includes, defines, flags) out := new(bytes.Buffer) - generate(syscalls, structs, unnamed, intFlags, out) + generate(syscalls, structs, unnamed, intFlags, flagVals, out) writeSource("sys.go", out.Bytes()) out = new(bytes.Buffer) @@ -60,7 +60,7 @@ type Flag struct { Values []string } -func generate(syscalls []Syscall, structs map[string]Struct, unnamed map[string][]string, flags map[string][]string, out io.Writer) { +func generate(syscalls []Syscall, structs map[string]Struct, unnamed map[string][]string, flags map[string][]string, flagVals map[string]string, out io.Writer) { fmt.Fprintf(out, "// AUTOGENERATED FILE\n") fmt.Fprintf(out, "package sys\n\n") @@ -69,21 +69,21 @@ func generate(syscalls []Syscall, structs map[string]Struct, unnamed map[string] fmt.Fprintf(out, "&Call{ID: %v, Name: \"%v\", CallName: \"%v\"", i, s.Name, s.CallName) if len(s.Ret) != 0 { fmt.Fprintf(out, ", Ret: ") - generateArg("ret", s.Ret[0], s.Ret[1:], structs, unnamed, flags, false, out) + generateArg("ret", s.Ret[0], s.Ret[1:], structs, unnamed, flags, flagVals, false, out) } fmt.Fprintf(out, ", Args: []Type{") for i, a := range s.Args { if i != 0 { fmt.Fprintf(out, ", ") } - generateArg(a[0], a[1], a[2:], structs, unnamed, flags, false, out) + generateArg(a[0], a[1], a[2:], structs, unnamed, flags, flagVals, false, out) } fmt.Fprintf(out, "}},\n") } fmt.Fprintf(out, "}\n") } -func generateArg(name, typ string, a []string, structs map[string]Struct, unnamed map[string][]string, flags map[string][]string, isField bool, out io.Writer) { +func generateArg(name, typ string, a []string, structs map[string]Struct, unnamed map[string][]string, flags map[string][]string, flagVals map[string]string, isField bool, out io.Writer) { name = "\"" + name + "\"" opt := false for i, v := range a { @@ -220,6 +220,23 @@ func generateArg(name, typ string, a []string, structs map[string]Struct, unname failf("unknown flag %v", a[0]) } fmt.Fprintf(out, "FlagsType{%v, TypeSize: %v, Vals: []uintptr{%v}}", common(), size, strings.Join(vals, ",")) + case "const": + var size uint64 + if isField { + if want := 2; len(a) != want { + failf("wrong number of arguments for %v arg %v, want %v, got %v", typ, name, want, len(a)) + } + size = typeToSize(a[1]) + } else { + if want := 1; len(a) != want { + failf("wrong number of arguments for %v arg %v, want %v, got %v", typ, name, want, len(a)) + } + } + val := flagVals[a[0]] + if val == "" { + val = a[0] + } + fmt.Fprintf(out, "ConstType{%v, TypeSize: %v, Val: uintptr(%v)}", common(), size, val) case "int8", "int16", "int32", "int64", "intptr": if want := 0; len(a) != want { failf("wrong number of arguments for %v arg %v, want %v, got %v", typ, name, want, len(a)) @@ -246,16 +263,16 @@ func generateArg(name, typ string, a []string, structs map[string]Struct, unname if want := 1; len(a) != want { failf("wrong number of arguments for %v arg %v, want %v, got %v", typ, name, want, len(a)) } - fmt.Fprintf(out, "ArrayType{%v, Type: %v}", common(), generateType(a[0], structs, unnamed, flags)) + fmt.Fprintf(out, "ArrayType{%v, Type: %v}", common(), generateType(a[0], structs, unnamed, flags, flagVals)) case "ptr": if want := 2; len(a) != want { failf("wrong number of arguments for %v arg %v, want %v, got %v", typ, name, want, len(a)) } - fmt.Fprintf(out, "PtrType{%v, Type: %v, Dir: %v}", common(), generateType(a[1], structs, unnamed, flags), fmtDir(a[0])) + fmt.Fprintf(out, "PtrType{%v, Type: %v, Dir: %v}", common(), generateType(a[1], structs, unnamed, flags, flagVals), fmtDir(a[0])) default: if strings.HasPrefix(typ, "unnamed") { if inner, ok := unnamed[typ]; ok { - generateArg("", inner[0], inner[1:], structs, unnamed, flags, isField, out) + generateArg("", inner[0], inner[1:], structs, unnamed, flags, flagVals, isField, out) return } failf("unknown unnamed type '%v'", typ) @@ -266,7 +283,7 @@ func generateArg(name, typ string, a []string, structs map[string]Struct, unname if i != 0 { fmt.Fprintf(out, ", ") } - generateArg(a[0], a[1], a[2:], structs, unnamed, flags, true, out) + generateArg(a[0], a[1], a[2:], structs, unnamed, flags, flagVals, true, out) } fmt.Fprintf(out, "}}") return @@ -275,9 +292,9 @@ func generateArg(name, typ string, a []string, structs map[string]Struct, unname } } -func generateType(typ string, structs map[string]Struct, unnamed map[string][]string, flags map[string][]string) string { +func generateType(typ string, structs map[string]Struct, unnamed map[string][]string, flags map[string][]string, flagVals map[string]string) string { buf := new(bytes.Buffer) - generateArg("", typ, nil, structs, unnamed, flags, true, buf) + generateArg("", typ, nil, structs, unnamed, flags, flagVals, true, buf) return buf.String() } @@ -545,7 +562,7 @@ func parse(in io.Reader) (includes []string, defines map[string]string, syscalls if defines[key] != "" { failf("%v define is defined multiple times", key) } - defines[key] = string(val) + defines[key] = fmt.Sprintf("(%s)", val) } else { switch p.Char() { case '(': |
