aboutsummaryrefslogtreecommitdiffstats
path: root/sysgen
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2015-10-16 18:16:10 +0200
committerDmitry Vyukov <dvyukov@google.com>2015-10-16 18:16:10 +0200
commitf8f416fb8f2ce79d0cbf980ee53ddb68fac850ca (patch)
tree16fc267a129cafde8432c62b575a9c4497054e55 /sysgen
parent587db99baa54c04e23c207aaf6a5d05d0e1bb791 (diff)
preliminary description of kdbus syscalls
Diffstat (limited to 'sysgen')
-rw-r--r--sysgen/sysgen.go41
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 '(':