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)
prog := ssatest.NewProgramEx(t, nil, imp)
ret, err := cl.NewPackage(prog, foo, nil, files)
ret, err := cl.NewPackage(prog, foo, files)
if err != nil {
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.
func NewPackage(prog llssa.Program, pkg, alt *ssa.Package, files []*ast.File) (ret llssa.Package, err error) {
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
})
func NewPackage(prog llssa.Program, pkg *ssa.Package, files []*ast.File) (ret llssa.Package, err error) {
return NewPackageEx(prog, pkg, nil, files)
}
// 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
pkgTypes := pkg.Pkg
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.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 {
member := m.val
switch member := member.(type) {
@@ -1013,7 +1029,6 @@ func NewPackage(prog llssa.Program, pkg, alt *ssa.Package, files []*ast.File) (r
ini()
}
}
return
}
// -----------------------------------------------------------------------------

View File

@@ -34,10 +34,10 @@ import (
"github.com/goplus/llgo/cl"
"github.com/goplus/llgo/internal/packages"
"github.com/goplus/llgo/xtool/clang"
clangCheck "github.com/goplus/llgo/xtool/clang/check"
"github.com/goplus/llgo/xtool/env"
llssa "github.com/goplus/llgo/ssa"
clangCheck "github.com/goplus/llgo/xtool/clang/check"
)
type Mode int
@@ -370,7 +370,7 @@ func buildPkg(prog llssa.Program, aPkg *aPackage, mode Mode, verbose bool) {
// TODO: merge pkg.Types
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)
if needLLFile(mode) {
pkg.ExportFile += ".ll"

View File

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

View File

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