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 
     20 namespace llvm {
     21 namespace xray {
     22 
     23 /// XRay traces all have a header providing some top-matter information useful
     24 /// to help tools determine how to interpret the information available in the
     25 /// trace.
     26 struct XRayFileHeader {
     27   /// Version of the XRay implementation that produced this file.
     28   uint16_t Version = 0;
     29 
     30   /// A numeric identifier for the type of file this is. Best used in
     31   /// combination with Version.
     32   uint16_t Type = 0;
     33 
     34   /// Whether the CPU that produced the timestamp counters (TSC) move at a
     35   /// constant rate.
     36   bool ConstantTSC;
     37 
     38   /// Whether the CPU that produced the timestamp counters (TSC) do not stop.
     39   bool NonstopTSC;
     40 
     41   /// The number of cycles per second for the CPU that produced the timestamp
     42   /// counter (TSC) values. Useful for estimating the amount of time that
     43   /// elapsed between two TSCs on some platforms.
     44   uint64_t CycleFrequency = 0;
     45 
     46   // This is different depending on the type of xray record. The naive format
     47   // stores a Wallclock timespec. FDR logging stores the size of a thread
     48   // buffer.
     49   char FreeFormData[16];
     50 };
     51 
     52 /// Determines the supported types of records that could be seen in XRay traces.
     53 /// This may or may not correspond to actual record types in the raw trace (as
     54 /// the loader implementation may synthesize this information in the process of
     55 /// of loading).
     56 enum class RecordTypes { ENTER, EXIT, TAIL_EXIT, ENTER_ARG };
     57 
     58 struct XRayRecord {
     59   /// The type of record.
     60   uint16_t RecordType;
     61 
     62   /// The CPU where the thread is running. We assume number of CPUs <= 65536.
     63   uint16_t CPU;
     64 
     65   /// Identifies the type of record.
     66   RecordTypes Type;
     67 
     68   /// The function ID for the record.
     69   int32_t FuncId;
     70 
     71   /// Get the full 8 bytes of the TSC when we get the log record.
     72   uint64_t TSC;
     73 
     74   /// The thread ID for the currently running thread.
     75   uint32_t TId;
     76 
     77   /// The function call arguments.
     78   std::vector<uint64_t> CallArgs;
     79 };
     80 
     81 } // namespace xray
     82 } // namespace llvm
     83 
     84 #endif // LLVM_XRAY_XRAY_RECORD_H
     85