diff options
author | Jonathan Metzman <metzman@chromium.org> | 2019-01-22 18:59:25 +0000 |
---|---|---|
committer | Jonathan Metzman <metzman@chromium.org> | 2019-01-22 18:59:25 +0000 |
commit | e4e52f63756f5d5639809ca6c44e3d745744780a (patch) | |
tree | 9ddd949c5bf7023816eb37bc7ed515aa0e48acc8 | |
parent | ca5da89cdde6d31218a580dcf331afa3fe4bfdad (diff) | |
download | compiler-rt-e4e52f63756f5d5639809ca6c44e3d745744780a.tar.gz |
[libFuzzer][MSVC] Enable building libFuzzer with MSVC
Summary:
Enable building libFuzzer with MSVC.
* Don't try to include <endian.h> in FuzzerSHA1.cpp. MSVC
doesn't have this header, and WINDOWS is always little
endian (even on ARM)
Subscribers: srhines, mgorny, javed.absar, kristof.beyls
Differential Revision: https://reviews.llvm.org/D56510
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@351855 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | cmake/config-ix.cmake | 11 | ||||
-rw-r--r-- | lib/fuzzer/CMakeLists.txt | 10 | ||||
-rw-r--r-- | lib/fuzzer/FuzzerBuiltinsMsvc.h | 2 | ||||
-rw-r--r-- | lib/fuzzer/FuzzerSHA1.cpp | 3 | ||||
-rw-r--r-- | lib/fuzzer/FuzzerValueBitMap.h | 4 |
5 files changed, 17 insertions, 13 deletions
diff --git a/cmake/config-ix.cmake b/cmake/config-ix.cmake index e0ee5b86b..493154c59 100644 --- a/cmake/config-ix.cmake +++ b/cmake/config-ix.cmake @@ -317,13 +317,13 @@ if(APPLE) # 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 @@ if(APPLE) # 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 @@ else() 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) diff --git a/lib/fuzzer/CMakeLists.txt b/lib/fuzzer/CMakeLists.txt index caea9734f..f6c5b761a 100644 --- a/lib/fuzzer/CMakeLists.txt +++ b/lib/fuzzer/CMakeLists.txt @@ -71,8 +71,14 @@ if (CMAKE_CXX_FLAGS MATCHES "fsanitize-coverage") 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}) diff --git a/lib/fuzzer/FuzzerBuiltinsMsvc.h b/lib/fuzzer/FuzzerBuiltinsMsvc.h index 20defc4df..82709cfe7 100644 --- a/lib/fuzzer/FuzzerBuiltinsMsvc.h +++ b/lib/fuzzer/FuzzerBuiltinsMsvc.h @@ -24,7 +24,7 @@ // __builtin_return_address() cannot be compiled with MSVC. Use the equivalent // from <intrin.h> -#define GET_CALLER_PC() reinterpret_cast<uintptr_t>(_ReturnAddress()) +#define GET_CALLER_PC() _ReturnAddress() namespace fuzzer { diff --git a/lib/fuzzer/FuzzerSHA1.cpp b/lib/fuzzer/FuzzerSHA1.cpp index 99c075f75..43e5e78cd 100644 --- a/lib/fuzzer/FuzzerSHA1.cpp +++ b/lib/fuzzer/FuzzerSHA1.cpp @@ -31,7 +31,8 @@ namespace { // Added for LibFuzzer #ifdef __BIG_ENDIAN__ # define SHA_BIG_ENDIAN -#elif defined __LITTLE_ENDIAN__ +// Windows is always little endian and MSVC doesn't have <endian.h> +#elif defined __LITTLE_ENDIAN__ || LIBFUZZER_WINDOWS /* override */ #elif defined __BYTE_ORDER # if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ diff --git a/lib/fuzzer/FuzzerValueBitMap.h b/lib/fuzzer/FuzzerValueBitMap.h index 03fb7477e..bc039f1df 100644 --- a/lib/fuzzer/FuzzerValueBitMap.h +++ b/lib/fuzzer/FuzzerValueBitMap.h @@ -34,7 +34,7 @@ struct ValueBitMap { 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 @@ struct ValueBitMap { 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; } |