github: Build with PGO

Using Frontend instrumentation rather than IR. This gives less
total speedup, but makes the profile much more usable for cross
other build targets.

Build the full Linux toolchain in stage1; this avoids needing to
rebuild runtimes for doing the profiling in stage2, and avoids
needing to wait for stage3 to complete before cross building
for Windows.
This commit is contained in:
Martin Storsjö committed 2025-06-25 11:51:07 +03:00
1 parent 05625eaf62
commit 80fad73644
1 file changed
+53 -15
+53 -15
View File
@@ -97,8 +97,7 @@ jobs:
llvm-mingw-*.tar.xz llvm-mingw-*.tar.xz
retention-days: 7 retention-days: 7
# Build a cross compiler for Linux, targeting Windows. linux-profile:
linux:
if: (github.event_name != 'schedule') || (github.repository == 'mstorsjo/llvm-mingw') if: (github.event_name != 'schedule') || (github.repository == 'mstorsjo/llvm-mingw')
needs: [prepare, linux-stage1] needs: [prepare, linux-stage1]
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
@@ -111,8 +110,42 @@ jobs:
run: | run: |
tar -Jxf llvm-mingw-*.tar.xz tar -Jxf llvm-mingw-*.tar.xz
rm llvm-mingw-*.tar.xz rm llvm-mingw-*.tar.xz
mv llvm-mingw* llvm-mingw-stage1
- name: Build
env:
LLVM_VERSION: ${{needs.prepare.outputs.LLVM_VERSION}}
TAG: ${{needs.prepare.outputs.TAG}}
SOURCE_DATE_EPOCH: ${{needs.prepare.outputs.COMMIT_DATE_UNIX}}
BUILD_DATE: ${{needs.prepare.outputs.BUILD_DATE}}
run: |
# Build LLVM in mostly the same way as it is going to be built in the
# final form.
LLVM_CMAKEFLAGS="-DLLVM_ENABLE_LIBXML2=OFF -DLLDB_ENABLE_PYTHON=OFF" ./build-all.sh --profile $(pwd)/llvm-mingw-stage1
- uses: actions/upload-artifact@v4
with:
name: profile
path: |
profile.profdata
retention-days: 7
# Build a cross compiler for Linux, targeting Windows.
linux:
if: (github.event_name != 'schedule') || (github.repository == 'mstorsjo/llvm-mingw')
needs: [prepare, linux-stage1, linux-profile]
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: linux-stage1-ucrt-x86_64-toolchain
- name: Unpack stage1 Clang
run: |
tar -Jxf llvm-mingw-*.tar.xz
rm llvm-mingw-*.tar.xz
sudo mv llvm-mingw* /opt/llvm-mingw sudo mv llvm-mingw* /opt/llvm-mingw
echo /opt/llvm-mingw/bin >> $GITHUB_PATH - uses: actions/download-artifact@v4
with:
name: profile
- name: Build - name: Build
env: env:
LLVM_VERSION: ${{needs.prepare.outputs.LLVM_VERSION}} LLVM_VERSION: ${{needs.prepare.outputs.LLVM_VERSION}}
@@ -120,12 +153,10 @@ jobs:
SOURCE_DATE_EPOCH: ${{needs.prepare.outputs.COMMIT_DATE_UNIX}} SOURCE_DATE_EPOCH: ${{needs.prepare.outputs.COMMIT_DATE_UNIX}}
BUILD_DATE: ${{needs.prepare.outputs.BUILD_DATE}} BUILD_DATE: ${{needs.prepare.outputs.BUILD_DATE}}
run: | run: |
mkdir -p install
cp -a /opt/llvm-mingw install
# Skip dynamic library dependencies that might make it harder to # Skip dynamic library dependencies that might make it harder to
# run the binaries on other distros (and that have little use within # run the binaries on other distros (and that have little use within
# llvm-mingw). # llvm-mingw).
LLVM_CMAKEFLAGS="-DLLVM_ENABLE_LIBXML2=OFF -DLLDB_ENABLE_PYTHON=OFF" ./build-all.sh $(pwd)/install/llvm-mingw --with-clang --thinlto --llvm-only LLVM_CMAKEFLAGS="-DLLVM_ENABLE_LIBXML2=OFF -DLLDB_ENABLE_PYTHON=OFF" ./build-all.sh /opt/llvm-mingw $(pwd)/install/llvm-mingw --thinlto --pgo --llvm-only
.github/workflows/store-version.sh install/llvm-mingw/versions.txt .github/workflows/store-version.sh install/llvm-mingw/versions.txt
./test-libcxx-module.sh $(pwd)/install/llvm-mingw ./test-libcxx-module.sh $(pwd)/install/llvm-mingw
./run-tests.sh $(pwd)/install/llvm-mingw ./run-tests.sh $(pwd)/install/llvm-mingw
@@ -145,7 +176,7 @@ jobs:
# libraries that were built in the 'linux' step above. # libraries that were built in the 'linux' step above.
linux-cross-aarch64: linux-cross-aarch64:
if: (github.event_name != 'schedule') || (github.repository == 'mstorsjo/llvm-mingw') if: (github.event_name != 'schedule') || (github.repository == 'mstorsjo/llvm-mingw')
needs: [linux-stage1, prepare] needs: [linux-stage1, linux-profile, prepare]
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
@@ -157,7 +188,9 @@ jobs:
tar -Jxf llvm-mingw-*.tar.xz tar -Jxf llvm-mingw-*.tar.xz
rm llvm-mingw-*.tar.xz rm llvm-mingw-*.tar.xz
sudo mv llvm-mingw* /opt/llvm-mingw sudo mv llvm-mingw* /opt/llvm-mingw
echo /opt/llvm-mingw/bin >> $GITHUB_PATH - uses: actions/download-artifact@v4
with:
name: profile
- name: Build - name: Build
env: env:
LLVM_VERSION: ${{needs.prepare.outputs.LLVM_VERSION}} LLVM_VERSION: ${{needs.prepare.outputs.LLVM_VERSION}}
@@ -165,7 +198,7 @@ jobs:
SOURCE_DATE_EPOCH: ${{needs.prepare.outputs.COMMIT_DATE_UNIX}} SOURCE_DATE_EPOCH: ${{needs.prepare.outputs.COMMIT_DATE_UNIX}}
run: | run: |
sudo apt-get update && sudo apt-get install g++-aarch64-linux-gnu sudo apt-get update && sudo apt-get install g++-aarch64-linux-gnu
./build-all.sh $(pwd)/install/llvm-mingw --no-runtimes --host=aarch64-linux-gnu --with-clang --thinlto ./build-all.sh /opt/llvm-mingw $(pwd)/install/llvm-mingw --no-runtimes --host=aarch64-linux-gnu --thinlto --pgo
.github/workflows/store-version.sh install/llvm-mingw/versions.txt .github/workflows/store-version.sh install/llvm-mingw/versions.txt
- name: Assemble the cross-built toolchain - name: Assemble the cross-built toolchain
run: | run: |
@@ -259,7 +292,7 @@ jobs:
# Build a cross compiler for macOS, targeting Windows. # Build a cross compiler for macOS, targeting Windows.
macos: macos:
if: (github.event_name != 'schedule') || (github.repository == 'mstorsjo/llvm-mingw') if: (github.event_name != 'schedule') || (github.repository == 'mstorsjo/llvm-mingw')
needs: [prepare, macos-stage1] needs: [prepare, macos-stage1, linux-profile]
runs-on: macos-latest runs-on: macos-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
@@ -271,7 +304,9 @@ jobs:
tar -Jxf llvm-*.tar.xz tar -Jxf llvm-*.tar.xz
rm llvm-*.tar.xz rm llvm-*.tar.xz
mv llvm* $HOME/llvm mv llvm* $HOME/llvm
echo $HOME/llvm/bin >> $GITHUB_PATH - uses: actions/download-artifact@v4
with:
name: profile
- name: Build - name: Build
env: env:
LLVM_VERSION: ${{needs.prepare.outputs.LLVM_VERSION}} LLVM_VERSION: ${{needs.prepare.outputs.LLVM_VERSION}}
@@ -285,8 +320,7 @@ jobs:
# form. Therefore, autodetection will pick them up, but linking # form. Therefore, autodetection will pick them up, but linking
# universal binaries fails as those libraries are unavailable in the # universal binaries fails as those libraries are unavailable in the
# other (x86_64) architecture form. # other (x86_64) architecture form.
export SDKROOT=$(xcrun --show-sdk-path) MACOS_REDIST=1 LLVM_CMAKEFLAGS="-DLLVM_ENABLE_ZSTD=OFF -DLLDB_ENABLE_PYTHON=OFF" ./build-all.sh $HOME/llvm $(pwd)/install/llvm-mingw --thinlto --pgo
MACOS_REDIST=1 LLVM_CMAKEFLAGS="-DLLVM_ENABLE_ZSTD=OFF -DLLDB_ENABLE_PYTHON=OFF" ./build-all.sh $(pwd)/install/llvm-mingw --with-clang --thinlto
.github/workflows/store-version.sh install/llvm-mingw/versions.txt .github/workflows/store-version.sh install/llvm-mingw/versions.txt
./test-libcxx-module.sh $(pwd)/install/llvm-mingw ./test-libcxx-module.sh $(pwd)/install/llvm-mingw
./run-tests.sh $(pwd)/install/llvm-mingw ./run-tests.sh $(pwd)/install/llvm-mingw
@@ -363,7 +397,7 @@ jobs:
# architectures). The binaries built here match actual releases quite closely. # architectures). The binaries built here match actual releases quite closely.
linux-cross-windows: linux-cross-windows:
if: (github.event_name != 'schedule') || (github.repository == 'mstorsjo/llvm-mingw') if: (github.event_name != 'schedule') || (github.repository == 'mstorsjo/llvm-mingw')
needs: [linux-stage1, prepare] needs: [linux-stage1, linux-profile, prepare]
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
fail-fast: false fail-fast: false
@@ -384,6 +418,9 @@ jobs:
sudo mv llvm-mingw* /opt/llvm-mingw sudo mv llvm-mingw* /opt/llvm-mingw
echo /opt/llvm-mingw/bin >> $GITHUB_PATH echo /opt/llvm-mingw/bin >> $GITHUB_PATH
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: profile
- name: Build - name: Build
env: env:
LLVM_VERSION: ${{needs.prepare.outputs.LLVM_VERSION}} LLVM_VERSION: ${{needs.prepare.outputs.LLVM_VERSION}}
@@ -394,7 +431,7 @@ jobs:
BUILD_DATE: ${{needs.prepare.outputs.BUILD_DATE}} BUILD_DATE: ${{needs.prepare.outputs.BUILD_DATE}}
run: | run: |
sudo apt-get update && sudo apt-get install libltdl-dev swig autoconf-archive sudo apt-get update && sudo apt-get install libltdl-dev swig autoconf-archive
./build-cross-tools.sh /opt/llvm-mingw $(pwd)/install/llvm-mingw ${{matrix.arch}} --with-python --thinlto ./build-cross-tools.sh /opt/llvm-mingw $(pwd)/install/llvm-mingw ${{matrix.arch}} --with-python --thinlto --pgo
.github/workflows/store-version.sh install/llvm-mingw/versions.txt .github/workflows/store-version.sh install/llvm-mingw/versions.txt
cd install cd install
NAME=llvm-mingw-$TAG-${{matrix.crt}}-${{matrix.arch}} NAME=llvm-mingw-$TAG-${{matrix.crt}}-${{matrix.arch}}
@@ -774,6 +811,7 @@ jobs:
rm -rf msys2* rm -rf msys2*
rm -rf linux-stage1-* rm -rf linux-stage1-*
rm -rf macos-llvm* rm -rf macos-llvm*
rm -rf profile*
mv *-toolchain/*.zip *-toolchain/*.tar.xz . mv *-toolchain/*.zip *-toolchain/*.tar.xz .
- name: Upload binaries - name: Upload binaries
env: env: