clang 18.0.0git
APINotesFormat.h
Go to the documentation of this file.
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
13#include "llvm/ADT/PointerEmbeddedInt.h"
14#include "llvm/Bitcode/BitcodeConvenience.h"
15
16namespace clang {
17namespace api_notes {
18/// Magic number for API notes files.
19const unsigned char API_NOTES_SIGNATURE[] = {0xE2, 0x9C, 0xA8, 0x01};
20
21/// API notes file major version number.
22const uint16_t VERSION_MAJOR = 0;
23
24/// API notes file minor version number.
25///
26/// When the format changes IN ANY WAY, this number should be incremented.
27const uint16_t VERSION_MINOR = 25; // SwiftImportAs
28
29using IdentifierID = llvm::PointerEmbeddedInt<unsigned, 31>;
30using IdentifierIDField = llvm::BCVBR<16>;
31
32using SelectorID = llvm::PointerEmbeddedInt<unsigned, 31>;
33using SelectorIDField = llvm::BCVBR<16>;
34
35/// The various types of blocks that can occur within a API notes file.
36///
37/// These IDs must \em not be renumbered or reordered without incrementing
38/// VERSION_MAJOR.
39enum BlockID {
40 /// The control block, which contains all of the information that needs to
41 /// be validated prior to committing to loading the API notes file.
42 ///
43 /// \sa control_block
44 CONTROL_BLOCK_ID = llvm::bitc::FIRST_APPLICATION_BLOCKID,
45
46 /// The identifier data block, which maps identifier strings to IDs.
48
49 /// The Objective-C context data block, which contains information about
50 /// Objective-C classes and protocols.
52
53 /// The Objective-C property data block, which maps Objective-C
54 /// (class name, property name) pairs to information about the
55 /// property.
57
58 /// The Objective-C property data block, which maps Objective-C
59 /// (class name, selector, is_instance_method) tuples to information
60 /// about the method.
62
63 /// The Objective-C selector data block, which maps Objective-C
64 /// selector names (# of pieces, identifier IDs) to the selector ID
65 /// used in other tables.
67
68 /// The global variables data block, which maps global variable names to
69 /// information about the global variable.
71
72 /// The (global) functions data block, which maps global function names to
73 /// information about the global function.
75
76 /// The tag data block, which maps tag names to information about
77 /// the tags.
79
80 /// The typedef data block, which maps typedef names to information about
81 /// the typedefs.
83
84 /// The enum constant data block, which maps enumerator names to
85 /// information about the enumerators.
87};
88
89namespace control_block {
90// These IDs must \em not be renumbered or reordered without incrementing
91// VERSION_MAJOR.
92enum {
97};
98
100 llvm::BCRecordLayout<METADATA, // ID
101 llvm::BCFixed<16>, // Module format major version
102 llvm::BCFixed<16> // Module format minor version
103 >;
104
105using ModuleNameLayout = llvm::BCRecordLayout<MODULE_NAME,
106 llvm::BCBlob // Module name
107 >;
108
110 llvm::BCRecordLayout<MODULE_OPTIONS,
111 llvm::BCFixed<1> // SwiftInferImportAsMember
112 >;
113
114using SourceFileLayout = llvm::BCRecordLayout<SOURCE_FILE,
115 llvm::BCVBR<16>, // file size
116 llvm::BCVBR<16> // creation time
117 >;
118} // namespace control_block
119
120namespace identifier_block {
121enum {
123};
124
125using IdentifierDataLayout = llvm::BCRecordLayout<
126 IDENTIFIER_DATA, // record ID
127 llvm::BCVBR<16>, // table offset within the blob (see below)
128 llvm::BCBlob // map from identifier strings to decl kinds / decl IDs
129 >;
130} // namespace identifier_block
131
132namespace objc_context_block {
133enum {
136};
137
139 llvm::BCRecordLayout<OBJC_CONTEXT_ID_DATA, // record ID
140 llvm::BCVBR<16>, // table offset within the blob (see
141 // below)
142 llvm::BCBlob // map from ObjC class names/protocol (as
143 // IDs) to context IDs
144 >;
145
146using ObjCContextInfoLayout = llvm::BCRecordLayout<
147 OBJC_CONTEXT_INFO_DATA, // record ID
148 llvm::BCVBR<16>, // table offset within the blob (see below)
149 llvm::BCBlob // map from ObjC context IDs to context information.
150 >;
151} // namespace objc_context_block
152
153namespace objc_property_block {
154enum {
156};
157
158using ObjCPropertyDataLayout = llvm::BCRecordLayout<
159 OBJC_PROPERTY_DATA, // record ID
160 llvm::BCVBR<16>, // table offset within the blob (see below)
161 llvm::BCBlob // map from ObjC (class name, property name) pairs to
162 // ObjC property information
163 >;
164} // namespace objc_property_block
165
166namespace objc_method_block {
167enum {
169};
170
172 llvm::BCRecordLayout<OBJC_METHOD_DATA, // record ID
173 llvm::BCVBR<16>, // table offset within the blob (see
174 // below)
175 llvm::BCBlob // map from ObjC (class names, selector,
176 // is-instance-method) tuples to ObjC
177 // method information
178 >;
179} // namespace objc_method_block
180
181namespace objc_selector_block {
182enum {
184};
185
187 llvm::BCRecordLayout<OBJC_SELECTOR_DATA, // record ID
188 llvm::BCVBR<16>, // table offset within the blob (see
189 // below)
190 llvm::BCBlob // map from (# pieces, identifier IDs) to
191 // Objective-C selector ID.
192 >;
193} // namespace objc_selector_block
194
195namespace global_variable_block {
197
198using GlobalVariableDataLayout = llvm::BCRecordLayout<
199 GLOBAL_VARIABLE_DATA, // record ID
200 llvm::BCVBR<16>, // table offset within the blob (see below)
201 llvm::BCBlob // map from name to global variable information
202 >;
203} // namespace global_variable_block
204
205namespace global_function_block {
207
208using GlobalFunctionDataLayout = llvm::BCRecordLayout<
209 GLOBAL_FUNCTION_DATA, // record ID
210 llvm::BCVBR<16>, // table offset within the blob (see below)
211 llvm::BCBlob // map from name to global function information
212 >;
213} // namespace global_function_block
214
215namespace tag_block {
216enum { TAG_DATA = 1 };
217
219 llvm::BCRecordLayout<TAG_DATA, // record ID
220 llvm::BCVBR<16>, // table offset within the blob (see
221 // below)
222 llvm::BCBlob // map from name to tag information
223 >;
224} // namespace tag_block
225
226namespace typedef_block {
227enum { TYPEDEF_DATA = 1 };
228
230 llvm::BCRecordLayout<TYPEDEF_DATA, // record ID
231 llvm::BCVBR<16>, // table offset within the blob (see
232 // below)
233 llvm::BCBlob // map from name to typedef information
234 >;
235} // namespace typedef_block
236
237namespace enum_constant_block {
239
241 llvm::BCRecordLayout<ENUM_CONSTANT_DATA, // record ID
242 llvm::BCVBR<16>, // table offset within the blob (see
243 // below)
244 llvm::BCBlob // map from name to enumerator information
245 >;
246} // namespace enum_constant_block
247
248/// A stored Objective-C selector.
250 unsigned NumPieces;
252};
253
254/// A stored Objective-C or C++ context, represented by the ID of its parent
255/// context, the kind of this context (Objective-C class / C++ namespace / etc),
256/// and the ID of this context.
259 uint8_t contextKind;
260 uint32_t contextID;
261
263
265 uint32_t contextID)
268
269 ContextTableKey(std::optional<Context> context, IdentifierID nameID)
270 : parentContextID(context ? context->id.Value : (uint32_t)-1),
271 contextKind(context ? static_cast<uint8_t>(context->kind)
272 : static_cast<uint8_t>(-1)),
273 contextID(nameID) {}
274
275 llvm::hash_code hashValue() const {
276 return llvm::hash_value(
278 }
279};
280
281inline bool operator==(const ContextTableKey &lhs, const ContextTableKey &rhs) {
282 return lhs.parentContextID == rhs.parentContextID &&
283 lhs.contextKind == rhs.contextKind && lhs.contextID == rhs.contextID;
284}
285
286} // namespace api_notes
287} // namespace clang
288
289namespace llvm {
290template <> struct DenseMapInfo<clang::api_notes::StoredObjCSelector> {
291 typedef DenseMapInfo<unsigned> UnsignedInfo;
292
294 return clang::api_notes::StoredObjCSelector{UnsignedInfo::getEmptyKey(),
295 {}};
296 }
297
299 return clang::api_notes::StoredObjCSelector{UnsignedInfo::getTombstoneKey(),
300 {}};
301 }
302
303 static unsigned
305 auto hash = llvm::hash_value(Selector.NumPieces);
306 hash = hash_combine(hash, Selector.Identifiers.size());
307 for (auto piece : Selector.Identifiers)
308 hash = hash_combine(hash, static_cast<unsigned>(piece));
309 // FIXME: Mix upper/lower 32-bit values together to produce
310 // unsigned rather than truncating.
311 return hash;
312 }
313
316 return LHS.NumPieces == RHS.NumPieces && LHS.Identifiers == RHS.Identifiers;
317 }
318};
319
320template <> struct DenseMapInfo<clang::api_notes::ContextTableKey> {
323 }
324
327 DenseMapInfo<uint32_t>::getTombstoneKey(),
328 DenseMapInfo<uint8_t>::getTombstoneKey(),
329 DenseMapInfo<uint32_t>::getTombstoneKey()};
330 }
331
332 static unsigned getHashValue(const clang::api_notes::ContextTableKey &value) {
333 return value.hashValue();
334 }
335
338 return lhs == rhs;
339 }
340};
341} // namespace llvm
342
343#endif
llvm::BCRecordLayout< SOURCE_FILE, llvm::BCVBR< 16 >, llvm::BCVBR< 16 > > SourceFileLayout
llvm::BCRecordLayout< MODULE_NAME, llvm::BCBlob > ModuleNameLayout
llvm::BCRecordLayout< MODULE_OPTIONS, llvm::BCFixed< 1 > > ModuleOptionsLayout
llvm::BCRecordLayout< METADATA, llvm::BCFixed< 16 >, llvm::BCFixed< 16 > > MetadataLayout
llvm::BCRecordLayout< ENUM_CONSTANT_DATA, llvm::BCVBR< 16 >, llvm::BCBlob > EnumConstantDataLayout
llvm::BCRecordLayout< GLOBAL_FUNCTION_DATA, llvm::BCVBR< 16 >, llvm::BCBlob > GlobalFunctionDataLayout
llvm::BCRecordLayout< GLOBAL_VARIABLE_DATA, llvm::BCVBR< 16 >, llvm::BCBlob > GlobalVariableDataLayout
llvm::BCRecordLayout< IDENTIFIER_DATA, llvm::BCVBR< 16 >, llvm::BCBlob > IdentifierDataLayout
llvm::BCRecordLayout< OBJC_CONTEXT_ID_DATA, llvm::BCVBR< 16 >, llvm::BCBlob > ObjCContextIDLayout
llvm::BCRecordLayout< OBJC_CONTEXT_INFO_DATA, llvm::BCVBR< 16 >, llvm::BCBlob > ObjCContextInfoLayout
llvm::BCRecordLayout< OBJC_METHOD_DATA, llvm::BCVBR< 16 >, llvm::BCBlob > ObjCMethodDataLayout
llvm::BCRecordLayout< OBJC_PROPERTY_DATA, llvm::BCVBR< 16 >, llvm::BCBlob > ObjCPropertyDataLayout
llvm::BCRecordLayout< OBJC_SELECTOR_DATA, llvm::BCVBR< 16 >, llvm::BCBlob > ObjCSelectorDataLayout
llvm::BCRecordLayout< TAG_DATA, llvm::BCVBR< 16 >, llvm::BCBlob > TagDataLayout
llvm::BCRecordLayout< TYPEDEF_DATA, llvm::BCVBR< 16 >, llvm::BCBlob > TypedefDataLayout
llvm::BCVBR< 16 > SelectorIDField
llvm::PointerEmbeddedInt< unsigned, 31 > SelectorID
bool operator==(const CommonEntityInfo &LHS, const CommonEntityInfo &RHS)
Definition: Types.h:116
llvm::PointerEmbeddedInt< unsigned, 31 > IdentifierID
llvm::BCVBR< 16 > IdentifierIDField
const uint16_t VERSION_MAJOR
API notes file major version number.
const unsigned char API_NOTES_SIGNATURE[]
Magic number for API notes files.
const uint16_t VERSION_MINOR
API notes file minor version number.
BlockID
The various types of blocks that can occur within a API notes file.
@ OBJC_CONTEXT_BLOCK_ID
The Objective-C context data block, which contains information about Objective-C classes and protocol...
@ TYPEDEF_BLOCK_ID
The typedef data block, which maps typedef names to information about the typedefs.
@ OBJC_PROPERTY_BLOCK_ID
The Objective-C property data block, which maps Objective-C (class name, property name) pairs to info...
@ ENUM_CONSTANT_BLOCK_ID
The enum constant data block, which maps enumerator names to information about the enumerators.
@ TAG_BLOCK_ID
The tag data block, which maps tag names to information about the tags.
@ OBJC_METHOD_BLOCK_ID
The Objective-C property data block, which maps Objective-C (class name, selector,...
@ OBJC_SELECTOR_BLOCK_ID
The Objective-C selector data block, which maps Objective-C selector names (# of pieces,...
@ GLOBAL_FUNCTION_BLOCK_ID
The (global) functions data block, which maps global function names to information about the global f...
@ CONTROL_BLOCK_ID
The control block, which contains all of the information that needs to be validated prior to committi...
@ IDENTIFIER_BLOCK_ID
The identifier data block, which maps identifier strings to IDs.
@ GLOBAL_VARIABLE_BLOCK_ID
The global variables data block, which maps global variable names to information about the global var...
YAML serialization mapping.
Definition: Dominators.h:30
hash_code hash_value(const clang::tooling::dependencies::ModuleID &ID)
A stored Objective-C or C++ context, represented by the ID of its parent context, the kind of this co...
ContextTableKey(std::optional< Context > context, IdentifierID nameID)
llvm::hash_code hashValue() const
ContextTableKey(uint32_t parentContextID, uint8_t contextKind, uint32_t contextID)
A stored Objective-C selector.
llvm::SmallVector< IdentifierID, 2 > Identifiers
static clang::api_notes::ContextTableKey getTombstoneKey()
static unsigned getHashValue(const clang::api_notes::ContextTableKey &value)
static clang::api_notes::ContextTableKey getEmptyKey()
static bool isEqual(const clang::api_notes::ContextTableKey &lhs, const clang::api_notes::ContextTableKey &rhs)
static clang::api_notes::StoredObjCSelector getEmptyKey()
static bool isEqual(const clang::api_notes::StoredObjCSelector &LHS, const clang::api_notes::StoredObjCSelector &RHS)
static clang::api_notes::StoredObjCSelector getTombstoneKey()
static unsigned getHashValue(const clang::api_notes::StoredObjCSelector &Selector)