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 { hasXRayInstrSet48 bool has(XRayInstrMask K) const { 49 assert(llvm::isPowerOf2_32(K)); 50 return Mask & K; 51 } 52 hasOneOfXRayInstrSet53 bool hasOneOf(XRayInstrMask K) const { return Mask & K; } 54 setXRayInstrSet55 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 emptyXRayInstrSet61 bool empty() const { return Mask == 0; } 62 fullXRayInstrSet63 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