// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// -*- mode: protobuffer -*-
//
// Copyright 2022-2024 Google LLC
//
// Licensed under the Apache License v2.0 with LLVM Exceptions (the
// "License"); you may not use this file except in compliance with the
// License.  You may obtain a copy of the License at
//
//     https://llvm.org/LICENSE.txt
//
// 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.
//
// Author: Siddharth Nayyar
//
// Protobuf definitions representing the graph and nodes defined in graph.h.
//
// The protobuf representations approximately mirror the internal STG
// representataion. Keeping the representations as close as possible helps keep
// the serialisation and deserialisation logic simple. Nevertheless, there are
// some differences between the two representation, which are as follows:
//
// * The protobuf graph has repeated fields for each node type rather than a
//   repeated field of one offs of all node types.
// * The external ids are 32-bit integers. We use fixed32 type to represent the
//   ids which is better than using a variable integer type in terms of both
//   space and time. The ids are generated using 32-bit hashes of local
//   information of nodes.
// * All enumerations have a default UNKNOWN value to avoid defaulting to
//   concrete enumeration values when those values are missing.
// * Self ids of nodes have been made a part of the node itself (as the first
//   member) for all node types. This is to improve succinctness of textual
//   representation of the protobuf.
// * The binary protobuf definitions have no stability guarantee and exist
//   solely to support the associated textual format.

syntax = "proto3";

package stg.proto;

// deprecated
message Void {
  fixed32 id = 1;
}

// deprecated
message Variadic {
  fixed32 id = 1;
}

message Special {
  enum Kind {
    KIND_UNSPECIFIED = 0;
    VOID = 1;
    VARIADIC = 2;
    NULLPTR = 3;
  }

  fixed32 id = 1;
  Kind kind = 2;
}

message PointerReference {
  enum Kind {
    KIND_UNSPECIFIED = 0;
    POINTER = 1;
    LVALUE_REFERENCE = 2;
    RVALUE_REFERENCE = 3;
  }

  fixed32 id = 1;
  Kind kind = 2;
  fixed32 pointee_type_id = 3;
}

message PointerToMember {
  fixed32 id = 1;
  fixed32 containing_type_id = 2;
  fixed32 pointee_type_id = 3;
}

message Typedef {
  fixed32 id = 1;
  string name = 2;
  fixed32 referred_type_id = 3;
}

message Qualified {
  enum Qualifier {
    QUALIFIER_UNSPECIFIED = 0;
    CONST = 1;
    VOLATILE = 2;
    RESTRICT = 3;
    ATOMIC = 4;
  }

  fixed32 id = 1;
  Qualifier qualifier = 2;
  fixed32 qualified_type_id = 3;
}

message Primitive {
  enum Encoding {
    ENCODING_UNSPECIFIED = 0;
    NONE = 1;
    BOOLEAN = 2;
    SIGNED_INTEGER = 3;
    UNSIGNED_INTEGER = 4;
    SIGNED_CHARACTER = 5;
    UNSIGNED_CHARACTER = 6;
    REAL_NUMBER = 7;
    COMPLEX_NUMBER = 8;
    UTF = 9;
  }

  fixed32 id = 1;
  string name = 2;
  optional Encoding encoding = 3;
  uint32 bytesize = 4;
}

message Array {
  fixed32 id = 1;
  uint64 number_of_elements = 2;
  fixed32 element_type_id = 3;
}

message BaseClass {
  enum Inheritance {
    INHERITANCE_UNSPECIFIED = 0;
    NON_VIRTUAL = 1;
    VIRTUAL = 2;
  }

  fixed32 id = 1;
  fixed32 type_id = 2;
  uint64 offset = 3;
  Inheritance inheritance = 4;
}

message Method {
  fixed32 id = 1;
  string mangled_name = 2;
  string name = 3;
  uint64 vtable_offset = 4;
  fixed32 type_id = 5;
}

message Member {
  fixed32 id = 1;
  string name = 2;
  fixed32 type_id = 3;
  uint64 offset = 4;
  uint64 bitsize = 5;
}

message VariantMember {
  fixed32 id = 1;
  string name = 2;
  optional int64 discriminant_value = 3;
  fixed32 type_id = 4;
}

message StructUnion {
  enum Kind {
    KIND_UNSPECIFIED = 0;
    STRUCT = 1;
    UNION = 2;
  }

  message Definition {
    uint64 bytesize = 1;
    repeated fixed32 base_class_id = 2;
    repeated fixed32 method_id = 3;
    repeated fixed32 member_id = 4;
  }

  fixed32 id = 1;
  Kind kind = 2;
  string name = 3;
  optional Definition definition = 4;
}

message Enumeration {
  message Enumerator {
    string name = 1;
    int64 value = 2;
  }

  message Definition {
    fixed32 underlying_type_id = 1;
    repeated Enumerator enumerator = 2;
  }

  fixed32 id = 1;
  string name = 2;
  optional Definition definition = 3;
}

message Variant {
  fixed32 id = 1;
  string name = 2;
  uint64 bytesize = 3;
  optional fixed32 discriminant = 4;
  repeated fixed32 member_id = 5;
}

message Function {
  fixed32 id = 1;
  fixed32 return_type_id = 2;
  repeated fixed32 parameter_id = 3;
}

message ElfSymbol {
  message VersionInfo {
    bool is_default = 1;
    string name = 2;
  }

  enum SymbolType {
    SYMBOL_TYPE_UNSPECIFIED = 0;
    NOTYPE = 1;
    OBJECT = 2;
    FUNCTION = 3;
    COMMON = 4;
    TLS = 5;
    GNU_IFUNC = 6;
  }

  enum Binding {
    GLOBAL = 0;  // Default while reading, omitted while writing.
    LOCAL = 1;
    WEAK = 2;
    GNU_UNIQUE = 3;
  }

  enum Visibility {
    DEFAULT = 0;  // Default while reading, omitted while writing.
    PROTECTED = 1;
    HIDDEN = 2;
    INTERNAL = 3;
  }

  fixed32 id = 1;
  string name = 2;
  optional VersionInfo version_info = 3;
  bool is_defined = 4;
  SymbolType symbol_type = 5;
  Binding binding = 6;
  Visibility visibility = 7;
  optional fixed32 crc = 8;
  optional string namespace = 9;
  optional fixed32 type_id = 10;
  optional string full_name = 11;
}

message Symbols {
  fixed32 id = 1;
  map<string, fixed32> symbol = 2;
}

message Interface {
  fixed32 id = 1;
  repeated fixed32 symbol_id = 2;
  repeated fixed32 type_id = 3;
}

message STG {
  uint32 version = 1;
  fixed32 root_id = 2;
  repeated Void void = 3;
  repeated Variadic variadic = 4;
  repeated Special special = 5;
  repeated PointerReference pointer_reference = 6;
  repeated PointerToMember pointer_to_member = 7;
  repeated Typedef typedef = 8;
  repeated Qualified qualified = 9;
  repeated Primitive primitive = 10;
  repeated Array array = 11;
  repeated BaseClass base_class = 12;
  repeated Method method = 13;
  repeated Member member = 14;
  repeated VariantMember variant_member = 15;
  repeated StructUnion struct_union = 16;
  repeated Enumeration enumeration = 17;
  repeated Variant variant = 18;
  repeated Function function = 19;
  repeated ElfSymbol elf_symbol = 20;
  repeated Symbols symbols = 21;
  repeated Interface interface = 22;
}
