summaryrefslogtreecommitdiff
path: root/gnu/llvm/compiler-rt/lib/gwp_asan/random.cpp
diff options
context:
space:
mode:
authorPatrick Wildt <patrick@cvs.openbsd.org>2021-01-02 17:10:12 +0000
committerPatrick Wildt <patrick@cvs.openbsd.org>2021-01-02 17:10:12 +0000
commitac63a3868d0079ed93660b89b2c6e6dbf67aea16 (patch)
tree7f055322abddaf10c9dbd7cbeb91c8f83d78e301 /gnu/llvm/compiler-rt/lib/gwp_asan/random.cpp
parentbecf90779831a234f9200480d6009ecb39ebb192 (diff)
Import compiler-rt 11.0.0 release.
ok kettenis@
Diffstat (limited to 'gnu/llvm/compiler-rt/lib/gwp_asan/random.cpp')
-rw-r--r--gnu/llvm/compiler-rt/lib/gwp_asan/random.cpp14
1 files changed, 11 insertions, 3 deletions
diff --git a/gnu/llvm/compiler-rt/lib/gwp_asan/random.cpp b/gnu/llvm/compiler-rt/lib/gwp_asan/random.cpp
index 90493da7e03..2180f920408 100644
--- a/gnu/llvm/compiler-rt/lib/gwp_asan/random.cpp
+++ b/gnu/llvm/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;