Skip to content

Commit 1c67da0

Browse files
authored
Add x64 baseline WebKit builds for Linux and Windows (#171)
* Add x64 baseline WebKit builds for Linux and Windows Linux x64 was pinned to -march=nehalem for all builds in 596e48e. This splits that: default entries get -march=haswell (matching bun's non-baseline target), new -baseline entries keep -march=nehalem. Windows had no arch pin at all. Both WebKit (clang-cl) and ICU (MSVC cl.exe via MSBuild) compiled without -march / /arch:, letting the auto-vectorizer emit AVX2/AVX-512 in ICU's hash and decimal loops with no CPUID gate. Now windows-release.ps1 takes -Baseline and threads /clang:-march= into CMake flags; build-icu.ps1 injects /arch: into the .vcxproj patches (/arch:SSE2 for baseline, /arch:AVX2 otherwise). New artifacts: bun-webkit-linux-amd64-baseline{,-lto} bun-webkit-linux-amd64-musl-baseline{,-lto} bun-webkit-windows-amd64-baseline Supersedes #137. * mac-release: pin clang++ to clang++-21 The C compiler was pinned (clang-21) but the C++ compiler was unqualified clang++. GH Actions macOS runner image changed between Feb 24 and Mar 3 so clang++ now resolves to Apple Clang instead of homebrew LLVM 21. Apple Clang's libc++ doesn't define _LIBCPP_AVAILABILITY_HAS_HASH_MEMORY, so LibcxxHashMemoryShim.cpp compiles to an empty object (__TEXT=0). Bun then fails to link with undefined std::__1::__hash_memory.
1 parent 625984a commit 1c67da0

4 files changed

Lines changed: 99 additions & 13 deletions

File tree

.github/workflows/build-reusable.yml

Lines changed: 68 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,20 @@ jobs:
182182
package_json_arch: "x64"
183183
CMAKE_BUILD_TYPE: "Release"
184184
RELEASE_FLAGS: "-O3 -DNDEBUG=1"
185+
- lto_flag: "-flto=full -fwhole-program-vtables -fforce-emit-vtables"
186+
label: bun-webkit-linux-amd64-baseline-lto
187+
os: linux-x64-gh
188+
package_json_arch: "x64"
189+
CMAKE_BUILD_TYPE: "Release"
190+
RELEASE_FLAGS: "-O3 -DNDEBUG=1"
191+
MARCH_FLAG: "-march=nehalem"
192+
- lto_flag: ""
193+
label: bun-webkit-linux-amd64-baseline
194+
os: linux-x64-gh
195+
package_json_arch: "x64"
196+
CMAKE_BUILD_TYPE: "Release"
197+
RELEASE_FLAGS: "-O3 -DNDEBUG=1"
198+
MARCH_FLAG: "-march=nehalem"
185199
- lto_flag: ""
186200
label: bun-webkit-linux-amd64-asan
187201
os: linux-x64-gh
@@ -218,8 +232,8 @@ jobs:
218232
rm -rf ${{runner.temp}}/bun-webkit ${{runner.temp}}/bun-webkit.tar.gz
219233
if [ "${{matrix.package_json_arch}}" = "arm64" ]; then
220234
export MARCH_FLAG="-march=armv8-a+crc -mtune=ampere1"
221-
elif [ "${{matrix.package_json_arch}}" = "x64" ]; then
222-
export MARCH_FLAG="-march=nehalem"
235+
else
236+
export MARCH_FLAG="${{ matrix.MARCH_FLAG || '-march=haswell' }}"
223237
fi
224238
WEBKIT_RELEASE_TYPE=${{matrix.CMAKE_BUILD_TYPE}} CPU="native" cpu=native LTO_FLAG="${{matrix.lto_flag}}" temp=${{runner.temp}} ENABLE_SANITIZERS="${{matrix.ENABLE_SANITIZERS}}" bash release.sh
225239
cd ${{runner.temp}}
@@ -248,6 +262,12 @@ jobs:
248262
package_json_arch: "x64"
249263
label: bun-webkit-windows-amd64-debug
250264
platform: x64
265+
- runner: windows
266+
build-type: Release
267+
package_json_arch: "x64"
268+
label: bun-webkit-windows-amd64-baseline
269+
platform: x64
270+
baseline: true
251271
- runner: windows-11-arm
252272
build-type: Release
253273
package_json_arch: "arm64"
@@ -312,7 +332,8 @@ jobs:
312332
$env:GITHUB_SHA = "${{ inputs.build_ref }}"
313333
$env:PACKAGE_JSON_ARCH = "${{matrix.package_json_arch}}"
314334
$env:GITHUB_REPOSITORY = "${{ github.repository }}"
315-
./windows-release.ps1 -Platform ${{matrix.platform}}
335+
$baselineArg = if ("${{ matrix.baseline }}" -eq "true") { @("-Baseline") } else { @() }
336+
./windows-release.ps1 -Platform ${{matrix.platform}} @baselineArg
316337
- uses: actions/upload-artifact@v4
317338
with:
318339
name: ${{matrix.label}}
@@ -354,6 +375,18 @@ jobs:
354375
os: linux-x64-gh
355376
package_json_arch: "x64"
356377
CMAKE_BUILD_TYPE: "MinSizeRel"
378+
- lto_flag: "-flto=full -fwhole-program-vtables -fforce-emit-vtables"
379+
label: bun-webkit-linux-amd64-musl-baseline-lto
380+
os: linux-x64-gh
381+
package_json_arch: "x64"
382+
CMAKE_BUILD_TYPE: "MinSizeRel"
383+
MARCH_FLAG: "-march=nehalem"
384+
- lto_flag: ""
385+
label: bun-webkit-linux-amd64-musl-baseline
386+
os: linux-x64-gh
387+
package_json_arch: "x64"
388+
CMAKE_BUILD_TYPE: "MinSizeRel"
389+
MARCH_FLAG: "-march=nehalem"
357390
timeout-minutes: 90
358391
steps:
359392
- uses: actions/checkout@v4
@@ -373,8 +406,8 @@ jobs:
373406
rm -rf ${{runner.temp}}/bun-webkit ${{runner.temp}}/bun-webkit.tar.gz
374407
if [ "${{matrix.package_json_arch}}" = "arm64" ]; then
375408
export MARCH_FLAG="-march=armv8-a+crc -mtune=ampere1"
376-
elif [ "${{matrix.package_json_arch}}" = "x64" ]; then
377-
export MARCH_FLAG="-march=nehalem"
409+
else
410+
export MARCH_FLAG="${{ matrix.MARCH_FLAG || '-march=haswell' }}"
378411
fi
379412
WEBKIT_RELEASE_TYPE=${{matrix.CMAKE_BUILD_TYPE}} CPU="native" cpu=native LTO_FLAG="${{matrix.lto_flag}}" temp=${{runner.temp}} bash musl-release.sh
380413
cd ${{runner.temp}}
@@ -477,10 +510,22 @@ jobs:
477510
with:
478511
name: bun-webkit-linux-arm64-lto
479512
path: ${{runner.temp}}/bun-webkit-linux-arm64-lto
513+
- uses: actions/download-artifact@v4
514+
with:
515+
name: bun-webkit-linux-amd64-baseline
516+
path: ${{runner.temp}}/bun-webkit-linux-amd64-baseline
517+
- uses: actions/download-artifact@v4
518+
with:
519+
name: bun-webkit-linux-amd64-baseline-lto
520+
path: ${{runner.temp}}/bun-webkit-linux-amd64-baseline-lto
480521
- uses: actions/download-artifact@v4
481522
with:
482523
name: bun-webkit-windows-amd64
483524
path: ${{runner.temp}}/bun-webkit-windows-amd64
525+
- uses: actions/download-artifact@v4
526+
with:
527+
name: bun-webkit-windows-amd64-baseline
528+
path: ${{runner.temp}}/bun-webkit-windows-amd64-baseline
484529
- uses: actions/download-artifact@v4
485530
with:
486531
name: bun-webkit-windows-amd64-debug
@@ -517,6 +562,14 @@ jobs:
517562
with:
518563
name: bun-webkit-linux-arm64-musl-lto
519564
path: ${{runner.temp}}/bun-webkit-linux-arm64-musl-lto
565+
- uses: actions/download-artifact@v4
566+
with:
567+
name: bun-webkit-linux-amd64-musl-baseline
568+
path: ${{runner.temp}}/bun-webkit-linux-amd64-musl-baseline
569+
- uses: actions/download-artifact@v4
570+
with:
571+
name: bun-webkit-linux-amd64-musl-baseline-lto
572+
path: ${{runner.temp}}/bun-webkit-linux-amd64-musl-baseline-lto
520573

521574
- name: Rename files
522575
run: |
@@ -541,9 +594,14 @@ jobs:
541594
mv ${{runner.temp}}/bun-webkit-macos-amd64-debug/bun-webkit.tar.gz ./out/bun-webkit-macos-amd64-debug.tar.gz
542595
mv ${{runner.temp}}/bun-webkit-linux-amd64-lto/bun-webkit.tar.gz ./out/bun-webkit-linux-amd64-lto.tar.gz
543596
mv ${{runner.temp}}/bun-webkit-linux-arm64-lto/bun-webkit.tar.gz ./out/bun-webkit-linux-arm64-lto.tar.gz
597+
mv ${{runner.temp}}/bun-webkit-linux-amd64-baseline/bun-webkit.tar.gz ./out/bun-webkit-linux-amd64-baseline.tar.gz
598+
mv ${{runner.temp}}/bun-webkit-linux-amd64-baseline-lto/bun-webkit.tar.gz ./out/bun-webkit-linux-amd64-baseline-lto.tar.gz
544599
mv ${{runner.temp}}/bun-webkit-linux-amd64-musl-lto/bun-webkit.tar.gz ./out/bun-webkit-linux-amd64-musl-lto.tar.gz
545600
mv ${{runner.temp}}/bun-webkit-linux-arm64-musl-lto/bun-webkit.tar.gz ./out/bun-webkit-linux-arm64-musl-lto.tar.gz
601+
mv ${{runner.temp}}/bun-webkit-linux-amd64-musl-baseline/bun-webkit.tar.gz ./out/bun-webkit-linux-amd64-musl-baseline.tar.gz
602+
mv ${{runner.temp}}/bun-webkit-linux-amd64-musl-baseline-lto/bun-webkit.tar.gz ./out/bun-webkit-linux-amd64-musl-baseline-lto.tar.gz
546603
mv ${{runner.temp}}/bun-webkit-windows-amd64/bun-webkit.tar.gz ./out/bun-webkit-windows-amd64.tar.gz
604+
mv ${{runner.temp}}/bun-webkit-windows-amd64-baseline/bun-webkit.tar.gz ./out/bun-webkit-windows-amd64-baseline.tar.gz
547605
mv ${{runner.temp}}/bun-webkit-windows-amd64-debug/bun-webkit.tar.gz ./out/bun-webkit-windows-amd64-debug.tar.gz
548606
mv ${{runner.temp}}/bun-webkit-windows-arm64/bun-webkit.tar.gz ./out/bun-webkit-windows-arm64.tar.gz
549607
mv ${{runner.temp}}/bun-webkit-windows-arm64-debug/bun-webkit.tar.gz ./out/bun-webkit-windows-arm64-debug.tar.gz
@@ -568,6 +626,8 @@ jobs:
568626
./out/bun-webkit-linux-arm64.tar.gz
569627
./out/bun-webkit-linux-amd64-lto.tar.gz
570628
./out/bun-webkit-linux-arm64-lto.tar.gz
629+
./out/bun-webkit-linux-amd64-baseline.tar.gz
630+
./out/bun-webkit-linux-amd64-baseline-lto.tar.gz
571631
./out/bun-webkit-linux-amd64-asan.tar.gz
572632
./out/bun-webkit-linux-arm64-asan.tar.gz
573633
./out/bun-webkit-linux-amd64-debug.tar.gz
@@ -583,6 +643,8 @@ jobs:
583643
./out/bun-webkit-linux-arm64-musl.tar.gz
584644
./out/bun-webkit-linux-amd64-musl-lto.tar.gz
585645
./out/bun-webkit-linux-arm64-musl-lto.tar.gz
646+
./out/bun-webkit-linux-amd64-musl-baseline.tar.gz
647+
./out/bun-webkit-linux-amd64-musl-baseline-lto.tar.gz
586648
./out/bun-webkit-linux-amd64-musl-debug.tar.gz
587649
./out/bun-webkit-linux-arm64-musl-debug.tar.gz
588650
@@ -602,6 +664,7 @@ jobs:
602664
tag_name: ${{ inputs.release_tag }}
603665
files: |
604666
./out/bun-webkit-windows-amd64.tar.gz
667+
./out/bun-webkit-windows-amd64-baseline.tar.gz
605668
./out/bun-webkit-windows-amd64-debug.tar.gz
606669
./out/bun-webkit-windows-arm64.tar.gz
607670
./out/bun-webkit-windows-arm64-debug.tar.gz

build-icu.ps1

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ param(
1616
[ValidateSet("Release", "Debug")]
1717
[string]$BuildType = "Release",
1818

19-
[string]$OutputDir = ""
19+
[string]$OutputDir = "",
20+
21+
[switch]$Baseline
2022
)
2123

2224
$ErrorActionPreference = "Stop"
@@ -73,6 +75,12 @@ if (-not (Test-Path $ICU_SOURCE_DIR)) {
7375
if ($LASTEXITCODE -ne 0) { throw "tar failed with exit code $LASTEXITCODE" }
7476
}
7577

78+
if ($Platform -eq "x64") {
79+
$ArchFlag = if ($Baseline) { "/arch:SSE2" } else { "/arch:AVX2" }
80+
} else {
81+
$ArchFlag = ""
82+
}
83+
7684
# --- Function to patch vcxproj files for static library build with /MT ---
7785
function Patch-IcuVcxProj {
7886
param(
@@ -106,6 +114,10 @@ function Patch-IcuVcxProj {
106114
$content = $content -replace '(<PreprocessorDefinitions>)', '$1U_STATIC_IMPLEMENTATION;'
107115
}
108116

117+
if ($ArchFlag) {
118+
$content = $content -replace '(<ClCompile>)', "`$1`n <AdditionalOptions>$ArchFlag %(AdditionalOptions)</AdditionalOptions>"
119+
}
120+
109121
# Disable /GL - lld-link cannot read LTCG object files
110122
$content = $content -replace '<WholeProgramOptimization>true</WholeProgramOptimization>', '<WholeProgramOptimization>false</WholeProgramOptimization>'
111123

mac-release.bash

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ THIS_DIR=$(pwd)
1010

1111
# Set default values for environment variables that are not set.
1212
CMAKE_C_COMPILER=${CMAKE_C_COMPILER:-clang-21}
13-
CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER:-clang++}
13+
CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER:-clang++-21}
1414
CMAKE_C_FLAGS=${CMAKE_C_FLAGS:-}
1515
CMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS:-}
1616
CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE:-Release}

