xref: /openbsd-src/gnu/llvm/clang/lib/APINotes/APINotesFormat.h (revision a9ac8606c53d55cee9c3a39778b249c51df111ef)
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