From 1de3be3b8b5f00e941bf893220ad34bd3022d209 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 8 May 2026 19:11:23 -0700 Subject: [PATCH] on windows test clang in release without asan --- .github/workflows/builds.yml | 21 +----- run_tests.bat | 130 +++++++++++++++++++++++------------ 2 files changed, 88 insertions(+), 63 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index ab651b42..5cdba0d5 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -118,30 +118,16 @@ jobs: mode: - debug - release - exclude: - - { compiler: clang, mode: release } # clang runs OOM in release with ASAN steps: - name: checkout uses: actions/checkout@v6 - name: run-torture shell: cmd run: | - rem find path to clang - for /f "tokens=*" %%i in ('where clang') do set clang_path=%%~dpi - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 - - rem set clang path before MSVC's clang path - set PATH=%clang_path%;%PATH% - - rem parse out clang version number out of --version to build path to the folder with ASAN DLL - for /f "tokens=3 delims=. " %%v in ('clang -v 2^>^&1 ^| findstr version') do set clang_version=%%v - if "${{matrix.compiler}}" == "clang" set PATH=%clang_path%..\lib\clang\%clang_version%\lib\windows;%PATH% - - call build meta raddbg_non_graphical || exit /b 1 - call build asan meta torture radlink radbin mule_main mule_module "${{matrix.mode}}" "${{matrix.compiler}}" || exit /b 1 - cd build - torture --gen_crash_dump || exit /b 1 + where clang + clang --version + call run_tests.bat ${{ matrix.compiler }} ${{ matrix.mode }} -- --gen_crash_dump || exit /b 1 - name: upload torture crash dumps if: failure() uses: actions/upload-artifact@v7 @@ -153,4 +139,3 @@ jobs: build/*.pdb build/torture_artifacts/** if-no-files-found: ignore - diff --git a/run_tests.bat b/run_tests.bat index a0651fc5..443c1b8b 100644 --- a/run_tests.bat +++ b/run_tests.bat @@ -1,45 +1,85 @@ -@echo off -setlocal enabledelayedexpansion - -rem Make sure that your VS install does not have LLVM included otherwise this script will use VS clang - -set TARGET_VALUES=radlink radbin mule_main mule_module torture -set CC_VALUES=msvc clang -set MODE_VALUES=debug release - -rem find path to clang -for /f "tokens=*" %%i in ('where clang') do set clang_path=%%~dpi - -rem parse out clang version number out of --version to build path to the folder with ASAN DLL -for /f "tokens=3 delims=. " %%v in ('clang -v 2^>^&1 ^| findstr version') do set clang_version=%%v - -for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( - setlocal - - echo -------------------------------------------------------------------------------- - echo Build %%c+%%m - - rem nuke artifacts from last run - rmdir /s /q build\torture_artifacts - - if "%%c" equ "clang" ( - set PATH=%clang_path%..\lib\clang\%clang_version%\lib\windows;!PATH! - ) - - rem TODO: unblock asan - call build.bat meta %%c %%m raddbg raddbg_non_graphical || exit /b 1 - - rem clang does not compile with asan in release mode because it runs out of memory - if "%%c" equ "clang" ( - call build.bat meta %%c %%m %TARGET_VALUES% || exit /b 1 - ) else ( - call build.bat meta asan %%c %%m %TARGET_VALUES% || exit /b 1 - ) - - pushd build - torture %* || exit /b 1 - popd - - endlocal -) - +@echo off +setlocal enabledelayedexpansion + +set TARGET_VALUES=radlink radbin mule_main mule_module torture +set CC_VALUES=msvc clang +set MODE_VALUES=debug release +set RAW_ARGS=%* +set TORTURE_ARGS= +set RUN_TORTURE=1 + +:parse_args +if "%~1" == "" goto parse_done +if "%~1" == "--" goto parse_torture_args +if /i "%~1" == "msvc" set CC_VALUES=msvc && shift /1 && goto parse_args +if /i "%~1" == "clang" set CC_VALUES=clang && shift /1 && goto parse_args +if /i "%~1" == "debug" set MODE_VALUES=debug && shift /1 && goto parse_args +if /i "%~1" == "release" set MODE_VALUES=release && shift /1 && goto parse_args +if /i "%~1" == "no_torture" set RUN_TORTURE=0 && shift /1 && goto parse_args +echo usage: run_tests.bat [msvc^|clang] [debug^|release] [no_torture] [-- ] +exit /b 1 + +:parse_torture_args +shift /1 +if "%~1" == "" set "TORTURE_ARGS=" && goto parse_done +set "TORTURE_ARGS=%RAW_ARGS%" +if "%TORTURE_ARGS:~0,3%" == "-- " set "TORTURE_ARGS=%TORTURE_ARGS:~3%" && goto parse_done +set "TORTURE_ARGS=%TORTURE_ARGS:* -- =%" + +:parse_done + +for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( + setlocal + + :: nuke artifacts from last run + if exist build/torture_artifacts rmdir /s /q build\torture_artifacts + if exist build\metagen.exe del /q build\metagen.exe + for %%t in (%TARGET_VALUES%) do ( + if exist build\%%t.exe del /q build\%%t.exe + if exist build\%%t.pdb del /q build\%%t.pdb + ) + + if "%%c" == "clang" ( + :: Prefer standalone LLVM clang over Visual Studio clang so ASAN runtime files match the compiler. + set "clang_path=" + for /f "tokens=*" %%i in ('where clang') do ( + set "candidate_clang_path=%%~dpi" + if "!candidate_clang_path:Microsoft Visual Studio=!"=="!candidate_clang_path!" ( + if not defined clang_path set "clang_path=!candidate_clang_path!" + ) + ) + if not defined clang_path ( + echo ERROR: standalone LLVM clang not found in PATH + exit /b 1 + ) + set PATH=!clang_path!;!PATH! + for /f "tokens=3 delims=. " %%v in ('clang -v 2^>^&1 ^| findstr version') do set clang_version=%%v + if not defined clang_version ( + echo ERROR: failed to detect clang version + exit /b 1 + ) + set PATH=!clang_path!..\lib\clang\!clang_version!\lib\windows;!PATH! + ) + + :: TODO: unblock asan + call build.bat meta %%c %%m raddbg raddbg_non_graphical || exit /b 1 + + :: clang does not compile with asan in release mode because it runs out of memory + if "%%c" equ "clang" ( + if /i "%%m" equ "release" ( + call build.bat meta %%c %%m !TARGET_VALUES! || exit /b 1 + ) else ( + call build.bat meta asan %%c %%m !TARGET_VALUES! || exit /b 1 + ) + ) else ( + call build.bat meta asan %%c %%m !TARGET_VALUES! || exit /b 1 + ) + + if "%RUN_TORTURE%" equ "1" ( + pushd build + torture %TORTURE_ARGS% || exit /b 1 + popd + ) + + endlocal +)