Merge pull request #282 from visualfc/runtime

build: check runtime link file
This commit is contained in:
xushiwei
2024-06-08 07:54:00 +08:00
committed by GitHub
4 changed files with 44 additions and 13 deletions

9
c/c.go
View File

@@ -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 //go:linkname Printf C.printf
func Printf(format *Char, __llgo_va_list ...any) Int func Printf(format *Char, __llgo_va_list ...any) Int

15
c/c_default.go Normal file
View File

@@ -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

15
c/c_linux.go Normal file
View File

@@ -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

View File

@@ -145,11 +145,15 @@ func Do(args []string, conf *Config) {
return rt[1].Types return rt[1].Types
}) })
pkgs := buildAllPkgs(prog, initial, mode, verbose) pkgs := buildAllPkgs(prog, initial, nil, mode, verbose)
var runtimeFiles []string var runtimeFiles []string
if needRt { 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 { for _, pkg := range dpkg {
if !strings.HasSuffix(pkg.ExportFile, ".ll") { if !strings.HasSuffix(pkg.ExportFile, ".ll") {
continue continue
@@ -188,7 +192,7 @@ func isNeedRuntimeOrPyInit(pkg *packages.Package) (needRuntime, needPyInit bool)
return 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. // Create SSA-form program representation.
ssaProg, pkgs, errPkgs := allPkgs(initial, ssa.SanityCheckFunctions) ssaProg, pkgs, errPkgs := allPkgs(initial, ssa.SanityCheckFunctions)
ssaProg.Build() ssaProg.Build()
@@ -200,6 +204,10 @@ func buildAllPkgs(prog llssa.Program, initial []*packages.Package, mode Mode, ve
} }
for _, aPkg := range pkgs { for _, aPkg := range pkgs {
pkg := aPkg.Package pkg := aPkg.Package
if skip[pkg.PkgPath] {
pkg.ExportFile = ""
continue
}
switch kind, param := cl.PkgKindOf(pkg.Types); kind { switch kind, param := cl.PkgKindOf(pkg.Types); kind {
case cl.PkgDeclOnly: case cl.PkgDeclOnly:
// skip packages that only contain declarations // skip packages that only contain declarations
@@ -294,7 +302,9 @@ func linkMainPkg(pkg *packages.Package, pkgs []*aPackage, runtimeFiles []string,
dirty := false dirty := false
if needRuntime && runtimeFiles != nil { if needRuntime && runtimeFiles != nil {
args = append(args, runtimeFiles...) for _, file := range runtimeFiles {
args = appendLinkFiles(args, file)
}
} else { } else {
dirty = true dirty = true
fn := aPkg.LPkg.FuncOf(cl.RuntimeInit) fn := aPkg.LPkg.FuncOf(cl.RuntimeInit)