From 2132a8454a565db904dc74e2cb178d542c14ca00 Mon Sep 17 00:00:00 2001 From: ZhouGuangyuan Date: Mon, 27 Jul 2026 08:57:47 +0800 Subject: [PATCH 1/5] cmd: make LLVM configuration explicit --- .gitignore | 1 + GOALLC.md | 67 ++++--- src/cmd/dist/build.go | 50 ++++- src/cmd/go.mod | 2 +- src/cmd/go.sum | 4 +- .../github.com/goallc/go-llvm/.gitignore | 1 + .../github.com/goallc/go-llvm/README.markdown | 14 +- .../goallc/go-llvm/gen_llvm_config.sh | 180 ++++++++++++++++++ .../goallc/go-llvm/gen_llvm_config_static.sh | 33 +--- .../goallc/go-llvm/llvm_config_llvm14.go | 2 +- .../goallc/go-llvm/llvm_config_llvm15.go | 2 +- .../goallc/go-llvm/llvm_config_llvm16.go | 2 +- .../goallc/go-llvm/llvm_config_llvm17.go | 2 +- .../goallc/go-llvm/llvm_config_llvm18.go | 2 +- .../goallc/go-llvm/llvm_config_llvm19.go | 2 +- .../goallc/go-llvm/llvm_config_llvm20.go | 2 +- .../goallc/go-llvm/llvm_config_llvm21.go | 2 +- .../goallc/go-llvm/llvm_config_llvm22.go | 2 +- .../goallc/go-llvm/llvm_config_llvm23.go | 2 +- .../goallc/go-llvm/llvm_config_static.go | 14 -- src/cmd/vendor/modules.txt | 2 +- src/make.bash | 6 + 22 files changed, 304 insertions(+), 90 deletions(-) create mode 100755 src/cmd/vendor/github.com/goallc/go-llvm/gen_llvm_config.sh mode change 100644 => 100755 src/cmd/vendor/github.com/goallc/go-llvm/gen_llvm_config_static.sh delete mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_static.go diff --git a/.gitignore b/.gitignore index 344b31f7ac1c1d..dc824830905d17 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ _testmain.go /doc/articles/wiki/*.bin /goinstall.log /last-change +/llvm/ /misc/cgo/life/run.out /misc/cgo/stdio/run.out /misc/cgo/testso/main diff --git a/GOALLC.md b/GOALLC.md index e235fa86c20d35..9e12d35403d598 100644 --- a/GOALLC.md +++ b/GOALLC.md @@ -77,24 +77,31 @@ Remote: - 上游:`tinygo-org/go-llvm` 的 `main` - LLVM 23 集成通过 GoALLC PR #2 进入 `master` - 合并后的 `master` 提交为 `7467f945baac` +- 显式 LLVM payload 配置通过 GoALLC PR #3 提交审核,当前提交为 + `c9f95165b560` - Go 仓库依赖版本为 - `v0.0.0-20260726171243-7467f945baac` + `v0.0.0-20260727005509-c9f95165b560` - 以 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 +- 无版本 build tag 时默认选择 LLVM 23;GoALLC 构建由 binding 直接生成 + 项目专用 cgo 配置,不再依赖 overlay 或外部 `CGO_*` 参数 +- 动态和静态模式使用同一个 LLVM payload 根目录布局: + `bin/llvm-config`、`include/llvm-c` 和 `lib` +- 默认动态链接;静态模式由 binding 通过 `llvm-config` 选择完整的 LLVM + archive 依赖,Linux 使用 archive group,macOS 使用依赖顺序 - 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。默认静态构建因此不是开箱即用的。 +standalone binding 可用 `gen_llvm_config.sh --llvm-dir DIR +--link dynamic|static` 生成相同配置。生成文件由 `goallc` build tag 选择, +并被版本控制忽略。 ### 2.3 `llvm-project` @@ -323,8 +330,10 @@ Go SSA 分支形成于 LLVM Go ABI 工作之前,目前: - bootstrap Go:Go 1.26.5; - vendored/standalone binding:LLVM 23 为默认版本; - LLVM source/build:23.1.0git; -- 本轮通过 `byollvm,llvm23` build tags、显式 include/library 路径和 - `libLLVM` 共享库直接使用 LLVM build tree。 +- LLVM payload 默认位于 `$GOROOT/llvm`,也可用 `-llvm-dir` 或专用环境 + 变量 `GOALLC_LLVM_DIR` 指定; +- 默认通过 payload 中的 `libLLVM` 动态链接;`-llvm-link=static` 或 + `GOALLC_LLVM_LINK=static` 选择静态 LLVM archives。 当前 LLVM 由 macOS 26 SDK 构建,而 Go 1.27 工具链默认链接目标为 macOS 16,因此链接时会产生 deployment-target 警告。构建和 smoke test @@ -332,9 +341,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` 现在自行注入 `goallc,llvm23` tags,静态 +模式额外注入 `staticllvm`;bootstrap 仍使用 `compiler_bootstrap` stub。 +LLVM 的 include 和 link 参数只存在于 binding 生成的 cgo 配置中,不与 +普通 cgo 构建的外部环境变量混用。 ## 6. 当前验证状态 @@ -352,12 +362,13 @@ link。这是早期 bring-up 手段,后续应缩小到真正依赖 LLVM 的 co LLVM 22; - 在上游 `185673e` 上重放 GoALLC 改动,并补齐 LLVM 23 的 branch opcode、 branch type query、build tags 和 config; -- standalone `go-llvm` 使用新 LLVM 23 头文件和共享库,在显式 - `byollvm,llvm23` 和默认无版本标签两种模式下完成全测试; +- standalone `go-llvm` 通过项目生成配置,在不设置外部 `CGO_*` 参数的 + 情况下完成 LLVM 23 动态与静态两种模式的全测试; - 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` 为 +- 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 @@ -453,35 +464,41 @@ 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/include/llvm-c/Core.h +$GOROOT/llvm/lib/libLLVM.dylib # dynamic +$GOROOT/llvm/lib/libLLVMCore.a # static ``` 不要把 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' ./... +./gen_llvm_config.sh \ + --llvm-dir /Volumes/Disk1/00.Work/00.Code/goallc/go/llvm \ + --link dynamic +go test -tags='goallc llvm23' ./... + +./gen_llvm_config.sh \ + --llvm-dir /Volumes/Disk1/00.Work/00.Code/goallc/go/llvm \ + --link static +go test -tags='goallc 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-link=dynamic +./make.bash -llvm-dir=/path/to/llvm -llvm-link=static ``` 最小 IR smoke test: diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index c91640e42fbf23..6ac3e51e59e401 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -67,7 +67,10 @@ var ( vflag int // verbosity ) -var goallcLLVMBuildTags string +var ( + goallcLLVMDir string + goallcLLVMLink string +) // The known architectures. var okgoarch = []string{ @@ -110,14 +113,20 @@ 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 = os.Getenv("GOALLC_LLVM_DIR") + if goallcLLVMDir == "" { + goallcLLVMDir = pathf("%s/llvm", goroot) + } + goallcLLVMLink = os.Getenv("GOALLC_LLVM_LINK") + if goallcLLVMLink == "" { + goallcLLVMLink = "dynamic" + } // Don't run just 'go' because the build infrastructure // runs cmd/dist inside go/bin often, and on Windows @@ -1402,9 +1411,11 @@ func toolenv() []string { // as the original build system. env = append(env, "CGO_ENABLED=0") } - if goallcLLVMBuildTags != "" { - goFlags = append(goFlags, "-tags="+goallcLLVMBuildTags) + goallcTags := "goallc,llvm23" + if goallcLLVMLink == "static" { + goallcTags += ",staticllvm" } + 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 +1464,11 @@ 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") xflagparse(0) + generateGoallcLLVMConfig() if noClean { xprintf("warning: --no-clean is deprecated and has no effect; use 'go install std cmd' instead\n") @@ -1724,6 +1738,32 @@ func cmdbootstrap() { } } +func generateGoallcLLVMConfig() { + 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) + + bindingDir := pathf("%s/src/cmd/vendor/github.com/goallc/go-llvm", goroot) + generator := pathf("%s/gen_llvm_config.sh", bindingDir) + output := pathf("%s/llvm_config_goallc_generated.go", bindingDir) + if _, err := os.Stat(generator); err != nil { + fatalf("GoALLC LLVM binding generator not found: %v", err) + } + + run(bindingDir, CheckExit|ShowOutput, "bash", generator, + "--llvm-dir", goallcLLVMDir, + "--link", goallcLLVMLink, + "--output", output) +} + func wrapperPathFor(goos, goarch string) string { switch { case goos == "android": diff --git a/src/cmd/go.mod b/src/cmd/go.mod index 31637e3523fc9e..058b976d6576ed 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-20260727005509-c9f95165b560 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..84c88f2ffcbf15 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-20260727005509-c9f95165b560 h1:iS+LJipirZV7Ao3DQEbgrheuNpwdr8HDwFdWu+mRc/0= +github.com/goallc/go-llvm v0.0.0-20260727005509-c9f95165b560/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 index 68f25aa5453647..918c36850295e2 100644 --- a/src/cmd/vendor/github.com/goallc/go-llvm/.gitignore +++ b/src/cmd/vendor/github.com/goallc/go-llvm/.gitignore @@ -1,2 +1,3 @@ llvm-*.src.tar.xz llvm-*/ +llvm_config_goallc_generated.go diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/README.markdown b/src/cmd/vendor/github.com/goallc/go-llvm/README.markdown index 6c603435b276c9..9163f0c950e959 100644 --- a/src/cmd/vendor/github.com/goallc/go-llvm/README.markdown +++ b/src/cmd/vendor/github.com/goallc/go-llvm/README.markdown @@ -13,9 +13,17 @@ 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"`. +GoALLC uses an explicit LLVM payload directory instead of ambient cgo +environment variables. Generate the project configuration with: + + ./gen_llvm_config.sh --llvm-dir /path/to/llvm --link dynamic + +The directory must contain `bin/llvm-config`, `include/llvm-c`, and `lib`. +`--link` accepts `dynamic` (the default) or `static`; both modes use the same +directory layout. The generated file is selected by the `goallc` build tag. +Static mode uses `llvm-config` to select the LLVM archives and their system +libraries, including correct archive grouping on Linux and dependency ordering +on macOS. ## Usage diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/gen_llvm_config.sh b/src/cmd/vendor/github.com/goallc/go-llvm/gen_llvm_config.sh new file mode 100755 index 00000000000000..ceb39971064fc0 --- /dev/null +++ b/src/cmd/vendor/github.com/goallc/go-llvm/gen_llvm_config.sh @@ -0,0 +1,180 @@ +#!/usr/bin/env bash + +set -euo pipefail + +usage() { + cat <<'EOF' +usage: gen_llvm_config.sh [--llvm-dir DIR] [--link dynamic|static] [--output FILE] + +Generate the project-specific cgo configuration used by GoALLC. DIR must use +the common LLVM payload layout: + + DIR/bin/llvm-config + DIR/include/llvm-c + DIR/lib + +The default directory is ./llvm, the default link mode is dynamic, and the +default output is ./llvm_config_goallc_generated.go. +EOF +} + +script_dir="$(cd "$(dirname "$0")" && pwd -P)" +llvm_dir="${script_dir}/llvm" +link_mode="dynamic" +output="${script_dir}/llvm_config_goallc_generated.go" + +while [[ $# -gt 0 ]]; do + case "$1" in + --llvm-dir) + [[ $# -ge 2 ]] || { usage >&2; exit 2; } + llvm_dir="$2" + shift 2 + ;; + --link) + [[ $# -ge 2 ]] || { usage >&2; exit 2; } + link_mode="$2" + shift 2 + ;; + --output) + [[ $# -ge 2 ]] || { usage >&2; exit 2; } + output="$2" + shift 2 + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "gen_llvm_config.sh: unknown argument: $1" >&2 + usage >&2 + exit 2 + ;; + esac +done + +case "$link_mode" in + dynamic|static) ;; + *) + echo "gen_llvm_config.sh: --link must be dynamic or static" >&2 + exit 2 + ;; +esac + +if [[ ! -d "$llvm_dir/include/llvm-c" ]]; then + echo "gen_llvm_config.sh: LLVM C headers not found under $llvm_dir/include" >&2 + exit 1 +fi +if [[ ! -d "$llvm_dir/lib" ]]; then + echo "gen_llvm_config.sh: LLVM library directory not found: $llvm_dir/lib" >&2 + exit 1 +fi +if [[ ! -x "$llvm_dir/bin/llvm-config" ]]; then + echo "gen_llvm_config.sh: executable llvm-config not found: $llvm_dir/bin/llvm-config" >&2 + exit 1 +fi + +llvm_dir="$(cd "$llvm_dir" && pwd -P)" +if [[ "$llvm_dir" == *[[:space:]#]* ]]; then + echo "gen_llvm_config.sh: LLVM directory must not contain whitespace or '#': $llvm_dir" >&2 + exit 1 +fi + +llvm_config="${llvm_dir}/bin/llvm-config" +llvm_version="$("$llvm_config" --version)" +llvm_major="${llvm_version%%.*}" +if [[ "$llvm_major" != "23" ]]; then + echo "gen_llvm_config.sh: GoALLC requires LLVM 23, found $llvm_version" >&2 + exit 1 +fi + +host_uname="$(uname -s)" +case "$host_uname" in + Darwin) + cgo_os="darwin" + ;; + Linux) + cgo_os="linux" + ;; + *) + echo "gen_llvm_config.sh: unsupported host: $host_uname" >&2 + exit 1 + ;; +esac + +cppflags="-I${llvm_dir}/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS" +if [[ "$cgo_os" == "linux" ]]; then + cppflags="$cppflags -D_GNU_SOURCE" +fi + +if [[ "$link_mode" == "dynamic" ]]; then + if [[ "$cgo_os" == "darwin" ]]; then + compgen -G "${llvm_dir}/lib/libLLVM*.dylib" >/dev/null || + { echo "gen_llvm_config.sh: libLLVM dylib not found under $llvm_dir/lib" >&2; exit 1; } + ldflags="-L${llvm_dir}/lib -Wl,-rpath,${llvm_dir}/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM" + else + compgen -G "${llvm_dir}/lib/libLLVM*.so*" >/dev/null || + { echo "gen_llvm_config.sh: libLLVM shared library not found under $llvm_dir/lib" >&2; exit 1; } + ldflags="-L${llvm_dir}/lib -Wl,-rpath,${llvm_dir}/lib -lLLVM" + fi +else + # The public binding exposes InitializeAllTargets and the interpreter, so + # their archives must be present even when the host target is the only one + # used by a particular program. + components=(core analysis bitreader bitwriter irreader linker passes all-targets executionengine mcjit interpreter target) + configured_libfiles="$("$llvm_config" --link-static --libfiles "${components[@]}")" + system_libs="$("$llvm_config" --link-static --system-libs "${components[@]}")" + if [[ " $system_libs " == *" -lzstd "* ]] && command -v pkg-config >/dev/null 2>&1; then + zstd_libdirs="$(pkg-config --libs-only-L libzstd 2>/dev/null || true)" + if [[ -n "$zstd_libdirs" ]]; then + system_libs="$zstd_libdirs $system_libs" + fi + fi + if [[ -z "$configured_libfiles" ]]; then + echo "gen_llvm_config.sh: llvm-config returned no static libraries" >&2 + exit 1 + fi + + libfiles="" + for configured_archive in $configured_libfiles; do + archive="${llvm_dir}/lib/$(basename "$configured_archive")" + [[ -f "$archive" ]] || + { echo "gen_llvm_config.sh: static LLVM archive not found: $archive" >&2; exit 1; } + libfiles="${libfiles} ${archive}" + done + libfiles="${libfiles# }" + + if [[ "$cgo_os" == "darwin" ]]; then + # llvm-config emits archives in dependency order. Pass them as direct + # linker inputs: cgo permits archive paths, and Darwin ld consumes this + # order without the GNU-only --start-group option. + ldflags="$libfiles $system_libs" + else + ldflags="-Wl,--start-group $libfiles -Wl,--end-group $system_libs" + fi +fi + +output_dir="$(dirname "$output")" +mkdir -p "$output_dir" +tmp_output="${output}.tmp.$$" +trap 'rm -f "$tmp_output"' EXIT + +cat >"$tmp_output" < "./llvm_config_static.go" <&2 +exec "${script_dir}/gen_llvm_config.sh" "$@" --link static 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 index 154b4f57a0fb6d..92415758c7d69e 100644 --- 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 @@ -1,4 +1,4 @@ -//go:build !byollvm && !staticllvm && llvm14 +//go:build !goallc && !byollvm && !staticllvm && llvm14 package llvm 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 index bf4c451e51c874..e42d34228db45a 100644 --- 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 @@ -1,4 +1,4 @@ -//go:build !byollvm && !staticllvm && llvm15 +//go:build !goallc && !byollvm && !staticllvm && llvm15 package llvm 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 index 6d742ed8c95ae3..c1e7b8fcd2b3dd 100644 --- 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 @@ -1,4 +1,4 @@ -//go:build !byollvm && !staticllvm && llvm16 +//go:build !goallc && !byollvm && !staticllvm && llvm16 package llvm 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 index 58a377ccccbc54..046c70f99fbb27 100644 --- 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 @@ -1,4 +1,4 @@ -//go:build !byollvm && !staticllvm && llvm17 +//go:build !goallc && !byollvm && !staticllvm && llvm17 package llvm 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 index 7a706bfb426802..83020f23cb3433 100644 --- 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 @@ -1,4 +1,4 @@ -//go:build !byollvm && !staticllvm && llvm18 +//go:build !goallc && !byollvm && !staticllvm && llvm18 package llvm 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 index bbe44d8983be08..71e300c06c7e76 100644 --- 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 @@ -1,4 +1,4 @@ -//go:build !byollvm && !staticllvm && llvm19 +//go:build !goallc && !byollvm && !staticllvm && llvm19 package llvm 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 index 224418c27c10a4..ca40948b24250f 100644 --- 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 @@ -1,4 +1,4 @@ -//go:build !byollvm && !staticllvm && llvm20 +//go:build !goallc && !byollvm && !staticllvm && llvm20 package llvm 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 index de236b401fc83d..a11f57c03df965 100644 --- 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 @@ -1,4 +1,4 @@ -//go:build !byollvm && !staticllvm && llvm21 +//go:build !goallc && !byollvm && !staticllvm && llvm21 package llvm 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 index e468b6146271d7..eda7c606a0ff7d 100644 --- 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 @@ -1,4 +1,4 @@ -//go:build !byollvm && !staticllvm && llvm22 +//go:build !goallc && !byollvm && !staticllvm && llvm22 package llvm 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 index ddfeb87a6d0f10..fab21afb8cac90 100644 --- 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 @@ -1,4 +1,4 @@ -//go:build !byollvm && !staticllvm && !llvm14 && !llvm15 && !llvm16 && !llvm17 && !llvm18 && !llvm19 && !llvm20 && !llvm21 && !llvm22 +//go:build !goallc && !byollvm && !staticllvm && !llvm14 && !llvm15 && !llvm16 && !llvm17 && !llvm18 && !llvm19 && !llvm20 && !llvm21 && !llvm22 package llvm 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/modules.txt b/src/cmd/vendor/modules.txt index f1a644f7371dcd..b5791d211eb6b9 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-20260727005509-c9f95165b560 ## explicit; go 1.24 github.com/goallc/go-llvm # github.com/google/pprof v0.0.0-20260507013755-92041b743c96 diff --git a/src/make.bash b/src/make.bash index d4e927dfda7c43..a9f2645996a07e 100755 --- a/src/make.bash +++ b/src/make.bash @@ -60,6 +60,12 @@ # GO_DISTFLAGS: extra flags to provide to "dist bootstrap". # (Or just pass them to the make.bash command line.) # +# GOALLC_LLVM_DIR: LLVM payload root. Defaults to $GOROOT/llvm and may +# instead be passed as -llvm-dir on the make.bash command line. +# +# GOALLC_LLVM_LINK: LLVM link mode, either dynamic (the default) or static. +# It may instead be passed as -llvm-link on the make.bash command line. +# # GOBUILDTIMELOGFILE: If set, make.bash and all.bash write # timing information to this file. Useful for profiling where the # time goes when these scripts run. From 4a36c2d08bf846d0c5a4fe61d85f8a2581754498 Mon Sep 17 00:00:00 2001 From: ZhouGuangyuan Date: Mon, 27 Jul 2026 10:27:51 +0800 Subject: [PATCH 2/5] cmd: select custom LLVM through dist parameters --- .gitignore | 1 + GOALLC.md | 117 ++++++------ src/cmd/dist/build.go | 92 +++++++-- src/cmd/go.mod | 2 +- src/cmd/go.sum | 4 +- .../github.com/goallc/go-llvm/.gitignore | 3 - .../github.com/goallc/go-llvm/README.markdown | 40 ---- .../goallc/go-llvm/branch_llvm23.go | 2 +- .../github.com/goallc/go-llvm/branch_pre23.go | 13 -- .../goallc/go-llvm/gen_llvm_config.sh | 180 ------------------ .../goallc/go-llvm/gen_llvm_config_static.sh | 8 - .../github.com/goallc/go-llvm/goallc_ext.go | 7 +- .../github.com/goallc/go-llvm/llvm_config.go | 9 + .../goallc/go-llvm/llvm_config_llvm14.go | 16 -- .../goallc/go-llvm/llvm_config_llvm15.go | 16 -- .../goallc/go-llvm/llvm_config_llvm16.go | 16 -- .../goallc/go-llvm/llvm_config_llvm17.go | 16 -- .../goallc/go-llvm/llvm_config_llvm18.go | 16 -- .../goallc/go-llvm/llvm_config_llvm19.go | 19 -- .../goallc/go-llvm/llvm_config_llvm20.go | 19 -- .../goallc/go-llvm/llvm_config_llvm21.go | 19 -- .../goallc/go-llvm/llvm_config_llvm22.go | 19 -- .../goallc/go-llvm/llvm_config_llvm23.go | 19 -- .../github.com/goallc/go-llvm/llvm_dep.go | 10 +- .../goallc/go-llvm/llvm_link_dynamic.go | 11 ++ .../goallc/go-llvm/llvm_link_static.go | 11 ++ .../goallc/go-llvm/llvm_version_23.go | 5 + .../goallc/go-llvm/opcode_llvm23.go | 2 +- .../github.com/goallc/go-llvm/opcode_pre23.go | 10 - .../goallc/go-llvm/switch_llvm22.go | 2 +- .../github.com/goallc/go-llvm/switch_pre22.go | 15 -- src/cmd/vendor/modules.txt | 2 +- src/make.bash | 3 + 33 files changed, 189 insertions(+), 535 deletions(-) delete mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/.gitignore delete mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/README.markdown delete mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/branch_pre23.go delete mode 100755 src/cmd/vendor/github.com/goallc/go-llvm/gen_llvm_config.sh delete mode 100755 src/cmd/vendor/github.com/goallc/go-llvm/gen_llvm_config_static.sh create mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/llvm_config.go delete mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm14.go delete mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm15.go delete mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm16.go delete mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm17.go delete mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm18.go delete mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm19.go delete mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm20.go delete mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm21.go delete mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm22.go delete mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm23.go create mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/llvm_link_dynamic.go create mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/llvm_link_static.go create mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/llvm_version_23.go delete mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/opcode_pre23.go delete mode 100644 src/cmd/vendor/github.com/goallc/go-llvm/switch_pre22.go diff --git a/.gitignore b/.gitignore index dc824830905d17..12cafc7db06516 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ _testmain.go /goinstall.log /last-change /llvm/ +/src/cmd/vendor/github.com/goallc/go-llvm/llvm /misc/cgo/life/run.out /misc/cgo/stdio/run.out /misc/cgo/testso/main diff --git a/GOALLC.md b/GOALLC.md index 9e12d35403d598..cf80ec814378e1 100644 --- a/GOALLC.md +++ b/GOALLC.md @@ -74,34 +74,27 @@ Remote: 路径:`/Volumes/Disk1/00.Work/00.Code/goallc/go-llvm` -- 上游:`tinygo-org/go-llvm` 的 `main` -- LLVM 23 集成通过 GoALLC PR #2 进入 `master` -- 合并后的 `master` 提交为 `7467f945baac` -- 显式 LLVM payload 配置通过 GoALLC PR #3 提交审核,当前提交为 - `c9f95165b560` -- Go 仓库依赖版本为 - `v0.0.0-20260727005509-c9f95165b560` -- 以 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;GoALLC 构建由 binding 直接生成 - 项目专用 cgo 配置,不再依赖 overlay 或外部 `CGO_*` 参数 -- 动态和静态模式使用同一个 LLVM payload 根目录布局: - `bin/llvm-config`、`include/llvm-c` 和 `lib` -- 默认动态链接;静态模式由 binding 通过 `llvm-config` 选择完整的 LLVM - archive 依赖,Linux 使用 archive group,macOS 使用依赖顺序 -- 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 - -standalone binding 可用 `gen_llvm_config.sh --llvm-dir DIR ---link dynamic|static` 生成相同配置。生成文件由 `goallc` build tag 选择, -并被版本控制忽略。 +- 由 `tinygo.org/x/go-llvm` 派生,module path 为 + `github.com/goallc/go-llvm`; +- LLVM 23 基础兼容已进入 `master`;当前清理方案在 GoALLC PR #3 的 + `codex/explicit-llvm-config` 分支审核,HEAD 为 `bbabd2cf14b6`; +- 本项目只支持 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`;静态模式只链接定制 LLVM + 生成的聚合归档 `libLLVMGoALLC.a`; +- 没有生成 Go 文件,没有 `LLVMROOT`,也不把路径塞进普通 cgo 的 + `CGO_CPPFLAGS`、`CGO_LDFLAGS` 或全局动态库环境; +- `goallc_ext.go` 已从 Go vendor 私有补丁收回 binding 仓库。 + +Go 仓库依赖当前 PR HEAD 的 pseudo-version: +`v0.0.0-20260727021832-bbabd2cf14b6`。 ### 2.3 `llvm-project` @@ -120,6 +113,8 @@ Remote: - 基于本地 `official/release/23.x` 的 `ce6af707aac8` - LLVM 版本文件为 `23.1.0` - GoObj 主题分支在 release base 上有 24 笔提交 +- 聚合静态库方案在 GoALLC PR #2 的 + `codex/goallc-static-library` 分支审核,HEAD 为 `7f782f174871` 本轮已恢复 Clang、LLDB 和 MLGO 测试夹具中的既有 symlink/file-type 变化,源码工作区目前干净。旧的 25 GB 构建目录已删除,并从空目录重新完成 @@ -188,9 +183,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 避免第一阶段直接依赖 @@ -328,12 +324,14 @@ 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; - LLVM payload 默认位于 `$GOROOT/llvm`,也可用 `-llvm-dir` 或专用环境 变量 `GOALLC_LLVM_DIR` 指定; +- LLVM API 默认版本为 23,也可用 `-llvm-version` 或 + `GOALLC_LLVM_VERSION` 显式指定; - 默认通过 payload 中的 `libLLVM` 动态链接;`-llvm-link=static` 或 - `GOALLC_LLVM_LINK=static` 选择静态 LLVM archives。 + `GOALLC_LLVM_LINK=static` 选择 `libLLVMGoALLC.a`。 当前 LLVM 由 macOS 26 SDK 构建,而 Go 1.27 工具链默认链接目标为 macOS 16,因此链接时会产生 deployment-target 警告。构建和 smoke test @@ -341,10 +339,10 @@ Go SSA 分支形成于 LLVM Go ABI 工作之前,目前: `cmd/dist` 还用一个恒为 true 的 `buildGoallc` 强制所有工具走 external link。这是早期 bring-up 手段,后续应缩小到真正依赖 LLVM 的 compiler -阶段和受支持平台。`cmd/dist` 现在自行注入 `goallc,llvm23` tags,静态 -模式额外注入 `staticllvm`;bootstrap 仍使用 `compiler_bootstrap` stub。 -LLVM 的 include 和 link 参数只存在于 binding 生成的 cgo 配置中,不与 -普通 cgo 构建的外部环境变量混用。 +阶段和受支持平台。`cmd/dist` 现在根据参数自行注入 +`llvm23,dynamicllvm` 或 `llvm23,staticllvm`;bootstrap 仍使用 +`compiler_bootstrap` stub。LLVM 的 include 和 link 参数只存在于 +binding 的代码配置中,不与普通 cgo 构建的外部环境变量混用。 ## 6. 当前验证状态 @@ -358,15 +356,12 @@ LLVM 的 include 和 link 参数只存在于 binding 生成的 cgo 配置中, - 新构建产物为 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` 通过项目生成配置,在不设置外部 `CGO_*` 参数的 - 情况下完成 LLVM 23 动态与静态两种模式的全测试; -- 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`; +- LLVM 的 `LLVMGoALLC` 目标生成包含 1,787 个 LLVM object member 的 + 聚合库;加入静态 zstd 后归档共 1,825 个 member; +- 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`; @@ -393,12 +388,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 已恢复。 @@ -459,6 +455,7 @@ cmake -S llvm -B llvm/cmake-build-debug -G Ninja \ -DLLVM_BUILD_TOOLS=ON \ -DBUILD_SHARED_LIBS=OFF \ -DLLVM_BUILD_LLVM_DYLIB=ON \ + -DLLVM_BUILD_GOALLC_STATIC=ON \ -DLLVM_ENABLE_RTTI=OFF \ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ninja -C llvm/cmake-build-debug -j6 @@ -470,7 +467,7 @@ ninja -C llvm/cmake-build-debug -j6 $GOROOT/llvm/bin/llvm-config $GOROOT/llvm/include/llvm-c/Core.h $GOROOT/llvm/lib/libLLVM.dylib # dynamic -$GOROOT/llvm/lib/libLLVMCore.a # static +$GOROOT/llvm/lib/libLLVMGoALLC.a # static ``` 不要把 LLVM build 目录全局写入 `DYLD_LIBRARY_PATH`;这会让 Homebrew 的 @@ -481,15 +478,9 @@ payload rpath。 ```sh cd /Volumes/Disk1/00.Work/00.Code/goallc/go-llvm -./gen_llvm_config.sh \ - --llvm-dir /Volumes/Disk1/00.Work/00.Code/goallc/go/llvm \ - --link dynamic -go test -tags='goallc llvm23' ./... - -./gen_llvm_config.sh \ - --llvm-dir /Volumes/Disk1/00.Work/00.Code/goallc/go/llvm \ - --link static -go test -tags='goallc llvm23 staticllvm' ./... +ln -s /Volumes/Disk1/00.Work/00.Code/goallc/go/llvm llvm +go test -tags='llvm23 dynamicllvm' ./... +go test -tags='llvm23 staticllvm' ./... ``` 构建 Go 集成工具链: @@ -497,10 +488,16 @@ go test -tags='goallc llvm23 staticllvm' ./... ```sh cd /Volumes/Disk1/00.Work/00.Code/goallc/go/src ./make.bash -./make.bash -llvm-dir=/path/to/llvm -llvm-link=dynamic -./make.bash -llvm-dir=/path/to/llvm -llvm-link=static +./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 目录解析顺序是显式 `-llvm-dir`、 +`GOALLC_LLVM_DIR`、最后 `$GOROOT/llvm`。它验证 payload 版本和所选链接库, +再原子更新 +`$GOROOT/src/cmd/vendor/github.com/goallc/go-llvm/llvm` 软链接。真实目录对 +binding 不可见,binding 始终只使用 `${SRCDIR}/llvm`。 + 最小 IR smoke test: ```sh diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index 6ac3e51e59e401..c76b2149f9598b 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -68,8 +68,9 @@ var ( ) var ( - goallcLLVMDir string - goallcLLVMLink string + goallcLLVMDir string + goallcLLVMLink string + goallcLLVMVersion string ) // The known architectures. @@ -127,6 +128,10 @@ func xinit() { if goallcLLVMLink == "" { goallcLLVMLink = "dynamic" } + goallcLLVMVersion = os.Getenv("GOALLC_LLVM_VERSION") + if goallcLLVMVersion == "" { + goallcLLVMVersion = "23" + } // Don't run just 'go' because the build infrastructure // runs cmd/dist inside go/bin often, and on Windows @@ -1411,10 +1416,7 @@ func toolenv() []string { // as the original build system. env = append(env, "CGO_ENABLED=0") } - goallcTags := "goallc,llvm23" - if goallcLLVMLink == "static" { - goallcTags += ",staticllvm" - } + goallcTags := "llvm" + goallcLLVMVersion + "," + goallcLLVMLink + "llvm" goFlags = append(goFlags, "-tags="+goallcTags) if isRelease || os.Getenv("GO_BUILDER_NAME") != "" { // Add -trimpath for reproducible builds of releases. @@ -1466,9 +1468,10 @@ func cmdbootstrap() { 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) - generateGoallcLLVMConfig() + configureGoallcLLVM() if noClean { xprintf("warning: --no-clean is deprecated and has no effect; use 'go install std cmd' instead\n") @@ -1738,7 +1741,13 @@ func cmdbootstrap() { } } -func generateGoallcLLVMConfig() { +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: @@ -1751,17 +1760,68 @@ func generateGoallcLLVMConfig() { } 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 == "static" { + libraries = []string{pathf("%s/lib/libLLVMGoALLC.a", goallcLLVMDir)} + } else if gohostos == "darwin" { + libraries, _ = filepath.Glob(pathf("%s/lib/libLLVM*.dylib", goallcLLVMDir)) + } else { + libraries, _ = filepath.Glob(pathf("%s/lib/libLLVM*.so*", goallcLLVMDir)) + } + if 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) - generator := pathf("%s/gen_llvm_config.sh", bindingDir) - output := pathf("%s/llvm_config_goallc_generated.go", bindingDir) - if _, err := os.Stat(generator); err != nil { - fatalf("GoALLC LLVM binding generator not found: %v", err) + 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) } - run(bindingDir, CheckExit|ShowOutput, "bash", generator, - "--llvm-dir", goallcLLVMDir, - "--link", goallcLLVMLink, - "--output", output) + 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) + } } func wrapperPathFor(goos, goarch string) string { diff --git a/src/cmd/go.mod b/src/cmd/go.mod index 058b976d6576ed..1238c29d83f4c6 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-20260727005509-c9f95165b560 + github.com/goallc/go-llvm v0.0.0-20260727021832-bbabd2cf14b6 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 84c88f2ffcbf15..18f152f4d18cfe 100644 --- a/src/cmd/go.sum +++ b/src/cmd/go.sum @@ -1,5 +1,5 @@ -github.com/goallc/go-llvm v0.0.0-20260727005509-c9f95165b560 h1:iS+LJipirZV7Ao3DQEbgrheuNpwdr8HDwFdWu+mRc/0= -github.com/goallc/go-llvm v0.0.0-20260727005509-c9f95165b560/go.mod h1:s70tU8u5zDo1LwIPqBxh6Qgol/tNt1kmn9caPfsTz8A= +github.com/goallc/go-llvm v0.0.0-20260727021832-bbabd2cf14b6 h1:coPCk4a7mgnzYEoBMaHbIvV8nm/EW8PXcUJumrunhaw= +github.com/goallc/go-llvm v0.0.0-20260727021832-bbabd2cf14b6/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 918c36850295e2..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -llvm-*.src.tar.xz -llvm-*/ -llvm_config_goallc_generated.go 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 9163f0c950e959..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/README.markdown +++ /dev/null @@ -1,40 +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"`. - -GoALLC uses an explicit LLVM payload directory instead of ambient cgo -environment variables. Generate the project configuration with: - - ./gen_llvm_config.sh --llvm-dir /path/to/llvm --link dynamic - -The directory must contain `bin/llvm-config`, `include/llvm-c`, and `lib`. -`--link` accepts `dynamic` (the default) or `static`; both modes use the same -directory layout. The generated file is selected by the `goallc` build tag. -Static mode uses `llvm-config` to select the LLVM archives and their system -libraries, including correct archive grouping on Linux and dependency ordering -on macOS. - -## 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.sh b/src/cmd/vendor/github.com/goallc/go-llvm/gen_llvm_config.sh deleted file mode 100755 index ceb39971064fc0..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/gen_llvm_config.sh +++ /dev/null @@ -1,180 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -usage() { - cat <<'EOF' -usage: gen_llvm_config.sh [--llvm-dir DIR] [--link dynamic|static] [--output FILE] - -Generate the project-specific cgo configuration used by GoALLC. DIR must use -the common LLVM payload layout: - - DIR/bin/llvm-config - DIR/include/llvm-c - DIR/lib - -The default directory is ./llvm, the default link mode is dynamic, and the -default output is ./llvm_config_goallc_generated.go. -EOF -} - -script_dir="$(cd "$(dirname "$0")" && pwd -P)" -llvm_dir="${script_dir}/llvm" -link_mode="dynamic" -output="${script_dir}/llvm_config_goallc_generated.go" - -while [[ $# -gt 0 ]]; do - case "$1" in - --llvm-dir) - [[ $# -ge 2 ]] || { usage >&2; exit 2; } - llvm_dir="$2" - shift 2 - ;; - --link) - [[ $# -ge 2 ]] || { usage >&2; exit 2; } - link_mode="$2" - shift 2 - ;; - --output) - [[ $# -ge 2 ]] || { usage >&2; exit 2; } - output="$2" - shift 2 - ;; - -h|--help) - usage - exit 0 - ;; - *) - echo "gen_llvm_config.sh: unknown argument: $1" >&2 - usage >&2 - exit 2 - ;; - esac -done - -case "$link_mode" in - dynamic|static) ;; - *) - echo "gen_llvm_config.sh: --link must be dynamic or static" >&2 - exit 2 - ;; -esac - -if [[ ! -d "$llvm_dir/include/llvm-c" ]]; then - echo "gen_llvm_config.sh: LLVM C headers not found under $llvm_dir/include" >&2 - exit 1 -fi -if [[ ! -d "$llvm_dir/lib" ]]; then - echo "gen_llvm_config.sh: LLVM library directory not found: $llvm_dir/lib" >&2 - exit 1 -fi -if [[ ! -x "$llvm_dir/bin/llvm-config" ]]; then - echo "gen_llvm_config.sh: executable llvm-config not found: $llvm_dir/bin/llvm-config" >&2 - exit 1 -fi - -llvm_dir="$(cd "$llvm_dir" && pwd -P)" -if [[ "$llvm_dir" == *[[:space:]#]* ]]; then - echo "gen_llvm_config.sh: LLVM directory must not contain whitespace or '#': $llvm_dir" >&2 - exit 1 -fi - -llvm_config="${llvm_dir}/bin/llvm-config" -llvm_version="$("$llvm_config" --version)" -llvm_major="${llvm_version%%.*}" -if [[ "$llvm_major" != "23" ]]; then - echo "gen_llvm_config.sh: GoALLC requires LLVM 23, found $llvm_version" >&2 - exit 1 -fi - -host_uname="$(uname -s)" -case "$host_uname" in - Darwin) - cgo_os="darwin" - ;; - Linux) - cgo_os="linux" - ;; - *) - echo "gen_llvm_config.sh: unsupported host: $host_uname" >&2 - exit 1 - ;; -esac - -cppflags="-I${llvm_dir}/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS" -if [[ "$cgo_os" == "linux" ]]; then - cppflags="$cppflags -D_GNU_SOURCE" -fi - -if [[ "$link_mode" == "dynamic" ]]; then - if [[ "$cgo_os" == "darwin" ]]; then - compgen -G "${llvm_dir}/lib/libLLVM*.dylib" >/dev/null || - { echo "gen_llvm_config.sh: libLLVM dylib not found under $llvm_dir/lib" >&2; exit 1; } - ldflags="-L${llvm_dir}/lib -Wl,-rpath,${llvm_dir}/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM" - else - compgen -G "${llvm_dir}/lib/libLLVM*.so*" >/dev/null || - { echo "gen_llvm_config.sh: libLLVM shared library not found under $llvm_dir/lib" >&2; exit 1; } - ldflags="-L${llvm_dir}/lib -Wl,-rpath,${llvm_dir}/lib -lLLVM" - fi -else - # The public binding exposes InitializeAllTargets and the interpreter, so - # their archives must be present even when the host target is the only one - # used by a particular program. - components=(core analysis bitreader bitwriter irreader linker passes all-targets executionengine mcjit interpreter target) - configured_libfiles="$("$llvm_config" --link-static --libfiles "${components[@]}")" - system_libs="$("$llvm_config" --link-static --system-libs "${components[@]}")" - if [[ " $system_libs " == *" -lzstd "* ]] && command -v pkg-config >/dev/null 2>&1; then - zstd_libdirs="$(pkg-config --libs-only-L libzstd 2>/dev/null || true)" - if [[ -n "$zstd_libdirs" ]]; then - system_libs="$zstd_libdirs $system_libs" - fi - fi - if [[ -z "$configured_libfiles" ]]; then - echo "gen_llvm_config.sh: llvm-config returned no static libraries" >&2 - exit 1 - fi - - libfiles="" - for configured_archive in $configured_libfiles; do - archive="${llvm_dir}/lib/$(basename "$configured_archive")" - [[ -f "$archive" ]] || - { echo "gen_llvm_config.sh: static LLVM archive not found: $archive" >&2; exit 1; } - libfiles="${libfiles} ${archive}" - done - libfiles="${libfiles# }" - - if [[ "$cgo_os" == "darwin" ]]; then - # llvm-config emits archives in dependency order. Pass them as direct - # linker inputs: cgo permits archive paths, and Darwin ld consumes this - # order without the GNU-only --start-group option. - ldflags="$libfiles $system_libs" - else - ldflags="-Wl,--start-group $libfiles -Wl,--end-group $system_libs" - fi -fi - -output_dir="$(dirname "$output")" -mkdir -p "$output_dir" -tmp_output="${output}.tmp.$$" -trap 'rm -f "$tmp_output"' EXIT - -cat >"$tmp_output" <&2 -exec "${script_dir}/gen_llvm_config.sh" "$@" --link static diff --git a/src/cmd/vendor/github.com/goallc/go-llvm/goallc_ext.go b/src/cmd/vendor/github.com/goallc/go-llvm/goallc_ext.go index 1d33dc9d67dfc5..cd6e34a6a6dbcf 100644 --- a/src/cmd/vendor/github.com/goallc/go-llvm/goallc_ext.go +++ b/src/cmd/vendor/github.com/goallc/go-llvm/goallc_ext.go @@ -5,6 +5,7 @@ package llvm #include */ 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 92415758c7d69e..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm14.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build !goallc && !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 e42d34228db45a..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm15.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build !goallc && !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 c1e7b8fcd2b3dd..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm16.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build !goallc && !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 046c70f99fbb27..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm17.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build !goallc && !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 83020f23cb3433..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm18.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build !goallc && !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 71e300c06c7e76..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm19.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build !goallc && !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 ca40948b24250f..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm20.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build !goallc && !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 a11f57c03df965..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm21.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build !goallc && !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 eda7c606a0ff7d..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm22.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build !goallc && !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 fab21afb8cac90..00000000000000 --- a/src/cmd/vendor/github.com/goallc/go-llvm/llvm_config_llvm23.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build !goallc && !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_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..17b3cad8d307bd --- /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}/llvm/lib -lLLVMGoALLC -lm -lz -lxml2 +#cgo linux LDFLAGS: -L${SRCDIR}/llvm/lib -lLLVMGoALLC -lm -lz -lxml2 -ldl -lpthread +*/ +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 b5791d211eb6b9..a6821671891ec8 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-20260727005509-c9f95165b560 +# github.com/goallc/go-llvm v0.0.0-20260727021832-bbabd2cf14b6 ## explicit; go 1.24 github.com/goallc/go-llvm # github.com/google/pprof v0.0.0-20260507013755-92041b743c96 diff --git a/src/make.bash b/src/make.bash index a9f2645996a07e..1b8b03e0d1dd9a 100755 --- a/src/make.bash +++ b/src/make.bash @@ -66,6 +66,9 @@ # GOALLC_LLVM_LINK: LLVM link mode, either dynamic (the default) or static. # It may instead be passed as -llvm-link on the make.bash command line. # +# GOALLC_LLVM_VERSION: LLVM API version. Defaults to 23 and may instead be +# passed as -llvm-version on the make.bash command line. +# # GOBUILDTIMELOGFILE: If set, make.bash and all.bash write # timing information to this file. Useful for profiling where the # time goes when these scripts run. From b918b2d661678c14fab21ea3570d28e03b6941a9 Mon Sep 17 00:00:00 2001 From: ZhouGuangyuan Date: Mon, 27 Jul 2026 12:59:23 +0800 Subject: [PATCH 3/5] cmd: assemble static LLVM payload in dist --- .gitignore | 1 + GOALLC.md | 32 ++-- src/cmd/dist/build.go | 150 +++++++++++++++++- src/cmd/go.mod | 2 +- src/cmd/go.sum | 4 +- .../goallc/go-llvm/llvm_link_static.go | 4 +- src/cmd/vendor/modules.txt | 2 +- 7 files changed, 173 insertions(+), 22 deletions(-) diff --git a/.gitignore b/.gitignore index 12cafc7db06516..197f746e507809 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ _testmain.go /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 cf80ec814378e1..c18fe8996a9707 100644 --- a/GOALLC.md +++ b/GOALLC.md @@ -77,7 +77,7 @@ Remote: - 由 `tinygo.org/x/go-llvm` 派生,module path 为 `github.com/goallc/go-llvm`; - LLVM 23 基础兼容已进入 `master`;当前清理方案在 GoALLC PR #3 的 - `codex/explicit-llvm-config` 分支审核,HEAD 为 `bbabd2cf14b6`; + `codex/explicit-llvm-config` 分支审核,HEAD 为 `223f6a971614`; - 本项目只支持 GoALLC 定制 LLVM,不再支持系统预安装 LLVM、 `byollvm`,也不保留 LLVM 14--22 的兼容配置; - LLVM API 版本和链接模式是两个正交、必选的 build-tag 维度: @@ -87,14 +87,14 @@ Remote: `${SRCDIR}/llvm/include` 和 `${SRCDIR}/llvm/lib`; - `llvm` 不入库,由调用方提供软链接。Go 工具链的 `cmd/dist` 根据 `-llvm-dir` 创建或更新该链接; -- 动态模式链接 payload 中的 `libLLVM`;静态模式只链接定制 LLVM - 生成的聚合归档 `libLLVMGoALLC.a`; +- 动态模式链接 payload 中的 `libLLVM`;静态模式只链接 binding + `${SRCDIR}` 下由 `cmd/dist` 聚合的 `libLLVMGoALLC.a`; - 没有生成 Go 文件,没有 `LLVMROOT`,也不把路径塞进普通 cgo 的 `CGO_CPPFLAGS`、`CGO_LDFLAGS` 或全局动态库环境; - `goallc_ext.go` 已从 Go vendor 私有补丁收回 binding 仓库。 Go 仓库依赖当前 PR HEAD 的 pseudo-version: -`v0.0.0-20260727021832-bbabd2cf14b6`。 +`v0.0.0-20260727045305-223f6a971614`。 ### 2.3 `llvm-project` @@ -113,8 +113,9 @@ Remote: - 基于本地 `official/release/23.x` 的 `ce6af707aac8` - LLVM 版本文件为 `23.1.0` - GoObj 主题分支在 release base 上有 24 笔提交 -- 聚合静态库方案在 GoALLC PR #2 的 - `codex/goallc-static-library` 分支审核,HEAD 为 `7f782f174871` +- 原聚合静态库方案的 GoALLC PR #2 已关闭;其 feature 分支已用 + `e31213b5750d` 撤回全部源码改动,相对 `llvm23.1.master` 的净 diff + 为零。静态聚合职责已移到 Go `cmd/dist` 本轮已恢复 Clang、LLDB 和 MLGO 测试夹具中的既有 symlink/file-type 变化,源码工作区目前干净。旧的 25 GB 构建目录已删除,并从空目录重新完成 @@ -331,7 +332,8 @@ Go SSA 分支形成于 LLVM Go ABI 工作之前,目前: - LLVM API 默认版本为 23,也可用 `-llvm-version` 或 `GOALLC_LLVM_VERSION` 显式指定; - 默认通过 payload 中的 `libLLVM` 动态链接;`-llvm-link=static` 或 - `GOALLC_LLVM_LINK=static` 选择 `libLLVMGoALLC.a`。 + `GOALLC_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 @@ -356,8 +358,8 @@ binding 的代码配置中,不与普通 cgo 构建的外部环境变量混用 - 新构建产物为 LLVM `23.1.0git`、Debug、assertions enabled,包含 X86 和 AArch64,并生成约 302 MB 的 `libLLVM.23.1git.dylib`; - 8 个 X86/AArch64 GoObj MC/CodeGen 定向测试全部通过; -- LLVM 的 `LLVMGoALLC` 目标生成包含 1,787 个 LLVM object member 的 - 聚合库;加入静态 zstd 后归档共 1,825 个 member; +- 旧方案曾由 LLVM 的 `LLVMGoALLC` target 生成聚合库;当前方案已把 + 聚合职责移到 `cmd/dist`,LLVM 源码不再需要该项目专用 target; - standalone `go-llvm` 在不设置外部 `CGO_*` 参数的情况下,以 `llvm23,dynamicllvm` 和 `llvm23,staticllvm` 完成全测试; - 更新后的 binding 已同步到 Go vendor,`goallc_ext.go` 不再是 vendor @@ -455,7 +457,6 @@ cmake -S llvm -B llvm/cmake-build-debug -G Ninja \ -DLLVM_BUILD_TOOLS=ON \ -DBUILD_SHARED_LIBS=OFF \ -DLLVM_BUILD_LLVM_DYLIB=ON \ - -DLLVM_BUILD_GOALLC_STATIC=ON \ -DLLVM_ENABLE_RTTI=OFF \ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ninja -C llvm/cmake-build-debug -j6 @@ -465,9 +466,10 @@ ninja -C llvm/cmake-build-debug -j6 ```sh $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/libLLVMGoALLC.a # static +$GOROOT/llvm/lib/libLLVM*.a # static component archives ``` 不要把 LLVM build 目录全局写入 `DYLD_LIBRARY_PATH`;这会让 Homebrew 的 @@ -480,6 +482,7 @@ payload rpath。 cd /Volumes/Disk1/00.Work/00.Code/goallc/go-llvm 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' ./... ``` @@ -498,6 +501,13 @@ cd /Volumes/Disk1/00.Work/00.Code/goallc/go/src `$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 c76b2149f9598b..ebcb2ee3769044 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -1780,14 +1780,12 @@ func configureGoallcLLVM() { } var libraries []string - if goallcLLVMLink == "static" { - libraries = []string{pathf("%s/lib/libLLVMGoALLC.a", goallcLLVMDir)} - } else if gohostos == "darwin" { + if goallcLLVMLink == "dynamic" && gohostos == "darwin" { libraries, _ = filepath.Glob(pathf("%s/lib/libLLVM*.dylib", goallcLLVMDir)) - } else { + } else if goallcLLVMLink == "dynamic" { libraries, _ = filepath.Glob(pathf("%s/lib/libLLVM*.so*", goallcLLVMDir)) } - if len(libraries) == 0 { + if goallcLLVMLink == "dynamic" && len(libraries) == 0 { fatalf("LLVM payload %q has no %s library", goallcLLVMDir, goallcLLVMLink) } for _, library := range libraries { @@ -1797,6 +1795,13 @@ func configureGoallcLLVM() { } 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 { @@ -1824,6 +1829,141 @@ func configureGoallcLLVM() { } } +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 1238c29d83f4c6..04d6f14d032c00 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-20260727021832-bbabd2cf14b6 + github.com/goallc/go-llvm v0.0.0-20260727045305-223f6a971614 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 18f152f4d18cfe..1b69bd8734d925 100644 --- a/src/cmd/go.sum +++ b/src/cmd/go.sum @@ -1,5 +1,5 @@ -github.com/goallc/go-llvm v0.0.0-20260727021832-bbabd2cf14b6 h1:coPCk4a7mgnzYEoBMaHbIvV8nm/EW8PXcUJumrunhaw= -github.com/goallc/go-llvm v0.0.0-20260727021832-bbabd2cf14b6/go.mod h1:s70tU8u5zDo1LwIPqBxh6Qgol/tNt1kmn9caPfsTz8A= +github.com/goallc/go-llvm v0.0.0-20260727045305-223f6a971614 h1:CLhaexjVLmeenJqb8GLa091TN4wZp+nDj/ztbknW3Qs= +github.com/goallc/go-llvm v0.0.0-20260727045305-223f6a971614/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/llvm_link_static.go b/src/cmd/vendor/github.com/goallc/go-llvm/llvm_link_static.go index 17b3cad8d307bd..c9667f64c71ff0 100644 --- 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 @@ -3,8 +3,8 @@ package llvm /* -#cgo darwin LDFLAGS: -L${SRCDIR}/llvm/lib -lLLVMGoALLC -lm -lz -lxml2 -#cgo linux LDFLAGS: -L${SRCDIR}/llvm/lib -lLLVMGoALLC -lm -lz -lxml2 -ldl -lpthread +#cgo darwin LDFLAGS: -L${SRCDIR} -lLLVMGoALLC -lm -lz -lxml2 +#cgo linux LDFLAGS: -L${SRCDIR} -lLLVMGoALLC -lm -lz -lxml2 -ldl -lpthread -lrt */ import "C" diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt index a6821671891ec8..672444cb9a1cad 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-20260727021832-bbabd2cf14b6 +# github.com/goallc/go-llvm v0.0.0-20260727045305-223f6a971614 ## explicit; go 1.24 github.com/goallc/go-llvm # github.com/google/pprof v0.0.0-20260507013755-92041b743c96 From 7ae0e80c1eb14789ce3768bde7a27a5f2ceeec14 Mon Sep 17 00:00:00 2001 From: ZhouGuangyuan Date: Mon, 27 Jul 2026 14:00:38 +0800 Subject: [PATCH 4/5] docs: record prebuilt LLVM CI policy --- GOALLC.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/GOALLC.md b/GOALLC.md index c18fe8996a9707..af457c555f4910 100644 --- a/GOALLC.md +++ b/GOALLC.md @@ -77,7 +77,7 @@ Remote: - 由 `tinygo.org/x/go-llvm` 派生,module path 为 `github.com/goallc/go-llvm`; - LLVM 23 基础兼容已进入 `master`;当前清理方案在 GoALLC PR #3 的 - `codex/explicit-llvm-config` 分支审核,HEAD 为 `223f6a971614`; + `codex/explicit-llvm-config` 分支审核,HEAD 为 `f21ebd5`; - 本项目只支持 GoALLC 定制 LLVM,不再支持系统预安装 LLVM、 `byollvm`,也不保留 LLVM 14--22 的兼容配置; - LLVM API 版本和链接模式是两个正交、必选的 build-tag 维度: @@ -92,8 +92,11 @@ Remote: - 没有生成 Go 文件,没有 `LLVMROOT`,也不把路径塞进普通 cgo 的 `CGO_CPPFLAGS`、`CGO_LDFLAGS` 或全局动态库环境; - `goallc_ext.go` 已从 Go vendor 私有补丁收回 binding 仓库。 +- 自动 CI 暂时只做源码格式检查,不再为每个 PR 从源码冷构建 LLVM; + 项目发布预构建 LLVM payload 后,CI 将直接下载 artifact 并恢复动态、 + 静态两种 binding 测试。 -Go 仓库依赖当前 PR HEAD 的 pseudo-version: +Go 仓库依赖 PR 中最后一个 binding 代码提交的 pseudo-version: `v0.0.0-20260727045305-223f6a971614`。 ### 2.3 `llvm-project` From 09420507ae7e4ce982a45064d0d300e427705a5c Mon Sep 17 00:00:00 2001 From: ZhouGuangyuan Date: Mon, 27 Jul 2026 15:27:24 +0800 Subject: [PATCH 5/5] cmd/dist: configure LLVM only through flags --- GOALLC.md | 24 +++++++++++------------- src/cmd/dist/build.go | 15 +++------------ src/cmd/go.mod | 2 +- src/cmd/go.sum | 4 ++-- src/cmd/vendor/modules.txt | 2 +- src/make.bash | 9 --------- 6 files changed, 18 insertions(+), 38 deletions(-) diff --git a/GOALLC.md b/GOALLC.md index af457c555f4910..c59ed699c7eb03 100644 --- a/GOALLC.md +++ b/GOALLC.md @@ -76,8 +76,8 @@ Remote: - 由 `tinygo.org/x/go-llvm` 派生,module path 为 `github.com/goallc/go-llvm`; -- LLVM 23 基础兼容已进入 `master`;当前清理方案在 GoALLC PR #3 的 - `codex/explicit-llvm-config` 分支审核,HEAD 为 `f21ebd5`; +- LLVM 23 基础兼容及当前清理方案已进入 `master`,HEAD 为 + `33267b8eb4a0`; - 本项目只支持 GoALLC 定制 LLVM,不再支持系统预安装 LLVM、 `byollvm`,也不保留 LLVM 14--22 的兼容配置; - LLVM API 版本和链接模式是两个正交、必选的 build-tag 维度: @@ -96,8 +96,8 @@ Remote: 项目发布预构建 LLVM payload 后,CI 将直接下载 artifact 并恢复动态、 静态两种 binding 测试。 -Go 仓库依赖 PR 中最后一个 binding 代码提交的 pseudo-version: -`v0.0.0-20260727045305-223f6a971614`。 +Go 仓库依赖 go-llvm `master` 的 pseudo-version: +`v0.0.0-20260727072003-33267b8eb4a0`。 ### 2.3 `llvm-project` @@ -330,12 +330,10 @@ Go SSA 分支形成于 LLVM Go ABI 工作之前,目前: - bootstrap Go:Go 1.26.5; - vendored/standalone binding:显式选择 `llvm23`; - LLVM source/build:23.1.0git; -- LLVM payload 默认位于 `$GOROOT/llvm`,也可用 `-llvm-dir` 或专用环境 - 变量 `GOALLC_LLVM_DIR` 指定; -- LLVM API 默认版本为 23,也可用 `-llvm-version` 或 - `GOALLC_LLVM_VERSION` 显式指定; -- 默认通过 payload 中的 `libLLVM` 动态链接;`-llvm-link=static` 或 - `GOALLC_LLVM_LINK=static` 让 `cmd/dist` 使用 payload 的 +- 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 @@ -498,9 +496,9 @@ cd /Volumes/Disk1/00.Work/00.Code/goallc/go/src ./make.bash -llvm-dir=/path/to/llvm -llvm-version=23 -llvm-link=static ``` -`cmd/dist` 的 LLVM 目录解析顺序是显式 `-llvm-dir`、 -`GOALLC_LLVM_DIR`、最后 `$GOROOT/llvm`。它验证 payload 版本和所选链接库, -再原子更新 +`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`。 diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index ebcb2ee3769044..eaeb2a2e0c3b47 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -120,18 +120,9 @@ func xinit() { } goroot = filepath.Clean(b) gorootBin = pathf("%s/bin", goroot) - goallcLLVMDir = os.Getenv("GOALLC_LLVM_DIR") - if goallcLLVMDir == "" { - goallcLLVMDir = pathf("%s/llvm", goroot) - } - goallcLLVMLink = os.Getenv("GOALLC_LLVM_LINK") - if goallcLLVMLink == "" { - goallcLLVMLink = "dynamic" - } - goallcLLVMVersion = os.Getenv("GOALLC_LLVM_VERSION") - if goallcLLVMVersion == "" { - goallcLLVMVersion = "23" - } + 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 diff --git a/src/cmd/go.mod b/src/cmd/go.mod index 04d6f14d032c00..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-20260727045305-223f6a971614 + 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 1b69bd8734d925..075f1eee83576a 100644 --- a/src/cmd/go.sum +++ b/src/cmd/go.sum @@ -1,5 +1,5 @@ -github.com/goallc/go-llvm v0.0.0-20260727045305-223f6a971614 h1:CLhaexjVLmeenJqb8GLa091TN4wZp+nDj/ztbknW3Qs= -github.com/goallc/go-llvm v0.0.0-20260727045305-223f6a971614/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/modules.txt b/src/cmd/vendor/modules.txt index 672444cb9a1cad..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-20260727045305-223f6a971614 +# 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 diff --git a/src/make.bash b/src/make.bash index 1b8b03e0d1dd9a..d4e927dfda7c43 100755 --- a/src/make.bash +++ b/src/make.bash @@ -60,15 +60,6 @@ # GO_DISTFLAGS: extra flags to provide to "dist bootstrap". # (Or just pass them to the make.bash command line.) # -# GOALLC_LLVM_DIR: LLVM payload root. Defaults to $GOROOT/llvm and may -# instead be passed as -llvm-dir on the make.bash command line. -# -# GOALLC_LLVM_LINK: LLVM link mode, either dynamic (the default) or static. -# It may instead be passed as -llvm-link on the make.bash command line. -# -# GOALLC_LLVM_VERSION: LLVM API version. Defaults to 23 and may instead be -# passed as -llvm-version on the make.bash command line. -# # GOBUILDTIMELOGFILE: If set, make.bash and all.bash write # timing information to this file. Useful for profiling where the # time goes when these scripts run.