Skip to content

[windows][toolchain] Enable builtins and sanitizers #77770

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Dec 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 48 additions & 3 deletions cmake/caches/Windows-aarch64.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -26,21 +26,65 @@ set(LLVM_DEFAULT_TARGET_TRIPLE aarch64-unknown-windows-msvc CACHE STRING "")
set(LLVM_APPEND_VC_REV NO CACHE BOOL "")
set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR YES CACHE BOOL "")
set(LLVM_ENABLE_PYTHON YES CACHE BOOL "")
set(LLVM_RUNTIME_TARGETS

set(default_targets
x86_64-unknown-windows-msvc
aarch64-unknown-windows-msvc
CACHE STRING "")
i686-unknown-windows-msvc)
set(LLVM_RUNTIME_TARGETS ${default_targets} CACHE STRING "")

# Build the android builtins if NDK path is provided.
if(NOT "$ENV{NDKPATH}" STREQUAL "")
list(APPEND default_targets
aarch64-unknown-linux-android
x86_64-unknown-linux-android
i686-unknown-linux-android
armv7-unknown-linux-androideabi)
endif()

set(LLVM_BUILTIN_TARGETS ${default_targets} CACHE STRING "")

foreach(target ${LLVM_RUNTIME_TARGETS})
set(RUNTIMES_${target}_LLVM_ENABLE_RUNTIMES
compiler-rt
CACHE STRING "")
set(RUNTIMES_${target}_CMAKE_MT mt CACHE STRING "")
set(RUNTIMES_${target}_CMAKE_SYSTEM_NAME Windows CACHE STRING "")
set(RUNTIMES_${target}_CMAKE_BUILD_TYPE Release CACHE STRING "")
set(RUNTIMES_${target}_COMPILER_RT_BUILD_BUILTINS YES CACHE BOOL "")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm slightly worried about this as this is the "legacy" path - the builtins build I thought was being replaced with the runtimes build.

Copy link
Member Author

@weliveindetail weliveindetail Dec 3, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My understanding was that this option lets the runtimes build include llvm-project\compiler-rt\lib\builtins which results in a builtins-<triple> build-tree next to the runtimes-<triple> one in the runtimes build directory. I don't see a deprecation warning in CMake, neither swiftlang not upstream https://github.com/llvm/llvm-project/blob/c9fbabfdc92f12b2b0148762e6e789157a172e4d/compiler-rt/lib/CMakeLists.txt#L16 I might be wrong though.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, double-checked: I should should switch this off as we get duplicate build artifacts in:

runtimes\runtimes-x86_64-unknown-windows-msvc-bins\compiler-rt\lib\builtins
runtimes\builtins-x86_64-unknown-windows-msvc-bins

set(RUNTIMES_${target}_COMPILER_RT_BUILD_CRT NO CACHE BOOL "")
set(RUNTIMES_${target}_COMPILER_RT_BUILD_LIBFUZZER NO CACHE BOOL "")
set(RUNTIMES_${target}_COMPILER_RT_BUILD_ORC NO CACHE BOOL "")
set(RUNTIMES_${target}_COMPILER_RT_BUILD_PROFILE YES CACHE BOOL "")
set(RUNTIMES_${target}_COMPILER_RT_BUILD_SANITIZERS NO CACHE BOOL "")
set(RUNTIMES_${target}_COMPILER_RT_BUILD_XRAY NO CACHE BOOL "")
# Sanitizers will be configured, but not built. We have separate build
# steps for that, because we need a different shell for each target.
set(RUNTIMES_${target}_COMPILER_RT_BUILD_SANITIZERS NO CACHE BOOL "")
endforeach()

foreach(target ${LLVM_BUILTIN_TARGETS})
set(BUILTINS_${target}_CMAKE_MT mt CACHE STRING "")
if(${target} MATCHES windows-msvc)
set(BUILTINS_${target}_CMAKE_SYSTEM_NAME Windows CACHE STRING "")
elseif(${target} MATCHES linux-android)
# Use a single 'linux' directory and arch-based lib names on Android.
set(BUILTINS_${target}_LLVM_ENABLE_PER_TARGET_RUNTIME_DIR NO CACHE BOOL "")
set(BUILTINS_${target}_CMAKE_SYSTEM_NAME Android CACHE STRING "")
if(${target} MATCHES aarch64)
set(BUILTINS_${target}_CMAKE_ANDROID_ARCH_ABI arm64-v8a CACHE STRING "")
elseif(${target} MATCHES armv7)
set(BUILTINS_${target}_CMAKE_ANDROID_ARCH_ABI armeabi-v7a CACHE STRING "")
elseif(${target} MATCHES i686)
set(BUILTINS_${target}_CMAKE_ANDROID_ARCH_ABI x86 CACHE STRING "")
else()
set(BUILTINS_${target}_CMAKE_ANDROID_ARCH_ABI x86_64 CACHE STRING "")
endif()
set(BUILTINS_${target}_CMAKE_ANDROID_NDK $ENV{NDKPATH} CACHE PATH "")
set(BUILTINS_${target}_CMAKE_ANDROID_API 21 CACHE STRING "")
set(BUILTINS_${target}_CMAKE_C_COMPILER_TARGET "${target}21" CACHE STRING "")
set(BUILTINS_${target}_CMAKE_CXX_COMPILER_TARGET "${target}21" CACHE STRING "")
endif()
set(BUILTINS_${target}_CMAKE_BUILD_TYPE Release CACHE STRING "")
endforeach()

