diff options
| author | Matthew G McGovern <matthew.mcgovern@microsoft.com> | 2019-08-22 20:44:34 +0000 |
|---|---|---|
| committer | Matthew G McGovern <matthew.mcgovern@microsoft.com> | 2019-08-22 20:44:34 +0000 |
| commit | 2eaeba6f15d361687795dc429b78090ab38ff1d2 (patch) | |
| tree | 3e656c2096bd105de959a16e54dacdf0fa4967f2 /compiler-rt/lib/fuzzer | |
| parent | 0ddb0e9fcb2c98af1b993abdfa9cb8ea5a611086 (diff) | |
| download | bcm5719-llvm-2eaeba6f15d361687795dc429b78090ab38ff1d2.tar.gz bcm5719-llvm-2eaeba6f15d361687795dc429b78090ab38ff1d2.zip | |
LibFuzzer support for 32bit MSVC
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
Diffstat (limited to 'compiler-rt/lib/fuzzer')
| -rw-r--r-- | compiler-rt/lib/fuzzer/FuzzerBuiltinsMsvc.h | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/compiler-rt/lib/fuzzer/FuzzerBuiltinsMsvc.h b/compiler-rt/lib/fuzzer/FuzzerBuiltinsMsvc.h index 82709cfe7b4..bc65c60098b 100644 --- a/compiler-rt/lib/fuzzer/FuzzerBuiltinsMsvc.h +++ b/compiler-rt/lib/fuzzer/FuzzerBuiltinsMsvc.h @@ -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> @@ -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; } @@ -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 |

