// 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 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; }