summaryrefslogtreecommitdiff
path: root/compiler-rt/lib/gwp_asan/random.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'compiler-rt/lib/gwp_asan/random.cpp')
-rw-r--r--compiler-rt/lib/gwp_asan/random.cpp14
1 files changed, 11 insertions, 3 deletions
diff --git a/compiler-rt/lib/gwp_asan/random.cpp b/compiler-rt/lib/gwp_asan/random.cpp
index 90493da7e038..2180f9204084 100644
--- a/compiler-rt/lib/gwp_asan/random.cpp
+++ b/compiler-rt/lib/gwp_asan/random.cpp
@@ -7,14 +7,22 @@
//===----------------------------------------------------------------------===//
#include "gwp_asan/random.h"
-#include "gwp_asan/guarded_pool_allocator.h"
+#include "gwp_asan/common.h"
#include <time.h>
+// Initialised to a magic constant so that an uninitialised GWP-ASan won't
+// regenerate its sample counter for as long as possible. The xorshift32()
+// algorithm used below results in getRandomUnsigned32(0xff82eb50) ==
+// 0xfffffea4.
+GWP_ASAN_TLS_INITIAL_EXEC uint32_t RandomState = 0xff82eb50;
+
namespace gwp_asan {
+void initPRNG() {
+ RandomState = time(nullptr) + getThreadID();
+}
+
uint32_t getRandomUnsigned32() {
- thread_local uint32_t RandomState =
- time(nullptr) + GuardedPoolAllocator::getThreadID();
RandomState ^= RandomState << 13;
RandomState ^= RandomState >> 17;
RandomState ^= RandomState << 5;