diff --git a/cl/internal/cltest/cltest.go b/cl/internal/cltest/cltest.go index de86e99dc..134259b11 100644 --- a/cl/internal/cltest/cltest.go +++ b/cl/internal/cltest/cltest.go @@ -41,5 +41,6 @@ func NC(cfg *llcppg.Config, fileMap map[string]*llcppg.FileInfo, convSym func(na ConvSym: convSym, TrimPrefixes: cfg.TrimPrefixes, KeepUnderScore: cfg.KeepUnderScore, + GenThird: cfg.GenThird, } } diff --git a/cl/internal/convert/convert.go b/cl/internal/convert/convert.go index 4e5a1930f..f2bafdd8b 100644 --- a/cl/internal/convert/convert.go +++ b/cl/internal/convert/convert.go @@ -29,8 +29,9 @@ type Config struct { Pkg *ast.File NC nc.NodeConverter - Deps []string // dependent packages - Libs string + Deps []string // dependent packages + Libs string + GenThird bool // trird type not in generation } // if modulePath is not empty, init the module by modulePath diff --git a/cl/internal/convert/convert_test.go b/cl/internal/convert/convert_test.go index 73a7d3d3b..06ee45526 100644 --- a/cl/internal/convert/convert_test.go +++ b/cl/internal/convert/convert_test.go @@ -232,6 +232,7 @@ func testFrom(t *testing.T, dir string, gen bool, validateFunc func(t *testing.T NC: cltest.NC(&cfg, convertPkg.FileMap, cltest.GetConvSym(symbPath)), Deps: cfg.Deps, Libs: cfg.Libs, + GenThird: true, }) if err != nil { t.Fatal(err) @@ -417,7 +418,7 @@ func createJSONFile(filepath string, data any) error { } func callSigfetch(configFile string, dir string) ([]byte, error) { - cmd := exec.Command("llcppsigfetch", configFile) + cmd := exec.Command("llcppsigfetch", "-v", configFile) cmd.Dir = dir var out bytes.Buffer diff --git a/cl/internal/convert/package.go b/cl/internal/convert/package.go index 969b68d5d..3d12d42f6 100644 --- a/cl/internal/convert/package.go +++ b/cl/internal/convert/package.go @@ -260,6 +260,7 @@ func (p *Package) NewFuncDecl(goName string, funcDecl *ast.FuncDecl) error { if debugLog { log.Printf("NewFuncDecl: %v\n", funcDecl.Name) } + // not need check , symbol not found will not generate fnSpec, err := p.LookupFunc(goName, funcDecl) if err != nil { @@ -366,6 +367,10 @@ func (p *Package) NewTypeDecl(goName string, typeDecl *ast.TypeDecl, pnc nc.Node log.Printf("NewTypeDecl: %s\n", typeDecl.Name.Name) } + if p.lookupOrigin(typeDecl.Name.Name, goName) != nil { + return nil + } + cname := typeDecl.Name.Name isForward := p.cvt.inComplete(typeDecl.Type) name, changed, exist, err := p.RegisterNode(Node{name: cname, kind: TypeDecl}, goName, p.lookupOrigin) @@ -467,6 +472,18 @@ func (p *Package) NewTypedefDecl(goName string, typedefDecl *ast.TypedefDecl, pn log.Printf("NewTypedefDecl: %s\n", typedefDecl.Name.Name) } + if typedefDecl.Name.Name == "__darwin_va_list" || typedefDecl.Name.Name == "__gnuc_va_list" { + typedefDecl.Type = &ast.PointerType{ + X: &ast.BuiltinType{ + Kind: ast.Void, + }, + } + } + + if p.lookupOrigin(typedefDecl.Name.Name, goName) != nil { + return nil + } + node := Node{name: typedefDecl.Name.Name, kind: TypedefDecl} name, changed, exist, err := p.RegisterNode(node, goName, p.lookupOrigin) if err != nil { @@ -558,6 +575,11 @@ func (p *Package) NewEnumTypeDecl(goName string, enumTypeDecl *ast.EnumTypeDecl, if debugLog { log.Printf("NewEnumTypeDecl: %v\n", enumTypeDecl.Name) } + + if enumTypeDecl.Name != nil && p.lookupOrigin(enumTypeDecl.Name.Name, goName) != nil { + return nil + } + enumType, exist, err := p.createEnumType(goName, enumTypeDecl.Name, pnc) if err != nil { return fmt.Errorf("NewEnumTypeDecl: %v fail: %w", enumTypeDecl.Name, err) diff --git a/cl/nc/ncimpl/ncimpl.go b/cl/nc/ncimpl/ncimpl.go index 83a2512c1..0e25cff1e 100644 --- a/cl/nc/ncimpl/ncimpl.go +++ b/cl/nc/ncimpl/ncimpl.go @@ -42,6 +42,7 @@ type Converter struct { Pubs map[string]string TrimPrefixes []string KeepUnderScore bool + GenThird bool } func (p *Converter) convFile(file string, obj *ast.Object) (goFile string, ok bool) { @@ -63,11 +64,11 @@ func (p *Converter) convFile(file string, obj *ast.Object) (goFile string, ok bo func (p *Converter) ConvDecl(file string, decl ast.Decl) (goName, goFile string, err error) { obj := ast.ObjectOf(decl) - goFile, ok := p.convFile(file, obj) - if !ok { - err = nc.ErrSkip - return - } + goFile, _ = p.convFile(file, obj) + // if !ok { + // err = nc.ErrSkip + // return + // } switch decl := decl.(type) { case *ast.FuncDecl: goName, err = p.ConvSym(obj, decl.MangledName) @@ -89,11 +90,11 @@ func (p *Converter) ConvDecl(file string, decl ast.Decl) (goName, goFile string, } func (p *Converter) ConvMacro(file string, macro *ast.Macro) (goName, goFile string, err error) { - goFile, ok := p.convFile(file, nil) - if !ok { - err = nc.ErrSkip - return - } + goFile, _ = p.convFile(file, nil) + // if !ok { + // err = nc.ErrSkip + // return + // } goName = p.constName(macro.Name) return } diff --git a/config/config.go b/config/config.go index dedfdf255..53714d2f2 100644 --- a/config/config.go +++ b/config/config.go @@ -39,6 +39,7 @@ type Config struct { TypeMap map[string]string `json:"typeMap,omitempty"` StaticLib bool `json:"staticLib,omitempty"` HeaderOnly bool `json:"headerOnly,omitempty"` + GenThird bool `json:"genThird,omitempty"` } // json middleware for validating