summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib/fuzzer
diff options
context:
space:
mode:
authorMatthew G McGovern <matthew.mcgovern@microsoft.com>2019-08-22 20:44:34 +0000
committerMatthew G McGovern <matthew.mcgovern@microsoft.com>2019-08-22 20:44:34 +0000
commit2eaeba6f15d361687795dc429b78090ab38ff1d2 (patch)
tree3e656c2096bd105de959a16e54dacdf0fa4967f2 /compiler-rt/lib/fuzzer
parent0ddb0e9fcb2c98af1b993abdfa9cb8ea5a611086 (diff)
downloadbcm5719-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.h22
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
OpenPOWER on IntegriCloud