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;
56 llvm::SmallVector<std::pair<llvm::VersionTuple, UnversionedDataType>, 1>;
57 using hash_value_type =
size_t;
58 using offset_type = unsigned;
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});
97 uint8_t EncodedBits = *
Data++;
98 Info.Unavailable = (EncodedBits >> 1) & 0x01;
99 Info.UnavailableInSwift = EncodedBits & 0x01;
100 if ((EncodedBits >> 2) & 0x01)
101 Info.setSwiftPrivate(
static_cast<bool>((EncodedBits >> 3) & 0x01));
102 if ((EncodedBits >> 4) & 0x01)
107 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
108 Info.UnavailableMsg =
109 std::string(
reinterpret_cast<const char *
>(
Data),
110 reinterpret_cast<const char *
>(
Data) + MsgLength);
113 unsigned SwiftNameLength =
114 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
116 std::string(
reinterpret_cast<const char *
>(
Data),
117 reinterpret_cast<const char *
>(
Data) + SwiftNameLength);
118 Data += SwiftNameLength;
123 ReadCommonEntityInfo(
Data, Info);
125 unsigned SwiftBridgeLength =
126 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
127 if (SwiftBridgeLength > 0) {
128 Info.setSwiftBridge(std::string(
reinterpret_cast<const char *
>(
Data),
129 SwiftBridgeLength - 1));
130 Data += SwiftBridgeLength - 1;
133 unsigned ErrorDomainLength =
134 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
135 if (ErrorDomainLength > 0) {
136 Info.setNSErrorDomain(std::optional<std::string>(std::string(
137 reinterpret_cast<const char *
>(
Data), ErrorDomainLength - 1)));
138 Data += ErrorDomainLength - 1;
141 if (
unsigned ConformanceLength =
142 endian::readNext<uint16_t, llvm::endianness::little>(
Data)) {
143 Info.setSwiftConformance(std::string(
reinterpret_cast<const char *
>(
Data),
144 ConformanceLength - 1));
145 Data += ConformanceLength - 1;
150class IdentifierTableInfo {
152 using internal_key_type = llvm::StringRef;
153 using external_key_type = llvm::StringRef;
156 using offset_type = unsigned;
158 internal_key_type GetInternalKey(external_key_type Key) {
return Key; }
160 external_key_type GetExternalKey(internal_key_type Key) {
return Key; }
162 hash_value_type
ComputeHash(internal_key_type Key) {
163 return llvm::djbHash(Key);
166 static bool EqualKey(internal_key_type LHS, internal_key_type RHS) {
170 static std::pair<unsigned, unsigned> ReadKeyDataLength(
const uint8_t *&
Data) {
172 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
173 unsigned DataLength =
174 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
175 return {KeyLength, DataLength};
178 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
179 return llvm::StringRef(
reinterpret_cast<const char *
>(
Data), Length);
182 static data_type ReadData(internal_key_type key,
const uint8_t *
Data,
184 return endian::readNext<uint32_t, llvm::endianness::little>(
Data);
190class ContextIDTableInfo {
192 using internal_key_type = ContextTableKey;
193 using external_key_type = internal_key_type;
194 using data_type = unsigned;
195 using hash_value_type =
size_t;
196 using offset_type = unsigned;
198 internal_key_type GetInternalKey(external_key_type Key) {
return Key; }
200 external_key_type GetExternalKey(internal_key_type Key) {
return Key; }
202 hash_value_type
ComputeHash(internal_key_type Key) {
203 return static_cast<size_t>(Key.hashValue());
206 static bool EqualKey(internal_key_type LHS, internal_key_type RHS) {
210 static std::pair<unsigned, unsigned> ReadKeyDataLength(
const uint8_t *&
Data) {
212 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
213 unsigned DataLength =
214 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
215 return {KeyLength, DataLength};
218 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
220 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
222 endian::readNext<uint8_t, llvm::endianness::little>(
Data);
223 auto NameID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
227 static data_type ReadData(internal_key_type Key,
const uint8_t *
Data,
229 return endian::readNext<uint32_t, llvm::endianness::little>(
Data);
234class ContextInfoTableInfo
235 :
public VersionedTableInfo<ContextInfoTableInfo, unsigned, ContextInfo> {
237 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
238 return endian::readNext<uint32_t, llvm::endianness::little>(
Data);
241 hash_value_type
ComputeHash(internal_key_type Key) {
245 static ContextInfo readUnversioned(internal_key_type Key,
246 const uint8_t *&
Data) {
248 ReadCommonTypeInfo(
Data, Info);
249 uint8_t Payload = *
Data++;
252 Info.setHasDesignatedInits(
true);
253 Payload = Payload >> 1;
256 Info.setDefaultNullability(
static_cast<NullabilityKind>(Payload & 0x03));
259 if (Payload & (1 << 1))
260 Info.setSwiftObjCMembers(Payload & 1);
263 if (Payload & (1 << 1))
264 Info.setSwiftImportAsNonGeneric(Payload & 1);
272 ReadCommonEntityInfo(
Data, Info);
278 auto TypeLen = endian::readNext<uint16_t, llvm::endianness::little>(
Data);
279 Info.setType(std::string(
Data,
Data + TypeLen));
284class ObjCPropertyTableInfo
285 :
public VersionedTableInfo<ObjCPropertyTableInfo,
286 std::tuple<uint32_t, uint32_t, uint8_t>,
289 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
290 auto ClassID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
291 auto NameID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
292 char IsInstance = endian::readNext<uint8_t, llvm::endianness::little>(
Data);
293 return {ClassID, NameID, IsInstance};
296 hash_value_type
ComputeHash(internal_key_type Key) {
300 static ObjCPropertyInfo readUnversioned(internal_key_type Key,
301 const uint8_t *&
Data) {
302 ObjCPropertyInfo Info;
303 ReadVariableInfo(
Data, Info);
304 uint8_t Flags = *
Data++;
305 if (Flags & (1 << 0))
306 Info.setSwiftImportAsAccessors(Flags & (1 << 1));
313 :
public VersionedTableInfo<FieldTableInfo, SingleDeclTableKey, FieldInfo> {
315 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
316 auto CtxID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
317 auto NameID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
318 return {CtxID, NameID};
321 hash_value_type
ComputeHash(internal_key_type Key) {
322 return static_cast<size_t>(Key.hashValue());
325 static FieldInfo readUnversioned(internal_key_type Key,
326 const uint8_t *&
Data) {
328 ReadVariableInfo(
Data, Info);
335 ReadVariableInfo(
Data, Info);
337 uint8_t Payload = endian::readNext<uint8_t, llvm::endianness::little>(
Data);
338 if (
auto RawConvention = Payload & 0x7) {
340 Info.setRetainCountConvention(Convention);
344 Info.setLifetimebound(Payload & 0x02);
347 Info.setNoEscape(Payload & 0x02);
349 assert(Payload == 0 &&
"Bad API notes");
354 ReadCommonEntityInfo(
Data, Info);
356 uint8_t Payload = endian::readNext<uint8_t, llvm::endianness::little>(
Data);
357 if (
auto RawConvention = Payload & 0x7) {
359 Info.setRetainCountConvention(Convention);
362 Info.NullabilityAudited = Payload & 0x1;
364 assert(Payload == 0 &&
"Bad API notes");
366 Info.NumAdjustedNullable =
367 endian::readNext<uint8_t, llvm::endianness::little>(
Data);
368 Info.NullabilityPayload =
369 endian::readNext<uint64_t, llvm::endianness::little>(
Data);
372 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
373 while (NumParams > 0) {
375 ReadParamInfo(
Data, pi);
376 Info.Params.push_back(pi);
380 unsigned ResultTypeLen =
381 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
382 Info.ResultType = std::string(
Data,
Data + ResultTypeLen);
383 Data += ResultTypeLen;
385 unsigned SwiftReturnOwnershipLength =
386 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
387 Info.SwiftReturnOwnership = std::string(
reinterpret_cast<const char *
>(
Data),
388 reinterpret_cast<const char *
>(
Data) +
389 SwiftReturnOwnershipLength);
390 Data += SwiftReturnOwnershipLength;
394class ObjCMethodTableInfo
395 :
public VersionedTableInfo<ObjCMethodTableInfo,
396 std::tuple<uint32_t, uint32_t, uint8_t>,
399 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
400 auto ClassID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
402 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
403 auto IsInstance = endian::readNext<uint8_t, llvm::endianness::little>(
Data);
407 hash_value_type
ComputeHash(internal_key_type Key) {
411 static ObjCMethodInfo readUnversioned(internal_key_type Key,
412 const uint8_t *&
Data) {
414 uint8_t Payload = *
Data++;
415 bool HasSelf = Payload & 0x01;
417 Info.RequiredInit = Payload & 0x01;
419 Info.DesignatedInit = Payload & 0x01;
421 assert(Payload == 0 &&
"Unable to fully decode 'Payload'.");
423 ReadFunctionInfo(
Data, Info);
425 Info.Self = ParamInfo{};
426 ReadParamInfo(
Data, *Info.Self);
433class ObjCSelectorTableInfo {
435 using internal_key_type = StoredObjCSelector;
436 using external_key_type = internal_key_type;
438 using hash_value_type = unsigned;
439 using offset_type = unsigned;
441 internal_key_type GetInternalKey(external_key_type Key) {
return Key; }
443 external_key_type GetExternalKey(internal_key_type Key) {
return Key; }
445 hash_value_type
ComputeHash(internal_key_type Key) {
446 return llvm::DenseMapInfo<StoredObjCSelector>::getHashValue(Key);
449 static bool EqualKey(internal_key_type LHS, internal_key_type RHS) {
450 return llvm::DenseMapInfo<StoredObjCSelector>::isEqual(LHS, RHS);
453 static std::pair<unsigned, unsigned> ReadKeyDataLength(
const uint8_t *&
Data) {
455 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
456 unsigned DataLength =
457 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
458 return {KeyLength, DataLength};
461 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
462 internal_key_type Key;
463 Key.NumArgs = endian::readNext<uint16_t, llvm::endianness::little>(
Data);
464 unsigned NumIdents = (Length -
sizeof(uint16_t)) /
sizeof(uint32_t);
465 for (
unsigned i = 0; i != NumIdents; ++i) {
466 Key.Identifiers.push_back(
467 endian::readNext<uint32_t, llvm::endianness::little>(
Data));
472 static data_type ReadData(internal_key_type Key,
const uint8_t *
Data,
474 return endian::readNext<uint32_t, llvm::endianness::little>(
Data);
479class GlobalVariableTableInfo
480 :
public VersionedTableInfo<GlobalVariableTableInfo, SingleDeclTableKey,
481 GlobalVariableInfo> {
483 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
484 auto CtxID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
485 auto NameID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
486 return {CtxID, NameID};
489 hash_value_type
ComputeHash(internal_key_type Key) {
490 return static_cast<size_t>(Key.hashValue());
493 static GlobalVariableInfo readUnversioned(internal_key_type Key,
494 const uint8_t *&
Data) {
495 GlobalVariableInfo Info;
496 ReadVariableInfo(
Data, Info);
502class GlobalFunctionTableInfo
503 :
public VersionedTableInfo<GlobalFunctionTableInfo, SingleDeclTableKey,
504 GlobalFunctionInfo> {
506 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
507 auto CtxID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
508 auto NameID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
509 return {CtxID, NameID};
512 hash_value_type
ComputeHash(internal_key_type Key) {
513 return static_cast<size_t>(Key.hashValue());
516 static GlobalFunctionInfo readUnversioned(internal_key_type Key,
517 const uint8_t *&
Data) {
518 GlobalFunctionInfo Info;
519 ReadFunctionInfo(
Data, Info);
525class CXXMethodTableInfo
526 :
public VersionedTableInfo<CXXMethodTableInfo, SingleDeclTableKey,
529 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
530 auto CtxID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
531 auto NameID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
532 return {CtxID, NameID};
535 hash_value_type
ComputeHash(internal_key_type Key) {
536 return static_cast<size_t>(Key.hashValue());
539 static CXXMethodInfo readUnversioned(internal_key_type Key,
540 const uint8_t *&
Data) {
543 uint8_t Payload = *
Data++;
544 bool HasThis = Payload & 0x01;
546 assert(Payload == 0 &&
"Unable to fully decode 'Payload'.");
548 ReadFunctionInfo(
Data, Info);
550 Info.This = ParamInfo{};
551 ReadParamInfo(
Data, *Info.This);
558class EnumConstantTableInfo
559 :
public VersionedTableInfo<EnumConstantTableInfo, uint32_t,
562 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
563 auto NameID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
567 hash_value_type
ComputeHash(internal_key_type Key) {
571 static EnumConstantInfo readUnversioned(internal_key_type Key,
572 const uint8_t *&
Data) {
573 EnumConstantInfo Info;
574 ReadCommonEntityInfo(
Data, Info);
581 :
public VersionedTableInfo<TagTableInfo, SingleDeclTableKey, TagInfo> {
583 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
584 auto CtxID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
586 endian::readNext<IdentifierID, llvm::endianness::little>(
Data);
587 return {CtxID, NameID};
590 hash_value_type
ComputeHash(internal_key_type Key) {
591 return static_cast<size_t>(Key.hashValue());
594 static TagInfo readUnversioned(internal_key_type Key,
const uint8_t *&
Data) {
597 uint8_t Payload = *
Data++;
599 Info.setFlagEnum(Payload & 2);
602 Info.EnumExtensibility =
606 endian::readNext<uint8_t, llvm::endianness::little>(
Data);
610 endian::readNext<uint8_t, llvm::endianness::little>(
Data);
612 Info.setSwiftEscapable(std::optional(Escapable ==
kSwiftConforms));
614 unsigned ImportAsLength =
615 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
616 if (ImportAsLength > 0) {
618 std::string(
reinterpret_cast<const char *
>(
Data), ImportAsLength - 1);
619 Data += ImportAsLength - 1;
621 unsigned RetainOpLength =
622 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
623 if (RetainOpLength > 0) {
625 std::string(
reinterpret_cast<const char *
>(
Data), RetainOpLength - 1);
626 Data += RetainOpLength - 1;
628 unsigned ReleaseOpLength =
629 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
630 if (ReleaseOpLength > 0) {
631 Info.SwiftReleaseOp = std::string(
reinterpret_cast<const char *
>(
Data),
632 ReleaseOpLength - 1);
633 Data += ReleaseOpLength - 1;
635 unsigned DefaultOwnershipLength =
636 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
637 if (DefaultOwnershipLength > 0) {
638 Info.SwiftDefaultOwnership = std::string(
639 reinterpret_cast<const char *
>(
Data), DefaultOwnershipLength - 1);
640 Data += DefaultOwnershipLength - 1;
642 unsigned DestroyOpLength =
643 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
644 if (DestroyOpLength > 0) {
645 Info.SwiftDestroyOp = std::string(
reinterpret_cast<const char *
>(
Data),
646 DestroyOpLength - 1);
647 Data += DestroyOpLength - 1;
650 ReadCommonTypeInfo(
Data, Info);
656class TypedefTableInfo
657 :
public VersionedTableInfo<TypedefTableInfo, SingleDeclTableKey,
660 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
661 auto CtxID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
663 endian::readNext<IdentifierID, llvm::endianness::little>(
Data);
664 return {CtxID, nameID};
667 hash_value_type
ComputeHash(internal_key_type Key) {
668 return static_cast<size_t>(Key.hashValue());
671 static TypedefInfo readUnversioned(internal_key_type Key,
672 const uint8_t *&
Data) {
675 uint8_t Payload = *
Data++;
679 ReadCommonTypeInfo(
Data, Info);
701 llvm::OnDiskIterableChainedHashTable<IdentifierTableInfo>;
707 llvm::OnDiskIterableChainedHashTable<ContextIDTableInfo>;
713 llvm::OnDiskIterableChainedHashTable<ContextInfoTableInfo>;
719 llvm::OnDiskIterableChainedHashTable<ObjCPropertyTableInfo>;
725 llvm::OnDiskIterableChainedHashTable<FieldTableInfo>;
731 llvm::OnDiskIterableChainedHashTable<ObjCMethodTableInfo>;
737 llvm::OnDiskIterableChainedHashTable<CXXMethodTableInfo>;
743 llvm::OnDiskIterableChainedHashTable<ObjCSelectorTableInfo>;
749 llvm::OnDiskIterableChainedHashTable<GlobalVariableTableInfo>;
755 llvm::OnDiskIterableChainedHashTable<GlobalFunctionTableInfo>;
761 llvm::OnDiskIterableChainedHashTable<EnumConstantTableInfo>;
772 llvm::OnDiskIterableChainedHashTable<TypedefTableInfo>;
779 std::optional<IdentifierID>
getIdentifier(llvm::StringRef Str);
813std::optional<IdentifierID>
828std::optional<SelectorID>
836 for (
auto Ident :
Selector.Identifiers) {
854 return llvm::createStringError(llvm::inconvertibleErrorCode(),
855 "Failed to enter control block");
857 bool SawMetadata =
false;
861 return MaybeNext.takeError();
863 llvm::BitstreamEntry
Next = MaybeNext.get();
865 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
866 if (
Next.Kind == llvm::BitstreamEntry::Error)
867 return llvm::createStringError(llvm::inconvertibleErrorCode(),
868 "Malformed bitstream entry");
870 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
873 if (Cursor.SkipBlock())
874 return llvm::createStringError(llvm::inconvertibleErrorCode(),
875 "Failed to skip sub-block");
877 MaybeNext = Cursor.advance();
879 return MaybeNext.takeError();
881 Next = MaybeNext.get();
886 llvm::StringRef BlobData;
888 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
890 return MaybeKind.takeError();
892 unsigned Kind = MaybeKind.get();
898 return llvm::createStringError(llvm::inconvertibleErrorCode(),
899 "Multiple metadata records found");
902 return llvm::createStringError(llvm::inconvertibleErrorCode(),
903 "Version mismatch in API Notes");
925 MaybeNext = Cursor.advance();
927 return MaybeNext.takeError();
929 Next = MaybeNext.get();
933 return llvm::createStringError(llvm::inconvertibleErrorCode(),
934 "Missing metadata record");
936 return llvm::Error::success();
942 return llvm::createStringError(llvm::inconvertibleErrorCode(),
943 "Failed to enter identifier block");
947 return MaybeNext.takeError();
949 llvm::BitstreamEntry
Next = MaybeNext.get();
951 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
952 if (
Next.Kind == llvm::BitstreamEntry::Error)
953 return llvm::createStringError(llvm::inconvertibleErrorCode(),
954 "Malformed bitstream entry");
956 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
959 if (Cursor.SkipBlock())
960 return llvm::createStringError(llvm::inconvertibleErrorCode(),
961 "Failed to skip sub-block");
963 MaybeNext = Cursor.advance();
965 return MaybeNext.takeError();
967 Next = MaybeNext.get();
972 llvm::StringRef BlobData;
974 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
976 return MaybeKind.takeError();
978 unsigned Kind = MaybeKind.get();
983 return llvm::createStringError(llvm::inconvertibleErrorCode(),
984 "Multiple identifier records found");
986 uint32_t tableOffset;
987 identifier_block::IdentifierDataLayout::readRecord(Scratch, tableOffset);
988 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
991 base + tableOffset, base +
sizeof(uint32_t), base));
1001 MaybeNext = Cursor.advance();
1003 return MaybeNext.takeError();
1005 Next = MaybeNext.get();
1008 return llvm::Error::success();
1014 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1015 "Failed to enter Objective-C context block");
1019 return MaybeNext.takeError();
1021 llvm::BitstreamEntry
Next = MaybeNext.get();
1023 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1024 if (
Next.Kind == llvm::BitstreamEntry::Error)
1025 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1026 "Malformed bitstream entry");
1028 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1031 if (Cursor.SkipBlock())
1032 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1033 "Failed to skip sub-block");
1035 MaybeNext = Cursor.advance();
1037 return MaybeNext.takeError();
1039 Next = MaybeNext.get();
1044 llvm::StringRef BlobData;
1046 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1048 return MaybeKind.takeError();
1050 unsigned Kind = MaybeKind.get();
1055 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1056 "Multiple context ID records found");
1058 uint32_t tableOffset;
1059 context_block::ContextIDLayout::readRecord(Scratch, tableOffset);
1060 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1063 base + tableOffset, base +
sizeof(uint32_t), base));
1070 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1071 "Multiple context info records found");
1073 uint32_t tableOffset;
1074 context_block::ContextInfoLayout::readRecord(Scratch, tableOffset);
1075 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1078 base + tableOffset, base +
sizeof(uint32_t), base));
1088 MaybeNext = Cursor.advance();
1090 return MaybeNext.takeError();
1092 Next = MaybeNext.get();
1095 return llvm::Error::success();
1101 return llvm::createStringError(
1102 llvm::inconvertibleErrorCode(),
1103 "Failed to enter Objective-C property block");
1107 return MaybeNext.takeError();
1109 llvm::BitstreamEntry
Next = MaybeNext.get();
1111 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1112 if (
Next.Kind == llvm::BitstreamEntry::Error)
1113 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1114 "Malformed bitstream entry");
1116 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1119 if (Cursor.SkipBlock())
1120 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1121 "Failed to skip sub-block");
1123 MaybeNext = Cursor.advance();
1125 return MaybeNext.takeError();
1127 Next = MaybeNext.get();
1132 llvm::StringRef BlobData;
1134 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1136 return MaybeKind.takeError();
1138 unsigned Kind = MaybeKind.get();
1143 return llvm::createStringError(
1144 llvm::inconvertibleErrorCode(),
1145 "Multiple Objective-C property records found");
1147 uint32_t tableOffset;
1148 objc_property_block::ObjCPropertyDataLayout::readRecord(Scratch,
1150 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1153 base + tableOffset, base +
sizeof(uint32_t), base));
1163 MaybeNext = Cursor.advance();
1165 return MaybeNext.takeError();
1167 Next = MaybeNext.get();
1170 return llvm::Error::success();
1176 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1177 "Failed to enter Objective-C method block");
1181 return MaybeNext.takeError();
1183 llvm::BitstreamEntry
Next = MaybeNext.get();
1184 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1185 if (
Next.Kind == llvm::BitstreamEntry::Error)
1186 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1187 "Malformed bitstream entry");
1189 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1192 if (Cursor.SkipBlock())
1193 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1194 "Failed to skip sub-block");
1196 MaybeNext = Cursor.advance();
1198 return MaybeNext.takeError();
1200 Next = MaybeNext.get();
1205 llvm::StringRef BlobData;
1207 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1209 return MaybeKind.takeError();
1211 unsigned Kind = MaybeKind.get();
1216 return llvm::createStringError(
1217 llvm::inconvertibleErrorCode(),
1218 "Multiple Objective-C method records found");
1220 uint32_t tableOffset;
1221 objc_method_block::ObjCMethodDataLayout::readRecord(Scratch, tableOffset);
1222 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1225 base + tableOffset, base +
sizeof(uint32_t), base));
1235 MaybeNext = Cursor.advance();
1237 return MaybeNext.takeError();
1239 Next = MaybeNext.get();
1242 return llvm::Error::success();
1248 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1249 "Failed to enter C++ method block");
1253 return MaybeNext.takeError();
1255 llvm::BitstreamEntry
Next = MaybeNext.get();
1256 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1257 if (
Next.Kind == llvm::BitstreamEntry::Error)
1258 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1259 "Malformed bitstream entry");
1261 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1264 if (Cursor.SkipBlock())
1265 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1266 "Failed to skip sub-block");
1268 MaybeNext = Cursor.advance();
1270 return MaybeNext.takeError();
1272 Next = MaybeNext.get();
1277 llvm::StringRef BlobData;
1279 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1281 return MaybeKind.takeError();
1283 unsigned Kind = MaybeKind.get();
1288 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1289 "Multiple C++ method records found");
1291 uint32_t tableOffset;
1292 cxx_method_block::CXXMethodDataLayout::readRecord(Scratch, tableOffset);
1293 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1296 base + tableOffset, base +
sizeof(uint32_t), base));
1306 MaybeNext = Cursor.advance();
1308 return MaybeNext.takeError();
1310 Next = MaybeNext.get();
1313 return llvm::Error::success();
1319 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1320 "Failed to enter field block");
1324 return MaybeNext.takeError();
1326 llvm::BitstreamEntry
Next = MaybeNext.get();
1327 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1328 if (
Next.Kind == llvm::BitstreamEntry::Error)
1329 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1330 "Malformed bitstream entry");
1332 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1335 if (Cursor.SkipBlock())
1336 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1337 "Failed to skip sub-block");
1339 MaybeNext = Cursor.advance();
1341 return MaybeNext.takeError();
1343 Next = MaybeNext.get();
1348 llvm::StringRef BlobData;
1350 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1352 return MaybeKind.takeError();
1354 unsigned Kind = MaybeKind.get();
1359 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1360 "Multiple field records found");
1362 uint32_t tableOffset;
1363 field_block::FieldDataLayout::readRecord(Scratch, tableOffset);
1364 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1366 FieldTable.reset(SerializedFieldTable::Create(
1367 base + tableOffset, base +
sizeof(uint32_t), base));
1377 MaybeNext = Cursor.advance();
1379 return MaybeNext.takeError();
1381 Next = MaybeNext.get();
1384 return llvm::Error::success();
1390 return llvm::createStringError(
1391 llvm::inconvertibleErrorCode(),
1392 "Failed to enter Objective-C selector block");
1396 return MaybeNext.takeError();
1398 llvm::BitstreamEntry
Next = MaybeNext.get();
1399 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1400 if (
Next.Kind == llvm::BitstreamEntry::Error)
1401 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1402 "Malformed bitstream entry");
1404 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1407 if (Cursor.SkipBlock())
1408 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1409 "Failed to skip sub-block");
1411 MaybeNext = Cursor.advance();
1413 return MaybeNext.takeError();
1415 Next = MaybeNext.get();
1420 llvm::StringRef BlobData;
1422 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1424 return MaybeKind.takeError();
1426 unsigned Kind = MaybeKind.get();
1431 return llvm::createStringError(
1432 llvm::inconvertibleErrorCode(),
1433 "Multiple Objective-C selector records found");
1435 uint32_t tableOffset;
1436 objc_selector_block::ObjCSelectorDataLayout::readRecord(Scratch,
1438 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1441 base + tableOffset, base +
sizeof(uint32_t), base));
1451 MaybeNext = Cursor.advance();
1453 return MaybeNext.takeError();
1455 Next = MaybeNext.get();
1458 return llvm::Error::success();
1464 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1465 "Failed to enter global variable block");
1469 return MaybeNext.takeError();
1471 llvm::BitstreamEntry
Next = MaybeNext.get();
1472 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1473 if (
Next.Kind == llvm::BitstreamEntry::Error)
1474 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1475 "Malformed bitstream entry");
1477 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1480 if (Cursor.SkipBlock())
1481 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1482 "Failed to skip sub-block");
1484 MaybeNext = Cursor.advance();
1486 return MaybeNext.takeError();
1488 Next = MaybeNext.get();
1493 llvm::StringRef BlobData;
1495 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1497 return MaybeKind.takeError();
1499 unsigned Kind = MaybeKind.get();
1504 return llvm::createStringError(
1505 llvm::inconvertibleErrorCode(),
1506 "Multiple global variable records found");
1508 uint32_t tableOffset;
1509 global_variable_block::GlobalVariableDataLayout::readRecord(Scratch,
1511 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1514 base + tableOffset, base +
sizeof(uint32_t), base));
1524 MaybeNext = Cursor.advance();
1526 return MaybeNext.takeError();
1528 Next = MaybeNext.get();
1531 return llvm::Error::success();
1537 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1538 "Failed to enter global function block");
1542 return MaybeNext.takeError();
1544 llvm::BitstreamEntry
Next = MaybeNext.get();
1545 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1546 if (
Next.Kind == llvm::BitstreamEntry::Error)
1547 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1548 "Malformed bitstream entry");
1550 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1553 if (Cursor.SkipBlock())
1554 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1555 "Failed to skip sub-block");
1557 MaybeNext = Cursor.advance();
1559 return MaybeNext.takeError();
1561 Next = MaybeNext.get();
1566 llvm::StringRef BlobData;
1568 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1570 return MaybeKind.takeError();
1572 unsigned Kind = MaybeKind.get();
1577 return llvm::createStringError(
1578 llvm::inconvertibleErrorCode(),
1579 "Multiple global function records found");
1581 uint32_t tableOffset;
1582 global_function_block::GlobalFunctionDataLayout::readRecord(Scratch,
1584 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1587 base + tableOffset, base +
sizeof(uint32_t), base));
1597 MaybeNext = Cursor.advance();
1599 return MaybeNext.takeError();
1601 Next = MaybeNext.get();
1604 return llvm::Error::success();
1610 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1611 "Failed to enter enum constant block");
1615 return MaybeNext.takeError();
1617 llvm::BitstreamEntry
Next = MaybeNext.get();
1618 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1619 if (
Next.Kind == llvm::BitstreamEntry::Error)
1620 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1621 "Malformed bitstream entry");
1623 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1626 if (Cursor.SkipBlock())
1627 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1628 "Failed to skip sub-block");
1630 MaybeNext = Cursor.advance();
1632 return MaybeNext.takeError();
1634 Next = MaybeNext.get();
1639 llvm::StringRef BlobData;
1641 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1643 return MaybeKind.takeError();
1645 unsigned Kind = MaybeKind.get();
1650 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1651 "Multiple enum constant records found");
1653 uint32_t tableOffset;
1654 enum_constant_block::EnumConstantDataLayout::readRecord(Scratch,
1656 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1659 base + tableOffset, base +
sizeof(uint32_t), base));
1669 MaybeNext = Cursor.advance();
1671 return MaybeNext.takeError();
1673 Next = MaybeNext.get();
1676 return llvm::Error::success();
1682 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1683 "Failed to enter tag block");
1687 return MaybeNext.takeError();
1689 llvm::BitstreamEntry
Next = MaybeNext.get();
1690 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1691 if (
Next.Kind == llvm::BitstreamEntry::Error)
1692 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1693 "Malformed bitstream entry");
1695 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1698 if (Cursor.SkipBlock())
1699 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1700 "Failed to skip sub-block");
1702 MaybeNext = Cursor.advance();
1704 return MaybeNext.takeError();
1706 Next = MaybeNext.get();
1711 llvm::StringRef BlobData;
1713 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1715 return MaybeKind.takeError();
1717 unsigned Kind = MaybeKind.get();
1722 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1723 "Multiple tag records found");
1725 uint32_t tableOffset;
1726 tag_block::TagDataLayout::readRecord(Scratch, tableOffset);
1727 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1729 TagTable.reset(SerializedTagTable::Create(base + tableOffset,
1730 base +
sizeof(uint32_t), base));
1740 MaybeNext = Cursor.advance();
1742 return MaybeNext.takeError();
1744 Next = MaybeNext.get();
1747 return llvm::Error::success();
1753 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1754 "Failed to enter typedef block");
1758 return MaybeNext.takeError();
1760 llvm::BitstreamEntry
Next = MaybeNext.get();
1761 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1762 if (
Next.Kind == llvm::BitstreamEntry::Error)
1763 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1764 "Malformed bitstream entry");
1766 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1769 if (Cursor.SkipBlock())
1770 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1771 "Failed to skip sub-block");
1773 MaybeNext = Cursor.advance();
1775 return MaybeNext.takeError();
1777 Next = MaybeNext.get();
1782 llvm::StringRef BlobData;
1784 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1786 return MaybeKind.takeError();
1788 unsigned Kind = MaybeKind.get();
1793 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1794 "Multiple typedef records found");
1796 uint32_t tableOffset;
1797 typedef_block::TypedefDataLayout::readRecord(Scratch, tableOffset);
1798 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1801 base + tableOffset, base +
sizeof(uint32_t), base));
1811 MaybeNext = Cursor.advance();
1813 return MaybeNext.takeError();
1815 Next = MaybeNext.get();
1818 return llvm::Error::success();
1821APINotesReader::APINotesReader(llvm::MemoryBuffer *InputBuffer,
1822 llvm::VersionTuple SwiftVersion,
1833 if (Cursor.AtEndOfStream()) {
1834 Err = llvm::createStringError(
1835 llvm::inconvertibleErrorCode(),
1836 "Unexpected end of stream while reading signature");
1842 Err = maybeRead.takeError();
1845 if (maybeRead.get() !=
byte) {
1846 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1847 "Invalid signature in API notes file");
1853 bool HasValidControlBlock =
false;
1854 llvm::SmallVector<uint64_t, 64> Scratch;
1855 while (!
Cursor.AtEndOfStream()) {
1856 llvm::Expected<llvm::BitstreamEntry> MaybeTopLevelEntry =
Cursor.advance();
1857 if (!MaybeTopLevelEntry) {
1858 Err = MaybeTopLevelEntry.takeError();
1861 llvm::BitstreamEntry TopLevelEntry = MaybeTopLevelEntry.get();
1863 if (TopLevelEntry.Kind != llvm::BitstreamEntry::SubBlock)
1866 switch (TopLevelEntry.ID) {
1867 case llvm::bitc::BLOCKINFO_BLOCK_ID:
1868 if (!
Cursor.ReadBlockInfoBlock()) {
1869 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1870 "Failed to read block info");
1877 if (HasValidControlBlock) {
1878 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1879 "Multiple control blocks found");
1882 if (llvm::Error BlockErr =
1883 Implementation->readControlBlock(Cursor, Scratch)) {
1884 Err = std::move(BlockErr);
1887 HasValidControlBlock =
true;
1891 if (!HasValidControlBlock) {
1892 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1893 "Missing control block");
1896 if (llvm::Error BlockErr =
1897 Implementation->readIdentifierBlock(Cursor, Scratch)) {
1898 Err = std::move(BlockErr);
1904 if (!HasValidControlBlock) {
1905 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1906 "Missing control block");
1909 if (llvm::Error BlockErr =
1910 Implementation->readContextBlock(Cursor, Scratch)) {
1911 Err = std::move(BlockErr);
1917 if (!HasValidControlBlock) {
1918 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1919 "Missing control block");
1922 if (llvm::Error BlockErr =
1923 Implementation->readObjCPropertyBlock(Cursor, Scratch)) {
1924 Err = std::move(BlockErr);
1930 if (!HasValidControlBlock) {
1931 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1932 "Missing control block");
1935 if (llvm::Error BlockErr =
1936 Implementation->readObjCMethodBlock(Cursor, Scratch)) {
1937 Err = std::move(BlockErr);
1943 if (!HasValidControlBlock) {
1944 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1945 "Missing control block");
1948 if (llvm::Error BlockErr =
1949 Implementation->readCXXMethodBlock(Cursor, Scratch)) {
1950 Err = std::move(BlockErr);
1956 if (!HasValidControlBlock) {
1957 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1958 "Missing control block");
1961 if (llvm::Error BlockErr =
1962 Implementation->readFieldBlock(Cursor, Scratch)) {
1963 Err = std::move(BlockErr);
1969 if (!HasValidControlBlock) {
1970 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1971 "Missing control block");
1974 if (llvm::Error BlockErr =
1975 Implementation->readObjCSelectorBlock(Cursor, Scratch)) {
1976 Err = std::move(BlockErr);
1982 if (!HasValidControlBlock) {
1983 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1984 "Missing control block");
1987 if (llvm::Error BlockErr =
1988 Implementation->readGlobalVariableBlock(Cursor, Scratch)) {
1989 Err = std::move(BlockErr);
1995 if (!HasValidControlBlock) {
1996 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1997 "Missing control block");
2000 if (llvm::Error BlockErr =
2001 Implementation->readGlobalFunctionBlock(Cursor, Scratch)) {
2002 Err = std::move(BlockErr);
2008 if (!HasValidControlBlock) {
2009 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
2010 "Missing control block");
2013 if (llvm::Error BlockErr =
2014 Implementation->readEnumConstantBlock(Cursor, Scratch)) {
2015 Err = std::move(BlockErr);
2021 if (!HasValidControlBlock) {
2022 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
2023 "Missing control block");
2026 if (llvm::Error BlockErr =
2027 Implementation->readTagBlock(Cursor, Scratch)) {
2028 Err = std::move(BlockErr);
2034 if (!HasValidControlBlock) {
2035 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
2036 "Missing control block");
2039 if (llvm::Error BlockErr =
2040 Implementation->readTypedefBlock(Cursor, Scratch)) {
2041 Err = std::move(BlockErr);
2049 if (
Cursor.SkipBlock()) {
2050 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
2051 "Failed to skip unknown top-level block");
2058 if (!
Cursor.AtEndOfStream()) {
2059 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
2060 "Bitstream has unread data after all blocks");
2069 llvm::VersionTuple SwiftVersion) {
2070 llvm::Error Err = llvm::Error::success();
2071 std::unique_ptr<APINotesReader> Reader(
2072 new APINotesReader(InputBuffer.release(), SwiftVersion, Err));
2077 return std::move(Reader);
2080template <
typename T>
2082 llvm::VersionTuple Version,
2084 : Results(
std::move(R)) {
2086 assert(!Results.empty());
2087 assert(llvm::is_sorted(
2089 [](
const std::pair<llvm::VersionTuple, T> &left,
2090 const std::pair<llvm::VersionTuple, T> &right) ->
bool {
2095 assert((&left == &right || left.first != right.first) &&
2096 "two entries for the same version");
2097 return left.first < right.first;
2100 Selected = std::nullopt;
2101 for (
unsigned i = 0, n = Results.size(); i != n; ++i) {
2102 if (!Version.empty() && Results[i].first >= Version) {
2114 if (!Selected && Results[0].first.empty())
2119 -> std::optional<ContextID> {
2121 return std::nullopt;
2125 return std::nullopt;
2132 return std::nullopt;
2140 return std::nullopt;
2144 return std::nullopt;
2148 return std::nullopt;
2154 -> std::optional<ContextID> {
2156 return std::nullopt;
2160 return std::nullopt;
2167 return std::nullopt;
2175 return std::nullopt;
2179 return std::nullopt;
2183 return std::nullopt;
2192 return std::nullopt;
2196 return std::nullopt;
2199 std::make_tuple(CtxID.Value, *PropertyID, (
char)IsInstance));
2201 return std::nullopt;
2207 bool IsInstanceMethod)
2210 return std::nullopt;
2214 return std::nullopt;
2217 ObjCMethodTableInfo::internal_key_type{CtxID.Value, *SelID,
2220 return std::nullopt;
2228 return std::nullopt;
2232 return std::nullopt;
2237 return std::nullopt;
2245 return std::nullopt;
2249 return std::nullopt;
2254 return std::nullopt;
2260 std::optional<Context> Ctx)
2263 return std::nullopt;
2267 return std::nullopt;
2273 return std::nullopt;
2279 std::optional<Context> Ctx)
2282 return std::nullopt;
2286 return std::nullopt;
2292 return std::nullopt;
2300 return std::nullopt;
2304 return std::nullopt;
2308 return std::nullopt;
2314 std::optional<Context> ParentCtx)
2315 -> std::optional<ContextID> {
2317 return std::nullopt;
2321 return std::nullopt;
2326 return std::nullopt;
2334 return std::nullopt;
2338 return std::nullopt;
2344 return std::nullopt;
2350 std::optional<Context> Ctx)
2353 return std::nullopt;
2357 return std::nullopt;
2363 return std::nullopt;
2369 llvm::StringRef Name, std::optional<ContextID> ParentNamespaceID)
2370 -> std::optional<ContextID> {
2372 return std::nullopt;
2376 return std::nullopt;
2378 uint32_t RawParentNamespaceID =
2379 ParentNamespaceID ? ParentNamespaceID->Value : -1;
2383 return std::nullopt;
static StringRef getIdentifier(const Token &Tok)
__SIZE_TYPE__ size_t
The unsigned integer type of the result of the sizeof operator.
Smart pointer class that efficiently represents Objective-C method names.
llvm::OnDiskIterableChainedHashTable< FieldTableInfo > SerializedFieldTable
std::unique_ptr< SerializedContextIDTable > ContextIDTable
The Objective-C / C++ context ID table.
std::string ModuleName
The name of the module that we read from the control block.
std::optional< std::pair< off_t, time_t > > SourceFileSizeAndModTime
llvm::Error readTypedefBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
std::unique_ptr< SerializedIdentifierTable > IdentifierTable
The identifier table.
llvm::Error readControlBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
llvm::Error readContextBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
llvm::OnDiskIterableChainedHashTable< TagTableInfo > SerializedTagTable
llvm::OnDiskIterableChainedHashTable< GlobalFunctionTableInfo > SerializedGlobalFunctionTable
std::unique_ptr< SerializedGlobalFunctionTable > GlobalFunctionTable
The global function table.
std::unique_ptr< SerializedObjCPropertyTable > ObjCPropertyTable
The Objective-C property table.
llvm::OnDiskIterableChainedHashTable< EnumConstantTableInfo > SerializedEnumConstantTable
llvm::Error readObjCPropertyBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
std::unique_ptr< SerializedGlobalVariableTable > GlobalVariableTable
The global variable table.
llvm::Error readObjCMethodBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
std::unique_ptr< SerializedTypedefTable > TypedefTable
The typedef table.
llvm::Error readIdentifierBlock(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.
llvm::OnDiskIterableChainedHashTable< ObjCMethodTableInfo > SerializedObjCMethodTable
llvm::Error readTagBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
llvm::OnDiskIterableChainedHashTable< CXXMethodTableInfo > SerializedCXXMethodTable
llvm::Error readEnumConstantBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
llvm::OnDiskIterableChainedHashTable< ContextInfoTableInfo > SerializedContextInfoTable
std::unique_ptr< SerializedCXXMethodTable > CXXMethodTable
The C++ method table.
llvm::OnDiskIterableChainedHashTable< ObjCSelectorTableInfo > SerializedObjCSelectorTable
llvm::OnDiskIterableChainedHashTable< IdentifierTableInfo > SerializedIdentifierTable
llvm::Error readObjCSelectorBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
llvm::Error readGlobalVariableBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
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.
llvm::Error readFieldBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
std::unique_ptr< SerializedTagTable > TagTable
The tag table.
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< TypedefTableInfo > SerializedTypedefTable
llvm::OnDiskIterableChainedHashTable< GlobalVariableTableInfo > SerializedGlobalVariableTable
llvm::VersionTuple SwiftVersion
The Swift version to use for filtering.
llvm::OnDiskIterableChainedHashTable< ContextIDTableInfo > SerializedContextIDTable
std::unique_ptr< SerializedObjCMethodTable > ObjCMethodTable
The Objective-C method table.
std::unique_ptr< SerializedContextInfoTable > ContextInfoTable
The Objective-C context info table.
llvm::Error readGlobalFunctionBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
llvm::OnDiskIterableChainedHashTable< ObjCPropertyTableInfo > SerializedObjCPropertyTable
llvm::Error readCXXMethodBlock(llvm::BitstreamCursor &Cursor, llvm::SmallVectorImpl< uint64_t > &Scratch)
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.
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 llvm::Expected< std::unique_ptr< APINotesReader > > Create(std::unique_ptr< llvm::MemoryBuffer > InputBuffer, llvm::VersionTuple SwiftVersion)
Create a new API notes reader from the given memory 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.
Describes API notes data for any entity.
Describes API notes for types.
Opaque context ID used to refer to an Objective-C class or protocol or a C++ namespace.
API notes for a function or method.
Describes a function or method parameter.
API notes for a variable/property.
RetainCountConventionKind
llvm::PointerEmbeddedInt< unsigned, 31 > IdentifierID
llvm::PointerEmbeddedInt< unsigned, 31 > SelectorID
const uint8_t kSwiftConforms
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::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