windows-release.ps1

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
param(
22
[ValidateSet("x64", "ARM64")]
3-
[string]$Platform = "x64"
3+
[string]$Platform = "x64",
4+
5+
[switch]$Baseline
46
)
57
$ErrorActionPreference = "Stop"
68

@@ -41,6 +43,15 @@ clang-cl.exe --version
4143
$env:CC = "clang-cl"
4244
$env:CXX = "clang-cl"
4345

46+
if ($Platform -eq "ARM64") {
47+
$MarchFlag = "/clang:-march=armv8-a+crc /clang:-mtune=ampere1"
48+
} elseif ($Baseline) {
49+
$MarchFlag = "/clang:-march=nehalem"
50+
} else {
51+
$MarchFlag = "/clang:-march=haswell"
52+
}
53+
Write-Host ":: WebKit codegen floor: $MarchFlag"
54+
4455
$output = if ($env:WEBKIT_OUTPUT_DIR) { $env:WEBKIT_OUTPUT_DIR } else { "bun-webkit" }
4556
$WebKitBuild = if ($env:WEBKIT_BUILD_DIR) { $env:WEBKIT_BUILD_DIR } else { "WebKitBuild" }
4657
$CMAKE_BUILD_TYPE = if ($env:CMAKE_BUILD_TYPE) { $env:CMAKE_BUILD_TYPE } else { "Release" }
@@ -52,7 +63,7 @@ $ICU_STATIC_LIBRARY = Join-Path $ICU_STATIC_ROOT "lib"
5263
$ICU_STATIC_INCLUDE_DIR = Join-Path $ICU_STATIC_ROOT "include"
5364

