From a45be62b6880a6682d0e8101a57919fdad0a64c7 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Sat, 15 Jun 2024 12:43:05 +0800 Subject: [PATCH] cl.NewPackageEx --- cl/cltest/cltest.go | 2 +- cl/compile.go | 43 +++++++++++++++++++++++++++------------- internal/build/build.go | 4 ++-- internal/llgen/llgen.go | 2 +- internal/llgen/llgenf.go | 2 +- 5 files changed, 34 insertions(+), 19 deletions(-) diff --git a/cl/cltest/cltest.go b/cl/cltest/cltest.go index fbe500be..6b1208c1 100644 --- a/cl/cltest/cltest.go +++ b/cl/cltest/cltest.go @@ -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) } diff --git a/cl/compile.go b/cl/compile.go index 06ca17f5..61b97d49 100644 --- a/cl/compile.go +++ b/cl/compile.go @@ -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 } // ----------------------------------------------------------------------------- diff --git a/internal/build/build.go b/internal/build/build.go index eacb4277..670656f2 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -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" diff --git a/internal/llgen/llgen.go b/internal/llgen/llgen.go index d50dfe56..2a62b637 100644 --- a/internal/llgen/llgen.go +++ b/internal/llgen/llgen.go @@ -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 diff --git a/internal/llgen/llgenf.go b/internal/llgen/llgenf.go index 36adf090..843c245a 100644 --- a/internal/llgen/llgenf.go +++ b/internal/llgen/llgenf.go @@ -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