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