From e4e52f63756f5d5639809ca6c44e3d745744780a Mon Sep 17 00:00:00 2001 From: Jonathan Metzman Date: Tue, 22 Jan 2019 18:59:25 +0000 Subject: [libFuzzer][MSVC] Enable building libFuzzer with MSVC Summary: Enable building libFuzzer with MSVC. * Don't try to include 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 --- lib/fuzzer/CMakeLists.txt | 10 ++++++++-- lib/fuzzer/FuzzerBuiltinsMsvc.h | 2 +- lib/fuzzer/FuzzerSHA1.cpp | 3 ++- lib/fuzzer/FuzzerValueBitMap.h | 4 ++-- 4 files changed, 13 insertions(+), 6 deletions(-) (limited to 'lib') 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 -#define GET_CALLER_PC() reinterpret_cast(_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 +#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; } -- cgit v1.2.1