set(LLVM_TARGETS_TO_BUILD AArch64 ARM WebAssembly X86 CACHE STRING "")
Expand Down Expand Up @@ -165,6 +209,7 @@ set(LLVM_DISTRIBUTION_COMPONENTS
libclang
libclang-headers
LTO
builtins
runtimes
${LLVM_TOOLCHAIN_TOOLS}
${CLANG_TOOLS}
Expand Down
32 changes: 18 additions & 14 deletions cmake/caches/Windows-x86_64.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -27,24 +27,22 @@ set(LLVM_APPEND_VC_REV NO CACHE BOOL "")
set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR YES CACHE BOOL "")
set(LLVM_ENABLE_PYTHON YES CACHE BOOL "")

set(DEFAULT_BUILTIN_TARGETS
set(default_targets
x86_64-unknown-windows-msvc
aarch64-unknown-windows-msvc)
aarch64-unknown-windows-msvc
i686-unknown-windows-msvc)
set(LLVM_RUNTIME_TARGETS ${default_targets} CACHE STRING "")

# Build the android builtins if NDK path is provided.
if(NOT "$ENV{NDKPATH}" STREQUAL "")
list(APPEND DEFAULT_BUILTIN_TARGETS
list(APPEND default_targets
aarch64-unknown-linux-android
x86_64-unknown-linux-android)
x86_64-unknown-linux-android
i686-unknown-linux-android
armv7-unknown-linux-androideabi)
endif()

# The builtin targets are used to build the compiler-rt builtins.
set(LLVM_BUILTIN_TARGETS ${DEFAULT_BUILTIN_TARGETS} CACHE STRING "")

# The runtime targets are used to build the compiler-rt profile library.
set(LLVM_RUNTIME_TARGETS
x86_64-unknown-windows-msvc
aarch64-unknown-windows-msvc
CACHE STRING "")
set(LLVM_BUILTIN_TARGETS ${default_targets} CACHE STRING "")

