xref: /aosp_15_r20/external/compiler-rt/lib/scudo/scudo_utils.h (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
1*7c3d14c8STreehugger Robot //===-- scudo_utils.h -------------------------------------------*- C++ -*-===//
2*7c3d14c8STreehugger Robot //
3*7c3d14c8STreehugger Robot //                     The LLVM Compiler Infrastructure
4*7c3d14c8STreehugger Robot //
5*7c3d14c8STreehugger Robot // This file is distributed under the University of Illinois Open Source
6*7c3d14c8STreehugger Robot // License. See LICENSE.TXT for details.
7*7c3d14c8STreehugger Robot //
8*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===//
9*7c3d14c8STreehugger Robot ///
10*7c3d14c8STreehugger Robot /// Header for scudo_utils.cpp.
11*7c3d14c8STreehugger Robot ///
12*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===//
13*7c3d14c8STreehugger Robot 
14*7c3d14c8STreehugger Robot #ifndef SCUDO_UTILS_H_
15*7c3d14c8STreehugger Robot #define SCUDO_UTILS_H_
16*7c3d14c8STreehugger Robot 
17*7c3d14c8STreehugger Robot #include <string.h>
18*7c3d14c8STreehugger Robot 
19*7c3d14c8STreehugger Robot #include "sanitizer_common/sanitizer_common.h"
20*7c3d14c8STreehugger Robot 
21*7c3d14c8STreehugger Robot namespace __scudo {
22*7c3d14c8STreehugger Robot 
23*7c3d14c8STreehugger Robot template <class Dest, class Source>
bit_cast(const Source & source)24*7c3d14c8STreehugger Robot inline Dest bit_cast(const Source& source) {
25*7c3d14c8STreehugger Robot   static_assert(sizeof(Dest) == sizeof(Source), "Sizes are not equal!");
26*7c3d14c8STreehugger Robot   Dest dest;
27*7c3d14c8STreehugger Robot   memcpy(&dest, &source, sizeof(dest));
28*7c3d14c8STreehugger Robot   return dest;
29*7c3d14c8STreehugger Robot }
30*7c3d14c8STreehugger Robot 
31*7c3d14c8STreehugger Robot void dieWithMessage(const char *Format, ...);
32*7c3d14c8STreehugger Robot 
33*7c3d14c8STreehugger Robot enum  CPUFeature {
34*7c3d14c8STreehugger Robot   SSE4_2 = 0,
35*7c3d14c8STreehugger Robot   ENUM_CPUFEATURE_MAX
36*7c3d14c8STreehugger Robot };
37*7c3d14c8STreehugger Robot bool testCPUFeature(CPUFeature feature);
38*7c3d14c8STreehugger Robot 
39*7c3d14c8STreehugger Robot // Tiny PRNG based on https://en.wikipedia.org/wiki/Xorshift#xorshift.2B
40*7c3d14c8STreehugger Robot // The state (128 bits) will be stored in thread local storage.
41*7c3d14c8STreehugger Robot struct Xorshift128Plus {
42*7c3d14c8STreehugger Robot  public:
43*7c3d14c8STreehugger Robot   Xorshift128Plus();
NextXorshift128Plus44*7c3d14c8STreehugger Robot   u64 Next() {
45*7c3d14c8STreehugger Robot     u64 x = State_0_;
46*7c3d14c8STreehugger Robot     const u64 y = State_1_;
47*7c3d14c8STreehugger Robot     State_0_ = y;
48*7c3d14c8STreehugger Robot     x ^= x << 23;
49*7c3d14c8STreehugger Robot     State_1_ = x ^ y ^ (x >> 17) ^ (y >> 26);
50*7c3d14c8STreehugger Robot     return State_1_ + y;
51*7c3d14c8STreehugger Robot   }
52*7c3d14c8STreehugger Robot  private:
53*7c3d14c8STreehugger Robot   u64 State_0_;
54*7c3d14c8STreehugger Robot   u64 State_1_;
55*7c3d14c8STreehugger Robot };
56*7c3d14c8STreehugger Robot 
57*7c3d14c8STreehugger Robot } // namespace __scudo
58*7c3d14c8STreehugger Robot 
59*7c3d14c8STreehugger Robot #endif  // SCUDO_UTILS_H_
60