]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/llvm/include/llvm/XRay/YAMLXRayRecord.h
MFC r355940:
[FreeBSD/FreeBSD.git] / contrib / llvm-project / llvm / include / llvm / XRay / YAMLXRayRecord.h
1 //===- YAMLXRayRecord.h - XRay Record YAML Support Definitions ------------===//
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 // Types and traits specialisations for YAML I/O of XRay log entries.
10 //
11 //===----------------------------------------------------------------------===//
12 #ifndef LLVM_XRAY_YAML_XRAY_RECORD_H
13 #define LLVM_XRAY_YAML_XRAY_RECORD_H
14
15 #include <type_traits>
16
17 #include "llvm/Support/YAMLTraits.h"
18 #include "llvm/XRay/XRayRecord.h"
19
20 namespace llvm {
21 namespace xray {
22
23 struct YAMLXRayFileHeader {
24   uint16_t Version;
25   uint16_t Type;
26   bool ConstantTSC;
27   bool NonstopTSC;
28   uint64_t CycleFrequency;
29 };
30
31 struct YAMLXRayRecord {
32   uint16_t RecordType;
33   uint16_t CPU;
34   RecordTypes Type;
35   int32_t FuncId;
36   std::string Function;
37   uint64_t TSC;
38   uint32_t TId;
39   uint32_t PId;
40   std::vector<uint64_t> CallArgs;
41   std::string Data;
42 };
43
44 struct YAMLXRayTrace {
45   YAMLXRayFileHeader Header;
46   std::vector<YAMLXRayRecord> Records;
47 };
48
49 } // namespace xray
50
51 namespace yaml {
52
53 // YAML Traits
54 // -----------
55 template <> struct ScalarEnumerationTraits<xray::RecordTypes> {
56   static void enumeration(IO &IO, xray::RecordTypes &Type) {
57     IO.enumCase(Type, "function-enter", xray::RecordTypes::ENTER);
58     IO.enumCase(Type, "function-exit", xray::RecordTypes::EXIT);
59     IO.enumCase(Type, "function-tail-exit", xray::RecordTypes::TAIL_EXIT);
60     IO.enumCase(Type, "function-enter-arg", xray::RecordTypes::ENTER_ARG);
61     IO.enumCase(Type, "custom-event", xray::RecordTypes::CUSTOM_EVENT);
62     IO.enumCase(Type, "typed-event", xray::RecordTypes::TYPED_EVENT);
63   }
64 };
65
66 template <> struct MappingTraits<xray::YAMLXRayFileHeader> {
67   static void mapping(IO &IO, xray::YAMLXRayFileHeader &Header) {
68     IO.mapRequired("version", Header.Version);
69     IO.mapRequired("type", Header.Type);
70     IO.mapRequired("constant-tsc", Header.ConstantTSC);
71     IO.mapRequired("nonstop-tsc", Header.NonstopTSC);
72     IO.mapRequired("cycle-frequency", Header.CycleFrequency);
73   }
74 };
75
76 template <> struct MappingTraits<xray::YAMLXRayRecord> {
77   static void mapping(IO &IO, xray::YAMLXRayRecord &Record) {
78     IO.mapRequired("type", Record.RecordType);
79     IO.mapOptional("func-id", Record.FuncId);
80     IO.mapOptional("function", Record.Function);
81     IO.mapOptional("args", Record.CallArgs);
82     IO.mapRequired("cpu", Record.CPU);
83     IO.mapOptional("thread", Record.TId, 0U);
84     IO.mapOptional("process", Record.PId, 0U);
85     IO.mapRequired("kind", Record.Type);
86     IO.mapRequired("tsc", Record.TSC);
87     IO.mapOptional("data", Record.Data);
88   }
89
90   static constexpr bool flow = true;
91 };
92
93 template <> struct MappingTraits<xray::YAMLXRayTrace> {
94   static void mapping(IO &IO, xray::YAMLXRayTrace &Trace) {
95     // A trace file contains two parts, the header and the list of all the
96     // trace records.
97     IO.mapRequired("header", Trace.Header);
98     IO.mapRequired("records", Trace.Records);
99   }
100 };
101
102 } // namespace yaml
103 } // namespace llvm
104
105 LLVM_YAML_IS_SEQUENCE_VECTOR(xray::YAMLXRayRecord)
106
107 #endif // LLVM_XRAY_YAML_XRAY_RECORD_H