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