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
15namespace clang {
16namespace api_notes {
17/// Magic number for API notes files.
18const unsigned char API_NOTES_SIGNATURE[] = {0xE2, 0x9C, 0xA8, 0x01};
19
20/// API notes file major version number.
21const 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.
26const uint16_t VERSION_MINOR = 24; // EnumExtensibility + FlagEnum
27
28using IdentifierID = llvm::PointerEmbeddedInt<unsigned, 31>;
29using IdentifierIDField = llvm::BCVBR<16>;
30
31using SelectorID = llvm::PointerEmbeddedInt<unsigned, 31>;
32using 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.
38enum 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
88namespace control_block {
89// These IDs must \em not be renumbered or reordered without incrementing
90// VERSION_MAJOR.
91enum {
92  METADATA = 1,
93  MODULE_NAME = 2,
94  MODULE_OPTIONS = 3,
95  SOURCE_FILE = 4,
96};
97
98using MetadataLayout =
99    llvm::BCRecordLayout<METADATA,          // ID
100                         llvm::BCFixed<16>, // Module format major version
101                         llvm::BCFixed<16>  // Module format minor version
102                         >;
103
104using ModuleNameLayout = llvm::BCRecordLayout<MODULE_NAME,
105                                              llvm::BCBlob // Module name
106                                              >;
107
108using ModuleOptionsLayout =
109    llvm::BCRecordLayout<MODULE_OPTIONS,
110                         llvm::BCFixed<1> // SwiftInferImportAsMember
111                         >;
112
113using SourceFileLayout = llvm::BCRecordLayout<SOURCE_FILE,
114                                              llvm::BCVBR<16>, // file size
115                                              llvm::BCVBR<16>  // creation time
116                                              >;
117} // namespace control_block
118
119namespace identifier_block {
120enum {
121  IDENTIFIER_DATA = 1,
122};
123
124using 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
131namespace objc_context_block {
132enum {
133  OBJC_CONTEXT_ID_DATA = 1,
134  OBJC_CONTEXT_INFO_DATA = 2,
135};
136
137using 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
145using 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
152namespace objc_property_block {
153enum {
154  OBJC_PROPERTY_DATA = 1,
155};
156
157using 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
165namespace objc_method_block {
166enum {
167  OBJC_METHOD_DATA = 1,
168};
169
170using 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
180namespace objc_selector_block {
181enum {
182  OBJC_SELECTOR_DATA = 1,
183};
184
185using 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
194namespace global_variable_block {
195enum { GLOBAL_VARIABLE_DATA = 1 };
196
197using 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
204namespace global_function_block {
205enum { GLOBAL_FUNCTION_DATA = 1 };
206
207using 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
214namespace tag_block {
215enum { TAG_DATA = 1 };
216
217using 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
225namespace typedef_block {
226enum { TYPEDEF_DATA = 1 };
227
228using 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
236namespace enum_constant_block {
237enum { ENUM_CONSTANT_DATA = 1 };
238
239using 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.
248struct StoredObjCSelector {
249  unsigned NumPieces;
250  llvm::SmallVector<IdentifierID, 2> Identifiers;
251};
252} // namespace api_notes
253} // namespace clang
254
255#endif
256