From d4147e8992bd7d1b038ef178a6a1d6152d794519 Mon Sep 17 00:00:00 2001 From: Hiroshi Yamauchi Date: Thu, 22 Feb 2024 09:12:50 -0800 Subject: [PATCH] Add a workaround for Windows ARM64 miscompile We get libdispatch assert failures with Windows ARM64 release mode in an internal app. We suspect that it is due to Clang miscompile. This is a temporary workaround to avoid them. --- src/CMakeLists.txt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 811e131e0..570c9197f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -124,6 +124,24 @@ else() target_compile_options(dispatch PRIVATE -Wall) endif() +# Work around a release-mode miscompile on windows arm64 +# Disable /Os and /Ot in /O1 and /O2 on queue.c +if(("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") AND + (("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ARM64") OR + ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64"))) + string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE) + set(FLAGS_BUILD_TYPE "${CMAKE_C_FLAGS_${uppercase_CMAKE_BUILD_TYPE}}") + string(REGEX MATCHALL "/[Oo][12]" FLAGS "${CMAKE_C_FLAGS} ${FLAGS_BUILD_TYPE}") + if (FLAGS) + if (FLAGS MATCHES "1$") + set(FLAGS "/Od;/Og;/Oy;/Ob2;/GF;/Gy") + elseif (FLAGS MATCHES "2$") + set(FLAGS "/Od;/Og;/Oi;/Oy;/Ob2;/GF;/Gy") + endif() + set_source_files_properties(queue.c PROPERTIES COMPILE_OPTIONS "${FLAGS}") + endif() +endif() + # FIXME(compnerd) add check for -fblocks? target_compile_options(dispatch PRIVATE -fblocks)