1*e8d8bef9SDimitry Andric //===-- APINotesWriter.h - API Notes Writer ---------------------*- C++ -*-===// 2*e8d8bef9SDimitry Andric // 3*e8d8bef9SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*e8d8bef9SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*e8d8bef9SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*e8d8bef9SDimitry Andric // 7*e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===// 8*e8d8bef9SDimitry Andric 9*e8d8bef9SDimitry Andric #ifndef LLVM_CLANG_LIB_APINOTES_APINOTESFORMAT_H 10*e8d8bef9SDimitry Andric #define LLVM_CLANG_LIB_APINOTES_APINOTESFORMAT_H 11*e8d8bef9SDimitry Andric 12*e8d8bef9SDimitry Andric #include "llvm/ADT/PointerEmbeddedInt.h" 13*e8d8bef9SDimitry Andric #include "llvm/Bitcode/BitcodeConvenience.h" 14*e8d8bef9SDimitry Andric 15*e8d8bef9SDimitry Andric namespace clang { 16*e8d8bef9SDimitry Andric namespace api_notes { 17*e8d8bef9SDimitry Andric /// Magic number for API notes files. 18*e8d8bef9SDimitry Andric const unsigned char API_NOTES_SIGNATURE[] = {0xE2, 0x9C, 0xA8, 0x01}; 19*e8d8bef9SDimitry Andric 20*e8d8bef9SDimitry Andric /// API notes file major version number. 21*e8d8bef9SDimitry Andric const uint16_t VERSION_MAJOR = 0; 22*e8d8bef9SDimitry Andric 23*e8d8bef9SDimitry Andric /// API notes file minor version number. 24*e8d8bef9SDimitry Andric /// 25*e8d8bef9SDimitry Andric /// When the format changes IN ANY WAY, this number should be incremented. 26*e8d8bef9SDimitry Andric const uint16_t VERSION_MINOR = 24; // EnumExtensibility + FlagEnum 27*e8d8bef9SDimitry Andric 28*e8d8bef9SDimitry Andric using IdentifierID = llvm::PointerEmbeddedInt<unsigned, 31>; 29*e8d8bef9SDimitry Andric using IdentifierIDField = llvm::BCVBR<16>; 30*e8d8bef9SDimitry Andric 31*e8d8bef9SDimitry Andric using SelectorID = llvm::PointerEmbeddedInt<unsigned, 31>; 32*e8d8bef9SDimitry Andric using SelectorIDField = llvm::BCVBR<16>; 33*e8d8bef9SDimitry Andric 34*e8d8bef9SDimitry Andric /// The various types of blocks that can occur within a API notes file. 35*e8d8bef9SDimitry Andric /// 36*e8d8bef9SDimitry Andric /// These IDs must \em not be renumbered or reordered without incrementing 37*e8d8bef9SDimitry Andric /// VERSION_MAJOR. 38*e8d8bef9SDimitry Andric enum BlockID { 39*e8d8bef9SDimitry Andric /// The control block, which contains all of the information that needs to 40*e8d8bef9SDimitry Andric /// be validated prior to committing to loading the API notes file. 41*e8d8bef9SDimitry Andric /// 42*e8d8bef9SDimitry Andric /// \sa control_block 43*e8d8bef9SDimitry Andric CONTROL_BLOCK_ID = llvm::bitc::FIRST_APPLICATION_BLOCKID, 44*e8d8bef9SDimitry Andric 45*e8d8bef9SDimitry Andric /// The identifier data block, which maps identifier strings to IDs. 46*e8d8bef9SDimitry Andric IDENTIFIER_BLOCK_ID, 47*e8d8bef9SDimitry Andric 48*e8d8bef9SDimitry Andric /// The Objective-C context data block, which contains information about 49*e8d8bef9SDimitry Andric /// Objective-C classes and protocols. 50*e8d8bef9SDimitry Andric OBJC_CONTEXT_BLOCK_ID, 51*e8d8bef9SDimitry Andric 52*e8d8bef9SDimitry Andric /// The Objective-C property data block, which maps Objective-C 53*e8d8bef9SDimitry Andric /// (class name, property name) pairs to information about the 54*e8d8bef9SDimitry Andric /// property. 55*e8d8bef9SDimitry Andric OBJC_PROPERTY_BLOCK_ID, 56*e8d8bef9SDimitry Andric 57*e8d8bef9SDimitry Andric /// The Objective-C property data block, which maps Objective-C 58*e8d8bef9SDimitry Andric /// (class name, selector, is_instance_method) tuples to information 59*e8d8bef9SDimitry Andric /// about the method. 60*e8d8bef9SDimitry Andric OBJC_METHOD_BLOCK_ID, 61*e8d8bef9SDimitry Andric 62*e8d8bef9SDimitry Andric /// The Objective-C selector data block, which maps Objective-C 63*e8d8bef9SDimitry Andric /// selector names (# of pieces, identifier IDs) to the selector ID 64*e8d8bef9SDimitry Andric /// used in other tables. 65*e8d8bef9SDimitry Andric OBJC_SELECTOR_BLOCK_ID, 66*e8d8bef9SDimitry Andric 67*e8d8bef9SDimitry Andric /// The global variables data block, which maps global variable names to 68*e8d8bef9SDimitry Andric /// information about the global variable. 69*e8d8bef9SDimitry Andric GLOBAL_VARIABLE_BLOCK_ID, 70*e8d8bef9SDimitry Andric 71*e8d8bef9SDimitry Andric /// The (global) functions data block, which maps global function names to 72*e8d8bef9SDimitry Andric /// information about the global function. 73*e8d8bef9SDimitry Andric GLOBAL_FUNCTION_BLOCK_ID, 74*e8d8bef9SDimitry Andric 75*e8d8bef9SDimitry Andric /// The tag data block, which maps tag names to information about 76*e8d8bef9SDimitry Andric /// the tags. 77*e8d8bef9SDimitry Andric TAG_BLOCK_ID, 78*e8d8bef9SDimitry Andric 79*e8d8bef9SDimitry Andric /// The typedef data block, which maps typedef names to information about 80*e8d8bef9SDimitry Andric /// the typedefs. 81*e8d8bef9SDimitry Andric TYPEDEF_BLOCK_ID, 82*e8d8bef9SDimitry Andric 83*e8d8bef9SDimitry Andric /// The enum constant data block, which maps enumerator names to 84*e8d8bef9SDimitry Andric /// information about the enumerators. 85*e8d8bef9SDimitry Andric ENUM_CONSTANT_BLOCK_ID, 86*e8d8bef9SDimitry Andric }; 87*e8d8bef9SDimitry Andric 88*e8d8bef9SDimitry Andric namespace control_block { 89*e8d8bef9SDimitry Andric // These IDs must \em not be renumbered or reordered without incrementing 90*e8d8bef9SDimitry Andric // VERSION_MAJOR. 91*e8d8bef9SDimitry Andric enum { 92*e8d8bef9SDimitry Andric METADATA = 1, 93*e8d8bef9SDimitry Andric MODULE_NAME = 2, 94*e8d8bef9SDimitry Andric MODULE_OPTIONS = 3, 95*e8d8bef9SDimitry Andric SOURCE_FILE = 4, 96*e8d8bef9SDimitry Andric }; 97*e8d8bef9SDimitry Andric 98*e8d8bef9SDimitry Andric using MetadataLayout = 99*e8d8bef9SDimitry Andric llvm::BCRecordLayout<METADATA, // ID 100*e8d8bef9SDimitry Andric llvm::BCFixed<16>, // Module format major version 101*e8d8bef9SDimitry Andric llvm::BCFixed<16> // Module format minor version 102*e8d8bef9SDimitry Andric >; 103*e8d8bef9SDimitry Andric 104*e8d8bef9SDimitry Andric using ModuleNameLayout = llvm::BCRecordLayout<MODULE_NAME, 105*e8d8bef9SDimitry Andric llvm::BCBlob // Module name 106*e8d8bef9SDimitry Andric >; 107*e8d8bef9SDimitry Andric 108*e8d8bef9SDimitry Andric using ModuleOptionsLayout = 109*e8d8bef9SDimitry Andric llvm::BCRecordLayout<MODULE_OPTIONS, 110*e8d8bef9SDimitry Andric llvm::BCFixed<1> // SwiftInferImportAsMember 111*e8d8bef9SDimitry Andric >; 112*e8d8bef9SDimitry Andric 113*e8d8bef9SDimitry Andric using SourceFileLayout = llvm::BCRecordLayout<SOURCE_FILE, 114*e8d8bef9SDimitry Andric llvm::BCVBR<16>, // file size 115*e8d8bef9SDimitry Andric llvm::BCVBR<16> // creation time 116*e8d8bef9SDimitry Andric >; 117*e8d8bef9SDimitry Andric } // namespace control_block 118*e8d8bef9SDimitry Andric 119*e8d8bef9SDimitry Andric namespace identifier_block { 120*e8d8bef9SDimitry Andric enum { 121*e8d8bef9SDimitry Andric IDENTIFIER_DATA = 1, 122*e8d8bef9SDimitry Andric }; 123*e8d8bef9SDimitry Andric 124*e8d8bef9SDimitry Andric using IdentifierDataLayout = llvm::BCRecordLayout< 125*e8d8bef9SDimitry Andric IDENTIFIER_DATA, // record ID 126*e8d8bef9SDimitry Andric llvm::BCVBR<16>, // table offset within the blob (see below) 127*e8d8bef9SDimitry Andric llvm::BCBlob // map from identifier strings to decl kinds / decl IDs 128*e8d8bef9SDimitry Andric >; 129*e8d8bef9SDimitry Andric } // namespace identifier_block 130*e8d8bef9SDimitry Andric 131*e8d8bef9SDimitry Andric namespace objc_context_block { 132*e8d8bef9SDimitry Andric enum { 133*e8d8bef9SDimitry Andric OBJC_CONTEXT_ID_DATA = 1, 134*e8d8bef9SDimitry Andric OBJC_CONTEXT_INFO_DATA = 2, 135*e8d8bef9SDimitry Andric }; 136*e8d8bef9SDimitry Andric 137*e8d8bef9SDimitry Andric using ObjCContextIDLayout = 138*e8d8bef9SDimitry Andric llvm::BCRecordLayout<OBJC_CONTEXT_ID_DATA, // record ID 139*e8d8bef9SDimitry Andric llvm::BCVBR<16>, // table offset within the blob (see 140*e8d8bef9SDimitry Andric // below) 141*e8d8bef9SDimitry Andric llvm::BCBlob // map from ObjC class names/protocol (as 142*e8d8bef9SDimitry Andric // IDs) to context IDs 143*e8d8bef9SDimitry Andric >; 144*e8d8bef9SDimitry Andric 145*e8d8bef9SDimitry Andric using ObjCContextInfoLayout = llvm::BCRecordLayout< 146*e8d8bef9SDimitry Andric OBJC_CONTEXT_INFO_DATA, // record ID 147*e8d8bef9SDimitry Andric llvm::BCVBR<16>, // table offset within the blob (see below) 148*e8d8bef9SDimitry Andric llvm::BCBlob // map from ObjC context IDs to context information. 149*e8d8bef9SDimitry Andric >; 150*e8d8bef9SDimitry Andric } // namespace objc_context_block 151*e8d8bef9SDimitry Andric 152*e8d8bef9SDimitry Andric namespace objc_property_block { 153*e8d8bef9SDimitry Andric enum { 154*e8d8bef9SDimitry Andric OBJC_PROPERTY_DATA = 1, 155*e8d8bef9SDimitry Andric }; 156*e8d8bef9SDimitry Andric 157*e8d8bef9SDimitry Andric using ObjCPropertyDataLayout = llvm::BCRecordLayout< 158*e8d8bef9SDimitry Andric OBJC_PROPERTY_DATA, // record ID 159*e8d8bef9SDimitry Andric llvm::BCVBR<16>, // table offset within the blob (see below) 160*e8d8bef9SDimitry Andric llvm::BCBlob // map from ObjC (class name, property name) pairs to 161*e8d8bef9SDimitry Andric // ObjC property information 162*e8d8bef9SDimitry Andric >; 163*e8d8bef9SDimitry Andric } // namespace objc_property_block 164*e8d8bef9SDimitry Andric 165*e8d8bef9SDimitry Andric namespace objc_method_block { 166*e8d8bef9SDimitry Andric enum { 167*e8d8bef9SDimitry Andric OBJC_METHOD_DATA = 1, 168*e8d8bef9SDimitry Andric }; 169*e8d8bef9SDimitry Andric 170*e8d8bef9SDimitry Andric using ObjCMethodDataLayout = 171*e8d8bef9SDimitry Andric llvm::BCRecordLayout<OBJC_METHOD_DATA, // record ID 172*e8d8bef9SDimitry Andric llvm::BCVBR<16>, // table offset within the blob (see 173*e8d8bef9SDimitry Andric // below) 174*e8d8bef9SDimitry Andric llvm::BCBlob // map from ObjC (class names, selector, 175*e8d8bef9SDimitry Andric // is-instance-method) tuples to ObjC 176*e8d8bef9SDimitry Andric // method information 177*e8d8bef9SDimitry Andric >; 178*e8d8bef9SDimitry Andric } // namespace objc_method_block 179*e8d8bef9SDimitry Andric 180*e8d8bef9SDimitry Andric namespace objc_selector_block { 181*e8d8bef9SDimitry Andric enum { 182*e8d8bef9SDimitry Andric OBJC_SELECTOR_DATA = 1, 183*e8d8bef9SDimitry Andric }; 184*e8d8bef9SDimitry Andric 185*e8d8bef9SDimitry Andric using ObjCSelectorDataLayout = 186*e8d8bef9SDimitry Andric llvm::BCRecordLayout<OBJC_SELECTOR_DATA, // record ID 187*e8d8bef9SDimitry Andric llvm::BCVBR<16>, // table offset within the blob (see 188*e8d8bef9SDimitry Andric // below) 189*e8d8bef9SDimitry Andric llvm::BCBlob // map from (# pieces, identifier IDs) to 190*e8d8bef9SDimitry Andric // Objective-C selector ID. 191*e8d8bef9SDimitry Andric >; 192*e8d8bef9SDimitry Andric } // namespace objc_selector_block 193*e8d8bef9SDimitry Andric 194*e8d8bef9SDimitry Andric namespace global_variable_block { 195*e8d8bef9SDimitry Andric enum { GLOBAL_VARIABLE_DATA = 1 }; 196*e8d8bef9SDimitry Andric 197*e8d8bef9SDimitry Andric using GlobalVariableDataLayout = llvm::BCRecordLayout< 198*e8d8bef9SDimitry Andric GLOBAL_VARIABLE_DATA, // record ID 199*e8d8bef9SDimitry Andric llvm::BCVBR<16>, // table offset within the blob (see below) 200*e8d8bef9SDimitry Andric llvm::BCBlob // map from name to global variable information 201*e8d8bef9SDimitry Andric >; 202*e8d8bef9SDimitry Andric } // namespace global_variable_block 203*e8d8bef9SDimitry Andric 204*e8d8bef9SDimitry Andric namespace global_function_block { 205*e8d8bef9SDimitry Andric enum { GLOBAL_FUNCTION_DATA = 1 }; 206*e8d8bef9SDimitry Andric 207*e8d8bef9SDimitry Andric using GlobalFunctionDataLayout = llvm::BCRecordLayout< 208*e8d8bef9SDimitry Andric GLOBAL_FUNCTION_DATA, // record ID 209*e8d8bef9SDimitry Andric llvm::BCVBR<16>, // table offset within the blob (see below) 210*e8d8bef9SDimitry Andric llvm::BCBlob // map from name to global function information 211*e8d8bef9SDimitry Andric >; 212*e8d8bef9SDimitry Andric } // namespace global_function_block 213*e8d8bef9SDimitry Andric 214*e8d8bef9SDimitry Andric namespace tag_block { 215*e8d8bef9SDimitry Andric enum { TAG_DATA = 1 }; 216*e8d8bef9SDimitry Andric 217*e8d8bef9SDimitry Andric using TagDataLayout = 218*e8d8bef9SDimitry Andric llvm::BCRecordLayout<TAG_DATA, // record ID 219*e8d8bef9SDimitry Andric llvm::BCVBR<16>, // table offset within the blob (see 220*e8d8bef9SDimitry Andric // below) 221*e8d8bef9SDimitry Andric llvm::BCBlob // map from name to tag information 222*e8d8bef9SDimitry Andric >; 223*e8d8bef9SDimitry Andric }; // namespace tag_block 224*e8d8bef9SDimitry Andric 225*e8d8bef9SDimitry Andric namespace typedef_block { 226*e8d8bef9SDimitry Andric enum { TYPEDEF_DATA = 1 }; 227*e8d8bef9SDimitry Andric 228*e8d8bef9SDimitry Andric using TypedefDataLayout = 229*e8d8bef9SDimitry Andric llvm::BCRecordLayout<TYPEDEF_DATA, // record ID 230*e8d8bef9SDimitry Andric llvm::BCVBR<16>, // table offset within the blob (see 231*e8d8bef9SDimitry Andric // below) 232*e8d8bef9SDimitry Andric llvm::BCBlob // map from name to typedef information 233*e8d8bef9SDimitry Andric >; 234*e8d8bef9SDimitry Andric }; // namespace typedef_block 235*e8d8bef9SDimitry Andric 236*e8d8bef9SDimitry Andric namespace enum_constant_block { 237*e8d8bef9SDimitry Andric enum { ENUM_CONSTANT_DATA = 1 }; 238*e8d8bef9SDimitry Andric 239*e8d8bef9SDimitry Andric using EnumConstantDataLayout = 240*e8d8bef9SDimitry Andric llvm::BCRecordLayout<ENUM_CONSTANT_DATA, // record ID 241*e8d8bef9SDimitry Andric llvm::BCVBR<16>, // table offset within the blob (see 242*e8d8bef9SDimitry Andric // below) 243*e8d8bef9SDimitry Andric llvm::BCBlob // map from name to enumerator information 244*e8d8bef9SDimitry Andric >; 245*e8d8bef9SDimitry Andric } // namespace enum_constant_block 246*e8d8bef9SDimitry Andric 247*e8d8bef9SDimitry Andric /// A stored Objective-C selector. 248*e8d8bef9SDimitry Andric struct StoredObjCSelector { 249*e8d8bef9SDimitry Andric unsigned NumPieces; 250*e8d8bef9SDimitry Andric llvm::SmallVector<IdentifierID, 2> Identifiers; 251*e8d8bef9SDimitry Andric }; 252*e8d8bef9SDimitry Andric } // namespace api_notes 253*e8d8bef9SDimitry Andric } // namespace clang 254*e8d8bef9SDimitry Andric 255*e8d8bef9SDimitry Andric #endif 256