1 //===- YAMLXRayRecord.h - XRay Record YAML Support Definitions ------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 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 21 namespace llvm { 22 namespace xray { 23 24 struct YAMLXRayFileHeader { 25 uint16_t Version; 26 uint16_t Type; 27 bool ConstantTSC; 28 bool NonstopTSC; 29 uint64_t CycleFrequency; 30 }; 31 32 struct 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 std::vector<uint64_t> CallArgs; 41 }; 42 43 struct YAMLXRayTrace { 44 YAMLXRayFileHeader Header; 45 std::vector<YAMLXRayRecord> Records; 46 }; 47 48 } // namespace xray 49 50 namespace yaml { 51 52 // YAML Traits 53 // ----------- 54 template <> struct ScalarEnumerationTraits<xray::RecordTypes> { 55 static void enumeration(IO &IO, xray::RecordTypes &Type) { 56 IO.enumCase(Type, "function-enter", xray::RecordTypes::ENTER); 57 IO.enumCase(Type, "function-exit", xray::RecordTypes::EXIT); 58 IO.enumCase(Type, "function-tail-exit", xray::RecordTypes::TAIL_EXIT); 59 IO.enumCase(Type, "function-enter-arg", xray::RecordTypes::ENTER_ARG); 60 } 61 }; 62 63 template <> struct MappingTraits<xray::YAMLXRayFileHeader> { 64 static void mapping(IO &IO, xray::YAMLXRayFileHeader &Header) { 65 IO.mapRequired("version", Header.Version); 66 IO.mapRequired("type", Header.Type); 67 IO.mapRequired("constant-tsc", Header.ConstantTSC); 68 IO.mapRequired("nonstop-tsc", Header.NonstopTSC); 69 IO.mapRequired("cycle-frequency", Header.CycleFrequency); 70 } 71 }; 72 73 template <> struct MappingTraits<xray::YAMLXRayRecord> { 74 static void mapping(IO &IO, xray::YAMLXRayRecord &Record) { 75 // FIXME: Make this type actually be descriptive 76 IO.mapRequired("type", Record.RecordType); 77 IO.mapRequired("func-id", Record.FuncId); 78 IO.mapOptional("function", Record.Function); 79 IO.mapOptional("args", Record.CallArgs); 80 IO.mapRequired("cpu", Record.CPU); 81 IO.mapRequired("thread", Record.TId); 82 IO.mapRequired("kind", Record.Type); 83 IO.mapRequired("tsc", Record.TSC); 84 } 85 86 static constexpr bool flow = true; 87 }; 88 89 template <> struct SequenceTraits<std::vector<uint64_t>> { 90 static constexpr bool flow = true; 91 static size_t size(IO &IO, std::vector<uint64_t> &V) { return V.size(); } 92 static uint64_t &element(IO &IO, std::vector<uint64_t> &V, size_t Index) { 93 if (Index >= V.size()) 94 V.resize(Index + 1); 95 return V[Index]; 96 } 97 }; 98 99 template <> struct MappingTraits<xray::YAMLXRayTrace> { 100 static void mapping(IO &IO, xray::YAMLXRayTrace &Trace) { 101 // A trace file contains two parts, the header and the list of all the 102 // trace records. 103 IO.mapRequired("header", Trace.Header); 104 IO.mapRequired("records", Trace.Records); 105 } 106 }; 107 108 } // namespace yaml 109 } // namespace llvm 110 111 LLVM_YAML_IS_SEQUENCE_VECTOR(xray::YAMLXRayRecord) 112 113 #endif // LLVM_XRAY_YAML_XRAY_RECORD_H 114