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_XRAYRECORD_H |
15 | #define LLVM_XRAY_XRAYRECORD_H |
16 | |
17 | #include <cstdint> |
18 | #include <vector> |
19 | #include <string> |
20 | |
21 | namespace llvm { |
22 | namespace 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. |
27 | struct { |
28 | /// Version of the XRay implementation that produced this file. |
29 | uint16_t = 0; |
30 | |
31 | /// A numeric identifier for the type of file this is. Best used in |
32 | /// combination with Version. |
33 | uint16_t = 0; |
34 | |
35 | /// Whether the CPU that produced the timestamp counters (TSC) move at a |
36 | /// constant rate. |
37 | bool = false; |
38 | |
39 | /// Whether the CPU that produced the timestamp counters (TSC) do not stop. |
40 | bool = false; |
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 = 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 [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). |
57 | enum 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. |
69 | struct 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_XRAYRECORD_H |
105 | |