From 1384a101b58dad287e4d96be5d9c8b949a848f4f Mon Sep 17 00:00:00 2001 From: Adam Perry Date: Mon, 8 Jun 2026 23:07:53 +0000 Subject: [PATCH] bazel: link Windows ARM64 V8 with powl --- .github/workflows/bazel.yml | 13 +++++++++++++ BUILD.bazel | 17 +++++++++++++++++ MODULE.bazel | 1 + patches/BUILD.bazel | 1 + patches/llvm_windows_arm64_powl.patch | 24 ++++++++++++++++++++++++ windows_platform_test.sh | 5 +++++ 6 files changed, 61 insertions(+) create mode 100644 patches/llvm_windows_arm64_powl.patch diff --git a/.github/workflows/bazel.yml b/.github/workflows/bazel.yml index 9cf1fa0568..4e33d23a67 100644 --- a/.github/workflows/bazel.yml +++ b/.github/workflows/bazel.yml @@ -578,6 +578,19 @@ jobs: -- \ @crates//:openssl-sys + # Link source-built V8 under Windows ARM64 so MinGW runtime gaps fail + # here instead of in the full release bundle. + ./.github/scripts/run-bazel-ci.sh \ + --print-failed-action-summary \ + -- \ + build \ + --platforms=//:release_windows_arm64 \ + --extra_toolchains=//:windows_arm64_gnullvm_tests_on_linux_host_toolchain \ + --build_metadata=COMMIT_SHA=${GITHUB_SHA} \ + --build_metadata=TAG_job=verify-release-v8-windows-arm64 \ + -- \ + //codex-rs/v8-poc:v8-poc-unit-tests + # Keep the documented `just build-for-release` target's remaining # platform transitions covered by analysis. ./.github/scripts/run-bazel-ci.sh \ diff --git a/BUILD.bazel b/BUILD.bazel index 6dfec359f4..e71ce4fa68 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -118,11 +118,28 @@ toolchain( toolchain_type = "@bazel_tools//tools/test:default_test_toolchain_type", ) +toolchain( + name = "windows_arm64_gnullvm_tests_on_linux_host_toolchain", + exec_compatible_with = [ + "@platforms//cpu:x86_64", + "@platforms//os:linux", + ], + target_compatible_with = [ + "@llvm//constraints/windows_abi:gnullvm", + "@platforms//cpu:aarch64", + "@platforms//os:windows", + "@rules_rs//rs/experimental/platforms/constraints:windows_gnullvm", + ], + toolchain = "@bazel_tools//tools/test:empty_toolchain", + toolchain_type = "@bazel_tools//tools/test:default_test_toolchain_type", +) + windows_platform_declarations_test( name = "windows_platform_declarations_test", data = [ "BUILD.bazel", "MODULE.bazel", + "//patches:llvm_windows_arm64_powl.patch", "//patches:llvm_windows_gnullvm_abi.patch", ], script = "windows_platform_test.sh", diff --git a/MODULE.bazel b/MODULE.bazel index 335aa95ce1..80550b6f52 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -11,6 +11,7 @@ single_version_override( patch_strip = 1, patches = [ "//patches:llvm_rusty_v8_custom_libcxx.patch", + "//patches:llvm_windows_arm64_powl.patch", "//patches:llvm_windows_gnullvm_abi.patch", "//patches:llvm_windows_symlink_extract.patch", ], diff --git a/patches/BUILD.bazel b/patches/BUILD.bazel index aaabadb092..6201f4fc8c 100644 --- a/patches/BUILD.bazel +++ b/patches/BUILD.bazel @@ -5,6 +5,7 @@ exports_files([ "aws-lc-sys_windows_msvc_memcmp_probe.patch", "bzip2_windows_stack_args.patch", "llvm_rusty_v8_custom_libcxx.patch", + "llvm_windows_arm64_powl.patch", "llvm_windows_gnullvm_abi.patch", "llvm_windows_symlink_extract.patch", "rules_rust_windows_bootstrap_process_wrapper_linker.patch", diff --git a/patches/llvm_windows_arm64_powl.patch b/patches/llvm_windows_arm64_powl.patch new file mode 100644 index 0000000000..954b71fd0f --- /dev/null +++ b/patches/llvm_windows_arm64_powl.patch @@ -0,0 +1,24 @@ +# What: provide and link MinGW's ARM64 long-double `powl` compatibility shim. +# Why: Windows ARM64 uses 64-bit long doubles, but LLVM's Bazel source list +# omits the upstream `powl -> pow` implementation and its default link flags +# omit the MinGW extension archive that owns the shim. + +diff --git a/runtimes/mingw/crt_sources.bzl b/runtimes/mingw/crt_sources.bzl +--- a/runtimes/mingw/crt_sources.bzl ++++ b/runtimes/mingw/crt_sources.bzl +@@ -420,4 +420,5 @@ + MINGWEX_ARM64_SRCS = [ ++ "math/arm-common/powl.c", + "math/sincos.c", + "math/sincosf.c", + "math/arm-common/sincosl.c", +diff --git a/toolchain/args/windows/BUILD.bazel b/toolchain/args/windows/BUILD.bazel +--- a/toolchain/args/windows/BUILD.bazel ++++ b/toolchain/args/windows/BUILD.bazel +@@ -50,5 +50,6 @@ cc_args( + # For now, we force on ucrt. + # TODO(cerisier): make this either a constraint or a build setting ++ "-lmingwex", + "-lucrt", + ], + data = [ diff --git a/windows_platform_test.sh b/windows_platform_test.sh index 585bd96954..37918507cb 100755 --- a/windows_platform_test.sh +++ b/windows_platform_test.sh @@ -6,6 +6,7 @@ workspace="${TEST_SRCDIR}/${TEST_WORKSPACE}" build_file="${workspace}/BUILD.bazel" module_file="${workspace}/MODULE.bazel" llvm_patch="${workspace}/patches/llvm_windows_gnullvm_abi.patch" +llvm_runtime_patch="${workspace}/patches/llvm_windows_arm64_powl.patch" require_line() { local file="$1" @@ -43,5 +44,9 @@ require_platform_constraint local_windows "@llvm//constraints/windows_abi:gnullv require_platform_constraint local_windows_msvc "@llvm//constraints/windows_abi:msvc" require_platform_constraint windows_x86_64_gnullvm "@llvm//constraints/windows_abi:gnullvm" require_platform_constraint windows_x86_64_msvc "@llvm//constraints/windows_abi:msvc" +require_platform_constraint release_windows_arm64 "@llvm//constraints/windows_abi:gnullvm" require_line "$module_file" ' "//patches:llvm_windows_gnullvm_abi.patch",' +require_line "$module_file" ' "//patches:llvm_windows_arm64_powl.patch",' require_count 2 "$llvm_patch" '+ "@llvm//constraints/windows_abi:gnullvm",' +require_line "$llvm_runtime_patch" '+ "math/arm-common/powl.c",' +require_line "$llvm_runtime_patch" '+ "-lmingwex",'