cl.NewPackageEx
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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))
|
// NewPackageEx compiles a Go package (pkg) to LLVM IR package.
|
||||||
for name, v := range pkg.Members {
|
// The Go package may have an alternative package (alt).
|
||||||
members = append(members, &namedMember{name, v})
|
// 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) {
|
||||||
sort.Slice(members, func(i, j int) bool {
|
|
||||||
return members[i].name < members[j].name
|
|
||||||
})
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user