Home | History | Annotate | Line # | Download | only in Basic
      1 //===--- XRayInstr.h --------------------------------------------*- C++ -*-===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 //
      9 /// \file
     10 /// Defines the clang::XRayInstrKind enum.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_CLANG_BASIC_XRAYINSTR_H
     15 #define LLVM_CLANG_BASIC_XRAYINSTR_H
     16 
     17 #include "clang/Basic/LLVM.h"
     18 #include "llvm/ADT/StringRef.h"
     19 #include "llvm/Support/MathExtras.h"
     20 #include <cassert>
     21 #include <cstdint>
     22 
     23 namespace clang {
     24 
     25 using XRayInstrMask = uint32_t;
     26 
     27 namespace XRayInstrKind {
     28 
     29 // TODO: Auto-generate these as we add more instrumentation kinds.
     30 enum XRayInstrOrdinal : XRayInstrMask {
     31   XRIO_FunctionEntry,
     32   XRIO_FunctionExit,
     33   XRIO_Custom,
     34   XRIO_Typed,
     35   XRIO_Count
     36 };
     37 
     38 constexpr XRayInstrMask None = 0;
     39 constexpr XRayInstrMask FunctionEntry = 1U << XRIO_FunctionEntry;
     40 constexpr XRayInstrMask FunctionExit = 1U << XRIO_FunctionExit;
     41 constexpr XRayInstrMask Custom = 1U << XRIO_Custom;
     42 constexpr XRayInstrMask Typed = 1U << XRIO_Typed;
     43 constexpr XRayInstrMask All = FunctionEntry | FunctionExit | Custom | Typed;
     44 
     45 } // namespace XRayInstrKind
     46 
     47 struct XRayInstrSet {
     48   bool has(XRayInstrMask K) const {
     49     assert(llvm::isPowerOf2_32(K));
     50     return Mask & K;
     51   }
     52 
     53   bool hasOneOf(XRayInstrMask K) const { return Mask & K; }
     54 
     55   void set(XRayInstrMask K, bool Value) {
     56     Mask = Value ? (Mask | K) : (Mask & ~K);
     57   }
     58 
     59   void clear(XRayInstrMask K = XRayInstrKind::All) { Mask &= ~K; }
     60 
     61   bool empty() const { return Mask == 0; }
     62 
     63   bool full() const { return Mask == XRayInstrKind::All; }
     64 
     65   XRayInstrMask Mask = 0;
     66 };
     67 
     68 /// Parses a command line argument into a mask.
     69 XRayInstrMask parseXRayInstrValue(StringRef Value);
     70 
     71 /// Serializes a set into a list of command line arguments.
     72 void serializeXRayInstrValue(XRayInstrSet Set,
     73                              SmallVectorImpl<StringRef> &Values);
     74 
     75 } // namespace clang
     76 
     77 #endif // LLVM_CLANG_BASIC_XRAYINSTR_H
     78