YAMLXRayRecord.h revision 321369
1272343Sngie//===- YAMLXRayRecord.h - XRay Record YAML Support Definitions ------------===//
2272343Sngie//
3272343Sngie//                     The LLVM Compiler Infrastructure
4272343Sngie//
5272343Sngie// This file is distributed under the University of Illinois Open Source
6272343Sngie// License. See LICENSE.TXT for details.
7272343Sngie//
8//===----------------------------------------------------------------------===//
9//
10// Types and traits specialisations for YAML I/O of XRay log entries.
11//
12//===----------------------------------------------------------------------===//
13#ifndef LLVM_XRAY_YAML_XRAY_RECORD_H
14#define LLVM_XRAY_YAML_XRAY_RECORD_H
15
16#include <type_traits>
17
18#include "llvm/Support/YAMLTraits.h"
19#include "llvm/XRay/XRayRecord.h"
20
21namespace llvm {
22namespace xray {
23
24struct YAMLXRayFileHeader {
25  uint16_t Version;
26  uint16_t Type;
27  bool ConstantTSC;
28  bool NonstopTSC;
29  uint64_t CycleFrequency;
30};
31
32struct YAMLXRayRecord {
33  uint16_t RecordType;
34  uint16_t CPU;
35  RecordTypes Type;
36  int32_t FuncId;
37  std::string Function;
38  uint64_t TSC;
39  uint32_t TId;
40};
41
42struct YAMLXRayTrace {
43  YAMLXRayFileHeader Header;
44  std::vector<YAMLXRayRecord> Records;
45};
46
47} // namespace xray
48
49namespace yaml {
50
51// YAML Traits
52// -----------
53template <> struct ScalarEnumerationTraits<xray::RecordTypes> {
54  static void enumeration(IO &IO, xray::RecordTypes &Type) {
55    IO.enumCase(Type, "function-enter", xray::RecordTypes::ENTER);
56    IO.enumCase(Type, "function-exit", xray::RecordTypes::EXIT);
57  }
58};
59
60template <> struct MappingTraits<xray::YAMLXRayFileHeader> {
61  static void mapping(IO &IO, xray::YAMLXRayFileHeader &Header) {
62    IO.mapRequired("version", Header.Version);
63    IO.mapRequired("type", Header.Type);
64    IO.mapRequired("constant-tsc", Header.ConstantTSC);
65    IO.mapRequired("nonstop-tsc", Header.NonstopTSC);
66    IO.mapRequired("cycle-frequency", Header.CycleFrequency);
67  }
68};
69
70template <> struct MappingTraits<xray::YAMLXRayRecord> {
71  static void mapping(IO &IO, xray::YAMLXRayRecord &Record) {
72    // FIXME: Make this type actually be descriptive
73    IO.mapRequired("type", Record.RecordType);
74    IO.mapRequired("func-id", Record.FuncId);
75    IO.mapOptional("function", Record.Function);
76    IO.mapRequired("cpu", Record.CPU);
77    IO.mapRequired("thread", Record.TId);
78    IO.mapRequired("kind", Record.Type);
79    IO.mapRequired("tsc", Record.TSC);
80  }
81
82  static constexpr bool flow = true;
83};
84
85template <> struct MappingTraits<xray::YAMLXRayTrace> {
86  static void mapping(IO &IO, xray::YAMLXRayTrace &Trace) {
87    // A trace file contains two parts, the header and the list of all the
88    // trace records.
89    IO.mapRequired("header", Trace.Header);
90    IO.mapRequired("records", Trace.Records);
91  }
92};
93
94} // namespace yaml
95} // namespace llvm
96
97LLVM_YAML_IS_SEQUENCE_VECTOR(xray::YAMLXRayRecord)
98
99#endif // LLVM_XRAY_YAML_XRAY_RECORD_H
100