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