Home | History | Annotate | Line # | Download | only in xray
      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