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 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 = false; 38 39 /// Whether the CPU that produced the timestamp counters (TSC) do not stop. 40 bool NonstopTSC = 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 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_XRAYRECORD_H 105