Index: compiler-rt/trunk/cmake/config-ix.cmake =================================================================== --- compiler-rt/trunk/cmake/config-ix.cmake +++ compiler-rt/trunk/cmake/config-ix.cmake @@ -317,13 +317,13 @@ # We're setting the flag manually for each target OS set(CMAKE_OSX_DEPLOYMENT_TARGET "") - + set(DARWIN_COMMON_CFLAGS -stdlib=libc++) set(DARWIN_COMMON_LINK_FLAGS -stdlib=libc++ -lc++ -lc++abi) - + check_linker_flag("-fapplication-extension" COMPILER_RT_HAS_APP_EXTENSION) if(COMPILER_RT_HAS_APP_EXTENSION) list(APPEND DARWIN_COMMON_LINK_FLAGS "-fapplication-extension") @@ -344,7 +344,7 @@ # Figure out which arches to use for each OS darwin_get_toolchain_supported_archs(toolchain_arches) message(STATUS "Toolchain supported arches: ${toolchain_arches}") - + if(NOT MACOSX_VERSION_MIN_FLAG) darwin_test_archs(osx DARWIN_osx_ARCHS @@ -648,10 +648,7 @@ endif() if (COMPILER_RT_HAS_SANITIZER_COMMON AND FUZZER_SUPPORTED_ARCH AND - OS_NAME MATCHES "Android|Darwin|Linux|NetBSD|FreeBSD|OpenBSD|Fuchsia|Windows" AND - # TODO: Support builds with MSVC. - NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" AND - NOT "${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") + OS_NAME MATCHES "Android|Darwin|Linux|NetBSD|FreeBSD|OpenBSD|Fuchsia|Windows") set(COMPILER_RT_HAS_FUZZER TRUE) else() set(COMPILER_RT_HAS_FUZZER FALSE) Index: compiler-rt/trunk/lib/fuzzer/CMakeLists.txt =================================================================== --- compiler-rt/trunk/lib/fuzzer/CMakeLists.txt +++ compiler-rt/trunk/lib/fuzzer/CMakeLists.txt @@ -71,8 +71,14 @@ list(APPEND LIBFUZZER_CFLAGS -fno-sanitize-coverage=trace-pc-guard,edge,trace-cmp,indirect-calls,8bit-counters) endif() -if(NOT HAS_THREAD_LOCAL) - list(APPEND LIBFUZZER_CFLAGS -Dthread_local=__thread) +if(OS_NAME MATCHES "Windows") + # Silence warnings with /Ehsc and avoid an error by unecessarily defining + # thread_local when it isn't even used on Windows. + list(APPEND LIBFUZZER_CFLAGS /EHsc) +else() + if(NOT HAS_THREAD_LOCAL) + list(APPEND LIBFUZZER_CFLAGS -Dthread_local=__thread) + endif() endif() set(FUZZER_SUPPORTED_OS ${SANITIZER_COMMON_SUPPORTED_OS}) Index: compiler-rt/trunk/lib/fuzzer/FuzzerBuiltinsMsvc.h =================================================================== --- compiler-rt/trunk/lib/fuzzer/FuzzerBuiltinsMsvc.h +++ compiler-rt/trunk/lib/fuzzer/FuzzerBuiltinsMsvc.h @@ -24,7 +24,7 @@ // __builtin_return_address() cannot be compiled with MSVC. Use the equivalent // from -#define GET_CALLER_PC() reinterpret_cast(_ReturnAddress()) +#define GET_CALLER_PC() _ReturnAddress() namespace fuzzer { Index: compiler-rt/trunk/lib/fuzzer/FuzzerSHA1.cpp =================================================================== --- compiler-rt/trunk/lib/fuzzer/FuzzerSHA1.cpp +++ compiler-rt/trunk/lib/fuzzer/FuzzerSHA1.cpp @@ -31,7 +31,8 @@ #ifdef __BIG_ENDIAN__ # define SHA_BIG_ENDIAN -#elif defined __LITTLE_ENDIAN__ +// Windows is always little endian and MSVC doesn't have +#elif defined __LITTLE_ENDIAN__ || LIBFUZZER_WINDOWS /* override */ #elif defined __BYTE_ORDER # if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ Index: compiler-rt/trunk/lib/fuzzer/FuzzerValueBitMap.h =================================================================== --- compiler-rt/trunk/lib/fuzzer/FuzzerValueBitMap.h +++ compiler-rt/trunk/lib/fuzzer/FuzzerValueBitMap.h @@ -34,7 +34,7 @@ uintptr_t WordIdx = Idx / kBitsInWord; uintptr_t BitIdx = Idx % kBitsInWord; uintptr_t Old = Map[WordIdx]; - uintptr_t New = Old | (1UL << BitIdx); + uintptr_t New = Old | (1ULL << BitIdx); Map[WordIdx] = New; return New != Old; } @@ -48,7 +48,7 @@ assert(Idx < kMapSizeInBits); uintptr_t WordIdx = Idx / kBitsInWord; uintptr_t BitIdx = Idx % kBitsInWord; - return Map[WordIdx] & (1UL << BitIdx); + return Map[WordIdx] & (1ULL << BitIdx); } size_t SizeInBits() const { return kMapSizeInBits; }