1// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 2// -*- mode: protobuffer -*- 3// 4// Copyright 2022-2024 Google LLC 5// 6// Licensed under the Apache License v2.0 with LLVM Exceptions (the 7// "License"); you may not use this file except in compliance with the 8// License. You may obtain a copy of the License at 9// 10// https://llvm.org/LICENSE.txt 11// 12// Unless required by applicable law or agreed to in writing, software 13// distributed under the License is distributed on an "AS IS" BASIS, 14// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15// See the License for the specific language governing permissions and 16// limitations under the License. 17// 18// Author: Siddharth Nayyar 19// 20// Protobuf definitions representing the graph and nodes defined in graph.h. 21// 22// The protobuf representations approximately mirror the internal STG 23// representataion. Keeping the representations as close as possible helps keep 24// the serialisation and deserialisation logic simple. Nevertheless, there are 25// some differences between the two representation, which are as follows: 26// 27// * The protobuf graph has repeated fields for each node type rather than a 28// repeated field of one offs of all node types. 29// * The external ids are 32-bit integers. We use fixed32 type to represent the 30// ids which is better than using a variable integer type in terms of both 31// space and time. The ids are generated using 32-bit hashes of local 32// information of nodes. 33// * All enumerations have a default UNKNOWN value to avoid defaulting to 34// concrete enumeration values when those values are missing. 35// * Self ids of nodes have been made a part of the node itself (as the first 36// member) for all node types. This is to improve succinctness of textual 37// representation of the protobuf. 38// * The binary protobuf definitions have no stability guarantee and exist 39// solely to support the associated textual format. 40 41syntax = "proto3"; 42 43package stg.proto; 44 45// deprecated 46message Void { 47 fixed32 id = 1; 48} 49 50// deprecated 51message Variadic { 52 fixed32 id = 1; 53} 54 55message Special { 56 enum Kind { 57 KIND_UNSPECIFIED = 0; 58 VOID = 1; 59 VARIADIC = 2; 60 NULLPTR = 3; 61 } 62 63 fixed32 id = 1; 64 Kind kind = 2; 65} 66 67message PointerReference { 68 enum Kind { 69 KIND_UNSPECIFIED = 0; 70 POINTER = 1; 71 LVALUE_REFERENCE = 2; 72 RVALUE_REFERENCE = 3; 73 } 74 75 fixed32 id = 1; 76 Kind kind = 2; 77 fixed32 pointee_type_id = 3; 78} 79 80message PointerToMember { 81 fixed32 id = 1; 82 fixed32 containing_type_id = 2; 83 fixed32 pointee_type_id = 3; 84} 85 86message Typedef { 87 fixed32 id = 1; 88 string name = 2; 89 fixed32 referred_type_id = 3; 90} 91 92message Qualified { 93 enum Qualifier { 94 QUALIFIER_UNSPECIFIED = 0; 95 CONST = 1; 96 VOLATILE = 2; 97 RESTRICT = 3; 98 ATOMIC = 4; 99 } 100 101 fixed32 id = 1; 102 Qualifier qualifier = 2; 103 fixed32 qualified_type_id = 3; 104} 105 106message Primitive { 107 enum Encoding { 108 ENCODING_UNSPECIFIED = 0; 109 NONE = 1; 110 BOOLEAN = 2; 111 SIGNED_INTEGER = 3; 112 UNSIGNED_INTEGER = 4; 113 SIGNED_CHARACTER = 5; 114 UNSIGNED_CHARACTER = 6; 115 REAL_NUMBER = 7; 116 COMPLEX_NUMBER = 8; 117 UTF = 9; 118 } 119 120 fixed32 id = 1; 121 string name = 2; 122 optional Encoding encoding = 3; 123 uint32 bytesize = 4; 124} 125 126message Array { 127 fixed32 id = 1; 128 uint64 number_of_elements = 2; 129 fixed32 element_type_id = 3; 130} 131 132message BaseClass { 133 enum Inheritance { 134 INHERITANCE_UNSPECIFIED = 0; 135 NON_VIRTUAL = 1; 136 VIRTUAL = 2; 137 } 138 139 fixed32 id = 1; 140 fixed32 type_id = 2; 141 uint64 offset = 3; 142 Inheritance inheritance = 4; 143} 144 145message Method { 146 fixed32 id = 1; 147 string mangled_name = 2; 148 string name = 3; 149 uint64 vtable_offset = 4; 150 fixed32 type_id = 5; 151} 152 153message Member { 154 fixed32 id = 1; 155 string name = 2; 156 fixed32 type_id = 3; 157 uint64 offset = 4; 158 uint64 bitsize = 5; 159} 160 161message VariantMember { 162 fixed32 id = 1; 163 string name = 2; 164 optional int64 discriminant_value = 3; 165 fixed32 type_id = 4; 166} 167 168message StructUnion { 169 enum Kind { 170 KIND_UNSPECIFIED = 0; 171 STRUCT = 1; 172 UNION = 2; 173 } 174 175 message Definition { 176 uint64 bytesize = 1; 177 repeated fixed32 base_class_id = 2; 178 repeated fixed32 method_id = 3; 179 repeated fixed32 member_id = 4; 180 } 181 182 fixed32 id = 1; 183 Kind kind = 2; 184 string name = 3; 185 optional Definition definition = 4; 186} 187 188message Enumeration { 189 message Enumerator { 190 string name = 1; 191 int64 value = 2; 192 } 193 194 message Definition { 195 fixed32 underlying_type_id = 1; 196 repeated Enumerator enumerator = 2; 197 } 198 199 fixed32 id = 1; 200 string name = 2; 201 optional Definition definition = 3; 202} 203 204message Variant { 205 fixed32 id = 1; 206 string name = 2; 207 uint64 bytesize = 3; 208 optional fixed32 discriminant = 4; 209 repeated fixed32 member_id = 5; 210} 211 212message Function { 213 fixed32 id = 1; 214 fixed32 return_type_id = 2; 215 repeated fixed32 parameter_id = 3; 216} 217 218message ElfSymbol { 219 message VersionInfo { 220 bool is_default = 1; 221 string name = 2; 222 } 223 224 enum SymbolType { 225 SYMBOL_TYPE_UNSPECIFIED = 0; 226 OBJECT = 1; 227 FUNCTION = 2; 228 COMMON = 3; 229 TLS = 4; 230 GNU_IFUNC = 5; 231 } 232 233 enum Binding { 234 GLOBAL = 0; // Default while reading, omitted while writing. 235 LOCAL = 1; 236 WEAK = 2; 237 GNU_UNIQUE = 3; 238 } 239 240 enum Visibility { 241 DEFAULT = 0; // Default while reading, omitted while writing. 242 PROTECTED = 1; 243 HIDDEN = 2; 244 INTERNAL = 3; 245 } 246 247 fixed32 id = 1; 248 string name = 2; 249 optional VersionInfo version_info = 3; 250 bool is_defined = 4; 251 SymbolType symbol_type = 5; 252 Binding binding = 6; 253 Visibility visibility = 7; 254 optional fixed32 crc = 8; 255 optional string namespace = 9; 256 optional fixed32 type_id = 10; 257 optional string full_name = 11; 258} 259 260message Symbols { 261 fixed32 id = 1; 262 map<string, fixed32> symbol = 2; 263} 264 265message Interface { 266 fixed32 id = 1; 267 repeated fixed32 symbol_id = 2; 268 repeated fixed32 type_id = 3; 269} 270 271message STG { 272 uint32 version = 1; 273 fixed32 root_id = 2; 274 repeated Void void = 3; 275 repeated Variadic variadic = 4; 276 repeated Special special = 5; 277 repeated PointerReference pointer_reference = 6; 278 repeated PointerToMember pointer_to_member = 7; 279 repeated Typedef typedef = 8; 280 repeated Qualified qualified = 9; 281 repeated Primitive primitive = 10; 282 repeated Array array = 11; 283 repeated BaseClass base_class = 12; 284 repeated Method method = 13; 285 repeated Member member = 14; 286 repeated VariantMember variant_member = 15; 287 repeated StructUnion struct_union = 16; 288 repeated Enumeration enumeration = 17; 289 repeated Variant variant = 18; 290 repeated Function function = 19; 291 repeated ElfSymbol elf_symbol = 20; 292 repeated Symbols symbols = 21; 293 repeated Interface interface = 22; 294} 295