From 878b395e20d89d42d8e1512a442d8294ac2313ff Mon Sep 17 00:00:00 2001 From: visualfc Date: Fri, 7 Jun 2024 20:33:31 +0800 Subject: [PATCH 1/2] build: check runtime link file --- c/c.go | 9 --------- c/c_default.go | 15 +++++++++++++++ c/c_linux.go | 15 +++++++++++++++ internal/build/build.go | 4 +++- 4 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 c/c_default.go create mode 100644 c/c_linux.go diff --git a/c/c.go b/c/c.go index c30ed0c9..cfa9a77c 100644 --- a/c/c.go +++ b/c/c.go @@ -97,15 +97,6 @@ func Qsort(base Pointer, count, elem uintptr, compar func(a, b Pointer) Int) // ----------------------------------------------------------------------------- -//go:linkname Stdin stdin -var Stdin FilePtr - -//go:linkname Stdout stdout -var Stdout FilePtr - -//go:linkname Stderr stderr -var Stderr FilePtr - //go:linkname Printf C.printf func Printf(format *Char, __llgo_va_list ...any) Int diff --git a/c/c_default.go b/c/c_default.go new file mode 100644 index 00000000..cc98cc44 --- /dev/null +++ b/c/c_default.go @@ -0,0 +1,15 @@ +//go:build !linux +// +build !linux + +package c + +import _ "unsafe" + +//go:linkname Stdin __stdinp +var Stdin FilePtr + +//go:linkname Stdout __stdoutp +var Stdout FilePtr + +//go:linkname Stderr __stderrp +var Stderr FilePtr diff --git a/c/c_linux.go b/c/c_linux.go new file mode 100644 index 00000000..a6a21c39 --- /dev/null +++ b/c/c_linux.go @@ -0,0 +1,15 @@ +//go:build linux +// +build linux + +package c + +import _ "unsafe" + +//go:linkname Stdin stdin +var Stdin FilePtr + +//go:linkname Stdout stdout +var Stdout FilePtr + +//go:linkname Stderr stderr +var Stderr FilePtr diff --git a/internal/build/build.go b/internal/build/build.go index d8718a05..afd731cc 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -294,7 +294,9 @@ func linkMainPkg(pkg *packages.Package, pkgs []*aPackage, runtimeFiles []string, dirty := false if needRuntime && runtimeFiles != nil { - args = append(args, runtimeFiles...) + for _, file := range runtimeFiles { + args = appendLinkFiles(args, file) + } } else { dirty = true fn := aPkg.LPkg.FuncOf(cl.RuntimeInit) From ae776220260f6d76d7dd447eb17c358a57124f10 Mon Sep 17 00:00:00 2001 From: visualfc Date: Fri, 7 Jun 2024 21:02:01 +0800 Subject: [PATCH 2/2] build: build runtime check skip --- internal/build/build.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/internal/build/build.go b/internal/build/build.go index afd731cc..a7e910d7 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -145,11 +145,15 @@ func Do(args []string, conf *Config) { return rt[1].Types }) - pkgs := buildAllPkgs(prog, initial, mode, verbose) + pkgs := buildAllPkgs(prog, initial, nil, mode, verbose) var runtimeFiles []string if needRt { - dpkg := buildAllPkgs(prog, rt[:1], mode, verbose) + skip := make(map[string]bool) + for _, v := range pkgs { + skip[v.PkgPath] = true + } + dpkg := buildAllPkgs(prog, rt[:1], skip, mode, verbose) for _, pkg := range dpkg { if !strings.HasSuffix(pkg.ExportFile, ".ll") { continue @@ -188,7 +192,7 @@ func isNeedRuntimeOrPyInit(pkg *packages.Package) (needRuntime, needPyInit bool) return } -func buildAllPkgs(prog llssa.Program, initial []*packages.Package, mode Mode, verbose bool) (pkgs []*aPackage) { +func buildAllPkgs(prog llssa.Program, initial []*packages.Package, skip map[string]bool, mode Mode, verbose bool) (pkgs []*aPackage) { // Create SSA-form program representation. ssaProg, pkgs, errPkgs := allPkgs(initial, ssa.SanityCheckFunctions) ssaProg.Build() @@ -200,6 +204,10 @@ func buildAllPkgs(prog llssa.Program, initial []*packages.Package, mode Mode, ve } for _, aPkg := range pkgs { pkg := aPkg.Package + if skip[pkg.PkgPath] { + pkg.ExportFile = "" + continue + } switch kind, param := cl.PkgKindOf(pkg.Types); kind { case cl.PkgDeclOnly: // skip packages that only contain declarations