// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto2";

package bloaty;

message Options {
  // The files to analyze.  At least one file must be provided.
  repeated string filename = 1;

  // If non-empty, we are in diff mode and these files should provide the
  // baseline.
  repeated string base_filename = 2;

  // Files to use for debug information.  We will match these to files from
  // filename or base_filename by build id.  Files that are only in
  // debug_filename will *not* have their file size counted.
  repeated string debug_filename = 10;

  // Link map files to assist symbol and compile unit parsing.
  // We will match these to files with the same base name / stem.
  // E.g. "foo.map" will be used to analyze the executable "foo".
  repeated string link_map_filename = 30;

  // If set, reads how frequently a range of bytes is accessed in CSV format.
  // The filter is in a sparse pattern format: assuming the frame size (see
  // access_pattern_frame_size) is 8 KiB, given a 24 KiB file and a `0:1,2:3`
  // pattern, it means that the first 8 KiB frame is accessed once, and the
  // third 8 KiB frame is accessed 3 times. The second 8 KiB frame is left
  // out, meaning it was never accessed. The frame indices in the pattern is not
  // guaranteed to be sorted. This option works together with the
  // `accesspattern` data source. When the `accesspattern` data source is the
  // first data source, the protobuf output format will only output items whose
  // region overlaps with a never-accessed frame.
  optional string cold_bytes_filter = 31;

  // If set, customizes how many bytes is in a frame as used by the pattern
  // in cold_bytes_filter.
  optional uint64 access_pattern_frame_size = 32 [default = 8192];

  // The data sources to scan in each file.  At least one data source must be
  // specified.  If more than one source is specified, the output is
  // hierarchical.
  //
  // These can be built-in data sources or custom data sources.
  repeated string data_source = 3;

  // The maximum number of rows to show at each level before collapsing the rest
  // into '[Other]'.
  optional int64 max_rows_per_level = 4 [default = 20];

  enum Demangle {
    DEMANGLE_SHORT = 0;
    DEMANGLE_FULL = 1;
    DEMANGLE_NONE = 2;
  }
  optional Demangle demangle = 5 [default = DEMANGLE_SHORT];

  // What to sort the output by.
  enum SortBy {
    SORTBY_BOTH = 0;
    SORTBY_VMSIZE = 1;
    SORTBY_FILESIZE = 2;
  }
  optional SortBy sort_by = 6 [default = SORTBY_BOTH];

  // When greater than zero, Bloaty will print verbose output to stdout.
  // TODO(haberman): should this be in the output object instead?
  optional int32 verbose_level = 7;

  // If set, these will print verbose information pertaining to the given
  // vm address and/or file offset.
  optional uint64 debug_vmaddr = 11;
  optional uint64 debug_fileoff = 12;

  // Custom data sources for this analysis.
  repeated CustomDataSource custom_data_source = 8;

  // Disassemble this function.
  optional string disassemble_function = 9;

  // Regex with which to filter names in the data sources.
  optional string source_filter = 13;
}

// A custom data source allows users to create their own label space by
// rewriting a set of existing labels according to a set of regexes.
message CustomDataSource {
  // The name of this data source.
  optional string name = 1;

  // The underlying data source.  We will scan this data source and apply
  // rewrites to define the new data source.  This must be a built-in data
  // source, not another custom data source.
  optional string base_data_source = 2;

  // The rewrites that we will apply to the underlying labels to define the new
  // data source.
  repeated Regex rewrite = 3;
}

// For rewriting labels from a data source.  If the regex matches, then the
// entire string is replaced with the replacement.  Any groups captured from the
// pattern can be substituted into the replacement with \1, \2, etc. and \0
// refers to the entire match.
message Regex {
  optional string pattern = 1;
  optional string replacement = 2;
}
