Skip to content

Commit

Permalink
LibFuzzer support for 32bit MSVC
Browse files Browse the repository at this point in the history
This fixes the two build errors when trying to compile LibFuzzer for
32bit with MSVC.

    - authored by Max Shavrick (mxms at microsoft)

llvm-svn: 369704
  • Loading branch information
mcgov committed Aug 22, 2019
1 parent 0ddb0e9 commit 2eaeba6
Showing 1 changed file with 18 additions and 4 deletions.
22 changes: 18 additions & 4 deletions compiler-rt/lib/fuzzer/FuzzerBuiltinsMsvc.h
Expand Up @@ -15,9 +15,6 @@
#include "FuzzerDefs.h"

#if LIBFUZZER_MSVC
#if !defined(_M_ARM) && !defined(_M_X64)
#error "_BitScanReverse64 unavailable on this platform so MSVC is unsupported."
#endif
#include <intrin.h>
#include <cstdint>
#include <cstdlib>
Expand All @@ -40,7 +37,18 @@ inline uint64_t Bswap(uint64_t x) { return _byteswap_uint64(x); }
// outside of Windows.
inline uint32_t Clzll(uint64_t X) {
unsigned long LeadZeroIdx = 0;

#if !defined(_M_ARM) && !defined(_M_X64)
// Scan the high 32 bits.
if (_BitScanReverse(&LeadZeroIdx, static_cast<unsigned long>(X >> 32)))
return static_cast<int>(63 - (LeadZeroIdx + 32)); // Create a bit offset from the MSB.
// Scan the low 32 bits.
if (_BitScanReverse(&LeadZeroIdx, static_cast<unsigned long>(X)))
return static_cast<int>(63 - LeadZeroIdx);

#else
if (_BitScanReverse64(&LeadZeroIdx, X)) return 63 - LeadZeroIdx;
#endif
return 64;
}

Expand All @@ -50,7 +58,13 @@ inline uint32_t Clz(uint32_t X) {
return 32;
}

inline int Popcountll(unsigned long long X) { return __popcnt64(X); }
inline int Popcountll(unsigned long long X) {
#if !defined(_M_ARM) && !defined(_M_X64)
return __popcnt(X) + __popcnt(X >> 32);
#else
return __popcnt64(X);
#endif
}

} // namespace fuzzer

Expand Down

0 comments on commit 2eaeba6

Please sign in to comment.