10b57cec5SDimitry Andric //===--- XRayInstr.cpp ------------------------------------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This is part of XRay, a function call instrumentation system.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric #include "clang/Basic/XRayInstr.h"
14*fe6060f1SDimitry Andric #include "llvm/ADT/SmallVector.h"
150b57cec5SDimitry Andric #include "llvm/ADT/StringSwitch.h"
160b57cec5SDimitry Andric
170b57cec5SDimitry Andric namespace clang {
180b57cec5SDimitry Andric
parseXRayInstrValue(StringRef Value)190b57cec5SDimitry Andric XRayInstrMask parseXRayInstrValue(StringRef Value) {
205ffd83dbSDimitry Andric XRayInstrMask ParsedKind =
215ffd83dbSDimitry Andric llvm::StringSwitch<XRayInstrMask>(Value)
220b57cec5SDimitry Andric .Case("all", XRayInstrKind::All)
230b57cec5SDimitry Andric .Case("custom", XRayInstrKind::Custom)
245ffd83dbSDimitry Andric .Case("function",
255ffd83dbSDimitry Andric XRayInstrKind::FunctionEntry | XRayInstrKind::FunctionExit)
265ffd83dbSDimitry Andric .Case("function-entry", XRayInstrKind::FunctionEntry)
275ffd83dbSDimitry Andric .Case("function-exit", XRayInstrKind::FunctionExit)
280b57cec5SDimitry Andric .Case("typed", XRayInstrKind::Typed)
290b57cec5SDimitry Andric .Case("none", XRayInstrKind::None)
300b57cec5SDimitry Andric .Default(XRayInstrKind::None);
310b57cec5SDimitry Andric return ParsedKind;
320b57cec5SDimitry Andric }
330b57cec5SDimitry Andric
serializeXRayInstrValue(XRayInstrSet Set,SmallVectorImpl<StringRef> & Values)34*fe6060f1SDimitry Andric void serializeXRayInstrValue(XRayInstrSet Set,
35*fe6060f1SDimitry Andric SmallVectorImpl<StringRef> &Values) {
36*fe6060f1SDimitry Andric if (Set.Mask == XRayInstrKind::All) {
37*fe6060f1SDimitry Andric Values.push_back("all");
38*fe6060f1SDimitry Andric return;
39*fe6060f1SDimitry Andric }
40*fe6060f1SDimitry Andric
41*fe6060f1SDimitry Andric if (Set.Mask == XRayInstrKind::None) {
42*fe6060f1SDimitry Andric Values.push_back("none");
43*fe6060f1SDimitry Andric return;
44*fe6060f1SDimitry Andric }
45*fe6060f1SDimitry Andric
46*fe6060f1SDimitry Andric if (Set.has(XRayInstrKind::Custom))
47*fe6060f1SDimitry Andric Values.push_back("custom");
48*fe6060f1SDimitry Andric
49*fe6060f1SDimitry Andric if (Set.has(XRayInstrKind::Typed))
50*fe6060f1SDimitry Andric Values.push_back("typed");
51*fe6060f1SDimitry Andric
52*fe6060f1SDimitry Andric if (Set.has(XRayInstrKind::FunctionEntry) &&
53*fe6060f1SDimitry Andric Set.has(XRayInstrKind::FunctionExit))
54*fe6060f1SDimitry Andric Values.push_back("function");
55*fe6060f1SDimitry Andric else if (Set.has(XRayInstrKind::FunctionEntry))
56*fe6060f1SDimitry Andric Values.push_back("function-entry");
57*fe6060f1SDimitry Andric else if (Set.has(XRayInstrKind::FunctionExit))
58*fe6060f1SDimitry Andric Values.push_back("function-exit");
59*fe6060f1SDimitry Andric }
600b57cec5SDimitry Andric } // namespace clang
61