From 15fad2e84120c450fdfb0ea3517d17d1a94ef2e6 Mon Sep 17 00:00:00 2001 From: Li Jie Date: Thu, 6 Jun 2024 10:59:35 +0800 Subject: [PATCH] cl: supports decl: --- .gitignore | 2 +- cl/cltest/cltest.go | 3 ++- cl/import.go | 2 ++ internal/build/build.go | 31 ++++++++++++++++++++----------- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 18a368ba..ff4e3cde 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,7 @@ *.dylib test.db -llgo_autogen.ll +llgo_autogen*.ll stories*.bin .DS_Store err.log diff --git a/cl/cltest/cltest.go b/cl/cltest/cltest.go index a0d0b750..04d1036b 100644 --- a/cl/cltest/cltest.go +++ b/cl/cltest/cltest.go @@ -26,6 +26,7 @@ import ( "log" "os" "path" + "path/filepath" "strings" "testing" @@ -74,7 +75,7 @@ func decodeLinkFile(llFile string) (data []byte, err error) { return } defer zipf.Close() - f, err := zipf.Open("llgo_autogen.ll") + f, err := zipf.Open(filepath.Base(llFile)) if err != nil { return } diff --git a/cl/import.go b/cl/import.go index 165b2f8c..35ef5317 100644 --- a/cl/import.go +++ b/cl/import.go @@ -105,6 +105,8 @@ func pkgKind(v string) (int, string) { return PkgLinkExtern, v[5:] } else if strings.HasPrefix(v, "py.") { // "py." return PkgPyModule, v[3:] + } else if strings.HasPrefix(v, "decl:") { // "decl: " + return PkgDeclOnly, v[5:] } } return PkgLLGo, "" diff --git a/internal/build/build.go b/internal/build/build.go index 32345acd..117b7dc7 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -449,8 +449,13 @@ func allLinkFiles(rt []*packages.Package) (outFiles []string) { outFiles = make([]string, 0, len(rt)) packages.Visit(rt, nil, func(p *packages.Package) { pkgPath := p.PkgPath + kind, param := cl.PkgKindOf(p.Types) if isRuntimePkg(pkgPath) { - llgoPkgLinkFiles(pkgPath, func(linkFile string) { + exptFile := "" + if kind == cl.PkgLinkIR || kind == cl.PkgDeclOnly { + exptFile = strings.TrimSpace(param) + } + llgoPkgLinkFiles(pkgPath, exptFile, func(linkFile string) { outFiles = append(outFiles, linkFile) }) } @@ -459,13 +464,14 @@ func allLinkFiles(rt []*packages.Package) (outFiles []string) { } const ( - pkgAbi = llgoModPath + "/internal/abi" - pkgRuntime = llgoModPath + "/internal/runtime" + pkgAbi = llgoModPath + "/internal/abi" + pkgRuntime = llgoModPath + "/internal/runtime" + pkgRuntimeC = llgoModPath + "/internal/runtime/c" ) func isRuntimePkg(pkgPath string) bool { switch pkgPath { - case pkgRuntime, pkgAbi: + case pkgRuntime, pkgAbi, pkgRuntimeC: return true } return false @@ -501,7 +507,7 @@ func concatPkgLinkFiles(pkgPath string) string { var b strings.Builder var ret string var n int - llgoPkgLinkFiles(pkgPath, func(linkFile string) { + llgoPkgLinkFiles(pkgPath, "", func(linkFile string) { if n == 0 { ret = linkFile } else { @@ -518,13 +524,16 @@ func concatPkgLinkFiles(pkgPath string) string { return ret } -func llgoPkgLinkFiles(pkgPath string, procFile func(linkFile string)) { +func llgoPkgLinkFiles(pkgPath string, llFile string, procFile func(linkFile string)) { dir := llgoRoot() + pkgPath[len(llgoModPath):] + "/" - llFile := dir + "llgo_autogen.ll" - llaFile := llFile + "a" - zipf, err := zip.OpenReader(llaFile) + if llFile == "" { + llFile = "llgo_autogen.ll" + } + llPath := dir + llFile + llaPath := llPath + "a" + zipf, err := zip.OpenReader(llaPath) if err != nil { - procFile(llFile) + procFile(llPath) return } defer zipf.Close() @@ -532,7 +541,7 @@ func llgoPkgLinkFiles(pkgPath string, procFile func(linkFile string)) { for _, f := range zipf.File { procFile(dir + f.Name) } - if _, err := os.Stat(llFile); os.IsNotExist(err) { + if _, err := os.Stat(llPath); os.IsNotExist(err) { for _, f := range zipf.File { decodeFile(dir+f.Name, f) }