18#include "llvm/ADT/Hashing.h"
19#include "llvm/Bitstream/BitstreamReader.h"
20#include "llvm/Support/DJB.h"
21#include "llvm/Support/OnDiskHashTable.h"
25using namespace llvm::support;
29llvm::VersionTuple ReadVersionTuple(
const uint8_t *&
Data) {
30 uint8_t NumVersions = (*
Data++) & 0x03;
32 unsigned Major = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
34 return llvm::VersionTuple(Major);
36 unsigned Minor = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
38 return llvm::VersionTuple(Major, Minor);
41 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
43 return llvm::VersionTuple(Major, Minor, Subminor);
45 unsigned Build = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
46 return llvm::VersionTuple(Major, Minor, Subminor, Build);
50template <
typename Derived,
typename KeyType,
typename UnversionedDataType>
51class VersionedTableInfo {
53 using internal_key_type = KeyType;
54 using external_key_type = KeyType;
57 using hash_value_type =
size_t;
60 internal_key_type GetInternalKey(external_key_type Key) {
return Key; }
62 external_key_type GetExternalKey(internal_key_type Key) {
return Key; }
64 static bool EqualKey(internal_key_type LHS, internal_key_type RHS) {
68 static std::pair<unsigned, unsigned> ReadKeyDataLength(
const uint8_t *&
Data) {
70 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
72 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
73 return {KeyLength, DataLength};
76 static data_type ReadData(internal_key_type Key,
const uint8_t *
Data,
78 unsigned NumElements =
79 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
81 Result.reserve(NumElements);
82 for (
unsigned i = 0; i != NumElements; ++i) {
83 auto version = ReadVersionTuple(
Data);
84 const auto *DataBefore =
Data;
86 auto UnversionedData = Derived::readUnversioned(Key,
Data);
87 assert(
Data != DataBefore &&
88 "Unversioned data reader didn't move pointer");
89 Result.push_back({version, UnversionedData});
96void ReadCommonEntityInfo(
const uint8_t *&
Data, CommonEntityInfo &Info) {
97 uint8_t UnavailableBits = *
Data++;
98 Info.Unavailable = (UnavailableBits >> 1) & 0x01;
99 Info.UnavailableInSwift = UnavailableBits & 0x01;
100 if ((UnavailableBits >> 2) & 0x01)
101 Info.setSwiftPrivate(
static_cast<bool>((UnavailableBits >> 3) & 0x01));
104 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
105 Info.UnavailableMsg =
106 std::string(
reinterpret_cast<const char *
>(
Data),
107 reinterpret_cast<const char *
>(
Data) + MsgLength);
110 unsigned SwiftNameLength =
111 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
113 std::string(
reinterpret_cast<const char *
>(
Data),
114 reinterpret_cast<const char *
>(
Data) + SwiftNameLength);
115 Data += SwiftNameLength;
119void ReadCommonTypeInfo(
const uint8_t *&
Data, CommonTypeInfo &Info) {
120 ReadCommonEntityInfo(
Data, Info);
122 unsigned SwiftBridgeLength =
123 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
124 if (SwiftBridgeLength > 0) {
125 Info.setSwiftBridge(std::string(
reinterpret_cast<const char *
>(
Data),
126 SwiftBridgeLength - 1));
127 Data += SwiftBridgeLength - 1;
130 unsigned ErrorDomainLength =
131 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
132 if (ErrorDomainLength > 0) {
133 Info.setNSErrorDomain(std::optional<std::string>(std::string(
134 reinterpret_cast<const char *
>(
Data), ErrorDomainLength - 1)));
135 Data += ErrorDomainLength - 1;
138 if (
unsigned ConformanceLength =
139 endian::readNext<uint16_t, llvm::endianness::little>(
Data)) {
140 Info.setSwiftConformance(std::string(
reinterpret_cast<const char *
>(
Data),
141 ConformanceLength - 1));
142 Data += ConformanceLength - 1;
147class IdentifierTableInfo {
149 using internal_key_type = llvm::StringRef;
150 using external_key_type = llvm::StringRef;
155 internal_key_type GetInternalKey(external_key_type Key) {
return Key; }
157 external_key_type GetExternalKey(internal_key_type Key) {
return Key; }
159 hash_value_type
ComputeHash(internal_key_type Key) {
160 return llvm::djbHash(Key);
163 static bool EqualKey(internal_key_type LHS, internal_key_type RHS) {
167 static std::pair<unsigned, unsigned> ReadKeyDataLength(
const uint8_t *&
Data) {
169 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
170 unsigned DataLength =
171 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
172 return {KeyLength, DataLength};
175 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
176 return llvm::StringRef(
reinterpret_cast<const char *
>(
Data), Length);
179 static data_type ReadData(internal_key_type key,
const uint8_t *
Data,
181 return endian::readNext<uint32_t, llvm::endianness::little>(
Data);
187class ContextIDTableInfo {
189 using internal_key_type = ContextTableKey;
190 using external_key_type = internal_key_type;
192 using hash_value_type =
size_t;
195 internal_key_type GetInternalKey(external_key_type Key) {
return Key; }
197 external_key_type GetExternalKey(internal_key_type Key) {
return Key; }
199 hash_value_type
ComputeHash(internal_key_type Key) {
200 return static_cast<size_t>(Key.hashValue());
203 static bool EqualKey(internal_key_type LHS, internal_key_type RHS) {
207 static std::pair<unsigned, unsigned> ReadKeyDataLength(
const uint8_t *&
Data) {
209 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
210 unsigned DataLength =
211 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
212 return {KeyLength, DataLength};
215 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
217 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
219 endian::readNext<uint8_t, llvm::endianness::little>(
Data);
220 auto NameID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
224 static data_type ReadData(internal_key_type Key,
const uint8_t *
Data,
226 return endian::readNext<uint32_t, llvm::endianness::little>(
Data);
231class ContextInfoTableInfo
232 :
public VersionedTableInfo<ContextInfoTableInfo, unsigned, ContextInfo> {
234 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
235 return endian::readNext<uint32_t, llvm::endianness::little>(
Data);
238 hash_value_type
ComputeHash(internal_key_type Key) {
242 static ContextInfo readUnversioned(internal_key_type Key,
243 const uint8_t *&
Data) {
245 ReadCommonTypeInfo(
Data, Info);
246 uint8_t Payload = *
Data++;
249 Info.setHasDesignatedInits(
true);
250 Payload = Payload >> 1;
253 Info.setDefaultNullability(
static_cast<NullabilityKind>(Payload & 0x03));
256 if (Payload & (1 << 1))
257 Info.setSwiftObjCMembers(Payload & 1);
260 if (Payload & (1 << 1))
261 Info.setSwiftImportAsNonGeneric(Payload & 1);
268void ReadVariableInfo(
const uint8_t *&
Data, VariableInfo &Info) {
269 ReadCommonEntityInfo(
Data, Info);
275 auto TypeLen = endian::readNext<uint16_t, llvm::endianness::little>(
Data);
276 Info.setType(std::string(
Data,
Data + TypeLen));
281class ObjCPropertyTableInfo
282 :
public VersionedTableInfo<ObjCPropertyTableInfo,
283 std::tuple<uint32_t, uint32_t, uint8_t>,
286 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
287 auto ClassID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
288 auto NameID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
289 char IsInstance = endian::readNext<uint8_t, llvm::endianness::little>(
Data);
290 return {ClassID, NameID, IsInstance};
293 hash_value_type
ComputeHash(internal_key_type Key) {
297 static ObjCPropertyInfo readUnversioned(internal_key_type Key,
298 const uint8_t *&
Data) {
299 ObjCPropertyInfo Info;
300 ReadVariableInfo(
Data, Info);
301 uint8_t Flags = *
Data++;
302 if (Flags & (1 << 0))
303 Info.setSwiftImportAsAccessors(Flags & (1 << 1));
310 :
public VersionedTableInfo<FieldTableInfo, SingleDeclTableKey, FieldInfo> {
312 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
313 auto CtxID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
314 auto NameID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
315 return {CtxID, NameID};
318 hash_value_type
ComputeHash(internal_key_type Key) {
319 return static_cast<size_t>(Key.hashValue());
322 static FieldInfo readUnversioned(internal_key_type Key,
323 const uint8_t *&
Data) {
325 ReadVariableInfo(
Data, Info);
331void ReadParamInfo(
const uint8_t *&
Data, ParamInfo &Info) {
332 ReadVariableInfo(
Data, Info);
334 uint8_t Payload = endian::readNext<uint8_t, llvm::endianness::little>(
Data);
335 if (
auto RawConvention = Payload & 0x7) {
337 Info.setRetainCountConvention(Convention);
341 Info.setLifetimebound(Payload & 0x02);
344 Info.setNoEscape(Payload & 0x02);
346 assert(Payload == 0 &&
"Bad API notes");
350void ReadFunctionInfo(
const uint8_t *&
Data, FunctionInfo &Info) {
351 ReadCommonEntityInfo(
Data, Info);
353 uint8_t Payload = endian::readNext<uint8_t, llvm::endianness::little>(
Data);
354 if (
auto RawConvention = Payload & 0x7) {
356 Info.setRetainCountConvention(Convention);
359 Info.NullabilityAudited = Payload & 0x1;
361 assert(Payload == 0 &&
"Bad API notes");
363 Info.NumAdjustedNullable =
364 endian::readNext<uint8_t, llvm::endianness::little>(
Data);
365 Info.NullabilityPayload =
366 endian::readNext<uint64_t, llvm::endianness::little>(
Data);
369 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
370 while (NumParams > 0) {
372 ReadParamInfo(
Data, pi);
373 Info.Params.push_back(pi);
377 unsigned ResultTypeLen =
378 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
379 Info.ResultType = std::string(
Data,
Data + ResultTypeLen);
380 Data += ResultTypeLen;
382 unsigned SwiftReturnOwnershipLength =
383 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
384 Info.SwiftReturnOwnership = std::string(
reinterpret_cast<const char *
>(
Data),
385 reinterpret_cast<const char *
>(
Data) +
386 SwiftReturnOwnershipLength);
387 Data += SwiftReturnOwnershipLength;
391class ObjCMethodTableInfo
392 :
public VersionedTableInfo<ObjCMethodTableInfo,
393 std::tuple<uint32_t, uint32_t, uint8_t>,
396 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
397 auto ClassID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
399 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
400 auto IsInstance = endian::readNext<uint8_t, llvm::endianness::little>(
Data);
404 hash_value_type
ComputeHash(internal_key_type Key) {
408 static ObjCMethodInfo readUnversioned(internal_key_type Key,
409 const uint8_t *&
Data) {
411 uint8_t Payload = *
Data++;
412 bool HasSelf = Payload & 0x01;
414 Info.RequiredInit = Payload & 0x01;
416 Info.DesignatedInit = Payload & 0x01;
418 assert(Payload == 0 &&
"Unable to fully decode 'Payload'.");
420 ReadFunctionInfo(
Data, Info);
422 Info.Self = ParamInfo{};
423 ReadParamInfo(
Data, *Info.Self);
430class ObjCSelectorTableInfo {
432 using internal_key_type = StoredObjCSelector;
433 using external_key_type = internal_key_type;
438 internal_key_type GetInternalKey(external_key_type Key) {
return Key; }
440 external_key_type GetExternalKey(internal_key_type Key) {
return Key; }
442 hash_value_type
ComputeHash(internal_key_type Key) {
443 return llvm::DenseMapInfo<StoredObjCSelector>::getHashValue(Key);
446 static bool EqualKey(internal_key_type LHS, internal_key_type RHS) {
447 return llvm::DenseMapInfo<StoredObjCSelector>::isEqual(LHS, RHS);
450 static std::pair<unsigned, unsigned> ReadKeyDataLength(
const uint8_t *&
Data) {
452 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
453 unsigned DataLength =
454 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
455 return {KeyLength, DataLength};
458 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
459 internal_key_type Key;
460 Key.NumArgs = endian::readNext<uint16_t, llvm::endianness::little>(
Data);
461 unsigned NumIdents = (Length -
sizeof(uint16_t)) /
sizeof(
uint32_t);
462 for (
unsigned i = 0; i != NumIdents; ++i) {
463 Key.Identifiers.push_back(
464 endian::readNext<uint32_t, llvm::endianness::little>(
Data));
469 static data_type ReadData(internal_key_type Key,
const uint8_t *
Data,
471 return endian::readNext<uint32_t, llvm::endianness::little>(
Data);
476class GlobalVariableTableInfo
477 :
public VersionedTableInfo<GlobalVariableTableInfo, SingleDeclTableKey,
478 GlobalVariableInfo> {
480 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
481 auto CtxID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
482 auto NameID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
483 return {CtxID, NameID};
486 hash_value_type
ComputeHash(internal_key_type Key) {
487 return static_cast<size_t>(Key.hashValue());
490 static GlobalVariableInfo readUnversioned(internal_key_type Key,
491 const uint8_t *&
Data) {
492 GlobalVariableInfo Info;
493 ReadVariableInfo(
Data, Info);
499class GlobalFunctionTableInfo
500 :
public VersionedTableInfo<GlobalFunctionTableInfo, SingleDeclTableKey,
501 GlobalFunctionInfo> {
503 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
504 auto CtxID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
505 auto NameID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
506 return {CtxID, NameID};
509 hash_value_type
ComputeHash(internal_key_type Key) {
510 return static_cast<size_t>(Key.hashValue());
513 static GlobalFunctionInfo readUnversioned(internal_key_type Key,
514 const uint8_t *&
Data) {
515 GlobalFunctionInfo Info;
516 ReadFunctionInfo(
Data, Info);
522class CXXMethodTableInfo
523 :
public VersionedTableInfo<CXXMethodTableInfo, SingleDeclTableKey,
526 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
527 auto CtxID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
528 auto NameID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
529 return {CtxID, NameID};
532 hash_value_type
ComputeHash(internal_key_type Key) {
533 return static_cast<size_t>(Key.hashValue());
536 static CXXMethodInfo readUnversioned(internal_key_type Key,
537 const uint8_t *&
Data) {
540 uint8_t Payload = *
Data++;
541 bool HasThis = Payload & 0x01;
543 assert(Payload == 0 &&
"Unable to fully decode 'Payload'.");
545 ReadFunctionInfo(
Data, Info);
547 Info.This = ParamInfo{};
548 ReadParamInfo(
Data, *Info.This);
555class EnumConstantTableInfo
556 :
public VersionedTableInfo<EnumConstantTableInfo, uint32_t,
559 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
560 auto NameID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
564 hash_value_type
ComputeHash(internal_key_type Key) {
568 static EnumConstantInfo readUnversioned(internal_key_type Key,
569 const uint8_t *&
Data) {
570 EnumConstantInfo Info;
571 ReadCommonEntityInfo(
Data, Info);
578 :
public VersionedTableInfo<TagTableInfo, SingleDeclTableKey, TagInfo> {
580 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
581 auto CtxID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
583 endian::readNext<IdentifierID, llvm::endianness::little>(
Data);
584 return {CtxID, NameID};
587 hash_value_type
ComputeHash(internal_key_type Key) {
588 return static_cast<size_t>(Key.hashValue());
591 static TagInfo readUnversioned(internal_key_type Key,
const uint8_t *&
Data) {
594 uint8_t Payload = *
Data++;
596 Info.setFlagEnum(Payload & 2);
599 Info.EnumExtensibility =
603 endian::readNext<uint8_t, llvm::endianness::little>(
Data);
607 endian::readNext<uint8_t, llvm::endianness::little>(
Data);
609 Info.setSwiftEscapable(std::optional(Escapable ==
kSwiftConforms));
611 unsigned ImportAsLength =
612 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
613 if (ImportAsLength > 0) {
615 std::string(
reinterpret_cast<const char *
>(
Data), ImportAsLength - 1);
616 Data += ImportAsLength - 1;
618 unsigned RetainOpLength =
619 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
620 if (RetainOpLength > 0) {
622 std::string(
reinterpret_cast<const char *
>(
Data), RetainOpLength - 1);
623 Data += RetainOpLength - 1;
625 unsigned ReleaseOpLength =
626 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
627 if (ReleaseOpLength > 0) {
628 Info.SwiftReleaseOp = std::string(
reinterpret_cast<const char *
>(
Data),
629 ReleaseOpLength - 1);
630 Data += ReleaseOpLength - 1;
632 unsigned DefaultOwnershipLength =
633 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
634 if (DefaultOwnershipLength > 0) {
635 Info.SwiftDefaultOwnership = std::string(
636 reinterpret_cast<const char *
>(
Data), DefaultOwnershipLength - 1);
637 Data += DefaultOwnershipLength - 1;
639 unsigned DestroyOpLength =
640 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
641 if (DestroyOpLength > 0) {
642 Info.SwiftDestroyOp = std::string(
reinterpret_cast<const char *
>(
Data),
643 DestroyOpLength - 1);
644 Data += DestroyOpLength - 1;
647 ReadCommonTypeInfo(
Data, Info);
653class TypedefTableInfo
654 :
public VersionedTableInfo<TypedefTableInfo, SingleDeclTableKey,
657 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
658 auto CtxID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
660 endian::readNext<IdentifierID, llvm::endianness::little>(
Data);
661 return {CtxID, nameID};
664 hash_value_type
ComputeHash(internal_key_type Key) {
665 return static_cast<size_t>(Key.hashValue());
668 static TypedefInfo readUnversioned(internal_key_type Key,
669 const uint8_t *&
Data) {
672 uint8_t Payload = *
Data++;
676 ReadCommonTypeInfo(
Data, Info);
698 llvm::OnDiskIterableChainedHashTable<IdentifierTableInfo>;
704 llvm::OnDiskIterableChainedHashTable<ContextIDTableInfo>;
710 llvm::OnDiskIterableChainedHashTable<ContextInfoTableInfo>;
716 llvm::OnDiskIterableChainedHashTable<ObjCPropertyTableInfo>;
722 llvm::OnDiskIterableChainedHashTable<FieldTableInfo>;
728 llvm::OnDiskIterableChainedHashTable<ObjCMethodTableInfo>;
734 llvm::OnDiskIterableChainedHashTable<CXXMethodTableInfo>;
740 llvm::OnDiskIterableChainedHashTable<ObjCSelectorTableInfo>;
746 llvm::OnDiskIterableChainedHashTable<GlobalVariableTableInfo>;
752 llvm::OnDiskIterableChainedHashTable<GlobalFunctionTableInfo>;
758 llvm::OnDiskIterableChainedHashTable<EnumConstantTableInfo>;
769 llvm::OnDiskIterableChainedHashTable<TypedefTableInfo>;
776 std::optional<IdentifierID>
getIdentifier(llvm::StringRef Str);
810std::optional<IdentifierID>
825std::optional<SelectorID>
833 for (
auto Ident :
Selector.Identifiers) {
841 auto Known = ObjCSelectorTable->find(Key);
842 if (Known == ObjCSelectorTable->end())
853 bool SawMetadata =
false;
858 consumeError(MaybeNext.takeError());
861 llvm::BitstreamEntry Next = MaybeNext.get();
863 while (Next.Kind != llvm::BitstreamEntry::EndBlock) {
864 if (Next.Kind == llvm::BitstreamEntry::Error)
867 if (Next.Kind == llvm::BitstreamEntry::SubBlock) {
870 if (Cursor.SkipBlock())
873 MaybeNext = Cursor.advance();
876 consumeError(MaybeNext.takeError());
879 Next = MaybeNext.get();
884 llvm::StringRef BlobData;
886 Cursor.readRecord(Next.ID, Scratch, &BlobData);
889 consumeError(MaybeKind.takeError());
892 unsigned Kind = MaybeKind.get();
907 ModuleName = BlobData.str();
914 SourceFileSizeAndModTime = {Scratch[0], Scratch[1]};
923 MaybeNext = Cursor.advance();
926 consumeError(MaybeNext.takeError());
929 Next = MaybeNext.get();
943 consumeError(MaybeNext.takeError());
946 llvm::BitstreamEntry Next = MaybeNext.get();
948 while (Next.Kind != llvm::BitstreamEntry::EndBlock) {
949 if (Next.Kind == llvm::BitstreamEntry::Error)
952 if (Next.Kind == llvm::BitstreamEntry::SubBlock) {
955 if (Cursor.SkipBlock())
958 MaybeNext = Cursor.advance();
961 consumeError(MaybeNext.takeError());
964 Next = MaybeNext.get();
969 llvm::StringRef BlobData;
971 Cursor.readRecord(Next.ID, Scratch, &BlobData);
974 consumeError(MaybeKind.takeError());
977 unsigned Kind = MaybeKind.get();
984 uint32_t tableOffset;
985 identifier_block::IdentifierDataLayout::readRecord(Scratch, tableOffset);
986 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
989 base + tableOffset, base +
sizeof(uint32_t), base));
999 MaybeNext = Cursor.advance();
1002 consumeError(MaybeNext.takeError());
1005 Next = MaybeNext.get();
1019 consumeError(MaybeNext.takeError());
1022 llvm::BitstreamEntry Next = MaybeNext.get();
1024 while (Next.Kind != llvm::BitstreamEntry::EndBlock) {
1025 if (Next.Kind == llvm::BitstreamEntry::Error)
1028 if (Next.Kind == llvm::BitstreamEntry::SubBlock) {
1031 if (Cursor.SkipBlock())
1034 MaybeNext = Cursor.advance();
1037 consumeError(MaybeNext.takeError());
1040 Next = MaybeNext.get();
1045 llvm::StringRef BlobData;
1047 Cursor.readRecord(Next.ID, Scratch, &BlobData);
1050 consumeError(MaybeKind.takeError());
1053 unsigned Kind = MaybeKind.get();
1060 uint32_t tableOffset;
1061 context_block::ContextIDLayout::readRecord(Scratch, tableOffset);
1062 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1064 ContextIDTable.reset(SerializedContextIDTable::Create(
1065 base + tableOffset, base +
sizeof(uint32_t), base));
1071 if (ContextInfoTable)
1074 uint32_t tableOffset;
1075 context_block::ContextInfoLayout::readRecord(Scratch, tableOffset);
1076 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1078 ContextInfoTable.reset(SerializedContextInfoTable::Create(
1079 base + tableOffset, base +
sizeof(uint32_t), base));
1089 MaybeNext = Cursor.advance();
1092 consumeError(MaybeNext.takeError());
1095 Next = MaybeNext.get();
1109 consumeError(MaybeNext.takeError());
1112 llvm::BitstreamEntry Next = MaybeNext.get();
1114 while (Next.Kind != llvm::BitstreamEntry::EndBlock) {
1115 if (Next.Kind == llvm::BitstreamEntry::Error)
1118 if (Next.Kind == llvm::BitstreamEntry::SubBlock) {
1121 if (Cursor.SkipBlock())
1124 MaybeNext = Cursor.advance();
1127 consumeError(MaybeNext.takeError());
1130 Next = MaybeNext.get();
1135 llvm::StringRef BlobData;
1137 Cursor.readRecord(Next.ID, Scratch, &BlobData);
1140 consumeError(MaybeKind.takeError());
1143 unsigned Kind = MaybeKind.get();
1147 if (ObjCPropertyTable)
1150 uint32_t tableOffset;
1151 objc_property_block::ObjCPropertyDataLayout::readRecord(Scratch,
1153 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1155 ObjCPropertyTable.reset(SerializedObjCPropertyTable::Create(
1156 base + tableOffset, base +
sizeof(uint32_t), base));
1166 MaybeNext = Cursor.advance();
1169 consumeError(MaybeNext.takeError());
1172 Next = MaybeNext.get();
1186 consumeError(MaybeNext.takeError());
1189 llvm::BitstreamEntry Next = MaybeNext.get();
1190 while (Next.Kind != llvm::BitstreamEntry::EndBlock) {
1191 if (Next.Kind == llvm::BitstreamEntry::Error)
1194 if (Next.Kind == llvm::BitstreamEntry::SubBlock) {
1197 if (Cursor.SkipBlock())
1200 MaybeNext = Cursor.advance();
1203 consumeError(MaybeNext.takeError());
1206 Next = MaybeNext.get();
1211 llvm::StringRef BlobData;
1213 Cursor.readRecord(Next.ID, Scratch, &BlobData);
1216 consumeError(MaybeKind.takeError());
1219 unsigned Kind = MaybeKind.get();
1223 if (ObjCMethodTable)
1226 uint32_t tableOffset;
1227 objc_method_block::ObjCMethodDataLayout::readRecord(Scratch, tableOffset);
1228 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1230 ObjCMethodTable.reset(SerializedObjCMethodTable::Create(
1231 base + tableOffset, base +
sizeof(uint32_t), base));
1241 MaybeNext = Cursor.advance();
1244 consumeError(MaybeNext.takeError());
1247 Next = MaybeNext.get();
1261 consumeError(MaybeNext.takeError());
1264 llvm::BitstreamEntry Next = MaybeNext.get();
1265 while (Next.Kind != llvm::BitstreamEntry::EndBlock) {
1266 if (Next.Kind == llvm::BitstreamEntry::Error)
1269 if (Next.Kind == llvm::BitstreamEntry::SubBlock) {
1272 if (Cursor.SkipBlock())
1275 MaybeNext = Cursor.advance();
1278 consumeError(MaybeNext.takeError());
1281 Next = MaybeNext.get();
1286 llvm::StringRef BlobData;
1288 Cursor.readRecord(Next.ID, Scratch, &BlobData);
1291 consumeError(MaybeKind.takeError());
1294 unsigned Kind = MaybeKind.get();
1301 uint32_t tableOffset;
1302 cxx_method_block::CXXMethodDataLayout::readRecord(Scratch, tableOffset);
1303 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1305 CXXMethodTable.reset(SerializedCXXMethodTable::Create(
1306 base + tableOffset, base +
sizeof(uint32_t), base));
1316 MaybeNext = Cursor.advance();
1319 consumeError(MaybeNext.takeError());
1322 Next = MaybeNext.get();
1336 consumeError(MaybeNext.takeError());
1339 llvm::BitstreamEntry Next = MaybeNext.get();
1340 while (Next.Kind != llvm::BitstreamEntry::EndBlock) {
1341 if (Next.Kind == llvm::BitstreamEntry::Error)
1344 if (Next.Kind == llvm::BitstreamEntry::SubBlock) {
1347 if (Cursor.SkipBlock())
1350 MaybeNext = Cursor.advance();
1353 consumeError(MaybeNext.takeError());
1356 Next = MaybeNext.get();
1361 llvm::StringRef BlobData;
1363 Cursor.readRecord(Next.ID, Scratch, &BlobData);
1366 consumeError(MaybeKind.takeError());
1369 unsigned Kind = MaybeKind.get();
1376 uint32_t tableOffset;
1377 field_block::FieldDataLayout::readRecord(Scratch, tableOffset);
1378 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1380 FieldTable.reset(SerializedFieldTable::Create(
1381 base + tableOffset, base +
sizeof(uint32_t), base));
1391 MaybeNext = Cursor.advance();
1394 consumeError(MaybeNext.takeError());
1397 Next = MaybeNext.get();
1411 consumeError(MaybeNext.takeError());
1414 llvm::BitstreamEntry Next = MaybeNext.get();
1415 while (Next.Kind != llvm::BitstreamEntry::EndBlock) {
1416 if (Next.Kind == llvm::BitstreamEntry::Error)
1419 if (Next.Kind == llvm::BitstreamEntry::SubBlock) {
1422 if (Cursor.SkipBlock())
1425 MaybeNext = Cursor.advance();
1428 consumeError(MaybeNext.takeError());
1431 Next = MaybeNext.get();
1436 llvm::StringRef BlobData;
1438 Cursor.readRecord(Next.ID, Scratch, &BlobData);
1441 consumeError(MaybeKind.takeError());
1444 unsigned Kind = MaybeKind.get();
1448 if (ObjCSelectorTable)
1451 uint32_t tableOffset;
1452 objc_selector_block::ObjCSelectorDataLayout::readRecord(Scratch,
1454 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1456 ObjCSelectorTable.reset(SerializedObjCSelectorTable::Create(
1457 base + tableOffset, base +
sizeof(uint32_t), base));
1467 MaybeNext = Cursor.advance();
1470 consumeError(MaybeNext.takeError());
1473 Next = MaybeNext.get();
1487 consumeError(MaybeNext.takeError());
1490 llvm::BitstreamEntry Next = MaybeNext.get();
1491 while (Next.Kind != llvm::BitstreamEntry::EndBlock) {
1492 if (Next.Kind == llvm::BitstreamEntry::Error)
1495 if (Next.Kind == llvm::BitstreamEntry::SubBlock) {
1498 if (Cursor.SkipBlock())
1501 MaybeNext = Cursor.advance();
1504 consumeError(MaybeNext.takeError());
1507 Next = MaybeNext.get();
1512 llvm::StringRef BlobData;
1514 Cursor.readRecord(Next.ID, Scratch, &BlobData);
1517 consumeError(MaybeKind.takeError());
1520 unsigned Kind = MaybeKind.get();
1524 if (GlobalVariableTable)
1527 uint32_t tableOffset;
1528 global_variable_block::GlobalVariableDataLayout::readRecord(Scratch,
1530 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1532 GlobalVariableTable.reset(SerializedGlobalVariableTable::Create(
1533 base + tableOffset, base +
sizeof(uint32_t), base));
1543 MaybeNext = Cursor.advance();
1546 consumeError(MaybeNext.takeError());
1549 Next = MaybeNext.get();
1563 consumeError(MaybeNext.takeError());
1566 llvm::BitstreamEntry Next = MaybeNext.get();
1567 while (Next.Kind != llvm::BitstreamEntry::EndBlock) {
1568 if (Next.Kind == llvm::BitstreamEntry::Error)
1571 if (Next.Kind == llvm::BitstreamEntry::SubBlock) {
1574 if (Cursor.SkipBlock())
1577 MaybeNext = Cursor.advance();
1580 consumeError(MaybeNext.takeError());
1583 Next = MaybeNext.get();
1588 llvm::StringRef BlobData;
1590 Cursor.readRecord(Next.ID, Scratch, &BlobData);
1593 consumeError(MaybeKind.takeError());
1596 unsigned Kind = MaybeKind.get();
1600 if (GlobalFunctionTable)
1603 uint32_t tableOffset;
1604 global_function_block::GlobalFunctionDataLayout::readRecord(Scratch,
1606 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1608 GlobalFunctionTable.reset(SerializedGlobalFunctionTable::Create(
1609 base + tableOffset, base +
sizeof(uint32_t), base));
1619 MaybeNext = Cursor.advance();
1622 consumeError(MaybeNext.takeError());
1625 Next = MaybeNext.get();
1639 consumeError(MaybeNext.takeError());
1642 llvm::BitstreamEntry Next = MaybeNext.get();
1643 while (Next.Kind != llvm::BitstreamEntry::EndBlock) {
1644 if (Next.Kind == llvm::BitstreamEntry::Error)
1647 if (Next.Kind == llvm::BitstreamEntry::SubBlock) {
1650 if (Cursor.SkipBlock())
1653 MaybeNext = Cursor.advance();
1656 consumeError(MaybeNext.takeError());
1659 Next = MaybeNext.get();
1664 llvm::StringRef BlobData;
1666 Cursor.readRecord(Next.ID, Scratch, &BlobData);
1669 consumeError(MaybeKind.takeError());
1672 unsigned Kind = MaybeKind.get();
1676 if (EnumConstantTable)
1679 uint32_t tableOffset;
1680 enum_constant_block::EnumConstantDataLayout::readRecord(Scratch,
1682 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1684 EnumConstantTable.reset(SerializedEnumConstantTable::Create(
1685 base + tableOffset, base +
sizeof(uint32_t), base));
1695 MaybeNext = Cursor.advance();
1698 consumeError(MaybeNext.takeError());
1701 Next = MaybeNext.get();
1715 consumeError(MaybeNext.takeError());
1718 llvm::BitstreamEntry Next = MaybeNext.get();
1719 while (Next.Kind != llvm::BitstreamEntry::EndBlock) {
1720 if (Next.Kind == llvm::BitstreamEntry::Error)
1723 if (Next.Kind == llvm::BitstreamEntry::SubBlock) {
1726 if (Cursor.SkipBlock())
1729 MaybeNext = Cursor.advance();
1732 consumeError(MaybeNext.takeError());
1735 Next = MaybeNext.get();
1740 llvm::StringRef BlobData;
1742 Cursor.readRecord(Next.ID, Scratch, &BlobData);
1745 consumeError(MaybeKind.takeError());
1748 unsigned Kind = MaybeKind.get();
1755 uint32_t tableOffset;
1756 tag_block::TagDataLayout::readRecord(Scratch, tableOffset);
1757 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1759 TagTable.reset(SerializedTagTable::Create(base + tableOffset,
1760 base +
sizeof(uint32_t), base));
1770 MaybeNext = Cursor.advance();
1773 consumeError(MaybeNext.takeError());
1776 Next = MaybeNext.get();
1790 consumeError(MaybeNext.takeError());
1793 llvm::BitstreamEntry Next = MaybeNext.get();
1794 while (Next.Kind != llvm::BitstreamEntry::EndBlock) {
1795 if (Next.Kind == llvm::BitstreamEntry::Error)
1798 if (Next.Kind == llvm::BitstreamEntry::SubBlock) {
1801 if (Cursor.SkipBlock())
1804 MaybeNext = Cursor.advance();
1807 consumeError(MaybeNext.takeError());
1810 Next = MaybeNext.get();
1815 llvm::StringRef BlobData;
1817 Cursor.readRecord(Next.ID, Scratch, &BlobData);
1820 consumeError(MaybeKind.takeError());
1823 unsigned Kind = MaybeKind.get();
1830 uint32_t tableOffset;
1831 typedef_block::TypedefDataLayout::readRecord(Scratch, tableOffset);
1832 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1834 TypedefTable.reset(SerializedTypedefTable::Create(
1835 base + tableOffset, base +
sizeof(uint32_t), base));
1845 MaybeNext = Cursor.advance();
1848 consumeError(MaybeNext.takeError());
1851 Next = MaybeNext.get();
1857APINotesReader::APINotesReader(llvm::MemoryBuffer *InputBuffer,
1858 llvm::VersionTuple SwiftVersion,
bool &Failed)
1869 if (Cursor.AtEndOfStream()) {
1875 if (maybeRead.get() !=
byte) {
1881 consumeError(maybeRead.takeError());
1888 bool HasValidControlBlock =
false;
1890 while (!
Cursor.AtEndOfStream()) {
1892 if (!MaybeTopLevelEntry) {
1894 consumeError(MaybeTopLevelEntry.takeError());
1898 llvm::BitstreamEntry TopLevelEntry = MaybeTopLevelEntry.get();
1900 if (TopLevelEntry.Kind != llvm::BitstreamEntry::SubBlock)
1903 switch (TopLevelEntry.ID) {
1904 case llvm::bitc::BLOCKINFO_BLOCK_ID:
1905 if (!
Cursor.ReadBlockInfoBlock()) {
1913 if (HasValidControlBlock ||
1914 Implementation->readControlBlock(Cursor, Scratch)) {
1919 HasValidControlBlock =
true;
1923 if (!HasValidControlBlock ||
1924 Implementation->readIdentifierBlock(Cursor, Scratch)) {
1931 if (!HasValidControlBlock ||
1932 Implementation->readContextBlock(Cursor, Scratch)) {
1940 if (!HasValidControlBlock ||
1941 Implementation->readObjCPropertyBlock(Cursor, Scratch)) {
1948 if (!HasValidControlBlock ||
1949 Implementation->readObjCMethodBlock(Cursor, Scratch)) {
1956 if (!HasValidControlBlock ||
1957 Implementation->readCXXMethodBlock(Cursor, Scratch)) {
1964 if (!HasValidControlBlock ||
1965 Implementation->readFieldBlock(Cursor, Scratch)) {
1972 if (!HasValidControlBlock ||
1973 Implementation->readObjCSelectorBlock(Cursor, Scratch)) {
1980 if (!HasValidControlBlock ||
1981 Implementation->readGlobalVariableBlock(Cursor, Scratch)) {
1988 if (!HasValidControlBlock ||
1989 Implementation->readGlobalFunctionBlock(Cursor, Scratch)) {
1996 if (!HasValidControlBlock ||
1997 Implementation->readEnumConstantBlock(Cursor, Scratch)) {
2004 if (!HasValidControlBlock ||
2005 Implementation->readTagBlock(Cursor, Scratch)) {
2012 if (!HasValidControlBlock ||
2013 Implementation->readTypedefBlock(Cursor, Scratch)) {
2022 if (
Cursor.SkipBlock()) {
2030 if (!
Cursor.AtEndOfStream()) {
2038std::unique_ptr<APINotesReader>
2040 llvm::VersionTuple SwiftVersion) {
2041 bool Failed =
false;
2042 std::unique_ptr<APINotesReader> Reader(
2043 new APINotesReader(InputBuffer.release(), SwiftVersion, Failed));
2050template <
typename T>
2052 llvm::VersionTuple Version,
2054 : Results(
std::move(R)) {
2056 assert(!Results.empty());
2057 assert(llvm::is_sorted(
2059 [](
const std::pair<llvm::VersionTuple, T> &left,
2060 const std::pair<llvm::VersionTuple, T> &right) ->
bool {
2065 assert((&left == &right || left.first != right.first) &&
2066 "two entries for the same version");
2067 return left.first < right.first;
2070 Selected = std::nullopt;
2071 for (
unsigned i = 0, n = Results.size(); i != n; ++i) {
2072 if (!Version.empty() && Results[i].first >= Version) {
2084 if (!Selected && Results[0].first.empty())
2089 -> std::optional<ContextID> {
2091 return std::nullopt;
2095 return std::nullopt;
2102 return std::nullopt;
2110 return std::nullopt;
2114 return std::nullopt;
2118 return std::nullopt;
2124 -> std::optional<ContextID> {
2126 return std::nullopt;
2130 return std::nullopt;
2137 return std::nullopt;
2145 return std::nullopt;
2149 return std::nullopt;
2153 return std::nullopt;
2162 return std::nullopt;
2166 return std::nullopt;
2169 std::make_tuple(CtxID.Value, *PropertyID, (
char)IsInstance));
2171 return std::nullopt;
2177 bool IsInstanceMethod)
2180 return std::nullopt;
2184 return std::nullopt;
2187 ObjCMethodTableInfo::internal_key_type{CtxID.Value, *SelID,
2190 return std::nullopt;
2198 return std::nullopt;
2202 return std::nullopt;
2207 return std::nullopt;
2215 return std::nullopt;
2219 return std::nullopt;
2224 return std::nullopt;
2230 std::optional<Context> Ctx)
2233 return std::nullopt;
2237 return std::nullopt;
2243 return std::nullopt;
2249 std::optional<Context> Ctx)
2252 return std::nullopt;
2256 return std::nullopt;
2262 return std::nullopt;
2270 return std::nullopt;
2274 return std::nullopt;
2278 return std::nullopt;
2284 std::optional<Context> ParentCtx)
2285 -> std::optional<ContextID> {
2287 return std::nullopt;
2291 return std::nullopt;
2296 return std::nullopt;
2304 return std::nullopt;
2308 return std::nullopt;
2314 return std::nullopt;
2320 std::optional<Context> Ctx)
2323 return std::nullopt;
2327 return std::nullopt;
2333 return std::nullopt;
2339 llvm::StringRef Name, std::optional<ContextID> ParentNamespaceID)
2340 -> std::optional<ContextID> {
2342 return std::nullopt;
2346 return std::nullopt;
2348 uint32_t RawParentNamespaceID =
2349 ParentNamespaceID ? ParentNamespaceID->Value : -1;
2353 return std::nullopt;
static StringRef getIdentifier(const Token &Tok)
Implements an efficient mapping from strings to IdentifierInfo nodes.
iterator find(StringRef Name) const
Smart pointer class that efficiently represents Objective-C method names.
llvm::OnDiskIterableChainedHashTable< FieldTableInfo > SerializedFieldTable
llvm::OnDiskIterableChainedHashTable< GlobalVariableTableInfo > SerializedGlobalVariableTable
std::unique_ptr< SerializedContextIDTable > ContextIDTable
The Objective-C / C++ context ID table.
bool readEnumConstantBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
std::string ModuleName
The name of the module that we read from the control block.
std::optional< std::pair< off_t, time_t > > SourceFileSizeAndModTime
std::unique_ptr< SerializedIdentifierTable > IdentifierTable
The identifier table.
llvm::OnDiskIterableChainedHashTable< TagTableInfo > SerializedTagTable
std::unique_ptr< SerializedGlobalFunctionTable > GlobalFunctionTable
The global function table.
std::unique_ptr< SerializedObjCPropertyTable > ObjCPropertyTable
The Objective-C property table.
bool readObjCMethodBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
std::unique_ptr< SerializedGlobalVariableTable > GlobalVariableTable
The global variable table.
bool readTagBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
std::unique_ptr< SerializedTypedefTable > TypedefTable
The typedef table.
bool readFieldBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
llvm::OnDiskIterableChainedHashTable< ObjCSelectorTableInfo > SerializedObjCSelectorTable
bool readGlobalFunctionBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
bool readTypedefBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
llvm::MemoryBuffer * InputBuffer
The input buffer for the API notes data.
std::unique_ptr< SerializedObjCSelectorTable > ObjCSelectorTable
The Objective-C selector table.
bool readControlBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
std::unique_ptr< SerializedCXXMethodTable > CXXMethodTable
The C++ method table.
bool readObjCPropertyBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
bool readObjCSelectorBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
llvm::OnDiskIterableChainedHashTable< IdentifierTableInfo > SerializedIdentifierTable
std::unique_ptr< SerializedEnumConstantTable > EnumConstantTable
The enumerator table.
std::optional< IdentifierID > getIdentifier(llvm::StringRef Str)
Retrieve the identifier ID for the given string, or an empty optional if the string is unknown.
bool readGlobalVariableBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
llvm::OnDiskIterableChainedHashTable< ObjCPropertyTableInfo > SerializedObjCPropertyTable
std::unique_ptr< SerializedTagTable > TagTable
The tag table.
llvm::OnDiskIterableChainedHashTable< CXXMethodTableInfo > SerializedCXXMethodTable
std::unique_ptr< SerializedFieldTable > FieldTable
The C record field table.
std::optional< SelectorID > getSelector(ObjCSelectorRef Selector)
Retrieve the selector ID for the given selector, or an empty optional if the string is unknown.
llvm::OnDiskIterableChainedHashTable< ObjCMethodTableInfo > SerializedObjCMethodTable
bool readCXXMethodBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
bool readIdentifierBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
llvm::VersionTuple SwiftVersion
The Swift version to use for filtering.
bool readContextBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
llvm::OnDiskIterableChainedHashTable< EnumConstantTableInfo > SerializedEnumConstantTable
std::unique_ptr< SerializedObjCMethodTable > ObjCMethodTable
The Objective-C method table.
std::unique_ptr< SerializedContextInfoTable > ContextInfoTable
The Objective-C context info table.
llvm::OnDiskIterableChainedHashTable< TypedefTableInfo > SerializedTypedefTable
llvm::OnDiskIterableChainedHashTable< GlobalFunctionTableInfo > SerializedGlobalFunctionTable
llvm::OnDiskIterableChainedHashTable< ContextInfoTableInfo > SerializedContextInfoTable
llvm::OnDiskIterableChainedHashTable< ContextIDTableInfo > SerializedContextIDTable
Captures the completed versioned information for a particular part of API notes, including both unver...
VersionedInfo(std::nullopt_t)
Form an empty set of versioned information.
A class that reads API notes data from a binary file that was written by the APINotesWriter.
VersionedInfo< ContextInfo > lookupObjCClassInfo(llvm::StringRef Name)
Look for information regarding the given Objective-C class.
VersionedInfo< FieldInfo > lookupField(ContextID CtxID, llvm::StringRef Name)
Look for information regarding the given field of a C struct.
VersionedInfo< CXXMethodInfo > lookupCXXMethod(ContextID CtxID, llvm::StringRef Name)
Look for information regarding the given C++ method in the given C++ tag context.
VersionedInfo< TagInfo > lookupTag(llvm::StringRef Name, std::optional< Context > Ctx=std::nullopt)
Look for information regarding the given tag (struct/union/enum/C++ class).
VersionedInfo< GlobalFunctionInfo > lookupGlobalFunction(llvm::StringRef Name, std::optional< Context > Ctx=std::nullopt)
Look for information regarding the given global function.
VersionedInfo< ObjCPropertyInfo > lookupObjCProperty(ContextID CtxID, llvm::StringRef Name, bool IsInstance)
Look for information regarding the given Objective-C property in the given context.
VersionedInfo< ObjCMethodInfo > lookupObjCMethod(ContextID CtxID, ObjCSelectorRef Selector, bool IsInstanceMethod)
Look for information regarding the given Objective-C method in the given context.
VersionedInfo< GlobalVariableInfo > lookupGlobalVariable(llvm::StringRef Name, std::optional< Context > Ctx=std::nullopt)
Look for information regarding the given global variable.
std::optional< ContextID > lookupNamespaceID(llvm::StringRef Name, std::optional< ContextID > ParentNamespaceID=std::nullopt)
Look for the context ID of the given C++ namespace.
std::optional< ContextID > lookupTagID(llvm::StringRef Name, std::optional< Context > ParentCtx=std::nullopt)
Look for the context ID of the given C++ tag.
VersionedInfo< TypedefInfo > lookupTypedef(llvm::StringRef Name, std::optional< Context > Ctx=std::nullopt)
Look for information regarding the given typedef.
std::optional< ContextID > lookupObjCClassID(llvm::StringRef Name)
Look for the context ID of the given Objective-C class.
static std::unique_ptr< APINotesReader > Create(std::unique_ptr< llvm::MemoryBuffer > InputBuffer, llvm::VersionTuple SwiftVersion)
Create a new API notes reader from the given member buffer, which contains the contents of a binary A...
VersionedInfo< ContextInfo > lookupObjCProtocolInfo(llvm::StringRef Name)
Look for information regarding the given Objective-C protocol.
std::optional< ContextID > lookupObjCProtocolID(llvm::StringRef Name)
Look for the context ID of the given Objective-C protocol.
VersionedInfo< EnumConstantInfo > lookupEnumConstant(llvm::StringRef Name)
Look for information regarding the given enumerator.
Opaque context ID used to refer to an Objective-C class or protocol or a C++ namespace.
llvm::PointerEmbeddedInt< unsigned, 31 > SelectorID
RetainCountConventionKind
const uint8_t kSwiftConforms
llvm::PointerEmbeddedInt< unsigned, 31 > IdentifierID
SwiftNewTypeKind
The kind of a swift_wrapper/swift_newtype.
EnumExtensibilityKind
The payload for an enum_extensibility attribute.
const uint8_t kSwiftDoesNotConform
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.
@ 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,...
@ FIELD_BLOCK_ID
The fields data block, which maps names fields of C records to information about the field.
@ OBJC_SELECTOR_BLOCK_ID
The Objective-C selector data block, which maps Objective-C selector names (# of pieces,...
@ CXX_METHOD_BLOCK_ID
The C++ method data block, which maps C++ (context id, method name) pairs to information about the me...
@ 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...
unsigned ComputeHash(Selector Sel)
The JSON file list parser is used to communicate input to InstallAPI.
NullabilityKind
Describes the nullability of a particular type.
@ Result
The result type of a method or function.
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...
A temporary reference to an Objective-C selector, suitable for referencing selector data on the stack...
A stored Objective-C or C++ declaration, represented by the ID of its parent context,...
A stored Objective-C selector.
llvm::SmallVector< IdentifierID, 2 > Identifiers