| //===-- scudo_utils.h -------------------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| /// |
| /// Header for scudo_utils.cpp. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef SCUDO_UTILS_H_ |
| #define SCUDO_UTILS_H_ |
| |
| #include <string.h> |
| |
| #include "sanitizer_common/sanitizer_common.h" |
| |
| namespace __scudo { |
| |
| template <class Dest, class Source> |
| inline Dest bit_cast(const Source& source) { |
| static_assert(sizeof(Dest) == sizeof(Source), "Sizes are not equal!"); |
| Dest dest; |
| memcpy(&dest, &source, sizeof(dest)); |
| return dest; |
| } |
| |
| void dieWithMessage(const char *Format, ...); |
| |
| enum CPUFeature { |
| SSE4_2 = 0, |
| ENUM_CPUFEATURE_MAX |
| }; |
| bool testCPUFeature(CPUFeature feature); |
| |
| // Tiny PRNG based on https://en.wikipedia.org/wiki/Xorshift#xorshift.2B |
| // The state (128 bits) will be stored in thread local storage. |
| struct Xorshift128Plus { |
| public: |
| Xorshift128Plus(); |
| u64 Next() { |
| u64 x = State_0_; |
| const u64 y = State_1_; |
| State_0_ = y; |
| x ^= x << 23; |
| State_1_ = x ^ y ^ (x >> 17) ^ (y >> 26); |
| return State_1_ + y; |
| } |
| private: |
| u64 State_0_; |
| u64 State_1_; |
| }; |
| |
| } // namespace __scudo |
| |
| #endif // SCUDO_UTILS_H_ |