// 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 {
  // Wall clock time for current sample.
  // By default, it is perf clock used in kernel.
  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
}

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