Home | History | Annotate | Line # | Download | only in XRay
      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 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).
     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