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

feat(gen): finish parsing ze_api.h

This commit is contained in:
源文雨
2026-03-22 23:38:41 +08:00
parent 64f95b23a7
commit d42d758aeb
43 changed files with 7235 additions and 32 deletions

View File

@@ -17,38 +17,67 @@ const (
var (
typemap = map[string]string{
"char": "byte",
"char*": "*byte",
"const char*": "*byte",
"char**": "**byte",
"const char**": "**byte",
"char": "byte",
"char*": "*byte",
"const char*": "*byte",
"char**": "**byte",
"const char**": "**byte",
"char***": "***byte",
"const char***": "***byte",
"void*": "unsafe.Pointer",
"void *": "unsafe.Pointer",
"const void*": "unsafe.Pointer",
"void**": "*unsafe.Pointer",
"void **": "*unsafe.Pointer",
"const void**": "*unsafe.Pointer",
"void*": "unsafe.Pointer",
"void *": "unsafe.Pointer",
"const void*": "unsafe.Pointer",
"void**": "*unsafe.Pointer",
"void **": "*unsafe.Pointer",
"const void**": "*unsafe.Pointer",
"void***": "**unsafe.Pointer",
"void ***": "**unsafe.Pointer",
"const void***": "**unsafe.Pointer",
"size_t": "uintptr",
"size_t*": "*uintptr",
"size_t": "uintptr",
"size_t*": "*uintptr",
"size_t *": "*uintptr",
"int": "int32",
"int": "int32",
"unsigned int": "uint32",
"float": "float32",
"double": "float64",
}
unsafeExcludeRegions = map[string]struct{}{
"globaloffset": {},
"bfloat16conversions": {},
"globaloffset": {},
"linkonceodr": {},
"subgroups": {},
}
zecallExcludeRegions = map[string]struct{}{
"CacheLineSize": {},
"common": {},
"driverDDIHandles": {},
"floatAtomics": {},
"program": {},
"raytracing": {},
"relaxedAllocLimits": {},
"bandwidth": {},
"bfloat16conversions": {},
"CacheLineSize": {},
"callbacks": {},
"common": {},
"counterbasedeventpool": {},
"deviceipversion": {},
"deviceLUID": {},
"deviceusablememproperties": {},
"driverDDIHandles": {},
"EUCount": {},
"externalMemMap": {},
"floatAtomics": {},
"imageFormatSupport": {},
"imageviewplanar": {},
"kernelMaxGroupSizeProperties": {},
"linkonceodr": {},
"memoryCompressionHints": {},
"memoryProperties": {},
"powersavinghint": {},
"program": {},
"raytracing": {},
"relaxedAllocLimits": {},
"SRGB": {},
"subAllocationsProperties": {},
"subgroups": {},
}
)
@@ -102,14 +131,22 @@ func scanHeader(name string, scan *bufio.Scanner) {
f.WriteString("\n")
f.WriteString("package ")
f.WriteString(name)
f.WriteString("\n\nimport (")
f.WriteString("\n\n")
noimport := true
sb := strings.Builder{}
sb.WriteString("import (")
if _, ok := unsafeExcludeRegions[region]; !ok {
f.WriteString("\n\t\"unsafe\"\n")
sb.WriteString("\n\t\"unsafe\"\n")
noimport = false
}
if _, ok := zecallExcludeRegions[region]; !ok {
f.WriteString("\n\t\"github.com/fumiama/gozel/internal/zecall\"\n")
sb.WriteString("\n\t\"github.com/fumiama/gozel/internal/zecall\"\n")
noimport = false
}
sb.WriteString(")\n\n")
if !noimport {
f.WriteString(sb.String())
}
f.WriteString(")\n\n")
regionfile = f
// block barrier
case strings.HasPrefix(t, "///////////////////////////////////////////////////////////////////////////////"):
@@ -123,7 +160,7 @@ func scanHeader(name string, scan *bufio.Scanner) {
regionfile = nil
// skip outer #
case strings.HasPrefix(t, "#") || t == "" || strings.HasPrefix(t, "// ") ||
strings.HasPrefix(t, "extern "):
strings.Contains(t, `extern "C"`):
fmt.Println(" [scan] skip", t)
continue
default:
@@ -274,6 +311,30 @@ func scanTypedef(
ln = newln
if strings.Contains(s, "\n") { // multi-line typedef
lines := strings.Split(s, "\n")
if strings.Contains(lines[0], " (*") || strings.Contains(lines[0], "ZE_APICALL") { // is func ptr typedef
_, remains, ok := strings.Cut(lines[0], " (*")
if !ok {
_, remains, ok = strings.Cut(lines[0], "ZE_APICALL")
if !ok {
panic(fmt.Sprintf("%s L%d: unexpected func typdef line %s", name, ln, firstln))
}
}
fnname, _, _ := strings.Cut(strings.TrimPrefix(strings.TrimSpace(remains), "*"), "_t")
fnname = strings.TrimSpace(fnname)
if fnname == "" {
panic(fmt.Sprintf("%s L%d: unexpected func typdef line %s", name, ln, firstln))
}
goname := us2camel(fnname)
fnname += "_t"
checkSymbolName(symtab, ln, name, fnname, goname, sb, f, func() *symbol {
return newSymbolConst(fnname, goname, symbolSubTypeFuncPtr)
})
f.WriteString("// gozel warn: please use C function pointer loaded from C library!\n")
f.WriteString("type ")
f.WriteString(goname)
f.WriteString(" uintptr\n\n")
return ln
}
if len(lines) < 4 {
panic(fmt.Sprintf("%s L%d: unexpected short multi typdef line %s", name, ln, firstln))
}
@@ -303,7 +364,10 @@ func scanTypedef(
strings.HasPrefix(stat, "const void* ") || strings.HasPrefix(stat, "int ") ||
strings.HasPrefix(stat, "const void** ") || strings.HasPrefix(stat, "const char* ") ||
strings.HasPrefix(stat, "const char** ") || strings.HasPrefix(stat, "float ") ||
strings.HasPrefix(stat, "double "):
strings.HasPrefix(stat, "double ") || strings.HasPrefix(stat, "void** ") ||
strings.HasPrefix(stat, "const void*** ") || strings.HasPrefix(stat, "void*** ") ||
strings.HasPrefix(stat, "const char*** ") || strings.HasPrefix(stat, "char** ") ||
strings.HasPrefix(stat, "char*** "):
remains, sz := "", ""
ok := false
remains, c, ok = strings.Cut(stat, ";")
@@ -546,7 +610,7 @@ func scanTypedef(
}
sname := strings.TrimSpace(strings.TrimSuffix(strings.TrimSpace(typs[1]), ";"))
val := us2camel(strings.TrimSuffix(sname, "_t"))
origtyp := strings.TrimSuffix(strings.TrimSpace(typs[0]), "_t")
origtyp := strings.TrimSuffix(symtab.apply(strings.TrimSpace(typs[0])), "_t")
checkSymbolName(symtab, ln, name, sname, val, sb, f, func() *symbol {
return newSymbolConst(sname, val, symbolSubTypeEmptyStruct)
})

View File

@@ -46,6 +46,7 @@ const (
symbolSubTypeEmptyStruct
symbolSubTypeLargeStruct
symbolSubTypeEnum
symbolSubTypeFuncPtr
)
type symbol struct {