From e4c5384986b729d8536149184e5fc508c61329e4 Mon Sep 17 00:00:00 2001 From: Li Jie Date: Sat, 22 Aug 2026 13:13:18 +0800 Subject: [PATCH 1/4] test: make archive error assertion portable on Windows --- archive_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/archive_test.go b/archive_test.go index df8e876..db1d476 100644 --- a/archive_test.go +++ b/archive_test.go @@ -10,6 +10,7 @@ package llvm import ( "bytes" + "fmt" "os" "path/filepath" "strings" @@ -74,7 +75,7 @@ func TestWriteArchiveRejectsInvalidMembers(t *testing.T) { {name: "empty path", members: []ArchiveMember{{}}, want: "archive path is empty"}, {name: "no members", path: path, want: "archive has no members"}, {name: "empty member", path: path, members: []ArchiveMember{{}}, want: "has no file or memory buffer"}, - {name: "missing file", path: path, members: []ArchiveMember{NewArchiveMemberFromFile(missing)}, want: missing}, + {name: "missing file", path: path, members: []ArchiveMember{NewArchiveMemberFromFile(missing)}, want: fmt.Sprintf("%q", missing)}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { From 8baef47bc7447c9006d543532a8ec3eab28ece19 Mon Sep 17 00:00:00 2001 From: Li Jie Date: Sat, 22 Aug 2026 13:13:20 +0800 Subject: [PATCH 2/4] llvm: configure Windows LLVM 19 with pkg-config --- llvm_config_llvm19.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/llvm_config_llvm19.go b/llvm_config_llvm19.go index fea3f0b..a7dcfc3 100644 --- a/llvm_config_llvm19.go +++ b/llvm_config_llvm19.go @@ -15,6 +15,8 @@ package llvm // #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 +// #cgo windows pkg-config: llgo-llvm-19 +// #cgo windows CXXFLAGS: -std=c++17 import "C" type run_build_sh int From dfae085150bfe4fa138874c5a3432aed07c88514 Mon Sep 17 00:00:00 2001 From: Li Jie Date: Sat, 22 Aug 2026 13:21:53 +0800 Subject: [PATCH 3/4] ci: test LLVM 19 bindings on Windows --- .github/workflows/go.yml | 107 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index c3aad07..a29fef7 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -55,6 +55,113 @@ jobs: if: matrix.llvm == 19 run: go test -v + test-windows: + runs-on: windows-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: '1.22' + - name: Set up MSYS2 + uses: msys2/setup-msys2@v2 + with: + msystem: CLANG64 + path-type: inherit + update: true + - name: Install LLVM 19 + shell: msys2 {0} + env: + LLVM_VERSION: '19.1.7' + MSYS2_LLVM_PACKAGE_VERSION: '19.1.7-1' + run: | + set -euo pipefail + + repo=https://repo.msys2.org/mingw/clang64 + prefix=mingw-w64-clang-x86_64 + packages=( + "clang-$MSYS2_LLVM_PACKAGE_VERSION" + "clang-libs-$MSYS2_LLVM_PACKAGE_VERSION" + "compiler-rt-$MSYS2_LLVM_PACKAGE_VERSION" + "llvm-$MSYS2_LLVM_PACKAGE_VERSION" + "llvm-libs-$MSYS2_LLVM_PACKAGE_VERSION" + "lld-$MSYS2_LLVM_PACKAGE_VERSION" + "libc++-$MSYS2_LLVM_PACKAGE_VERSION" + "libunwind-$MSYS2_LLVM_PACKAGE_VERSION" + 'gettext-runtime-0.22.5-2' + 'libffi-3.4.6-1' + 'libiconv-1.17-4' + 'libxml2-2.12.9-2' + 'xz-5.6.3-3' + 'zlib-1.3.1-1' + 'zstd-1.5.6-2' + ) + urls=() + for package in "${packages[@]}"; do + urls+=("$repo/$prefix-$package-any.pkg.tar.zst") + done + + # These archived LLVM 19 packages predate MSYS2's rename of the + # compiler-runtime virtual dependency from gcc-libs to cc-libs. + # libc++ 19 still supplies that runtime, so satisfy only the renamed + # package metadata rather than upgrading the pinned LLVM toolchain. + assumed_cc_runtime="$prefix-cc-libs=$LLVM_VERSION" + pacman --noconfirm -U \ + --assume-installed "$assumed_cc_runtime" \ + "${urls[@]}" + pacman --noconfirm -S --needed \ + --assume-installed "$assumed_cc_runtime" \ + "$prefix-pkgconf" + + for package in clang clang-libs compiler-rt llvm llvm-libs lld libc++ libunwind; do + installed="$(pacman -Q "$prefix-$package" | awk '{print $2}')" + if [[ "$installed" != "$MSYS2_LLVM_PACKAGE_VERSION" ]]; then + echo "expected $package $MSYS2_LLVM_PACKAGE_VERSION, got $installed" >&2 + exit 1 + fi + done + - name: Test LLVM 19 + shell: msys2 {0} + run: | + set -euo pipefail + + llvm_version="$(llvm-config --version)" + if [[ "$llvm_version" != 19.1.7 ]]; then + echo "expected LLVM 19.1.7, got $llvm_version" >&2 + exit 1 + fi + + # The Windows binding keeps LLVM's host flags package-local through + # pkg-config, so they do not affect unrelated CGO packages. + pc_dir="$(cygpath -u "$RUNNER_TEMP")/llgo-llvm-pkgconfig" + mkdir -p "$pc_dir" + cflags="$(llvm-config --cflags | tr '\r\n' ' ')" + ldflags="$(llvm-config --ldflags --libs all --system-libs | tr '\r\n' ' ')" + printf '%s\n' \ + 'Name: LLGo LLVM 19 host' \ + 'Description: LLVM 19 flags used by the LLGo host compiler' \ + "Version: $llvm_version" \ + "Cflags: $cflags" \ + "Libs: $ldflags" \ + > "$pc_dir/llgo-llvm-19.pc" + + export CC=clang + export CXX=clang++ + export CGO_ENABLED=1 + export PKG_CONFIG_PATH="$(cygpath -m "$pc_dir")" + clang --version + go test -v -tags=llvm19 + - name: Test default LLVM + shell: msys2 {0} + run: | + set -euo pipefail + export CC=clang + export CXX=clang++ + export CGO_ENABLED=1 + pc_dir="$(cygpath -u "$RUNNER_TEMP")/llgo-llvm-pkgconfig" + export PKG_CONFIG_PATH="$(cygpath -m "$pc_dir")" + go test -v test-linux-fedora: # Fedora uses different paths than other systems, so testing it separately. runs-on: ubuntu-24.04 From a7dfe6c95b2730f3748cf83bb22f306dd19705c5 Mon Sep 17 00:00:00 2001 From: Li Jie Date: Sat, 22 Aug 2026 16:26:21 +0800 Subject: [PATCH 4/4] llvm: use a neutral LLVM 19 pkg-config name --- .github/workflows/go.yml | 10 +++++----- llvm_config_llvm19.go | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index a29fef7..3ec9809 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -134,17 +134,17 @@ jobs: # The Windows binding keeps LLVM's host flags package-local through # pkg-config, so they do not affect unrelated CGO packages. - pc_dir="$(cygpath -u "$RUNNER_TEMP")/llgo-llvm-pkgconfig" + pc_dir="$(cygpath -u "$RUNNER_TEMP")/llvm-pkgconfig" mkdir -p "$pc_dir" cflags="$(llvm-config --cflags | tr '\r\n' ' ')" ldflags="$(llvm-config --ldflags --libs all --system-libs | tr '\r\n' ' ')" printf '%s\n' \ - 'Name: LLGo LLVM 19 host' \ - 'Description: LLVM 19 flags used by the LLGo host compiler' \ + 'Name: LLVM 19' \ + 'Description: LLVM 19 host compiler and linker flags' \ "Version: $llvm_version" \ "Cflags: $cflags" \ "Libs: $ldflags" \ - > "$pc_dir/llgo-llvm-19.pc" + > "$pc_dir/llvm-19.pc" export CC=clang export CXX=clang++ @@ -159,7 +159,7 @@ jobs: export CC=clang export CXX=clang++ export CGO_ENABLED=1 - pc_dir="$(cygpath -u "$RUNNER_TEMP")/llgo-llvm-pkgconfig" + pc_dir="$(cygpath -u "$RUNNER_TEMP")/llvm-pkgconfig" export PKG_CONFIG_PATH="$(cygpath -m "$pc_dir")" go test -v test-linux-fedora: diff --git a/llvm_config_llvm19.go b/llvm_config_llvm19.go index a7dcfc3..83a0f1a 100644 --- a/llvm_config_llvm19.go +++ b/llvm_config_llvm19.go @@ -15,7 +15,7 @@ package llvm // #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 -// #cgo windows pkg-config: llgo-llvm-19 +// #cgo windows pkg-config: llvm-19 // #cgo windows CXXFLAGS: -std=c++17 import "C"