foreach(target ${LLVM_RUNTIME_TARGETS})
set(RUNTIMES_${target}_LLVM_ENABLE_RUNTIMES
Expand All @@ -53,13 +51,15 @@ foreach(target ${LLVM_RUNTIME_TARGETS})
set(RUNTIMES_${target}_CMAKE_MT mt CACHE STRING "")
set(RUNTIMES_${target}_CMAKE_SYSTEM_NAME Windows CACHE STRING "")
set(RUNTIMES_${target}_CMAKE_BUILD_TYPE Release CACHE STRING "")
set(RUNTIMES_${target}_COMPILER_RT_BUILD_BUILTINS NO CACHE BOOL "")
set(RUNTIMES_${target}_COMPILER_RT_BUILD_BUILTINS YES CACHE BOOL "")
set(RUNTIMES_${target}_COMPILER_RT_BUILD_CRT NO CACHE BOOL "")
set(RUNTIMES_${target}_COMPILER_RT_BUILD_LIBFUZZER NO CACHE BOOL "")
set(RUNTIMES_${target}_COMPILER_RT_BUILD_ORC NO CACHE BOOL "")
set(RUNTIMES_${target}_COMPILER_RT_BUILD_PROFILE YES CACHE BOOL "")
set(RUNTIMES_${target}_COMPILER_RT_BUILD_SANITIZERS NO CACHE BOOL "")
set(RUNTIMES_${target}_COMPILER_RT_BUILD_XRAY NO CACHE BOOL "")
# Sanitizers will be configured, but not built. We have separate build
# steps for that, because we need a different shell for each target.
set(RUNTIMES_${target}_COMPILER_RT_BUILD_SANITIZERS NO CACHE BOOL "")
endforeach()

foreach(target ${LLVM_BUILTIN_TARGETS})
Expand All @@ -72,6 +72,10 @@ foreach(target ${LLVM_BUILTIN_TARGETS})
set(BUILTINS_${target}_CMAKE_SYSTEM_NAME Android CACHE STRING "")
if(${target} MATCHES aarch64)
set(BUILTINS_${target}_CMAKE_ANDROID_ARCH_ABI arm64-v8a CACHE STRING "")
elseif(${target} MATCHES armv7)
set(BUILTINS_${target}_CMAKE_ANDROID_ARCH_ABI armeabi-v7a CACHE STRING "")
elseif(${target} MATCHES i686)
set(BUILTINS_${target}_CMAKE_ANDROID_ARCH_ABI x86 CACHE STRING "")
else()
set(BUILTINS_${target}_CMAKE_ANDROID_ARCH_ABI x86_64 CACHE STRING "")
endif()
Expand Down
2 changes: 2 additions & 0 deletions test/Driver/sanitize_coverage.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// UNSUPPORTED: OS=windows-msvc

// Different sanitizer coverage types
// RUN: %swiftc_driver -driver-print-jobs -sanitize-coverage=func -sanitize=address %s | %FileCheck -check-prefix=SANCOV_FUNC %s
// RUN: %swiftc_driver -driver-print-jobs -sanitize-coverage=bb -sanitize=address %s | %FileCheck -check-prefix=SANCOV_BB %s
Expand Down
1 change: 1 addition & 0 deletions test/IRGen/address_sanitizer_use_odr_indicator.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// UNSUPPORTED: OS=windows-msvc
// REQUIRES: asan_runtime

// Default instrumentation that does not use ODR indicators
Expand Down
2 changes: 2 additions & 0 deletions test/Interpreter/indirect_enum.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// UNSUPPORTED: OS=windows-msvc

// RUN: %target-swiftc_driver %s -g -sanitize=address -o %t_asan-binary
// RUN: %target-codesign %t_asan-binary
// RUN: env ASAN_OPTIONS=detect_leaks=0 %target-run %t_asan-binary
Expand Down
1 change: 1 addition & 0 deletions test/Reflection/typeref_decoding_asan.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// UNSUPPORTED: OS=linux-gnu && CPU=aarch64
// UNSUPPORTED: OS=windows-msvc

// rdar://100805115
// UNSUPPORTED: CPU=arm64e
Expand Down
2 changes: 2 additions & 0 deletions test/Sanitizers/asan/asan.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// UNSUPPORTED: OS=windows-msvc

// RUN: %target-swiftc_driver %s -g -sanitize=address -o %t_asan-binary
// RUN: %target-codesign %t_asan-binary
// RUN: env %env-ASAN_OPTIONS=abort_on_error=0 not %target-run %t_asan-binary 2>&1 | %FileCheck %s
Expand Down
1 change: 1 addition & 0 deletions test/Sanitizers/sanitizer_coverage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
// For now restrict this test to platforms where we know this test will pass
// REQUIRES: CPU=x86_64
// UNSUPPORTED: remote_run
// UNSUPPORTED: OS=windows-msvc

func sayHello() {
print("Hello")
Expand Down
20 changes: 20 additions & 0 deletions utils/build.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -1764,6 +1764,21 @@ function Build-CURL([Platform]$Platform, $Arch) {
})
}

function Build-Sanitizers([Platform]$Platform, $Arch, $InstallTo) {
Isolate-EnvVars {
# Use configured compilers
Build-CMakeProject `
-Src $SourceCache\llvm-project\runtimes `
-Bin "$(Get-HostProjectBinaryCache Compilers)\runtimes\runtimes-$($Arch.LLVMTarget)-bins" `
-InstallTo $InstallTo `
-Arch $Arch `
-Platform $Platform `
-Defines (@{
COMPILER_RT_BUILD_SANITIZERS = "YES"
})
}
}

function Build-Runtime([Platform]$Platform, $Arch) {
$PlatformDefines = @{}
if ($Platform -eq "Android") {
Expand Down Expand Up @@ -2756,6 +2771,11 @@ if (-not $SkipBuild) {

Invoke-BuildStep Build-CMark $HostArch
Invoke-BuildStep Build-Compilers $HostArch

$InstallTo = "$($HostArch.ToolchainInstallRoot)\usr"
foreach ($Arch in $WindowsSDKArchs) {
Invoke-BuildStep Build-Sanitizers Windows $Arch $InstallTo
}
}

if ($Clean) {
Expand Down