5465
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
55-
& "$ScriptDir/build-icu.ps1" -Platform $Platform -BuildType $CMAKE_BUILD_TYPE -OutputDir $ICU_STATIC_ROOT
66+
& "$ScriptDir/build-icu.ps1" -Platform $Platform -BuildType $CMAKE_BUILD_TYPE -OutputDir $ICU_STATIC_ROOT -Baseline:$Baseline
5667
if ($LASTEXITCODE -ne 0) { throw "build-icu.ps1 failed with exit code $LASTEXITCODE" }
5768

5869
Write-Host ":: Configuring WebKit"
@@ -108,10 +119,10 @@ cmake -S . -B $WebKitBuild `
108119
"-DCMAKE_C_COMPILER=${ClangPath}" `
109120
"-DCMAKE_CXX_COMPILER=${ClangPath}" `
110121
"-DCMAKE_LINKER=${LldLinkPath}" `
111-
"-DCMAKE_C_FLAGS_RELEASE=/Zi /O2 /Ob2 /DNDEBUG /DU_STATIC_IMPLEMENTATION ${ARM64SehWorkaround}" `
112-
"-DCMAKE_CXX_FLAGS_RELEASE=/Zi /O2 /Ob2 /DNDEBUG /DU_STATIC_IMPLEMENTATION /clang:-fno-c++-static-destructors ${ARM64SehWorkaround}" `
113-
"-DCMAKE_C_FLAGS_DEBUG=/Zi /FS /O0 /Ob0 /DU_STATIC_IMPLEMENTATION ${ARM64SehWorkaround}" `
114-
"-DCMAKE_CXX_FLAGS_DEBUG=/Zi /FS /O0 /Ob0 /DU_STATIC_IMPLEMENTATION /clang:-fno-c++-static-destructors ${ARM64SehWorkaround}" `
122+
"-DCMAKE_C_FLAGS_RELEASE=/Zi /O2 /Ob2 /DNDEBUG /DU_STATIC_IMPLEMENTATION ${MarchFlag} ${ARM64SehWorkaround}" `
123+
"-DCMAKE_CXX_FLAGS_RELEASE=/Zi /O2 /Ob2 /DNDEBUG /DU_STATIC_IMPLEMENTATION ${MarchFlag} /clang:-fno-c++-static-destructors ${ARM64SehWorkaround}" `
124+
"-DCMAKE_C_FLAGS_DEBUG=/Zi /FS /O0 /Ob0 /DU_STATIC_IMPLEMENTATION ${MarchFlag} ${ARM64SehWorkaround}" `
125+
"-DCMAKE_CXX_FLAGS_DEBUG=/Zi /FS /O0 /Ob0 /DU_STATIC_IMPLEMENTATION ${MarchFlag} /clang:-fno-c++-static-destructors ${ARM64SehWorkaround}" `
115126
-DENABLE_REMOTE_INSPECTOR=ON `
116127
"-DCMAKE_MSVC_RUNTIME_LIBRARY=${CmakeMsvcRuntimeLibrary}" `
117128
-G Ninja

0 commit comments

Comments
 (0)