diff --git a/.gitignore b/.gitignore index 344b31f7ac1c1d..197f746e507809 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,9 @@ _testmain.go /doc/articles/wiki/*.bin /goinstall.log /last-change +/llvm/ +/src/cmd/vendor/github.com/goallc/go-llvm/llvm +/src/cmd/vendor/github.com/goallc/go-llvm/libLLVMGoALLC.a.stamp /misc/cgo/life/run.out /misc/cgo/stdio/run.out /misc/cgo/testso/main diff --git a/GOALLC.md b/GOALLC.md index e235fa86c20d35..c59ed699c7eb03 100644 --- a/GOALLC.md +++ b/GOALLC.md @@ -74,27 +74,30 @@ Remote: 路径:`/Volumes/Disk1/00.Work/00.Code/goallc/go-llvm` -- 上游:`tinygo-org/go-llvm` 的 `main` -- LLVM 23 集成通过 GoALLC PR #2 进入 `master` -- 合并后的 `master` 提交为 `7467f945baac` -- Go 仓库依赖版本为 - `v0.0.0-20260726171243-7467f945baac` -- 以 TinyGo 上游 `185673e` 为基础,重放 GoALLC 的 module path 和静态 - 链接改动 -- 由 `tinygo.org/x/go-llvm` 派生 -- 上游代码已经支持 LLVM 14--22;本轮为 LLVM 23 增加相同的版本选择和 - 系统安装配置 -- 本项目把 module path 改成 `github.com/goallc/go-llvm` -- 无版本 build tag 时默认选择 LLVM 23;项目内静态 payload 改为显式 - `staticllvm` build tag -- Linux 使用 apt.llvm.org 的 LLVM 23 当前快照 suite;Homebrew 当前仍以 - LLVM 22 为未版本化公式,因此 macOS 的 LLVM 23 验证使用本地源码构建 -- Go 仓库中的 vendored binding 已同步上述更新 -- personal lowering 分支额外增加了 `goallc_ext.go`,包装 - `LLVMPrintModuleToFile`、`LLVMSetValueName2` 和 opaque pointer type - -当前 `go-llvm/llvm/` 只包含 4 个 `.gitignore`,没有实际 LLVM headers、 -libraries 或 binaries。默认静态构建因此不是开箱即用的。 +- 由 `tinygo.org/x/go-llvm` 派生,module path 为 + `github.com/goallc/go-llvm`; +- LLVM 23 基础兼容及当前清理方案已进入 `master`,HEAD 为 + `33267b8eb4a0`; +- 本项目只支持 GoALLC 定制 LLVM,不再支持系统预安装 LLVM、 + `byollvm`,也不保留 LLVM 14--22 的兼容配置; +- LLVM API 版本和链接模式是两个正交、必选的 build-tag 维度: + `llvm23` 与 `dynamicllvm`/`staticllvm`;后续 LLVM 24 只新增 + `llvm24` 版本层; +- 路径与版本、链接模式解耦。所有 cgo include/link 路径固定写为 + `${SRCDIR}/llvm/include` 和 `${SRCDIR}/llvm/lib`; +- `llvm` 不入库,由调用方提供软链接。Go 工具链的 `cmd/dist` 根据 + `-llvm-dir` 创建或更新该链接; +- 动态模式链接 payload 中的 `libLLVM`;静态模式只链接 binding + `${SRCDIR}` 下由 `cmd/dist` 聚合的 `libLLVMGoALLC.a`; +- 没有生成 Go 文件,没有 `LLVMROOT`,也不把路径塞进普通 cgo 的 + `CGO_CPPFLAGS`、`CGO_LDFLAGS` 或全局动态库环境; +- `goallc_ext.go` 已从 Go vendor 私有补丁收回 binding 仓库。 +- 自动 CI 暂时只做源码格式检查,不再为每个 PR 从源码冷构建 LLVM; + 项目发布预构建 LLVM payload 后,CI 将直接下载 artifact 并恢复动态、 + 静态两种 binding 测试。 + +Go 仓库依赖 go-llvm `master` 的 pseudo-version: +`v0.0.0-20260727072003-33267b8eb4a0`。 ### 2.3 `llvm-project` @@ -113,6 +116,9 @@ Remote: - 基于本地 `official/release/23.x` 的 `ce6af707aac8` - LLVM 版本文件为 `23.1.0` - GoObj 主题分支在 release base 上有 24 笔提交 +- 原聚合静态库方案的 GoALLC PR #2 已关闭;其 feature 分支已用 + `e31213b5750d` 撤回全部源码改动,相对 `llvm23.1.master` 的净 diff + 为零。静态聚合职责已移到 Go `cmd/dist` 本轮已恢复 Clang、LLDB 和 MLGO 测试夹具中的既有 symlink/file-type 变化,源码工作区目前干净。旧的 25 GB 构建目录已删除,并从空目录重新完成 @@ -181,9 +187,10 @@ symbol、relocation、aux data、function metadata、stack map 和反汇编内 - 保留了 LLVM C API 的主要 IR、target、bitcode、DIBuilder、pass、 execution engine 等 Go 封装; -- 支持 LLVM 14--21 的 build tag; -- 改用 GoALLC module path; -- 增加项目内静态 LLVM 目录和生成静态链接 flags 的机制; +- 只保留当前 LLVM 23 API,并以独立 build tag 为 LLVM 24 迁移预留扩展点; +- 版本选择、链接模式和 payload 路径互不耦合; +- 动态、静态配置完全由代码 build tag 隔离,不生成配置源文件; +- 静态模式使用一个 `libLLVMGoALLC.a`,不在 binding 中计算组件依赖; - 允许把 binding 直接 vendor 到 `src/cmd/vendor`,供 `cmd/compile` 内部使用; - bootstrap build 通过 `compiler_bootstrap` stub 避免第一阶段直接依赖 @@ -321,10 +328,13 @@ Go SSA 分支形成于 LLVM Go ABI 工作之前,目前: - Go checkout:官方 `release-branch.go1.27` 的 `go1.27rc2`; - bootstrap Go:Go 1.26.5; -- vendored/standalone binding:LLVM 23 为默认版本; +- vendored/standalone binding:显式选择 `llvm23`; - LLVM source/build:23.1.0git; -- 本轮通过 `byollvm,llvm23` build tags、显式 include/library 路径和 - `libLLVM` 共享库直接使用 LLVM build tree。 +- LLVM payload 默认位于 `$GOROOT/llvm`,也可用 `-llvm-dir` 指定; +- LLVM API 默认版本为 23,也可用 `-llvm-version` 显式指定; +- 默认通过 payload 中的 `libLLVM` 动态链接;`-llvm-link=static` 让 + `cmd/dist` 使用 payload 的 + `llvm-config` 与 `llvm-ar` 生成 binding 本地的 `libLLVMGoALLC.a`。 当前 LLVM 由 macOS 26 SDK 构建,而 Go 1.27 工具链默认链接目标为 macOS 16,因此链接时会产生 deployment-target 警告。构建和 smoke test @@ -332,9 +342,10 @@ Go SSA 分支形成于 LLVM Go ABI 工作之前,目前: `cmd/dist` 还用一个恒为 true 的 `buildGoallc` 强制所有工具走 external link。这是早期 bring-up 手段,后续应缩小到真正依赖 LLVM 的 compiler -阶段和受支持平台。本轮新增 `GOALLC_LLVM_BUILD_TAGS`,因为 `cmd/dist` -会清空调用者的 `GOFLAGS`;它只把指定 tags 注入 toolchain2/3,bootstrap -仍使用 `compiler_bootstrap` stub。 +阶段和受支持平台。`cmd/dist` 现在根据参数自行注入 +`llvm23,dynamicllvm` 或 `llvm23,staticllvm`;bootstrap 仍使用 +`compiler_bootstrap` stub。LLVM 的 include 和 link 参数只存在于 +binding 的代码配置中,不与普通 cgo 构建的外部环境变量混用。 ## 6. 当前验证状态 @@ -348,16 +359,14 @@ link。这是早期 bring-up 手段,后续应缩小到真正依赖 LLVM 的 co - 新构建产物为 LLVM `23.1.0git`、Debug、assertions enabled,包含 X86 和 AArch64,并生成约 302 MB 的 `libLLVM.23.1git.dylib`; - 8 个 X86/AArch64 GoObj MC/CodeGen 定向测试全部通过; -- `go-llvm` 已获取 `tinygo-org/go-llvm` 当前 `main`,上游新增版本明确到 - LLVM 22; -- 在上游 `185673e` 上重放 GoALLC 改动,并补齐 LLVM 23 的 branch opcode、 - branch type query、build tags 和 config; -- standalone `go-llvm` 使用新 LLVM 23 头文件和共享库,在显式 - `byollvm,llvm23` 和默认无版本标签两种模式下完成全测试; -- GoALLC PR #2 CI 通过 Linux LLVM 14--23、Fedora LLVM 19--21 和 - macOS LLVM 14--22;Linux LLVM 23 同时验证默认无版本标签模式; -- 更新后的 binding 已同步到 Go vendor,并保留 `goallc_ext.go`; -- Go 三阶段工具链集成构建成功,`bin/go version` 为 +- 旧方案曾由 LLVM 的 `LLVMGoALLC` target 生成聚合库;当前方案已把 + 聚合职责移到 `cmd/dist`,LLVM 源码不再需要该项目专用 target; +- standalone `go-llvm` 在不设置外部 `CGO_*` 参数的情况下,以 + `llvm23,dynamicllvm` 和 `llvm23,staticllvm` 完成全测试; +- 更新后的 binding 已同步到 Go vendor,`goallc_ext.go` 不再是 vendor + 私有差异; +- Go 三阶段工具链在默认动态模式和 `-llvm-link=static` 模式下均构建 + 成功,`bin/go version` 为 `go1.27rc2 darwin/arm64`,`compile -h` 包含 `-enablellvm`; - `go test cmd/dist`、`go test cmd/compile/internal/ssa cmd/objview` 通过; - 最小 `Add(int64, int64)` 包经 `compile -enablellvm` 同时生成 Go archive @@ -382,12 +391,13 @@ rebase 后曾通过: - Go:`official/release-branch.go1.27`,当前 `go1.27rc2`; - LLVM:`release/23.x` 上的 GoObj 分支 `llvm23.1.master`; -- binding:GoALLC `go-llvm/master`,默认 LLVM 23。 +- binding:GoALLC `go-llvm` PR #3,显式 LLVM 23。 ### 7.1 已完成的版本迁移 1. LLVM 23 分支和共享库 clean build 已完成。 -2. binding 已补齐 LLVM 22/23 C API 差异、默认版本、平台路径和 CI。 +2. binding 已清理为定制 LLVM 23、固定 `${SRCDIR}/llvm` payload 和正交 + build tags。 3. Go 的 6 笔既有提交已重放到 Go 1.27 release branch。 4. vendored binding、dist build tags 和 Go 1.27 vet 兼容性已更新。 5. 三阶段 bootstrap、核心测试和最小 IR verifier smoke test 已恢复。 @@ -453,37 +463,52 @@ cmake -S llvm -B llvm/cmake-build-debug -G Ninja \ ninja -C llvm/cmake-build-debug -j6 ``` -在 macOS 上用 build tree 配置 cgo: +准备统一的 LLVM payload 布局: ```sh -goallc_llvm_build=/Volumes/Disk1/00.Work/00.Code/goallc/llvm-project/llvm/cmake-build-debug -export CGO_CPPFLAGS="-I$goallc_llvm_build/include -I$goallc_llvm_build/../include" -export CGO_CXXFLAGS="-std=c++17" -export CGO_LDFLAGS="-L$goallc_llvm_build/lib -Wl,-rpath,$goallc_llvm_build/lib -lLLVM -L/opt/homebrew/lib -lz -lzstd -lxml2 -lm" +$GOROOT/llvm/bin/llvm-config +$GOROOT/llvm/bin/llvm-ar +$GOROOT/llvm/include/llvm-c/Core.h +$GOROOT/llvm/lib/libLLVM.dylib # dynamic +$GOROOT/llvm/lib/libLLVM*.a # static component archives ``` 不要把 LLVM build 目录全局写入 `DYLD_LIBRARY_PATH`;这会让 Homebrew 的 clang 等 LLVM 工具误加载该开发版共享库。`cmd/compile` 的链接命令已经写入 -build-tree rpath。 +payload rpath。 验证 standalone binding: ```sh cd /Volumes/Disk1/00.Work/00.Code/goallc/go-llvm -GOCACHE=/private/tmp/goallc-gocache \ - go test -tags='byollvm llvm23' ./... +ln -s /Volumes/Disk1/00.Work/00.Code/goallc/go/llvm llvm +go test -tags='llvm23 dynamicllvm' ./... +# staticllvm 需要先由 Go 的 cmd/dist 在 binding ${SRCDIR} 聚合静态库 +go test -tags='llvm23 staticllvm' ./... ``` 构建 Go 集成工具链: ```sh cd /Volumes/Disk1/00.Work/00.Code/goallc/go/src -GOROOT_BOOTSTRAP=/opt/homebrew/Cellar/go/1.26.5/libexec \ -GOCACHE=/private/tmp/goallc-toolchain-gocache \ -GOALLC_LLVM_BUILD_TAGS=byollvm,llvm23 \ - ./make.bash +./make.bash +./make.bash -llvm-dir=/path/to/llvm -llvm-version=23 -llvm-link=dynamic +./make.bash -llvm-dir=/path/to/llvm -llvm-version=23 -llvm-link=static ``` +`cmd/dist` 使用显式 `-llvm-dir`,未指定时使用 `$GOROOT/llvm`。LLVM +版本和链接方式同样只接受 `-llvm-version` 与 `-llvm-link` 参数,不读取 +项目专用环境变量。它验证 payload 版本和所选链接库,再原子更新 +`$GOROOT/src/cmd/vendor/github.com/goallc/go-llvm/llvm` 软链接。真实目录对 +binding 不可见,binding 始终只使用 `${SRCDIR}/llvm`。 + +静态模式下,`cmd/dist` 通过 payload 的 `llvm-config --link-static +--libfiles` 获取标准 LLVM component archives,再通过 `llvm-ar -M` +聚合为 +`$GOROOT/src/cmd/vendor/github.com/goallc/go-llvm/libLLVMGoALLC.a`。 +它用 LLVM 版本、组件列表以及输入归档的路径、大小和修改时间缓存结果; +LLVM 源码和构建系统本身不包含 GoALLC 专用静态库 target。 + 最小 IR smoke test: ```sh diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index c91640e42fbf23..eaeb2a2e0c3b47 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -67,7 +67,11 @@ var ( vflag int // verbosity ) -var goallcLLVMBuildTags string +var ( + goallcLLVMDir string + goallcLLVMLink string + goallcLLVMVersion string +) // The known architectures. var okgoarch = []string{ @@ -110,14 +114,15 @@ var okgoos = []string{ // xinit handles initialization of the various global state, like goroot and goarch. func xinit() { - goallcLLVMBuildTags = os.Getenv("GOALLC_LLVM_BUILD_TAGS") - b := os.Getenv("GOROOT") if b == "" { fatalf("$GOROOT must be set") } goroot = filepath.Clean(b) gorootBin = pathf("%s/bin", goroot) + goallcLLVMDir = pathf("%s/llvm", goroot) + goallcLLVMLink = "dynamic" + goallcLLVMVersion = "23" // Don't run just 'go' because the build infrastructure // runs cmd/dist inside go/bin often, and on Windows @@ -1402,9 +1407,8 @@ func toolenv() []string { // as the original build system. env = append(env, "CGO_ENABLED=0") } - if goallcLLVMBuildTags != "" { - goFlags = append(goFlags, "-tags="+goallcLLVMBuildTags) - } + goallcTags := "llvm" + goallcLLVMVersion + "," + goallcLLVMLink + "llvm" + goFlags = append(goFlags, "-tags="+goallcTags) if isRelease || os.Getenv("GO_BUILDER_NAME") != "" { // Add -trimpath for reproducible builds of releases. // Include builders so that -trimpath is well-tested ahead of releases. @@ -1453,8 +1457,12 @@ func cmdbootstrap() { flag.BoolVar(&force, "force", force, "build even if the port is marked as broken") flag.BoolVar(&noBanner, "no-banner", noBanner, "do not print banner") flag.BoolVar(&noClean, "no-clean", noClean, "print deprecation warning") + flag.StringVar(&goallcLLVMDir, "llvm-dir", goallcLLVMDir, "LLVM payload directory (default $GOROOT/llvm)") + flag.StringVar(&goallcLLVMLink, "llvm-link", goallcLLVMLink, "LLVM link mode: dynamic or static") + flag.StringVar(&goallcLLVMVersion, "llvm-version", goallcLLVMVersion, "LLVM API version: 23") xflagparse(0) + configureGoallcLLVM() if noClean { xprintf("warning: --no-clean is deprecated and has no effect; use 'go install std cmd' instead\n") @@ -1724,6 +1732,229 @@ func cmdbootstrap() { } } +func configureGoallcLLVM() { + if gohostos != "darwin" && gohostos != "linux" { + fatalf("GoALLC LLVM currently supports Darwin and Linux hosts, not %s", gohostos) + } + if goallcLLVMVersion != "23" { + fatalf("-llvm-version must be 23, not %q", goallcLLVMVersion) + } + switch goallcLLVMLink { + case "dynamic", "static": + default: + fatalf("-llvm-link must be dynamic or static, not %q", goallcLLVMLink) + } + + absDir, err := filepath.Abs(goallcLLVMDir) + if err != nil { + fatalf("resolving -llvm-dir %q: %v", goallcLLVMDir, err) + } + goallcLLVMDir = filepath.Clean(absDir) + + for _, required := range []string{ + pathf("%s/include/llvm-c", goallcLLVMDir), + pathf("%s/lib", goallcLLVMDir), + pathf("%s/bin/llvm-config", goallcLLVMDir), + } { + if _, err := os.Stat(required); err != nil { + fatalf("invalid LLVM payload %q: %v", goallcLLVMDir, err) + } + } + llvmConfig := pathf("%s/bin/llvm-config", goallcLLVMDir) + versionOutput, err := exec.Command(llvmConfig, "--version").Output() + if err != nil { + fatalf("running %s --version: %v", llvmConfig, err) + } + version := strings.TrimSpace(string(versionOutput)) + if version != goallcLLVMVersion && !strings.HasPrefix(version, goallcLLVMVersion+".") { + fatalf("LLVM payload version is %q; -llvm-version requires %s", version, goallcLLVMVersion) + } + + var libraries []string + if goallcLLVMLink == "dynamic" && gohostos == "darwin" { + libraries, _ = filepath.Glob(pathf("%s/lib/libLLVM*.dylib", goallcLLVMDir)) + } else if goallcLLVMLink == "dynamic" { + libraries, _ = filepath.Glob(pathf("%s/lib/libLLVM*.so*", goallcLLVMDir)) + } + if goallcLLVMLink == "dynamic" && len(libraries) == 0 { + fatalf("LLVM payload %q has no %s library", goallcLLVMDir, goallcLLVMLink) + } + for _, library := range libraries { + if _, err := os.Stat(library); err != nil { + fatalf("invalid LLVM library %q: %v", library, err) + } + } + + bindingDir := pathf("%s/src/cmd/vendor/github.com/goallc/go-llvm", goroot) + configureGoallcLLVMPayloadLink(bindingDir) + if goallcLLVMLink == "static" { + buildGoallcLLVMStaticArchive(bindingDir, llvmConfig, version) + } +} + +func configureGoallcLLVMPayloadLink(bindingDir string) { + link := pathf("%s/llvm", bindingDir) + if info, err := os.Lstat(link); err == nil { + if info.Mode()&os.ModeSymlink == 0 { + fatalf("LLVM binding payload path %q exists and is not a symlink", link) + } + if target, err := os.Readlink(link); err == nil && target == goallcLLVMDir { + return + } + } else if !os.IsNotExist(err) { + fatalf("examining LLVM binding payload path %q: %v", link, err) + } + + temporaryLink := fmt.Sprintf("%s.tmp.%d", link, os.Getpid()) + if _, err := os.Lstat(temporaryLink); err == nil { + fatalf("temporary LLVM binding payload path already exists: %s", temporaryLink) + } else if !os.IsNotExist(err) { + fatalf("examining temporary LLVM binding payload path %q: %v", temporaryLink, err) + } + if err := os.Symlink(goallcLLVMDir, temporaryLink); err != nil { + fatalf("creating LLVM binding payload symlink: %v", err) + } + if err := os.Rename(temporaryLink, link); err != nil { + os.Remove(temporaryLink) + fatalf("installing LLVM binding payload symlink: %v", err) + } +} + +var goallcLLVMStaticComponents = []string{ + "core", + "analysis", + "bitreader", + "bitwriter", + "irreader", + "linker", + "passes", + "all-targets", + "executionengine", + "mcjit", + "interpreter", + "target", +} + +func buildGoallcLLVMStaticArchive(bindingDir, llvmConfig, version string) { + llvmAR := pathf("%s/bin/llvm-ar", goallcLLVMDir) + if _, err := os.Stat(llvmAR); err != nil { + fatalf("static LLVM linking requires %s: %v", llvmAR, err) + } + + archives := strings.Fields(llvmConfigOutput(llvmConfig, "--link-static", "--libfiles")) + if len(archives) == 0 { + fatalf("%s returned no static component archives", llvmConfig) + } + for _, library := range strings.Fields(llvmConfigOutput(llvmConfig, "--link-static", "--system-libs")) { + if isGoallcLLVMSystemLibrary(library) { + continue + } + archive := goallcLLVMStaticSystemArchive(library) + if archive == "" { + fatalf("unsupported LLVM static system library %q; provide its static archive in %s/lib", library, goallcLLVMDir) + } + archives = append(archives, archive) + } + + var stamp strings.Builder + fmt.Fprintf(&stamp, "version=%s\ncomponents=%s\n", version, strings.Join(goallcLLVMStaticComponents, ",")) + for _, archive := range archives { + if strings.ContainsAny(archive, " \t\r\n") { + fatalf("LLVM static archive paths may not contain whitespace: %q", archive) + } + info, err := os.Stat(archive) + if err != nil { + fatalf("invalid LLVM static archive %q: %v", archive, err) + } + fmt.Fprintf(&stamp, "%s\t%d\t%d\n", archive, info.Size(), info.ModTime().UnixNano()) + } + + output := pathf("%s/libLLVMGoALLC.a", bindingDir) + if strings.ContainsAny(output, " \t\r\n") { + fatalf("Go root path may not contain whitespace for static LLVM linking: %q", goroot) + } + stampFile := output + ".stamp" + if oldStamp, err := os.ReadFile(stampFile); err == nil && string(oldStamp) == stamp.String() { + if info, err := os.Stat(output); err == nil && info.Size() != 0 { + return + } + } + + temporary := fmt.Sprintf("%s.tmp.%d", output, os.Getpid()) + xremove(temporary) + var mri strings.Builder + fmt.Fprintf(&mri, "CREATE %s\n", temporary) + for _, archive := range archives { + fmt.Fprintf(&mri, "ADDLIB %s\n", archive) + } + mri.WriteString("SAVE\nEND\n") + + cmd := exec.Command(llvmAR, "-M") + cmd.Stdin = strings.NewReader(mri.String()) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + xremove(temporary) + fatalf("merging LLVM static archives: %v", err) + } + if err := os.Rename(temporary, output); err != nil { + xremove(temporary) + fatalf("installing LLVM static archive: %v", err) + } + writefile(stamp.String(), stampFile, writeSkipSame) +} + +func llvmConfigOutput(llvmConfig string, options ...string) string { + args := append([]string{}, options...) + args = append(args, goallcLLVMStaticComponents...) + output, err := exec.Command(llvmConfig, args...).CombinedOutput() + if err != nil { + fatalf("running %s %s: %v\n%s", llvmConfig, strings.Join(args, " "), err, output) + } + return string(output) +} + +func isGoallcLLVMSystemLibrary(library string) bool { + allowed := map[string]bool{ + "-lm": true, + "-lz": true, + "-lxml2": true, + "-ldl": true, + "-lpthread": true, + "-lrt": true, + } + return allowed[library] +} + +func goallcLLVMStaticSystemArchive(library string) string { + if !strings.HasPrefix(library, "-l") || len(library) == 2 { + if filepath.Ext(library) == ".a" { + return library + } + return "" + } + name := strings.TrimPrefix(library, "-l") + filename := "lib" + name + ".a" + if path := pathf("%s/lib/%s", goallcLLVMDir, filename); isFile(path) { + return path + } + for _, pkg := range []string{name, "lib" + name} { + output, err := exec.Command(defaultpkgconfig, "--variable=libdir", pkg).Output() + if err != nil { + continue + } + if path := filepath.Join(strings.TrimSpace(string(output)), filename); isFile(path) { + return path + } + } + return "" +} + +func isFile(path string) bool { + info, err := os.Stat(path) + return err == nil && !info.IsDir() +} + func wrapperPathFor(goos, goarch string) string { switch { case goos == "android": diff --git a/src/cmd/go.mod b/src/cmd/go.mod index 31637e3523fc9e..6d15c9f6e78853 100644 --- a/src/cmd/go.mod +++ b/src/cmd/go.mod @@ -3,7 +3,7 @@ module cmd go 1.27 require ( - github.com/goallc/go-llvm v0.0.0-20260726171243-7467f945baac + github.com/goallc/go-llvm v0.0.0-20260727072003-33267b8eb4a0 github.com/google/pprof v0.0.0-20260507013755-92041b743c96 golang.org/x/arch v0.27.1-0.20260521044007-9c1a596a2c97 golang.org/x/build v0.0.0-20260522210304-d55d0041b921 diff --git a/src/cmd/go.sum b/src/cmd/go.sum index 6a6e35c89b5258..075f1eee83576a 100644 --- a/src/cmd/go.sum +++ b/src/cmd/go.sum @@ -1,5 +1,5 @@ -github.com/goallc/go-llvm v0.0.0-20260726171243-7467f945baac h1:yW+7FnZzR7S+PQA9p6TkFz9WPP8ph8azk7Nr/T1DOPQ= -github.com/goallc/go-llvm v0.0.0-20260726171243-7467f945baac/go.mod h1:s70tU8u5zDo1LwIPqBxh6Qgol/tNt1kmn9caPfsTz8A= +github.com/goallc/go-llvm v0.0.0-20260727072003-33267b8eb4a0 h1:yaqOKHghW9oGMKtbUYHHyd2UyAWHGYZjOiHqCiDJ8tE= +github.com/goallc/go-llvm v0.0.0-20260727072003-33267b8eb4a0/go.mod h1:s70tU8u5zDo1LwIPqBxh6Qgol/tNt1kmn9caPfsTz8A= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/pprof v0.0.0-20260507013755-92041b743c96 h1:YDDnaZ9afWajDboPMt9Vikqca/yWAX7KAxVzb4lJU1M= diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/.gitignore b/src/cmd/vendor/github.com/goallc/go-llvm/.gitignore deleted file mode 100644 index 68f25aa5453647..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -llvm-*.src.tar.xz -llvm-*/ diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/README.markdown b/src/cmd/vendor/github.com/goallc/go-llvm/README.markdown deleted file mode 100644 index 6c603435b276c9..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/README.markdown +++ /dev/null @@ -1,32 +0,0 @@ -# Go bindings to system LLVM - -This library provides bindings to a system-installed LLVM. - -Currently supported: - - * LLVM 23, 22, 21, 20, 19, 18, 17, 16, 15 and 14 from [apt.llvm.org](http://apt.llvm.org/) on Debian/Ubuntu. - * LLVM 23, 22, 21, 20, 19, 18, 17, 16, 15 and 14 from Homebrew on macOS. - * Any of the above versions with a manually built LLVM through the `byollvm` build tag. You need to set up `CFLAGS`/`LDFLAGS` etc yourself in this case. - -LLVM 23 is selected by default. You can select another LLVM version using a -build tag, for example `-tags=llvm17` to use LLVM 17. When using a manually -built LLVM 22 or newer, combine the version and custom-build tags, for example -`-tags="byollvm llvm23"`. - -The GoALLC in-tree static LLVM payload is selected explicitly with -`-tags=staticllvm`. Add a version tag when the payload is not LLVM 23, for -example `-tags="staticllvm llvm20"`. - -## Usage - -If you have a supported LLVM installation, you should be able to do a simple `go get`: - - go get tinygo.org/x/go-llvm - -You can use build tags to select a LLVM version. For example, use `-tags=llvm15` to select LLVM 15. Setting a build tag for a LLVM version that is not supported will be ignored. - -## License - -These LLVM bindings for Go originally come from LLVM, but they have since been [removed](https://discourse.llvm.org/t/rfc-remove-the-go-bindings/65725). Still, they remain under the same license as they were originally, which is the [Apache License 2.0 (with LLVM exceptions)](http://releases.llvm.org/9.0.0/LICENSE.TXT). Check upstream LLVM for detailed copyright information. - -This README, the backports\* files, and the Makefile are separate from LLVM but are licensed under the same license. diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/branch_llvm23.go b/src/cmd/vendor/github.com/goallc/go-llvm/branch_llvm23.go index a19065f78d13e3..c31cc09dd442dc 100644 --- a/src/cmd/vendor/github.com/goallc/go-llvm/branch_llvm23.go +++ b/src/cmd/vendor/github.com/goallc/go-llvm/branch_llvm23.go @@ -1,4 +1,4 @@ -//go:build llvm23 || (!byollvm && !llvm14 && !llvm15 && !llvm16 && !llvm17 && !llvm18 && !llvm19 && !llvm20 && !llvm21 && !llvm22) +//go:build llvm23 package llvm diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/branch_pre23.go b/src/cmd/vendor/github.com/goallc/go-llvm/branch_pre23.go deleted file mode 100644 index e3b33bf9a4ebfa..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/branch_pre23.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build !llvm23 && (byollvm || llvm14 || llvm15 || llvm16 || llvm17 || llvm18 || llvm19 || llvm20 || llvm21 || llvm22) - -package llvm - -/* -#include "llvm-c/Core.h" -*/ -import "C" - -func (v Value) IsABranchInst() (rv Value) { - rv.C = C.LLVMIsABranchInst(v.C) - return -} diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/gen_llvm_config_static.sh b/src/cmd/vendor/github.com/goallc/go-llvm/gen_llvm_config_static.sh deleted file mode 100644 index cbd26643928270..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/gen_llvm_config_static.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -if [[ ! -d ./llvm/lib ]]; then - echo "Error: directory ./llvm/lib not found" - exit 1 -fi - -LDFLAGS="-L\${SRCDIR}/$(realpath --relative-to="$(pwd)" ./llvm/lib)" -for f in ./llvm/lib/*.a; do - [[ -e "$f" ]] || continue - filename=$(basename "$f") # liba.a - libname="${filename#lib}" # a.a - libname="${libname%.a}" # a - LDFLAGS="$LDFLAGS -l$libname" -done - -cat > "./llvm_config_static.go" < */ import "C" + import ( "errors" "unsafe" @@ -22,13 +23,13 @@ func LLVMPrintModuleToFile(module Module, filename string) error { return nil } -func LLVMSetValueName2(value Value, name string) { +func LLVMSetValueName2(value Value, name string) { namestr := C.CString(name) defer C.free(unsafe.Pointer(namestr)) C.LLVMSetValueName2(value.C, namestr, C.size_t(len(name))) } -func (c Context) PointerType(AddressSpace uint32) (t Type) { - t.C = C.LLVMPointerTypeInContext(c.C, C.unsigned(AddressSpace)) +func (c Context) PointerType(addressSpace uint32) (t Type) { + t.C = C.LLVMPointerTypeInContext(c.C, C.unsigned(addressSpace)) return } diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config.go b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config.go new file mode 100644 index 00000000000000..e9f5875dd6c254 --- /dev/null +++ b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config.go @@ -0,0 +1,9 @@ +package llvm + +/* +#cgo darwin CPPFLAGS: -I${SRCDIR}/llvm/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS +#cgo linux CPPFLAGS: -I${SRCDIR}/llvm/include -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS +#cgo darwin CXXFLAGS: -std=c++17 +#cgo linux CXXFLAGS: -std=c++17 +*/ +import "C" diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm14.go b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm14.go deleted file mode 100644 index 154b4f57a0fb6d..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm14.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build !byollvm && !staticllvm && llvm14 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@14/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++14 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@14/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@14/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++14 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@14/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo linux CPPFLAGS: -I/usr/lib/llvm-14/include -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++14 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-14/lib -lLLVM-14 -import "C" - -type run_build_sh int diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm15.go b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm15.go deleted file mode 100644 index bf4c451e51c874..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm15.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build !byollvm && !staticllvm && llvm15 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@15/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++14 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@15/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@15/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++14 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@15/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo linux CPPFLAGS: -I/usr/lib/llvm-15/include -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++14 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-15/lib -lLLVM-15 -import "C" - -type run_build_sh int diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm16.go b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm16.go deleted file mode 100644 index 6d742ed8c95ae3..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm16.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build !byollvm && !staticllvm && llvm16 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@16/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++17 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@16/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@16/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++17 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@16/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo linux CPPFLAGS: -I/usr/lib/llvm-16/include -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++17 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-16/lib -lLLVM-16 -import "C" - -type run_build_sh int diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm17.go b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm17.go deleted file mode 100644 index 58a377ccccbc54..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm17.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build !byollvm && !staticllvm && llvm17 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@17/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++17 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@17/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@17/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++17 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@17/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo linux CPPFLAGS: -I/usr/include/llvm-17 -I/usr/include/llvm-c-17 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++17 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-17/lib -lLLVM-17 -import "C" - -type run_build_sh int diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm18.go b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm18.go deleted file mode 100644 index 7a706bfb426802..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm18.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build !byollvm && !staticllvm && llvm18 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@18/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++17 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@18/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@18/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++17 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@18/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo linux CPPFLAGS: -I/usr/include/llvm-18 -I/usr/include/llvm-c-18 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++17 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-18/lib -lLLVM-18 -import "C" - -type run_build_sh int diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm19.go b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm19.go deleted file mode 100644 index bbe44d8983be08..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm19.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build !byollvm && !staticllvm && llvm19 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@19/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++17 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@19/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@19/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++17 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@19/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo freebsd CPPFLAGS: -I/usr/local/llvm19/include -I/usr/local/llvm19/include/llvm-c -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo freebsd CXXFLAGS: -std=c++17 -// #cgo freebsd LDFLAGS: -L/usr/local/llvm19/lib -lLLVM -// #cgo linux CPPFLAGS: -I/usr/include/llvm-19 -I/usr/include/llvm-c-19 -I/usr/lib64/llvm19/include -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++17 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-19/lib -L/usr/lib64/llvm19/lib -lLLVM-19 -import "C" - -type run_build_sh int diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm20.go b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm20.go deleted file mode 100644 index 224418c27c10a4..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm20.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build !byollvm && !staticllvm && llvm20 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@20/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++17 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@20/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@20/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++17 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@20/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo freebsd CPPFLAGS: -I/usr/local/llvm20/include -I/usr/local/llvm20/include/llvm-c -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo freebsd CXXFLAGS: -std=c++17 -// #cgo freebsd LDFLAGS: -L/usr/local/llvm20/lib -lLLVM -// #cgo linux CPPFLAGS: -I/usr/include/llvm-20 -I/usr/include/llvm-c-20 -I/usr/lib64/llvm20/include -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++17 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-20/lib -L/usr/lib64/llvm20/lib64 -lLLVM-20 -import "C" - -type run_build_sh int diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm21.go b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm21.go deleted file mode 100644 index de236b401fc83d..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm21.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build !byollvm && !staticllvm && llvm21 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@21/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++17 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@21/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@21/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++17 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@21/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo freebsd CPPFLAGS: -I/usr/local/llvm21/include -I/usr/local/llvm21/include/llvm-c -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo freebsd CXXFLAGS: -std=c++17 -// #cgo freebsd LDFLAGS: -L/usr/local/llvm21/lib -lLLVM -// #cgo linux CPPFLAGS: -I/usr/include/llvm-21 -I/usr/include/llvm-c-21 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++17 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-21/lib -lLLVM-21 -import "C" - -type run_build_sh int diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm22.go b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm22.go deleted file mode 100644 index e468b6146271d7..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm22.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build !byollvm && !staticllvm && llvm22 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@22/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++17 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@22/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@22/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++17 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@22/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo freebsd CPPFLAGS: -I/usr/local/llvm22/include -I/usr/local/llvm22/include/llvm-c -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo freebsd CXXFLAGS: -std=c++17 -// #cgo freebsd LDFLAGS: -L/usr/local/llvm22/lib -lLLVM -// #cgo linux CPPFLAGS: -I/usr/include/llvm-22 -I/usr/include/llvm-c-22 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++17 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-22/lib -lLLVM-22 -import "C" - -type run_build_sh int diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm23.go b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm23.go deleted file mode 100644 index ddfeb87a6d0f10..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm23.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build !byollvm && !staticllvm && !llvm14 && !llvm15 && !llvm16 && !llvm17 && !llvm18 && !llvm19 && !llvm20 && !llvm21 && !llvm22 - -package llvm - -// #cgo darwin,amd64 CPPFLAGS: -I/usr/local/opt/llvm@23/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,amd64 CXXFLAGS: -std=c++17 -// #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/llvm@23/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo darwin,arm64 CPPFLAGS: -I/opt/homebrew/opt/llvm@23/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo darwin,arm64 CXXFLAGS: -std=c++17 -// #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/llvm@23/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM -lz -lm -// #cgo freebsd CPPFLAGS: -I/usr/local/llvm23/include -I/usr/local/llvm23/include/llvm-c -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo freebsd CXXFLAGS: -std=c++17 -// #cgo freebsd LDFLAGS: -L/usr/local/llvm23/lib -lLLVM -// #cgo linux CPPFLAGS: -I/usr/include/llvm-23 -I/usr/include/llvm-c-23 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -// #cgo linux CXXFLAGS: -std=c++17 -// #cgo linux LDFLAGS: -L/usr/lib/llvm-23/lib -lLLVM-23 -import "C" - -type run_build_sh int diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_static.go b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_static.go deleted file mode 100644 index 24e172d20afc55..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_static.go +++ /dev/null @@ -1,14 +0,0 @@ -//go:build !byollvm && staticllvm - -// Code generated by gen_llvm_config_static.sh; DO NOT EDIT. - -package llvm - -/* -#cgo linux CPPFLAGS: -I${SRCDIR}/llvm/include/ -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -#cgo linux CXXFLAGS: -std=c++17 -#cgo linux LDFLAGS: -Wl,--start-group -lz -lzstd -L${SRCDIR}/llvm/lib -lLLVMAArch64AsmParser -lLLVMAArch64CodeGen -lLLVMAArch64Desc -lLLVMAArch64Disassembler -lLLVMAArch64Info -lLLVMAArch64Utils -lLLVMAggressiveInstCombine -lLLVMAnalysis -lLLVMAsmParser -lLLVMAsmPrinter -lLLVMBinaryFormat -lLLVMBitReader -lLLVMBitstreamReader -lLLVMBitWriter -lLLVMCAS -lLLVMCFGuard -lLLVMCFIVerify -lLLVMCGData -lLLVMCodeGen -lLLVMCodeGenTypes -lLLVMCore -lLLVMCoroutines -lLLVMCoverage -lLLVMDebugInfoBTF -lLLVMDebugInfoCodeView -lLLVMDebuginfod -lLLVMDebugInfoDWARF -lLLVMDebugInfoDWARFLowLevel -lLLVMDebugInfoGSYM -lLLVMDebugInfoLogicalView -lLLVMDebugInfoMSF -lLLVMDebugInfoPDB -lLLVMDemangle -lLLVMDiff -lLLVMDlltoolDriver -lLLVMDWARFCFIChecker -lLLVMDWARFLinker -lLLVMDWARFLinkerClassic -lLLVMDWARFLinkerParallel -lLLVMDWP -lLLVMExecutionEngine -lLLVMExegesis -lLLVMExegesisAArch64 -lLLVMExegesisX86 -lLLVMExtensions -lLLVMFileCheck -lLLVMFrontendAtomic -lLLVMFrontendDirective -lLLVMFrontendDriver -lLLVMFrontendHLSL -lLLVMFrontendOffloading -lLLVMFrontendOpenACC -lLLVMFrontendOpenMP -lLLVMFuzzerCLI -lLLVMFuzzMutate -lLLVMGlobalISel -lLLVMHipStdPar -lLLVMInstCombine -lLLVMInstrumentation -lLLVMInterfaceStub -lLLVMInterpreter -lLLVMipo -lLLVMIRPrinter -lLLVMIRReader -lLLVMJITLink -lLLVMLibDriver -lLLVMLineEditor -lLLVMLinker -lLLVMLTO -lLLVMMC -lLLVMMCA -lLLVMMCDisassembler -lLLVMMCJIT -lLLVMMCParser -lLLVMMIRParser -lLLVMObjCARCOpts -lLLVMObjCopy -lLLVMObject -lLLVMObjectYAML -lLLVMOptDriver -lLLVMOption -lLLVMOrcDebugging -lLLVMOrcJIT -lLLVMOrcShared -lLLVMOrcTargetProcess -lLLVMPasses -lLLVMProfileData -lLLVMRemarks -lLLVMRuntimeDyld -lLLVMSandboxIR -lLLVMScalarOpts -lLLVMSelectionDAG -lLLVMSupport -lLLVMSupportLSP -lLLVMSymbolize -lLLVMTableGen -lLLVMTableGenBasic -lLLVMTableGenCommon -lLLVMTarget -lLLVMTargetParser -lLLVMTelemetry -lLLVMTextAPI -lLLVMTextAPIBinaryReader -lLLVMTransformUtils -lLLVMVectorize -lLLVMWindowsDriver -lLLVMWindowsManifest -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMX86Desc -lLLVMX86Disassembler -lLLVMX86Info -lLLVMX86TargetMCA -lLLVMXRay -Wl,--end-group -*/ -import "C" - -type run_build_sh int diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_dep.go b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_dep.go index cdce01bd031ed9..570fa842dc3387 100644 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_dep.go +++ b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_dep.go @@ -6,13 +6,13 @@ // //===----------------------------------------------------------------------===// // -// This file ensures that the LLVM libraries are built before using the -// bindings. +// This file makes selecting an LLVM API version and link mode mandatory. // //===----------------------------------------------------------------------===// -//go:build !byollvm - package llvm -var _ run_build_sh +var ( + _ llvmVersionSelected + _ llvmLinkModeSelected +) diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_link_dynamic.go b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_link_dynamic.go new file mode 100644 index 00000000000000..9fbe9eff539dc6 --- /dev/null +++ b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_link_dynamic.go @@ -0,0 +1,11 @@ +//go:build dynamicllvm + +package llvm + +/* +#cgo darwin LDFLAGS: -L${SRCDIR}/llvm/lib -Wl,-rpath,${SRCDIR}/llvm/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM +#cgo linux LDFLAGS: -L${SRCDIR}/llvm/lib -Wl,-rpath,${SRCDIR}/llvm/lib -lLLVM +*/ +import "C" + +type llvmLinkModeSelected struct{} diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_link_static.go b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_link_static.go new file mode 100644 index 00000000000000..c9667f64c71ff0 --- /dev/null +++ b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_link_static.go @@ -0,0 +1,11 @@ +//go:build staticllvm + +package llvm + +/* +#cgo darwin LDFLAGS: -L${SRCDIR} -lLLVMGoALLC -lm -lz -lxml2 +#cgo linux LDFLAGS: -L${SRCDIR} -lLLVMGoALLC -lm -lz -lxml2 -ldl -lpthread -lrt +*/ +import "C" + +type llvmLinkModeSelected struct{} diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_version_23.go b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_version_23.go new file mode 100644 index 00000000000000..0a6071043e484d --- /dev/null +++ b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_version_23.go @@ -0,0 +1,5 @@ +//go:build llvm23 + +package llvm + +type llvmVersionSelected struct{} diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/opcode_llvm23.go b/src/cmd/vendor/github.com/goallc/go-llvm/opcode_llvm23.go index f126e80c5eaa0f..95072208e02ebf 100644 --- a/src/cmd/vendor/github.com/goallc/go-llvm/opcode_llvm23.go +++ b/src/cmd/vendor/github.com/goallc/go-llvm/opcode_llvm23.go @@ -1,4 +1,4 @@ -//go:build llvm23 || (!byollvm && !llvm14 && !llvm15 && !llvm16 && !llvm17 && !llvm18 && !llvm19 && !llvm20 && !llvm21 && !llvm22) +//go:build llvm23 package llvm diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/opcode_pre23.go b/src/cmd/vendor/github.com/goallc/go-llvm/opcode_pre23.go deleted file mode 100644 index 9a3208067863c6..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/opcode_pre23.go +++ /dev/null @@ -1,10 +0,0 @@ -//go:build !llvm23 && (byollvm || llvm14 || llvm15 || llvm16 || llvm17 || llvm18 || llvm19 || llvm20 || llvm21 || llvm22) - -package llvm - -/* -#include "llvm-c/Core.h" -*/ -import "C" - -const Br Opcode = C.LLVMBr diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/switch_llvm22.go b/src/cmd/vendor/github.com/goallc/go-llvm/switch_llvm22.go index 8df696655aeed5..cdb7cc2a823e94 100644 --- a/src/cmd/vendor/github.com/goallc/go-llvm/switch_llvm22.go +++ b/src/cmd/vendor/github.com/goallc/go-llvm/switch_llvm22.go @@ -1,4 +1,4 @@ -//go:build llvm22 || llvm23 || (!byollvm && !llvm14 && !llvm15 && !llvm16 && !llvm17 && !llvm18 && !llvm19 && !llvm20 && !llvm21 && !llvm22) +//go:build llvm23 package llvm diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/switch_pre22.go b/src/cmd/vendor/github.com/goallc/go-llvm/switch_pre22.go deleted file mode 100644 index 6bbfac96f05162..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/switch_pre22.go +++ /dev/null @@ -1,15 +0,0 @@ -//go:build !llvm22 && !llvm23 && (byollvm || llvm14 || llvm15 || llvm16 || llvm17 || llvm18 || llvm19 || llvm20 || llvm21) - -package llvm - -// GetSwitchCaseValue obtains the case value for a successor of a switch -// instruction. i corresponds to the successor index; the first successor (0) -// is the default destination, so i must be greater than zero. -// -// Before LLVM 22, switch case values were stored as regular instruction -// operands (alternating with their destination blocks, after the leading -// condition/default-destination pair), so this is implemented via Operand -// access instead of the LLVM 22+-only LLVMGetSwitchCaseValue. -func (v Value) GetSwitchCaseValue(i int) Value { - return v.Operand(2 * i) -} diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt index f1a644f7371dcd..6542e1b5e69e12 100644 --- a/src/cmd/vendor/modules.txt +++ b/src/cmd/vendor/modules.txt @@ -1,4 +1,4 @@ -# github.com/goallc/go-llvm v0.0.0-20260726171243-7467f945baac +# github.com/goallc/go-llvm v0.0.0-20260727072003-33267b8eb4a0 ## explicit; go 1.24 github.com/goallc/go-llvm # github.com/google/pprof v0.0.0-20260507013755-92041b743c96