17330f729Sjoerg //===--- XRayInstr.cpp ------------------------------------------*- C++ -*-===//
27330f729Sjoerg //
37330f729Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47330f729Sjoerg // See https://llvm.org/LICENSE.txt for license information.
57330f729Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67330f729Sjoerg //
77330f729Sjoerg //===----------------------------------------------------------------------===//
87330f729Sjoerg //
97330f729Sjoerg // This is part of XRay, a function call instrumentation system.
107330f729Sjoerg //
117330f729Sjoerg //===----------------------------------------------------------------------===//
127330f729Sjoerg
137330f729Sjoerg #include "clang/Basic/XRayInstr.h"
14*e038c9c4Sjoerg #include "llvm/ADT/SmallVector.h"
157330f729Sjoerg #include "llvm/ADT/StringSwitch.h"
167330f729Sjoerg
177330f729Sjoerg namespace clang {
187330f729Sjoerg
parseXRayInstrValue(StringRef Value)197330f729Sjoerg XRayInstrMask parseXRayInstrValue(StringRef Value) {
20*e038c9c4Sjoerg XRayInstrMask ParsedKind =
21*e038c9c4Sjoerg llvm::StringSwitch<XRayInstrMask>(Value)
227330f729Sjoerg .Case("all", XRayInstrKind::All)
237330f729Sjoerg .Case("custom", XRayInstrKind::Custom)
24*e038c9c4Sjoerg .Case("function",
25*e038c9c4Sjoerg XRayInstrKind::FunctionEntry | XRayInstrKind::FunctionExit)
26*e038c9c4Sjoerg .Case("function-entry", XRayInstrKind::FunctionEntry)
27*e038c9c4Sjoerg .Case("function-exit", XRayInstrKind::FunctionExit)
287330f729Sjoerg .Case("typed", XRayInstrKind::Typed)
297330f729Sjoerg .Case("none", XRayInstrKind::None)
307330f729Sjoerg .Default(XRayInstrKind::None);
317330f729Sjoerg return ParsedKind;
327330f729Sjoerg }
337330f729Sjoerg
serializeXRayInstrValue(XRayInstrSet Set,SmallVectorImpl<StringRef> & Values)34*e038c9c4Sjoerg void serializeXRayInstrValue(XRayInstrSet Set,
35*e038c9c4Sjoerg SmallVectorImpl<StringRef> &Values) {
36*e038c9c4Sjoerg if (Set.Mask == XRayInstrKind::All) {
37*e038c9c4Sjoerg Values.push_back("all");
38*e038c9c4Sjoerg return;
39*e038c9c4Sjoerg }
40*e038c9c4Sjoerg
41*e038c9c4Sjoerg if (Set.Mask == XRayInstrKind::None) {
42*e038c9c4Sjoerg Values.push_back("none");
43*e038c9c4Sjoerg return;
44*e038c9c4Sjoerg }
45*e038c9c4Sjoerg
46*e038c9c4Sjoerg if (Set.has(XRayInstrKind::Custom))
47*e038c9c4Sjoerg Values.push_back("custom");
48*e038c9c4Sjoerg
49*e038c9c4Sjoerg if (Set.has(XRayInstrKind::Typed))
50*e038c9c4Sjoerg Values.push_back("typed");
51*e038c9c4Sjoerg
52*e038c9c4Sjoerg if (Set.has(XRayInstrKind::FunctionEntry) &&
53*e038c9c4Sjoerg Set.has(XRayInstrKind::FunctionExit))
54*e038c9c4Sjoerg Values.push_back("function");
55*e038c9c4Sjoerg else if (Set.has(XRayInstrKind::FunctionEntry))
56*e038c9c4Sjoerg Values.push_back("function-entry");
57*e038c9c4Sjoerg else if (Set.has(XRayInstrKind::FunctionExit))
58*e038c9c4Sjoerg Values.push_back("function-exit");
59*e038c9c4Sjoerg }
607330f729Sjoerg } // namespace clang
61