xref: /openbsd-src/gnu/llvm/clang/lib/Basic/XRayInstr.cpp (revision a9ac8606c53d55cee9c3a39778b249c51df111ef)
1e5dd7070Spatrick //===--- XRayInstr.cpp ------------------------------------------*- C++ -*-===//
2e5dd7070Spatrick //
3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick //
7e5dd7070Spatrick //===----------------------------------------------------------------------===//
8e5dd7070Spatrick //
9e5dd7070Spatrick // This is part of XRay, a function call instrumentation system.
10e5dd7070Spatrick //
11e5dd7070Spatrick //===----------------------------------------------------------------------===//
12e5dd7070Spatrick 
13e5dd7070Spatrick #include "clang/Basic/XRayInstr.h"
14*a9ac8606Spatrick #include "llvm/ADT/SmallVector.h"
15e5dd7070Spatrick #include "llvm/ADT/StringSwitch.h"
16e5dd7070Spatrick 
17e5dd7070Spatrick namespace clang {
18e5dd7070Spatrick 
parseXRayInstrValue(StringRef Value)19e5dd7070Spatrick XRayInstrMask parseXRayInstrValue(StringRef Value) {
20ec727ea7Spatrick   XRayInstrMask ParsedKind =
21ec727ea7Spatrick       llvm::StringSwitch<XRayInstrMask>(Value)
22e5dd7070Spatrick           .Case("all", XRayInstrKind::All)
23e5dd7070Spatrick           .Case("custom", XRayInstrKind::Custom)
24ec727ea7Spatrick           .Case("function",
25ec727ea7Spatrick                 XRayInstrKind::FunctionEntry | XRayInstrKind::FunctionExit)
26ec727ea7Spatrick           .Case("function-entry", XRayInstrKind::FunctionEntry)
27ec727ea7Spatrick           .Case("function-exit", XRayInstrKind::FunctionExit)
28e5dd7070Spatrick           .Case("typed", XRayInstrKind::Typed)
29e5dd7070Spatrick           .Case("none", XRayInstrKind::None)
30e5dd7070Spatrick           .Default(XRayInstrKind::None);
31e5dd7070Spatrick   return ParsedKind;
32e5dd7070Spatrick }
33e5dd7070Spatrick 
serializeXRayInstrValue(XRayInstrSet Set,SmallVectorImpl<StringRef> & Values)34*a9ac8606Spatrick void serializeXRayInstrValue(XRayInstrSet Set,
35*a9ac8606Spatrick                              SmallVectorImpl<StringRef> &Values) {
36*a9ac8606Spatrick   if (Set.Mask == XRayInstrKind::All) {
37*a9ac8606Spatrick     Values.push_back("all");
38*a9ac8606Spatrick     return;
39*a9ac8606Spatrick   }
40*a9ac8606Spatrick 
41*a9ac8606Spatrick   if (Set.Mask == XRayInstrKind::None) {
42*a9ac8606Spatrick     Values.push_back("none");
43*a9ac8606Spatrick     return;
44*a9ac8606Spatrick   }
45*a9ac8606Spatrick 
46*a9ac8606Spatrick   if (Set.has(XRayInstrKind::Custom))
47*a9ac8606Spatrick     Values.push_back("custom");
48*a9ac8606Spatrick 
49*a9ac8606Spatrick   if (Set.has(XRayInstrKind::Typed))
50*a9ac8606Spatrick     Values.push_back("typed");
51*a9ac8606Spatrick 
52*a9ac8606Spatrick   if (Set.has(XRayInstrKind::FunctionEntry) &&
53*a9ac8606Spatrick       Set.has(XRayInstrKind::FunctionExit))
54*a9ac8606Spatrick     Values.push_back("function");
55*a9ac8606Spatrick   else if (Set.has(XRayInstrKind::FunctionEntry))
56*a9ac8606Spatrick     Values.push_back("function-entry");
57*a9ac8606Spatrick   else if (Set.has(XRayInstrKind::FunctionExit))
58*a9ac8606Spatrick     Values.push_back("function-exit");
59*a9ac8606Spatrick }
60e5dd7070Spatrick } // namespace clang
61