From 769b93a277fa3b58dde298a820e805f617f0c7e2 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Mon, 29 Apr 2024 00:49:17 +0800 Subject: [PATCH] build: mark need runtime --- internal/build/build.go | 21 ++++++++++++++++++--- ssa/package.go | 9 +++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/internal/build/build.go b/internal/build/build.go index 86f3b815..bd2276c5 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -132,6 +132,14 @@ func Do(args []string, conf *Config) { } } +func setNeedRuntime(pkg *packages.Package) { + pkg.Module = nil // just use pkg.Module to mark it needs runtime +} + +func isNeedRuntime(pkg *packages.Package) bool { + return pkg.Module == nil +} + func buildAllPkgs(prog llssa.Program, initial []*packages.Package, mode Mode, verbose bool) { // Create SSA-form program representation. ssaProg, pkgs, errPkgs := allPkgs(initial, ssa.SanityCheckFunctions) @@ -141,6 +149,9 @@ func buildAllPkgs(prog llssa.Program, initial []*packages.Package, mode Mode, ve } for _, pkg := range pkgs { buildPkg(prog, pkg, mode, verbose) + if prog.NeedRuntime() { + setNeedRuntime(pkg.Package) + } } } @@ -156,14 +167,18 @@ func linkMainPkg(pkg *packages.Package, runtimeFiles []string, conf *Config, mod args[0] = "-o" args[1] = app args[2] = "-Wno-override-module" - if runtimeFiles != nil { - args = append(args, runtimeFiles...) - } + needRuntime := false packages.Visit([]*packages.Package{pkg}, nil, func(p *packages.Package) { if p.PkgPath != "unsafe" { // TODO(xsw): maybe can remove this special case args = append(args, p.ExportFile+".ll") + if !needRuntime { + needRuntime = isNeedRuntime(p) + } } }) + if needRuntime && runtimeFiles != nil { + args = append(args, runtimeFiles...) + } // TODO(xsw): show work // fmt.Fprintln(os.Stderr, "clang", args) diff --git a/ssa/package.go b/ssa/package.go index 5640de1b..4512ca25 100644 --- a/ssa/package.go +++ b/ssa/package.go @@ -126,6 +126,8 @@ type aProgram struct { uintptrTy Type intTy Type f64Ty Type + + needRuntime bool } // A Program presents a program. @@ -154,10 +156,16 @@ func (p Program) SetRuntime(runtime any) { } } +// NeedRuntime returns if the current package needs runtime. +func (p Program) NeedRuntime() bool { + return p.needRuntime +} + func (p Program) runtime() *types.Package { if p.rt == nil { p.rt = p.rtget() } + p.needRuntime = true return p.rt } @@ -197,6 +205,7 @@ func (p Program) NewPackage(name, pkgPath string) Package { // mod.Finalize() fns := make(map[string]Function) gbls := make(map[string]Global) + p.needRuntime = false return &aPackage{mod, fns, gbls, p} }