1
0
mirror of https://github.com/fumiama/gozel.git synced 2026-06-29 23:30:39 +08:00

feat(gen): finish def func & simple typedef parsing

This commit is contained in:
源文雨
2026-03-17 23:57:25 +08:00
parent bddf993ebf
commit 5ab4023cb9
70 changed files with 291 additions and 258 deletions

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +1,84 @@
// Code generated by gen. DO NOT EDIT. // Code generated by gen. DO NOT EDIT.
/*
*
* Copyright (C) 2019-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
* @file ze_api.h
* @version v1.15-r1.15.31
*
*/
package core package core
/// @brief Generates generic 'oneAPI' API versions
func ZE_MAKE_VERSION[T ~int | ~uint64 | ~uintptr](_major T, _minor T) T {
return (( _major << 16 )|( _minor & 0x0000ffff))
}
/// @brief Extracts 'oneAPI' API major version
func ZE_MAJOR_VERSION[T ~int | ~uint64 | ~uintptr](_ver T) T {
return ( _ver >> 16 )
}
/// @brief Extracts 'oneAPI' API minor version
func ZE_MINOR_VERSION[T ~int | ~uint64 | ~uintptr](_ver T) T {
return ( _ver & 0x0000ffff )
}
/// @brief compiler-independent type
type ZeBool uint8
/// @brief Handle of a driver instance
type ZeDriverHandle uintptr
/// @brief Handle of driver's device object
type ZeDeviceHandle uintptr
/// @brief Handle of driver's context object
type ZeContextHandle uintptr
/// @brief Handle of driver's command queue object
type ZeCommandQueueHandle uintptr
/// @brief Handle of driver's command list object
type ZeCommandListHandle uintptr
/// @brief Handle of driver's fence object
type ZeFenceHandle uintptr
/// @brief Handle of driver's event pool object
type ZeEventPoolHandle uintptr
/// @brief Handle of driver's event object
type ZeEventHandle uintptr
/// @brief Handle of driver's image object
type ZeImageHandle uintptr
/// @brief Handle of driver's module object
type ZeModuleHandle uintptr
/// @brief Handle of module's build log object
type ZeModuleBuildLogHandle uintptr
/// @brief Handle of driver's kernel object
type ZeKernelHandle uintptr
/// @brief Handle of driver's sampler object
type ZeSamplerHandle uintptr
/// @brief Handle of physical memory object
type ZePhysicalMemHandle uintptr
/// @brief Handle of driver's fabric vertex object
type ZeFabricVertexHandle uintptr
/// @brief Handle of driver's fabric edge object
type ZeFabricEdgeHandle uintptr
/// @brief Maximum IPC handle size
const ZE_MAX_IPC_HANDLE_SIZE = 64

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -1,3 +0,0 @@
// Code generated by gen. DO NOT EDIT.
package core

View File

