1//===- XRayRecord.h - XRay Trace Record -----------------------------------===//
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// This file replicates the record definition for XRay log entries. This should
10// follow the evolution of the log record versions supported in the compiler-rt
11// xray project.
12//
13//===----------------------------------------------------------------------===//
14#ifndef LLVM_XRAY_XRAY_RECORD_H
15#define LLVM_XRAY_XRAY_RECORD_H
16
17#include <cstdint>
18#include <vector>
19#include <string>
20
21namespace llvm {
22namespace xray {
23
24/// XRay traces all have a header providing some top-matter information useful
25/// to help tools determine how to interpret the information available in the
26/// trace.
27struct XRayFileHeader {
28  /// Version of the XRay implementation that produced this file.
29  uint16_t Version = 0;
30
31  /// A numeric identifier for the type of file this is. Best used in
32  /// combination with Version.
33  uint16_t Type = 0;
34
35  /// Whether the CPU that produced the timestamp counters (TSC) move at a
36  /// constant rate.
37  bool ConstantTSC;
38
39  /// Whether the CPU that produced the timestamp counters (TSC) do not stop.
40  bool NonstopTSC;
41
42  /// The number of cycles per second for the CPU that produced the timestamp
43  /// counter (TSC) values. Useful for estimating the amount of time that
44  /// elapsed between two TSCs on some platforms.
45  uint64_t CycleFrequency = 0;
46
47  // This is different depending on the type of xray record. The naive format
48  // stores a Wallclock timespec. FDR logging stores the size of a thread
49  // buffer.
50  char FreeFormData[16];
51};
52
53/// Determines the supported types of records that could be seen in XRay traces.
54/// This may or may not correspond to actual record types in the raw trace (as
55/// the loader implementation may synthesize this information in the process of
56/// of loading).
57enum class RecordTypes {
58  ENTER,
59  EXIT,
60  TAIL_EXIT,
61  ENTER_ARG,
62  CUSTOM_EVENT,
63  TYPED_EVENT
64};
65
66/// An XRayRecord is the denormalized view of data associated in a trace. These
67/// records may not correspond to actual entries in the raw traces, but they are
68/// the logical representation of records in a higher-level event log.
69struct XRayRecord {
70  /// RecordType values are used as "sub-types" which have meaning in the
71  /// context of the `Type` below. For function call and custom event records,
72  /// the RecordType is always 0, while for typed events we store the type in
73  /// the RecordType field.
74  uint16_t RecordType;
75
76  /// The CPU where the thread is running. We assume number of CPUs <= 65536.
77  uint16_t CPU;
78
79  /// Identifies the type of record.
80  RecordTypes Type;
81
82  /// The function ID for the record, if this is a function call record.
83  int32_t FuncId;
84
85  /// Get the full 8 bytes of the TSC when we get the log record.
86  uint64_t TSC;
87
88  /// The thread ID for the currently running thread.
89  uint32_t TId;
90
91  /// The process ID for the currently running process.
92  uint32_t PId;
93
94  /// The function call arguments.
95  std::vector<uint64_t> CallArgs;
96
97  /// For custom and typed events, we provide the raw data from the trace.
98  std::string Data;
99};
100
101} // namespace xray
102} // namespace llvm
103
104#endif // LLVM_XRAY_XRAY_RECORD_H
105