blob: 0937299d961dcc44d75530f2adb963c033702ca9 [file] [log] [blame]
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// -*- mode: protobuffer -*-
//
// Copyright 2022 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;
fixed32 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 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 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;
OBJECT = 1;
FUNCTION = 2;
COMMON = 3;
TLS = 4;
GNU_IFUNC = 5;
}
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 StructUnion struct_union = 15;
repeated Enumeration enumeration = 16;
repeated Function function = 17;
repeated ElfSymbol elf_symbol = 18;
repeated Symbols symbols = 19;
repeated Interface interface = 20;
}