|  | //===-- xray_utils.h --------------------------------------------*- C++ -*-===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file is a part of XRay, a dynamic runtime instrumentation system. | 
|  | // | 
|  | // Some shared utilities for the XRay runtime implementation. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | #ifndef XRAY_UTILS_H | 
|  | #define XRAY_UTILS_H | 
|  |  | 
|  | #include <cstddef> | 
|  | #include <cstdint> | 
|  | #include <sys/types.h> | 
|  | #include <utility> | 
|  |  | 
|  | #include "sanitizer_common/sanitizer_common.h" | 
|  | #if SANITIZER_FUCHSIA | 
|  | #include <zircon/types.h> | 
|  | #endif | 
|  |  | 
|  | namespace __xray { | 
|  |  | 
|  | class LogWriter { | 
|  | public: | 
|  | #if SANITIZER_FUCHSIA | 
|  | LogWriter(zx_handle_t Vmo) : Vmo(Vmo) {} | 
|  | #else | 
|  | explicit LogWriter(int Fd) : Fd(Fd) {} | 
|  | #endif | 
|  | ~LogWriter(); | 
|  |  | 
|  | // Write a character range into a log. | 
|  | void WriteAll(const char *Begin, const char *End); | 
|  |  | 
|  | void Flush(); | 
|  |  | 
|  | // Returns a new log instance initialized using the flag-provided values. | 
|  | static LogWriter *Open(); | 
|  | // Closes and deallocates the log instance. | 
|  | static void Close(LogWriter *LogWriter); | 
|  |  | 
|  | private: | 
|  | #if SANITIZER_FUCHSIA | 
|  | zx_handle_t Vmo = ZX_HANDLE_INVALID; | 
|  | uint64_t Offset = 0; | 
|  | #else | 
|  | int Fd = -1; | 
|  | #endif | 
|  | }; | 
|  |  | 
|  | constexpr size_t gcd(size_t a, size_t b) { | 
|  | return (b == 0) ? a : gcd(b, a % b); | 
|  | } | 
|  |  | 
|  | constexpr size_t lcm(size_t a, size_t b) { return a * b / gcd(a, b); } | 
|  |  | 
|  | constexpr size_t nearest_boundary(size_t number, size_t multiple) { | 
|  | return multiple * ((number / multiple) + ((number % multiple) ? 1 : 0)); | 
|  | } | 
|  |  | 
|  | constexpr size_t next_pow2_helper(size_t num, size_t acc) { | 
|  | return (1u << acc) >= num ? (1u << acc) : next_pow2_helper(num, acc + 1); | 
|  | } | 
|  |  | 
|  | constexpr size_t next_pow2(size_t number) { | 
|  | return next_pow2_helper(number, 1); | 
|  | } | 
|  |  | 
|  | template <class T> constexpr T &max(T &A, T &B) { return A > B ? A : B; } | 
|  |  | 
|  | template <class T> constexpr T &min(T &A, T &B) { return A <= B ? A : B; } | 
|  |  | 
|  | constexpr ptrdiff_t diff(uintptr_t A, uintptr_t B) { | 
|  | return max(A, B) - min(A, B); | 
|  | } | 
|  |  | 
|  | } // namespace __xray | 
|  |  | 
|  | #endif // XRAY_UTILS_H |