createAltSSAPkg

This commit is contained in:
xushiwei
2024-06-15 17:40:05 +08:00
parent 4aa3d321fa
commit 3a6f5dd4ee

View File

@@ -201,9 +201,13 @@ func isNeedRuntimeOrPyInit(pkg *packages.Package) (needRuntime, needPyInit bool)
return return
} }
const (
ssaBuildMode = ssa.SanityCheckFunctions
)
func buildAllPkgs(prog llssa.Program, imp importer, initial []*packages.Package, skip map[string]bool, mode Mode, verbose bool) (pkgs []*aPackage) { func buildAllPkgs(prog llssa.Program, imp importer, initial []*packages.Package, skip map[string]bool, mode Mode, verbose bool) (pkgs []*aPackage) {
// Create SSA-form program representation. // Create SSA-form program representation.
ssaProg, pkgs, errPkgs := allPkgs(imp, initial, ssa.SanityCheckFunctions) ssaProg, pkgs, errPkgs := allPkgs(imp, initial, ssaBuildMode)
ssaProg.Build() ssaProg.Build()
for _, errPkg := range errPkgs { for _, errPkg := range errPkgs {
for _, err := range errPkg.Errors { for _, err := range errPkg.Errors {
@@ -425,7 +429,7 @@ func allPkgs(imp importer, initial []*packages.Package, mode ssa.BuilderMode) (p
if imp != nil { if imp != nil {
if _, ok := hasAltPkg[p.PkgPath]; ok { if _, ok := hasAltPkg[p.PkgPath]; ok {
altPkgPath := "github.com/goplus/llgo/internal/lib/" + p.PkgPath altPkgPath := "github.com/goplus/llgo/internal/lib/" + p.PkgPath
if altPkg = imp(altPkgPath); altPkg != nil { if altPkg = imp(altPkgPath); altPkg != nil { // TODO(xsw): how to minimize import times
altSSA = createAltSSAPkg(prog, altPkg) altSSA = createAltSSAPkg(prog, altPkg)
} }
} }
@@ -439,15 +443,20 @@ func allPkgs(imp importer, initial []*packages.Package, mode ssa.BuilderMode) (p
} }
func createAltSSAPkg(prog *ssa.Program, alt *packages.Package) *ssa.Package { func createAltSSAPkg(prog *ssa.Program, alt *packages.Package) *ssa.Package {
altPath := alt.Types.Path()
altSSA := prog.ImportedPackage(altPath)
if altSSA == nil {
packages.Visit([]*packages.Package{alt}, nil, func(p *packages.Package) { packages.Visit([]*packages.Package{alt}, nil, func(p *packages.Package) {
typ := p.Types pkgTypes := p.Types
if typ != nil && !p.IllTyped { if pkgTypes != nil && !p.IllTyped {
if prog.ImportedPackage(typ.Path()) == nil { if prog.ImportedPackage(pkgTypes.Path()) == nil {
prog.CreatePackage(typ, p.Syntax, p.TypesInfo, true) prog.CreatePackage(pkgTypes, p.Syntax, p.TypesInfo, true)
} }
} }
}) })
return prog.ImportedPackage(alt.Types.Path()) altSSA = prog.ImportedPackage(altPath)
}
return altSSA
} }
var ( var (