From f8f416fb8f2ce79d0cbf980ee53ddb68fac850ca Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Fri, 16 Oct 2015 18:16:10 +0200 Subject: preliminary description of kdbus syscalls --- sysgen/sysgen.go | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) (limited to 'sysgen') 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 '(': -- cgit mrf-deployment