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