cl.NewPackageEx

This commit is contained in:
xushiwei
2024-06-15 12:43:05 +08:00
parent e0a25b5098
commit a45be62b68
5 changed files with 34 additions and 19 deletions

View File

@@ -143,7 +143,7 @@ func TestCompileEx(t *testing.T, src any, fname, expected string) {
foo.WriteTo(os.Stderr) foo.WriteTo(os.Stderr)
prog := ssatest.NewProgramEx(t, nil, imp) prog := ssatest.NewProgramEx(t, nil, imp)
ret, err := cl.NewPackage(prog, foo, nil, files) ret, err := cl.NewPackage(prog, foo, files)
if err != nil { if err != nil {
t.Fatal("cl.NewPackage failed:", err) t.Fatal("cl.NewPackage failed:", err)
} }

View File

@@ -953,20 +953,14 @@ func (p *context) compileValues(b llssa.Builder, vals []ssa.Value, hasVArg int)
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// NewPackage compiles a Go package to LLVM IR package. // NewPackage compiles a Go package to LLVM IR package.
func NewPackage(prog llssa.Program, pkg, alt *ssa.Package, files []*ast.File) (ret llssa.Package, err error) { func NewPackage(prog llssa.Program, pkg *ssa.Package, files []*ast.File) (ret llssa.Package, err error) {
type namedMember struct { return NewPackageEx(prog, pkg, nil, files)
name string }
val ssa.Member
}
members := make([]*namedMember, 0, len(pkg.Members))
for name, v := range pkg.Members {
members = append(members, &namedMember{name, v})
}
sort.Slice(members, func(i, j int) bool {
return members[i].name < members[j].name
})
// NewPackageEx compiles a Go package (pkg) to LLVM IR package.
// The Go package may have an alternative package (alt).
// The pkg and alt have the same (Pkg *types.Package).
func NewPackageEx(prog llssa.Program, pkg, alt *ssa.Package, files []*ast.File) (ret llssa.Package, err error) {
pkgProg := pkg.Prog pkgProg := pkg.Prog
pkgTypes := pkg.Pkg pkgTypes := pkg.Pkg
pkgName, pkgPath := pkgTypes.Name(), llssa.PathOf(pkgTypes) pkgName, pkgPath := pkgTypes.Name(), llssa.PathOf(pkgTypes)
@@ -990,6 +984,28 @@ func NewPackage(prog llssa.Program, pkg, alt *ssa.Package, files []*ast.File) (r
} }
ctx.initPyModule() ctx.initPyModule()
ctx.initFiles(pkgPath, files) ctx.initFiles(pkgPath, files)
if alt != nil {
processPkg(ctx, ret, alt)
}
processPkg(ctx, ret, pkg)
return
}
func processPkg(ctx *context, ret llssa.Package, pkg *ssa.Package) {
type namedMember struct {
name string
val ssa.Member
}
members := make([]*namedMember, 0, len(pkg.Members))
for name, v := range pkg.Members {
members = append(members, &namedMember{name, v})
}
sort.Slice(members, func(i, j int) bool {
return members[i].name < members[j].name
})
for _, m := range members { for _, m := range members {
member := m.val member := m.val
switch member := member.(type) { switch member := member.(type) {
@@ -1013,7 +1029,6 @@ func NewPackage(prog llssa.Program, pkg, alt *ssa.Package, files []*ast.File) (r
ini() ini()
} }
} }
return
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------

View File

@@ -34,10 +34,10 @@ import (
"github.com/goplus/llgo/cl" "github.com/goplus/llgo/cl"
"github.com/goplus/llgo/internal/packages" "github.com/goplus/llgo/internal/packages"
"github.com/goplus/llgo/xtool/clang" "github.com/goplus/llgo/xtool/clang"
clangCheck "github.com/goplus/llgo/xtool/clang/check"
"github.com/goplus/llgo/xtool/env" "github.com/goplus/llgo/xtool/env"
llssa "github.com/goplus/llgo/ssa" llssa "github.com/goplus/llgo/ssa"
clangCheck "github.com/goplus/llgo/xtool/clang/check"
) )
type Mode int type Mode int
@@ -370,7 +370,7 @@ func buildPkg(prog llssa.Program, aPkg *aPackage, mode Mode, verbose bool) {
// TODO: merge pkg.Types // TODO: merge pkg.Types
syntax = append(syntax, altPkg.Syntax...) syntax = append(syntax, altPkg.Syntax...)
} }
ret, err := cl.NewPackage(prog, aPkg.SSA, aPkg.AltSSA, syntax) ret, err := cl.NewPackageEx(prog, aPkg.SSA, aPkg.AltSSA, syntax)
check(err) check(err)
if needLLFile(mode) { if needLLFile(mode) {
pkg.ExportFile += ".ll" pkg.ExportFile += ".ll"

View File

@@ -80,7 +80,7 @@ func Gen(pkgPath, inFile string, src any) string {
return ret return ret
}) })
ret, err := cl.NewPackage(prog, ssaPkg, nil, files) ret, err := cl.NewPackage(prog, ssaPkg, files)
check(err) check(err)
if prog.NeedPyInit { // call PyInit if needed if prog.NeedPyInit { // call PyInit if needed

View File

@@ -80,7 +80,7 @@ func GenFrom(fileOrPkg string) string {
ssaPkg.WriteTo(os.Stderr) ssaPkg.WriteTo(os.Stderr)
} }
ret, err := cl.NewPackage(prog, ssaPkg, nil, pkg.Syntax) ret, err := cl.NewPackage(prog, ssaPkg, pkg.Syntax)
check(err) check(err)
if prog.NeedPyInit { // call PyInit if needed if prog.NeedPyInit { // call PyInit if needed