// The file format generated by cmd_report_sample.proto is as below:
// char magic[10] = "SIMPLEPERF";
// LittleEndian16(version) = 1;
// LittleEndian32(record_size_0)
// message Record(record_0) (having record_size_0 bytes)
// LittleEndian32(record_size_1)
// message Record(record_1) (having record_size_1 bytes)
// ...
// LittleEndian32(record_size_N)
// message Record(record_N) (having record_size_N bytes)
// LittleEndian32(0)

syntax = "proto2";
option optimize_for = LITE_RUNTIME;
package simpleperf_report_proto;
option java_package = "com.android.tools.profiler.proto";
option java_outer_classname = "SimpleperfReport";

message Sample {
  // Monotonic clock time in nanoseconds. On kernel < 4.1, it's perf clock instead.
  optional uint64 time = 1;
  optional int32 thread_id = 2;

  message CallChainEntry {
    // virtual address of the instruction in elf file
    optional uint64 vaddr_in_file = 1;

    // index of the elf file containing the instruction
    optional uint32 file_id = 2;

    // symbol_id refers to the name of the function containing the instruction.
    // If the function name is found, it is a valid index in the symbol table
    // of File with 'id' field being file_id, otherwise it is -1.
    optional int32 symbol_id = 3;

    enum ExecutionType {
      // methods belong to native libraries, AOT compiled JVM code and ART methods not used near
      // JVM methods
      NATIVE_METHOD = 0;
      INTERPRETED_JVM_METHOD = 1;
      JIT_JVM_METHOD = 2;
      // ART methods used near JVM methods. It's shown only when --show-art-frames is used.
      ART_METHOD = 3;
    }
    optional ExecutionType execution_type = 4 [default = NATIVE_METHOD];
  }

  repeated CallChainEntry callchain = 3;

  // Simpleperf generates one sample whenever a specified amount of events happen
  // while running a monitored thread. So each sample belongs to one event type.
  // Event type can be cpu-cycles, cpu-clock, sched:sched_switch or other types.
  // By using '-e' option, we can ask simpleperf to record samples for one or more
  // event types.
  // Each event type generates samples independently. But recording more event types
  // will cost more cpu time generating samples, which may affect the monitored threads
  // and sample lost rate.
  // event_count field shows the count of the events (belong to the sample's event type)
  // that have happened since last sample (belong to the sample's event type) for the
  // same thread. However, if there are lost samples between current sample and previous
  // sample, the event_count is the count of events from the last lost sample.
  optional uint64 event_count = 4;

  // An index in meta_info.event_type, shows which event type current sample belongs to.
  optional uint32 event_type_id = 5;

  message UnwindingResult {
    // error code provided by libunwindstack, in
    // https://cs.android.com/android/platform/superproject/+/master:system/unwinding/libunwindstack/include/unwindstack/Error.h
    optional uint32 raw_error_code = 1;
    // error addr provided by libunwindstack
    optional uint64 error_addr = 2;

    // error code interpreted by simpleperf
    enum ErrorCode {
      ERROR_NONE = 0;                  // No error
      ERROR_UNKNOWN = 1;               // Error not interpreted by simpleperf, see raw_error_code
      ERROR_NOT_ENOUGH_STACK = 2;      // Simpleperf doesn't record enough stack data
      ERROR_MEMORY_INVALID = 3;        // Memory read failed
      ERROR_UNWIND_INFO = 4;           // No debug info in binary to support unwinding
      ERROR_INVALID_MAP = 5;           // Unwind in an invalid map
      ERROR_MAX_FRAME_EXCEEDED = 6;    // Stopped at MAX_UNWINDING_FRAMES, which is 512.
      ERROR_REPEATED_FRAME = 7;        // The last frame has the same pc/sp as the next.
      ERROR_INVALID_ELF = 8;           // Unwind in an invalid elf file
    }
    optional ErrorCode error_code = 3;
  }

  // Unwinding result is provided for samples without a complete callchain, when recorded with
  // --keep-failed-unwinding-result or --keep-failed-unwinding-debug-info.
  optional UnwindingResult unwinding_result = 6;
}

message LostSituation {
  optional uint64 sample_count = 1;
  optional uint64 lost_count = 2;
}

message File {
  // unique id for each file, starting from 0, and add 1 each time.
  optional uint32 id = 1;

  // file path, like /system/lib/libc.so.
  optional string path = 2;

  // symbol table of the file.
  repeated string symbol = 3;

  // mangled symbol table of the file.
  repeated string mangled_symbol = 4;
}

message Thread {
  optional uint32 thread_id = 1;
  optional uint32 process_id = 2;
  optional string thread_name = 3;
}

message MetaInfo {
  repeated string event_type = 1;
  optional string app_package_name = 2;
  optional string app_type = 3;  // debuggable, profileable or non_profileable
  optional string android_sdk_version = 4;
  optional string android_build_type = 5;  // user, userdebug or eng

  // True if the profile is recorded with --trace-offcpu option.
  optional bool trace_offcpu = 6;
}

// Thread context switch info. It is available when MetaInfo.trace_offcpu = true.
message ContextSwitch {
  // If true, the thread is scheduled on cpu, otherwise it is scheduled off cpu.
  optional bool switch_on = 1;

  // Monotonic clock time in nanoseconds. On kernel < 4.1, it's perf clock instead.
  optional uint64 time = 2;
  optional uint32 thread_id = 3;
}

message Record {
  oneof record_data {
    Sample sample = 1;
    LostSituation lost = 2;
    File file = 3;
    Thread thread = 4;
    MetaInfo meta_info = 5;
    ContextSwitch context_switch = 6;
  }
}