1 1.1 kamil //===-- xray_utils.h --------------------------------------------*- C++ -*-===// 2 1.1 kamil // 3 1.1 kamil // The LLVM Compiler Infrastructure 4 1.1 kamil // 5 1.1 kamil // This file is distributed under the University of Illinois Open Source 6 1.1 kamil // License. See LICENSE.TXT for details. 7 1.1 kamil // 8 1.1 kamil //===----------------------------------------------------------------------===// 9 1.1 kamil // 10 1.1 kamil // This file is a part of XRay, a dynamic runtime instrumentation system. 11 1.1 kamil // 12 1.1 kamil // Some shared utilities for the XRay runtime implementation. 13 1.1 kamil // 14 1.1 kamil //===----------------------------------------------------------------------===// 15 1.1 kamil #ifndef XRAY_UTILS_H 16 1.1 kamil #define XRAY_UTILS_H 17 1.1 kamil 18 1.1 kamil #include <cstddef> 19 1.1 kamil #include <cstdint> 20 1.1 kamil #include <sys/types.h> 21 1.1 kamil #include <utility> 22 1.1 kamil 23 1.1 kamil #include "sanitizer_common/sanitizer_common.h" 24 1.1 kamil #if SANITIZER_FUCHSIA 25 1.1 kamil #include <zircon/types.h> 26 1.1 kamil #endif 27 1.1 kamil 28 1.1 kamil namespace __xray { 29 1.1 kamil 30 1.1 kamil class LogWriter { 31 1.1 kamil public: 32 1.1 kamil #if SANITIZER_FUCHSIA 33 1.1 kamil LogWriter(zx_handle_t Vmo) : Vmo(Vmo) {} 34 1.1 kamil #else 35 1.1 kamil explicit LogWriter(int Fd) : Fd(Fd) {} 36 1.1 kamil #endif 37 1.1 kamil ~LogWriter(); 38 1.1 kamil 39 1.1 kamil // Write a character range into a log. 40 1.1 kamil void WriteAll(const char *Begin, const char *End); 41 1.1 kamil 42 1.1 kamil void Flush(); 43 1.1 kamil 44 1.1 kamil // Returns a new log instance initialized using the flag-provided values. 45 1.1 kamil static LogWriter *Open(); 46 1.1 kamil // Closes and deallocates the log instance. 47 1.1 kamil static void Close(LogWriter *LogWriter); 48 1.1 kamil 49 1.1 kamil private: 50 1.1 kamil #if SANITIZER_FUCHSIA 51 1.1 kamil zx_handle_t Vmo = ZX_HANDLE_INVALID; 52 1.1 kamil uint64_t Offset = 0; 53 1.1 kamil #else 54 1.1 kamil int Fd = -1; 55 1.1 kamil #endif 56 1.1 kamil }; 57 1.1 kamil 58 1.1 kamil constexpr size_t gcd(size_t a, size_t b) { 59 1.1 kamil return (b == 0) ? a : gcd(b, a % b); 60 1.1 kamil } 61 1.1 kamil 62 1.1 kamil constexpr size_t lcm(size_t a, size_t b) { return a * b / gcd(a, b); } 63 1.1 kamil 64 1.1 kamil constexpr size_t nearest_boundary(size_t number, size_t multiple) { 65 1.1 kamil return multiple * ((number / multiple) + (number % multiple ? 1 : 0)); 66 1.1 kamil } 67 1.1 kamil 68 1.1 kamil constexpr size_t next_pow2_helper(size_t num, size_t acc) { 69 1.1 kamil return (1u << acc) >= num ? (1u << acc) : next_pow2_helper(num, acc + 1); 70 1.1 kamil } 71 1.1 kamil 72 1.1 kamil constexpr size_t next_pow2(size_t number) { 73 1.1 kamil return next_pow2_helper(number, 1); 74 1.1 kamil } 75 1.1 kamil 76 1.1 kamil template <class T> constexpr T &max(T &A, T &B) { return A > B ? A : B; } 77 1.1 kamil 78 1.1 kamil template <class T> constexpr T &min(T &A, T &B) { return A <= B ? A : B; } 79 1.1 kamil 80 1.1 kamil constexpr ptrdiff_t diff(uintptr_t A, uintptr_t B) { 81 1.1 kamil return max(A, B) - min(A, B); 82 1.1 kamil } 83 1.1 kamil 84 1.1 kamil } // namespace __xray 85 1.1 kamil 86 1.1 kamil #endif // XRAY_UTILS_H 87