@@ -22,6 +22,7 @@ func main() {
if strings.HasPrefix(*spec, "v") { if strings.HasPrefix(*spec, "v") {
ver := (*spec)[1:] ver := (*spec)[1:]
u := fmt.Sprintf("https://github.com/oneapi-src/level-zero/releases/download/v%s/level-zero-win-sdk-%s.zip", ver, ver) u := fmt.Sprintf("https://github.com/oneapi-src/level-zero/releases/download/v%s/level-zero-win-sdk-%s.zip", ver, ver)
fmt.Println("[main] downloading spec from", u)
resp, err := http.Get(u) resp, err := http.Get(u)
if err != nil { if err != nil {
panic(err) panic(err)
@@ -37,6 +38,7 @@ func main() {
} }
specdir = r specdir = r
} else { } else {
fmt.Println("[main] reading local spec from", *spec)
specdir = os.DirFS(*spec) specdir = os.DirFS(*spec)
} }
@@ -45,7 +47,7 @@ func main() {
if err != nil { if err != nil {
panic(err) panic(err)
} }
scanheader("core", bufio.NewScanner(f)) scanHeader("core", bufio.NewScanner(f))
_ = f.Close() _ = f.Close()
fmt.Println("[main] finish parsing core") fmt.Println("[main] finish parsing core")
@@ -54,7 +56,7 @@ func main() {
if err != nil { if err != nil {
panic(err) panic(err)
} }
scanheader("rntm", bufio.NewScanner(f)) scanHeader("rntm", bufio.NewScanner(f))
_ = f.Close() _ = f.Close()
fmt.Println("[main] finish parsing runtime") fmt.Println("[main] finish parsing runtime")
@@ -63,7 +65,7 @@ func main() {
if err != nil { if err != nil {
panic(err) panic(err)
} }
scanheader("sysm", bufio.NewScanner(f)) scanHeader("sysm", bufio.NewScanner(f))
_ = f.Close() _ = f.Close()
fmt.Println("[main] finish parsing sysman") fmt.Println("[main] finish parsing sysman")
@@ -72,7 +74,7 @@ func main() {
if err != nil { if err != nil {
panic(err) panic(err)
} }
scanheader("tols", bufio.NewScanner(f)) scanHeader("tols", bufio.NewScanner(f))
_ = f.Close() _ = f.Close()
fmt.Println("[main] finish parsing tools") fmt.Println("[main] finish parsing tools")
} }

View File

@@ -19,7 +19,7 @@ func infh(name string) string {
return s return s
} }
func scanheader(name string, scan *bufio.Scanner) { func scanHeader(name string, scan *bufio.Scanner) {
ln := 0 ln := 0
var regionfile *os.File var regionfile *os.File
symtab := symbolTable{ symtab := symbolTable{
@@ -27,13 +27,19 @@ func scanheader(name string, scan *bufio.Scanner) {
"ZE_APIEXPORT": symbol{symbolTypeConst, "ZE_APIEXPORT", []string{""}}, "ZE_APIEXPORT": symbol{symbolTypeConst, "ZE_APIEXPORT", []string{""}},
"ZE_DLLEXPORT": symbol{symbolTypeConst, "ZE_DLLEXPORT", []string{""}}, "ZE_DLLEXPORT": symbol{symbolTypeConst, "ZE_DLLEXPORT", []string{""}},
} }
fileheadersb := strings.Builder{}
region := ""
for scan.Scan() { for scan.Scan() {
ln++ ln++
t := scan.Text() t := scan.Text()
switch { switch {
// file headers
case strings.HasPrefix(t, "/*") || strings.HasPrefix(t, " *") || strings.HasPrefix(t, " */"):
fileheadersb.WriteString(t)
fileheadersb.WriteString("\n")
// pragma start // pragma start
case strings.HasPrefix(t, "#pragma region "): case strings.HasPrefix(t, "#pragma region "):
region := strings.TrimSpace(t[15:]) region = strings.TrimSpace(t[15:])
if region == "" { if region == "" {
panic(fmt.Sprintf("%s L%d: unexpected empty region", name, ln)) panic(fmt.Sprintf("%s L%d: unexpected empty region", name, ln))
} }
@@ -47,25 +53,49 @@ func scanheader(name string, scan *bufio.Scanner) {
if err != nil { if err != nil {
panic(fmt.Sprintf("%s L%d: cannot create region %s, err: %v", name, ln, region, err)) panic(fmt.Sprintf("%s L%d: cannot create region %s, err: %v", name, ln, region, err))
} }
f.WriteString("// Code generated by gen. DO NOT EDIT.\n\npackage ") f.WriteString("// Code generated by gen. DO NOT EDIT.\n\n")
f.WriteString(name) f.WriteString(fileheadersb.String())
f.WriteString("\n") f.WriteString("\n")
f.WriteString("package ")
f.WriteString(name)
f.WriteString("\n\n")
regionfile = f regionfile = f
// block barrier // block barrier
case strings.HasPrefix(t, "///////////////////////////////////////////////////////////////////////////////"): case strings.HasPrefix(t, "///////////////////////////////////////////////////////////////////////////////"):
regionfile.WriteString(t) fmt.Println(" [scan] enter", region, "block")
regionfile.WriteString("\n") ln = scanBlocks(name, scan, regionfile, ln, symtab)
ln = scanblocks(name, scan, regionfile, ln, symtab) fmt.Println(" [scan] leave", region, "block")
// pragma end // pragma end
case strings.HasPrefix(t, "#pragma endregion"): case strings.HasPrefix(t, "#pragma endregion"):
fmt.Println(infh(name), "close region", regionfile.Name()) fmt.Println(infh(name), "close region", regionfile.Name())
_ = regionfile.Close() _ = regionfile.Close()
regionfile = nil regionfile = nil
// skip outer #
case strings.HasPrefix(t, "#") || t == "" || strings.HasPrefix(t, "// ") ||
strings.HasPrefix(t, "extern "):
fmt.Println(" [scan] skip", t)
continue
default:
panic(fmt.Sprintf("%s L%d: unexpected line %s", name, ln, t))
} }
} }
} }
func scanblocks( func checkSymbolName(
symtab symbolTable, ln int, name, sname string,
sb *strings.Builder, f *os.File, eq func() symbol) {
if _, ok := symtab[sname]; ok {
panic(fmt.Sprintf("%s L%d: func #define %s has been defined", name, ln, sname))
}
symtab[sname] = eq()
if sb.Len() == 0 {
panic(fmt.Sprintf("%s L%d: unexpected non-comment for symbol %s", name, ln, sname))
}
f.WriteString(sb.String())
sb.Reset()
}
func scanBlocks(
name string, scan *bufio.Scanner, f *os.File, name string, scan *bufio.Scanner, f *os.File,
ln int, symtab symbolTable, ln int, symtab symbolTable,
) int { ) int {
@@ -119,7 +149,77 @@ func scanblocks(
panic(fmt.Sprintf("%s L%d: unexpected unpaired #endif", name, ln)) panic(fmt.Sprintf("%s L%d: unexpected unpaired #endif", name, ln))
} }
case strings.HasPrefix(t, "#define "): case strings.HasPrefix(t, "#define "):
if !strings.Contains(t, "(") { // is const define
argseval := trimEmptyStringArray(strings.Split(t[8:], " "))
if len(argseval) != 2 {
panic(fmt.Sprintf("%s L%d: unexpected const #define line %s", name, ln, t))
}
sname := strings.TrimSpace(argseval[0])
val := strings.TrimSpace(argseval[1])
checkSymbolName(symtab, ln, name, sname, &sb, f, func() symbol {
return newSymbolConst(sname, val)
})
f.WriteString("const ")
f.WriteString(sname)
f.WriteString(" = ")
f.WriteString(val)
f.WriteString("\n\n")
continue
}
sname, argseval, ok := strings.Cut(t[8:], "(")
if !ok {
panic(fmt.Sprintf("%s L%d: unexpected #define line %s", name, ln, t))
}
args, n, err := getInsideRoundBrakets(argseval)
if err != nil {
panic(fmt.Sprintf("%s L%d: unexpected args bracket err: %v", name, ln, err))
}
sname = strings.TrimSpace(sname)
args = strings.TrimSpace(args)
eval := strings.TrimSpace(argseval[n+1:])
checkSymbolName(symtab, ln, name, sname, &sb, f, func() symbol {
return newSymbolFunc(sname, args, eval)
})
f.WriteString("func ")
f.WriteString(sname)
f.WriteString("[T ~int | ~uint64 | ~uintptr](")
f.WriteString(strings.Join(strings.Split(args, ","), " T,"))
f.WriteString(" T) T {\n\treturn ")
f.WriteString(eval)
f.WriteString("\n}\n\n")
case strings.HasPrefix(t, "typedef "):
s, newln := get1sentence(t, scan, ln)
if newln < 0 {
panic(fmt.Sprintf("%s L%d: unexpected sentence end from", name, ln))
}
ln = newln
typs := trimEmptyStringArray(strings.Split(s[8:], " "))
if len(typs) == 0 {
panic(fmt.Sprintf("%s L%d: unexpected typdef line %s", name, ln, t))
}
if strings.TrimSpace(typs[0]) == "struct" {
if len(typs) != 3 || !strings.Contains(typs[1], "handle_t") ||
!strings.Contains(typs[2], "*") {
panic(fmt.Sprintf("%s L%d: unexpected typdef line %s", name, ln, t))
}
typs = typs[1:]
typs[0] = "uintptr"
typs[1] = strings.TrimPrefix(strings.TrimSpace(typs[1]), "*")
}
if len(typs) != 2 {
panic(fmt.Sprintf("%s L%d: unexpected typdef line %s", name, ln, t))
}
sname := strings.TrimSpace(strings.TrimSuffix(strings.TrimSpace(typs[1]), ";"))
val := us2camel(strings.TrimSuffix(sname, "_t"))
origtyp := strings.TrimSuffix(strings.TrimSpace(typs[0]), "_t")
checkSymbolName(symtab, ln, name, sname, &sb, f, func() symbol {
return newSymbolConst(sname, val)
})
f.WriteString("type ")
f.WriteString(val)
f.WriteString(" ")
f.WriteString(origtyp)
f.WriteString("\n\n")
} }
} }
return ln return ln

View File

@@ -1,46 +0,0 @@
package main
import (
"bufio"
"errors"
"strings"
)
func skip2endif(scan *bufio.Scanner, ln int) int {
depth := 1
for scan.Scan() {
ln++
t := scan.Text()
switch {
case strings.HasPrefix(t, "#endif"):
depth--
case strings.HasPrefix(t, "#if"):
depth++
default:
}
if depth <= 0 {
break
}
}
return ln
}
func getinside0brakets(txt string) (string, int, error) {
depth := 0
a := 0
for i, t := range txt {
switch t {
case '(':
if depth == 0 {
a = i + 1
}
depth++
case ')':
depth--
if depth <= 0 {
return txt[a:i], i, nil
}
}
}
return "", 0, errors.New("no round brakets pair in " + txt)
}

View File

@@ -40,7 +40,7 @@ type symbol struct {
fields []string fields []string
} }
func newsymbolconst(name, val string) symbol { func newSymbolConst(name, val string) symbol {
return symbol{ return symbol{
stype: symbolTypeConst, stype: symbolTypeConst,
name: name, name: name,
@@ -48,7 +48,7 @@ func newsymbolconst(name, val string) symbol {
} }
} }
func newsymbolfunc(name, paras, evals string) symbol { func newSymbolFunc(name, paras, evals string) symbol {
return symbol{ return symbol{
stype: symbolTypeConst, stype: symbolTypeConst,
name: name, name: name,
@@ -56,7 +56,7 @@ func newsymbolfunc(name, paras, evals string) symbol {
} }
} }
func (s *symbol) extractfirstfunc(txt string) (args []string, a, b int, err error) { func (s *symbol) extract1stFunc(txt string) (args []string, a, b int, err error) {
if s.stype == symbolTypeConst { if s.stype == symbolTypeConst {
return nil, 0, 0, errIsConstReplace return nil, 0, 0, errIsConstReplace
} }
@@ -64,7 +64,7 @@ func (s *symbol) extractfirstfunc(txt string) (args []string, a, b int, err erro
if a < 0 { if a < 0 {
return nil, 0, 0, errNoSuchSymbol return nil, 0, 0, errNoSuchSymbol
} }
str, off, err := getinside0brakets(txt[a:]) str, off, err := getInsideRoundBrakets(txt[a:])
if err != nil { if err != nil {
return nil, 0, 0, err return nil, 0, 0, err
} }
@@ -82,7 +82,7 @@ func (s *symbol) replace(txt string) string {
case symbolTypeFunc: case symbolTypeFunc:
paras := strings.Split(s.fields[0], ",") paras := strings.Split(s.fields[0], ",")
for { for {
args, a, b, err := s.extractfirstfunc(txt) args, a, b, err := s.extract1stFunc(txt)
if err == errNoSuchSymbol { if err == errNoSuchSymbol {
return txt return txt
} }

88
gen/utils.go Normal file
View File

@@ -0,0 +1,88 @@
package main
import (
"bufio"
"errors"
"strings"
"unicode"
)
func skip2endif(scan *bufio.Scanner, ln int) int {
depth := 1
for scan.Scan() {
ln++
t := scan.Text()
switch {
case strings.HasPrefix(t, "#endif"):
depth--
case strings.HasPrefix(t, "#if"):
depth++
default:
}
if depth <= 0 {
break
}
}
return ln
}
func getInsideRoundBrakets(txt string) (string, int, error) {
depth := 0
a := 0
for i, t := range txt {
switch t {
case '(':
if depth == 0 {
a = i + 1
}
depth++
case ')':
depth--
if depth <= 0 {
return txt[a:i], i, nil
}
}
}
return "", 0, errors.New("no round brakets pair in " + txt)
}
func get1sentence(firstln string, scan *bufio.Scanner, ln int) (string, int) {
if strings.Contains(firstln, ";") {
return firstln, ln
}
sb := strings.Builder{}
sb.WriteString(firstln)
for scan.Scan() {
sb.WriteString("\n")
t := scan.Text()
ln++
sb.WriteString(t)
if strings.Contains(t, ";") {
return sb.String(), ln
}
}
return "", -1
}
func us2camel(t string) string {
sb := strings.Builder{}
for s := range strings.SplitSeq(t, "_") {
rs := []rune(s)
sb.WriteRune(unicode.ToUpper(rs[0]))
for _, r := range rs[1:] {
sb.WriteRune(unicode.ToLower(r))
}
}
return sb.String()
}
func trimEmptyStringArray(arr []string) []string {
news := make([]string, 0, len(arr))
for _, s := range arr {
if s == "" {
continue
}
news = append(news, s)
}
return news
}