xref: /freebsd-src/contrib/llvm-project/clang/lib/APINotes/APINotesFormat.h (revision e8d8bef961a50d4dc22501cde4fb9fb0be1b2532)
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