Home | History | Annotate | Download | only in XRay
      1 //===- XRayRecord.h - XRay Trace Record -----------------------------------===//
      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 // This file replicates the record definition for XRay log entries. This should
     11 // follow the evolution of the log record versions supported in the compiler-rt
     12 // xray project.
     13 //
     14 //===----------------------------------------------------------------------===//
     15 #ifndef LLVM_XRAY_XRAY_RECORD_H
     16 #define LLVM_XRAY_XRAY_RECORD_H
     17 
     18 #include <cstdint>
     19 #include <vector>
     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 { ENTER, EXIT, TAIL_EXIT, ENTER_ARG };
     58 
     59 struct XRayRecord {
     60   /// The type of record.
     61   uint16_t RecordType;
     62 
     63   /// The CPU where the thread is running. We assume number of CPUs <= 65536.
     64   uint16_t CPU;
     65 
     66   /// Identifies the type of record.
     67   RecordTypes Type;
     68 
     69   /// The function ID for the record.
     70   int32_t FuncId;
     71 
     72   /// Get the full 8 bytes of the TSC when we get the log record.
     73   uint64_t TSC;
     74 
     75   /// The thread ID for the currently running thread.
     76   uint32_t TId;
     77 
     78   /// The process ID for the currently running process.
     79   uint32_t PId;
     80 
     81   /// The function call arguments.
     82   std::vector<uint64_t> CallArgs;
     83 };
     84 
     85 } // namespace xray
     86 } // namespace llvm
     87 
     88 #endif // LLVM_XRAY_XRAY_RECORD_H
     89