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 uint8_t Payload = endian::readNext<uint8_t, llvm::endianness::little>(
Data);
337 if (Payload & 0x01) {
338 uint8_t
Level = (Payload >> 1) & 0x7;
339 Info.setLevelAudited(
Level);
343 if (Payload & 0x01) {
344 uint8_t
Kind = (Payload >> 1) & 0x7;
350 uint16_t ExternalBoundsLen =
351 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
352 Info.ExternalBounds = std::string(
Data,
Data + ExternalBoundsLen);
353 Data += ExternalBoundsLen;
358 ReadVariableInfo(
Data, Info);
360 uint8_t Payload = endian::readNext<uint8_t, llvm::endianness::little>(
Data);
361 if (
auto RawConvention = Payload & 0x7) {
363 Info.setRetainCountConvention(Convention);
367 Info.setLifetimebound(Payload & 0x02);
370 Info.setNoEscape(Payload & 0x02);
373 ReadBoundsSafetyInfo(
Data, Info.BoundsSafety.emplace());
378 ReadCommonEntityInfo(
Data, Info);
380 uint8_t Payload = endian::readNext<uint8_t, llvm::endianness::little>(
Data);
381 if (
auto RawConvention = Payload & 0x7) {
383 Info.setRetainCountConvention(Convention);
386 Info.NullabilityAudited = Payload & 0x1;
388 assert(Payload == 0 &&
"Bad API notes");
390 Info.NumAdjustedNullable =
391 endian::readNext<uint8_t, llvm::endianness::little>(
Data);
392 Info.NullabilityPayload =
393 endian::readNext<uint64_t, llvm::endianness::little>(
Data);
396 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
397 while (NumParams > 0) {
399 ReadParamInfo(
Data, pi);
400 Info.Params.push_back(pi);
404 unsigned ResultTypeLen =
405 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
406 Info.ResultType = std::string(
Data,
Data + ResultTypeLen);
407 Data += ResultTypeLen;
409 unsigned SwiftReturnOwnershipLength =
410 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
411 Info.SwiftReturnOwnership = std::string(
reinterpret_cast<const char *
>(
Data),
412 reinterpret_cast<const char *
>(
Data) +
413 SwiftReturnOwnershipLength);
414 Data += SwiftReturnOwnershipLength;
418class ObjCMethodTableInfo
419 :
public VersionedTableInfo<ObjCMethodTableInfo,
420 std::tuple<uint32_t, uint32_t, uint8_t>,
423 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
424 auto ClassID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
426 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
427 auto IsInstance = endian::readNext<uint8_t, llvm::endianness::little>(
Data);
431 hash_value_type
ComputeHash(internal_key_type Key) {
435 static ObjCMethodInfo readUnversioned(internal_key_type Key,
436 const uint8_t *&
Data) {
438 uint8_t Payload = *
Data++;
439 bool HasSelf = Payload & 0x01;
441 Info.RequiredInit = Payload & 0x01;
443 Info.DesignatedInit = Payload & 0x01;
445 assert(Payload == 0 &&
"Unable to fully decode 'Payload'.");
447 ReadFunctionInfo(
Data, Info);
449 Info.Self = ParamInfo{};
450 ReadParamInfo(
Data, *Info.Self);
457class ObjCSelectorTableInfo {
459 using internal_key_type = StoredObjCSelector;
460 using external_key_type = internal_key_type;
462 using hash_value_type = unsigned;
463 using offset_type = unsigned;
465 internal_key_type GetInternalKey(external_key_type Key) {
return Key; }
467 external_key_type GetExternalKey(internal_key_type Key) {
return Key; }
469 hash_value_type
ComputeHash(internal_key_type Key) {
470 return llvm::DenseMapInfo<StoredObjCSelector>::getHashValue(Key);
473 static bool EqualKey(internal_key_type LHS, internal_key_type RHS) {
474 return llvm::DenseMapInfo<StoredObjCSelector>::isEqual(LHS, RHS);
477 static std::pair<unsigned, unsigned> ReadKeyDataLength(
const uint8_t *&
Data) {
479 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
480 unsigned DataLength =
481 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
482 return {KeyLength, DataLength};
485 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
486 internal_key_type Key;
487 Key.NumArgs = endian::readNext<uint16_t, llvm::endianness::little>(
Data);
488 unsigned NumIdents = (Length -
sizeof(uint16_t)) /
sizeof(uint32_t);
489 for (
unsigned i = 0; i != NumIdents; ++i) {
490 Key.Identifiers.push_back(
491 endian::readNext<uint32_t, llvm::endianness::little>(
Data));
496 static data_type ReadData(internal_key_type Key,
const uint8_t *
Data,
498 return endian::readNext<uint32_t, llvm::endianness::little>(
Data);
503class GlobalVariableTableInfo
504 :
public VersionedTableInfo<GlobalVariableTableInfo, SingleDeclTableKey,
505 GlobalVariableInfo> {
507 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
508 auto CtxID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
509 auto NameID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
510 return {CtxID, NameID};
513 hash_value_type
ComputeHash(internal_key_type Key) {
514 return static_cast<size_t>(Key.hashValue());
517 static GlobalVariableInfo readUnversioned(internal_key_type Key,
518 const uint8_t *&
Data) {
519 GlobalVariableInfo Info;
520 ReadVariableInfo(
Data, Info);
526class GlobalFunctionTableInfo
527 :
public VersionedTableInfo<GlobalFunctionTableInfo, SingleDeclTableKey,
528 GlobalFunctionInfo> {
530 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
531 auto CtxID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
532 auto NameID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
533 return {CtxID, NameID};
536 hash_value_type
ComputeHash(internal_key_type Key) {
537 return static_cast<size_t>(Key.hashValue());
540 static GlobalFunctionInfo readUnversioned(internal_key_type Key,
541 const uint8_t *&
Data) {
542 GlobalFunctionInfo Info;
543 ReadFunctionInfo(
Data, Info);
549class CXXMethodTableInfo
550 :
public VersionedTableInfo<CXXMethodTableInfo, SingleDeclTableKey,
553 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
554 auto CtxID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
555 auto NameID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
556 return {CtxID, NameID};
559 hash_value_type
ComputeHash(internal_key_type Key) {
560 return static_cast<size_t>(Key.hashValue());
563 static CXXMethodInfo readUnversioned(internal_key_type Key,
564 const uint8_t *&
Data) {
567 uint8_t Payload = *
Data++;
568 bool HasThis = Payload & 0x01;
570 assert(Payload == 0 &&
"Unable to fully decode 'Payload'.");
572 ReadFunctionInfo(
Data, Info);
574 Info.This = ParamInfo{};
575 ReadParamInfo(
Data, *Info.This);
582class EnumConstantTableInfo
583 :
public VersionedTableInfo<EnumConstantTableInfo, uint32_t,
586 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
587 auto NameID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
591 hash_value_type
ComputeHash(internal_key_type Key) {
595 static EnumConstantInfo readUnversioned(internal_key_type Key,
596 const uint8_t *&
Data) {
597 EnumConstantInfo Info;
598 ReadCommonEntityInfo(
Data, Info);
605 :
public VersionedTableInfo<TagTableInfo, SingleDeclTableKey, TagInfo> {
607 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
608 auto CtxID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
610 endian::readNext<IdentifierID, llvm::endianness::little>(
Data);
611 return {CtxID, NameID};
614 hash_value_type
ComputeHash(internal_key_type Key) {
615 return static_cast<size_t>(Key.hashValue());
618 static TagInfo readUnversioned(internal_key_type Key,
const uint8_t *&
Data) {
621 uint8_t Payload = *
Data++;
623 Info.setFlagEnum(Payload & 2);
626 Info.EnumExtensibility =
630 endian::readNext<uint8_t, llvm::endianness::little>(
Data);
634 endian::readNext<uint8_t, llvm::endianness::little>(
Data);
636 Info.setSwiftEscapable(std::optional(Escapable ==
kSwiftConforms));
638 unsigned ImportAsLength =
639 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
640 if (ImportAsLength > 0) {
642 std::string(
reinterpret_cast<const char *
>(
Data), ImportAsLength - 1);
643 Data += ImportAsLength - 1;
645 unsigned RetainOpLength =
646 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
647 if (RetainOpLength > 0) {
649 std::string(
reinterpret_cast<const char *
>(
Data), RetainOpLength - 1);
650 Data += RetainOpLength - 1;
652 unsigned ReleaseOpLength =
653 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
654 if (ReleaseOpLength > 0) {
655 Info.SwiftReleaseOp = std::string(
reinterpret_cast<const char *
>(
Data),
656 ReleaseOpLength - 1);
657 Data += ReleaseOpLength - 1;
659 unsigned DefaultOwnershipLength =
660 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
661 if (DefaultOwnershipLength > 0) {
662 Info.SwiftDefaultOwnership = std::string(
663 reinterpret_cast<const char *
>(
Data), DefaultOwnershipLength - 1);
664 Data += DefaultOwnershipLength - 1;
666 unsigned DestroyOpLength =
667 endian::readNext<uint16_t, llvm::endianness::little>(
Data);
668 if (DestroyOpLength > 0) {
669 Info.SwiftDestroyOp = std::string(
reinterpret_cast<const char *
>(
Data),
670 DestroyOpLength - 1);
671 Data += DestroyOpLength - 1;
674 ReadCommonTypeInfo(
Data, Info);
680class TypedefTableInfo
681 :
public VersionedTableInfo<TypedefTableInfo, SingleDeclTableKey,
684 static internal_key_type ReadKey(
const uint8_t *
Data,
unsigned Length) {
685 auto CtxID = endian::readNext<uint32_t, llvm::endianness::little>(
Data);
687 endian::readNext<IdentifierID, llvm::endianness::little>(
Data);
688 return {CtxID, nameID};
691 hash_value_type
ComputeHash(internal_key_type Key) {
692 return static_cast<size_t>(Key.hashValue());
695 static TypedefInfo readUnversioned(internal_key_type Key,
696 const uint8_t *&
Data) {
699 uint8_t Payload = *
Data++;
703 ReadCommonTypeInfo(
Data, Info);
725 llvm::OnDiskIterableChainedHashTable<IdentifierTableInfo>;
731 llvm::OnDiskIterableChainedHashTable<ContextIDTableInfo>;
737 llvm::OnDiskIterableChainedHashTable<ContextInfoTableInfo>;
743 llvm::OnDiskIterableChainedHashTable<ObjCPropertyTableInfo>;
749 llvm::OnDiskIterableChainedHashTable<FieldTableInfo>;
755 llvm::OnDiskIterableChainedHashTable<ObjCMethodTableInfo>;
761 llvm::OnDiskIterableChainedHashTable<CXXMethodTableInfo>;
767 llvm::OnDiskIterableChainedHashTable<ObjCSelectorTableInfo>;
773 llvm::OnDiskIterableChainedHashTable<GlobalVariableTableInfo>;
779 llvm::OnDiskIterableChainedHashTable<GlobalFunctionTableInfo>;
785 llvm::OnDiskIterableChainedHashTable<EnumConstantTableInfo>;
796 llvm::OnDiskIterableChainedHashTable<TypedefTableInfo>;
803 std::optional<IdentifierID>
getIdentifier(llvm::StringRef Str);
837std::optional<IdentifierID>
852std::optional<SelectorID>
860 for (
auto Ident :
Selector.Identifiers) {
878 return llvm::createStringError(llvm::inconvertibleErrorCode(),
879 "Failed to enter control block");
881 bool SawMetadata =
false;
885 return MaybeNext.takeError();
887 llvm::BitstreamEntry
Next = MaybeNext.get();
889 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
890 if (
Next.Kind == llvm::BitstreamEntry::Error)
891 return llvm::createStringError(llvm::inconvertibleErrorCode(),
892 "Malformed bitstream entry");
894 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
897 if (Cursor.SkipBlock())
898 return llvm::createStringError(llvm::inconvertibleErrorCode(),
899 "Failed to skip sub-block");
901 MaybeNext = Cursor.advance();
903 return MaybeNext.takeError();
905 Next = MaybeNext.get();
910 llvm::StringRef BlobData;
912 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
914 return MaybeKind.takeError();
916 unsigned Kind = MaybeKind.get();
922 return llvm::createStringError(llvm::inconvertibleErrorCode(),
923 "Multiple metadata records found");
926 return llvm::createStringError(llvm::inconvertibleErrorCode(),
927 "Version mismatch in API Notes");
949 MaybeNext = Cursor.advance();
951 return MaybeNext.takeError();
953 Next = MaybeNext.get();
957 return llvm::createStringError(llvm::inconvertibleErrorCode(),
958 "Missing metadata record");
960 return llvm::Error::success();
966 return llvm::createStringError(llvm::inconvertibleErrorCode(),
967 "Failed to enter identifier block");
971 return MaybeNext.takeError();
973 llvm::BitstreamEntry
Next = MaybeNext.get();
975 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
976 if (
Next.Kind == llvm::BitstreamEntry::Error)
977 return llvm::createStringError(llvm::inconvertibleErrorCode(),
978 "Malformed bitstream entry");
980 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
983 if (Cursor.SkipBlock())
984 return llvm::createStringError(llvm::inconvertibleErrorCode(),
985 "Failed to skip sub-block");
987 MaybeNext = Cursor.advance();
989 return MaybeNext.takeError();
991 Next = MaybeNext.get();
996 llvm::StringRef BlobData;
998 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1000 return MaybeKind.takeError();
1002 unsigned Kind = MaybeKind.get();
1007 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1008 "Multiple identifier records found");
1010 uint32_t tableOffset;
1011 identifier_block::IdentifierDataLayout::readRecord(Scratch, tableOffset);
1012 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1015 base + tableOffset, base +
sizeof(uint32_t), base));
1025 MaybeNext = Cursor.advance();
1027 return MaybeNext.takeError();
1029 Next = MaybeNext.get();
1032 return llvm::Error::success();
1038 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1039 "Failed to enter Objective-C context block");
1043 return MaybeNext.takeError();
1045 llvm::BitstreamEntry
Next = MaybeNext.get();
1047 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1048 if (
Next.Kind == llvm::BitstreamEntry::Error)
1049 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1050 "Malformed bitstream entry");
1052 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1055 if (Cursor.SkipBlock())
1056 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1057 "Failed to skip sub-block");
1059 MaybeNext = Cursor.advance();
1061 return MaybeNext.takeError();
1063 Next = MaybeNext.get();
1068 llvm::StringRef BlobData;
1070 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1072 return MaybeKind.takeError();
1074 unsigned Kind = MaybeKind.get();
1079 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1080 "Multiple context ID records found");
1082 uint32_t tableOffset;
1083 context_block::ContextIDLayout::readRecord(Scratch, tableOffset);
1084 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1087 base + tableOffset, base +
sizeof(uint32_t), base));
1094 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1095 "Multiple context info records found");
1097 uint32_t tableOffset;
1098 context_block::ContextInfoLayout::readRecord(Scratch, tableOffset);
1099 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1102 base + tableOffset, base +
sizeof(uint32_t), base));
1112 MaybeNext = Cursor.advance();
1114 return MaybeNext.takeError();
1116 Next = MaybeNext.get();
1119 return llvm::Error::success();
1125 return llvm::createStringError(
1126 llvm::inconvertibleErrorCode(),
1127 "Failed to enter Objective-C property block");
1131 return MaybeNext.takeError();
1133 llvm::BitstreamEntry
Next = MaybeNext.get();
1135 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1136 if (
Next.Kind == llvm::BitstreamEntry::Error)
1137 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1138 "Malformed bitstream entry");
1140 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1143 if (Cursor.SkipBlock())
1144 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1145 "Failed to skip sub-block");
1147 MaybeNext = Cursor.advance();
1149 return MaybeNext.takeError();
1151 Next = MaybeNext.get();
1156 llvm::StringRef BlobData;
1158 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1160 return MaybeKind.takeError();
1162 unsigned Kind = MaybeKind.get();
1167 return llvm::createStringError(
1168 llvm::inconvertibleErrorCode(),
1169 "Multiple Objective-C property records found");
1171 uint32_t tableOffset;
1172 objc_property_block::ObjCPropertyDataLayout::readRecord(Scratch,
1174 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1177 base + tableOffset, base +
sizeof(uint32_t), base));
1187 MaybeNext = Cursor.advance();
1189 return MaybeNext.takeError();
1191 Next = MaybeNext.get();
1194 return llvm::Error::success();
1200 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1201 "Failed to enter Objective-C method block");
1205 return MaybeNext.takeError();
1207 llvm::BitstreamEntry
Next = MaybeNext.get();
1208 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1209 if (
Next.Kind == llvm::BitstreamEntry::Error)
1210 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1211 "Malformed bitstream entry");
1213 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1216 if (Cursor.SkipBlock())
1217 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1218 "Failed to skip sub-block");
1220 MaybeNext = Cursor.advance();
1222 return MaybeNext.takeError();
1224 Next = MaybeNext.get();
1229 llvm::StringRef BlobData;
1231 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1233 return MaybeKind.takeError();
1235 unsigned Kind = MaybeKind.get();
1240 return llvm::createStringError(
1241 llvm::inconvertibleErrorCode(),
1242 "Multiple Objective-C method records found");
1244 uint32_t tableOffset;
1245 objc_method_block::ObjCMethodDataLayout::readRecord(Scratch, tableOffset);
1246 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1249 base + tableOffset, base +
sizeof(uint32_t), base));
1259 MaybeNext = Cursor.advance();
1261 return MaybeNext.takeError();
1263 Next = MaybeNext.get();
1266 return llvm::Error::success();
1272 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1273 "Failed to enter C++ method block");
1277 return MaybeNext.takeError();
1279 llvm::BitstreamEntry
Next = MaybeNext.get();
1280 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1281 if (
Next.Kind == llvm::BitstreamEntry::Error)
1282 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1283 "Malformed bitstream entry");
1285 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1288 if (Cursor.SkipBlock())
1289 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1290 "Failed to skip sub-block");
1292 MaybeNext = Cursor.advance();
1294 return MaybeNext.takeError();
1296 Next = MaybeNext.get();
1301 llvm::StringRef BlobData;
1303 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1305 return MaybeKind.takeError();
1307 unsigned Kind = MaybeKind.get();
1312 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1313 "Multiple C++ method records found");
1315 uint32_t tableOffset;
1316 cxx_method_block::CXXMethodDataLayout::readRecord(Scratch, tableOffset);
1317 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1320 base + tableOffset, base +
sizeof(uint32_t), base));
1330 MaybeNext = Cursor.advance();
1332 return MaybeNext.takeError();
1334 Next = MaybeNext.get();
1337 return llvm::Error::success();
1343 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1344 "Failed to enter field block");
1348 return MaybeNext.takeError();
1350 llvm::BitstreamEntry
Next = MaybeNext.get();
1351 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1352 if (
Next.Kind == llvm::BitstreamEntry::Error)
1353 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1354 "Malformed bitstream entry");
1356 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1359 if (Cursor.SkipBlock())
1360 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1361 "Failed to skip sub-block");
1363 MaybeNext = Cursor.advance();
1365 return MaybeNext.takeError();
1367 Next = MaybeNext.get();
1372 llvm::StringRef BlobData;
1374 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1376 return MaybeKind.takeError();
1378 unsigned Kind = MaybeKind.get();
1383 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1384 "Multiple field records found");
1386 uint32_t tableOffset;
1387 field_block::FieldDataLayout::readRecord(Scratch, tableOffset);
1388 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1390 FieldTable.reset(SerializedFieldTable::Create(
1391 base + tableOffset, base +
sizeof(uint32_t), base));
1401 MaybeNext = Cursor.advance();
1403 return MaybeNext.takeError();
1405 Next = MaybeNext.get();
1408 return llvm::Error::success();
1414 return llvm::createStringError(
1415 llvm::inconvertibleErrorCode(),
1416 "Failed to enter Objective-C selector block");
1420 return MaybeNext.takeError();
1422 llvm::BitstreamEntry
Next = MaybeNext.get();
1423 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1424 if (
Next.Kind == llvm::BitstreamEntry::Error)
1425 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1426 "Malformed bitstream entry");
1428 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1431 if (Cursor.SkipBlock())
1432 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1433 "Failed to skip sub-block");
1435 MaybeNext = Cursor.advance();
1437 return MaybeNext.takeError();
1439 Next = MaybeNext.get();
1444 llvm::StringRef BlobData;
1446 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1448 return MaybeKind.takeError();
1450 unsigned Kind = MaybeKind.get();
1455 return llvm::createStringError(
1456 llvm::inconvertibleErrorCode(),
1457 "Multiple Objective-C selector records found");
1459 uint32_t tableOffset;
1460 objc_selector_block::ObjCSelectorDataLayout::readRecord(Scratch,
1462 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1465 base + tableOffset, base +
sizeof(uint32_t), base));
1475 MaybeNext = Cursor.advance();
1477 return MaybeNext.takeError();
1479 Next = MaybeNext.get();
1482 return llvm::Error::success();
1488 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1489 "Failed to enter global variable block");
1493 return MaybeNext.takeError();
1495 llvm::BitstreamEntry
Next = MaybeNext.get();
1496 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1497 if (
Next.Kind == llvm::BitstreamEntry::Error)
1498 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1499 "Malformed bitstream entry");
1501 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1504 if (Cursor.SkipBlock())
1505 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1506 "Failed to skip sub-block");
1508 MaybeNext = Cursor.advance();
1510 return MaybeNext.takeError();
1512 Next = MaybeNext.get();
1517 llvm::StringRef BlobData;
1519 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1521 return MaybeKind.takeError();
1523 unsigned Kind = MaybeKind.get();
1528 return llvm::createStringError(
1529 llvm::inconvertibleErrorCode(),
1530 "Multiple global variable records found");
1532 uint32_t tableOffset;
1533 global_variable_block::GlobalVariableDataLayout::readRecord(Scratch,
1535 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1538 base + tableOffset, base +
sizeof(uint32_t), base));
1548 MaybeNext = Cursor.advance();
1550 return MaybeNext.takeError();
1552 Next = MaybeNext.get();
1555 return llvm::Error::success();
1561 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1562 "Failed to enter global function block");
1566 return MaybeNext.takeError();
1568 llvm::BitstreamEntry
Next = MaybeNext.get();
1569 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1570 if (
Next.Kind == llvm::BitstreamEntry::Error)
1571 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1572 "Malformed bitstream entry");
1574 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1577 if (Cursor.SkipBlock())
1578 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1579 "Failed to skip sub-block");
1581 MaybeNext = Cursor.advance();
1583 return MaybeNext.takeError();
1585 Next = MaybeNext.get();
1590 llvm::StringRef BlobData;
1592 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1594 return MaybeKind.takeError();
1596 unsigned Kind = MaybeKind.get();
1601 return llvm::createStringError(
1602 llvm::inconvertibleErrorCode(),
1603 "Multiple global function records found");
1605 uint32_t tableOffset;
1606 global_function_block::GlobalFunctionDataLayout::readRecord(Scratch,
1608 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1611 base + tableOffset, base +
sizeof(uint32_t), base));
1621 MaybeNext = Cursor.advance();
1623 return MaybeNext.takeError();
1625 Next = MaybeNext.get();
1628 return llvm::Error::success();
1634 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1635 "Failed to enter enum constant block");
1639 return MaybeNext.takeError();
1641 llvm::BitstreamEntry
Next = MaybeNext.get();
1642 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1643 if (
Next.Kind == llvm::BitstreamEntry::Error)
1644 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1645 "Malformed bitstream entry");
1647 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1650 if (Cursor.SkipBlock())
1651 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1652 "Failed to skip sub-block");
1654 MaybeNext = Cursor.advance();
1656 return MaybeNext.takeError();
1658 Next = MaybeNext.get();
1663 llvm::StringRef BlobData;
1665 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1667 return MaybeKind.takeError();
1669 unsigned Kind = MaybeKind.get();
1674 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1675 "Multiple enum constant records found");
1677 uint32_t tableOffset;
1678 enum_constant_block::EnumConstantDataLayout::readRecord(Scratch,
1680 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1683 base + tableOffset, base +
sizeof(uint32_t), base));
1693 MaybeNext = Cursor.advance();
1695 return MaybeNext.takeError();
1697 Next = MaybeNext.get();
1700 return llvm::Error::success();
1706 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1707 "Failed to enter tag block");
1711 return MaybeNext.takeError();
1713 llvm::BitstreamEntry
Next = MaybeNext.get();
1714 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1715 if (
Next.Kind == llvm::BitstreamEntry::Error)
1716 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1717 "Malformed bitstream entry");
1719 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1722 if (Cursor.SkipBlock())
1723 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1724 "Failed to skip sub-block");
1726 MaybeNext = Cursor.advance();
1728 return MaybeNext.takeError();
1730 Next = MaybeNext.get();
1735 llvm::StringRef BlobData;
1737 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1739 return MaybeKind.takeError();
1741 unsigned Kind = MaybeKind.get();
1746 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1747 "Multiple tag records found");
1749 uint32_t tableOffset;
1750 tag_block::TagDataLayout::readRecord(Scratch, tableOffset);
1751 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1753 TagTable.reset(SerializedTagTable::Create(base + tableOffset,
1754 base +
sizeof(uint32_t), base));
1764 MaybeNext = Cursor.advance();
1766 return MaybeNext.takeError();
1768 Next = MaybeNext.get();
1771 return llvm::Error::success();
1777 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1778 "Failed to enter typedef block");
1782 return MaybeNext.takeError();
1784 llvm::BitstreamEntry
Next = MaybeNext.get();
1785 while (
Next.Kind != llvm::BitstreamEntry::EndBlock) {
1786 if (
Next.Kind == llvm::BitstreamEntry::Error)
1787 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1788 "Malformed bitstream entry");
1790 if (
Next.Kind == llvm::BitstreamEntry::SubBlock) {
1793 if (Cursor.SkipBlock())
1794 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1795 "Failed to skip sub-block");
1797 MaybeNext = Cursor.advance();
1799 return MaybeNext.takeError();
1801 Next = MaybeNext.get();
1806 llvm::StringRef BlobData;
1808 Cursor.readRecord(
Next.ID, Scratch, &BlobData);
1810 return MaybeKind.takeError();
1812 unsigned Kind = MaybeKind.get();
1817 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1818 "Multiple typedef records found");
1820 uint32_t tableOffset;
1821 typedef_block::TypedefDataLayout::readRecord(Scratch, tableOffset);
1822 auto base =
reinterpret_cast<const uint8_t *
>(BlobData.data());
1825 base + tableOffset, base +
sizeof(uint32_t), base));
1835 MaybeNext = Cursor.advance();
1837 return MaybeNext.takeError();
1839 Next = MaybeNext.get();
1842 return llvm::Error::success();
1845APINotesReader::APINotesReader(llvm::MemoryBuffer *InputBuffer,
1846 llvm::VersionTuple SwiftVersion,
1857 if (Cursor.AtEndOfStream()) {
1858 Err = llvm::createStringError(
1859 llvm::inconvertibleErrorCode(),
1860 "Unexpected end of stream while reading signature");
1866 Err = maybeRead.takeError();
1869 if (maybeRead.get() !=
byte) {
1870 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1871 "Invalid signature in API notes file");
1877 bool HasValidControlBlock =
false;
1878 llvm::SmallVector<uint64_t, 64> Scratch;
1879 while (!
Cursor.AtEndOfStream()) {
1880 llvm::Expected<llvm::BitstreamEntry> MaybeTopLevelEntry =
Cursor.advance();
1881 if (!MaybeTopLevelEntry) {
1882 Err = MaybeTopLevelEntry.takeError();
1885 llvm::BitstreamEntry TopLevelEntry = MaybeTopLevelEntry.get();
1887 if (TopLevelEntry.Kind != llvm::BitstreamEntry::SubBlock)
1890 switch (TopLevelEntry.ID) {
1891 case llvm::bitc::BLOCKINFO_BLOCK_ID:
1892 if (!
Cursor.ReadBlockInfoBlock()) {
1893 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1894 "Failed to read block info");
1901 if (HasValidControlBlock) {
1902 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1903 "Multiple control blocks found");
1906 if (llvm::Error BlockErr =
1907 Implementation->readControlBlock(Cursor, Scratch)) {
1908 Err = std::move(BlockErr);
1911 HasValidControlBlock =
true;
1915 if (!HasValidControlBlock) {
1916 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1917 "Missing control block");
1920 if (llvm::Error BlockErr =
1921 Implementation->readIdentifierBlock(Cursor, Scratch)) {
1922 Err = std::move(BlockErr);
1928 if (!HasValidControlBlock) {
1929 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1930 "Missing control block");
1933 if (llvm::Error BlockErr =
1934 Implementation->readContextBlock(Cursor, Scratch)) {
1935 Err = std::move(BlockErr);
1941 if (!HasValidControlBlock) {
1942 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1943 "Missing control block");
1946 if (llvm::Error BlockErr =
1947 Implementation->readObjCPropertyBlock(Cursor, Scratch)) {
1948 Err = std::move(BlockErr);
1954 if (!HasValidControlBlock) {
1955 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1956 "Missing control block");
1959 if (llvm::Error BlockErr =
1960 Implementation->readObjCMethodBlock(Cursor, Scratch)) {
1961 Err = std::move(BlockErr);
1967 if (!HasValidControlBlock) {
1968 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1969 "Missing control block");
1972 if (llvm::Error BlockErr =
1973 Implementation->readCXXMethodBlock(Cursor, Scratch)) {
1974 Err = std::move(BlockErr);
1980 if (!HasValidControlBlock) {
1981 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1982 "Missing control block");
1985 if (llvm::Error BlockErr =
1986 Implementation->readFieldBlock(Cursor, Scratch)) {
1987 Err = std::move(BlockErr);
1993 if (!HasValidControlBlock) {
1994 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
1995 "Missing control block");
1998 if (llvm::Error BlockErr =
1999 Implementation->readObjCSelectorBlock(Cursor, Scratch)) {
2000 Err = std::move(BlockErr);
2006 if (!HasValidControlBlock) {
2007 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
2008 "Missing control block");
2011 if (llvm::Error BlockErr =
2012 Implementation->readGlobalVariableBlock(Cursor, Scratch)) {
2013 Err = std::move(BlockErr);
2019 if (!HasValidControlBlock) {
2020 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
2021 "Missing control block");
2024 if (llvm::Error BlockErr =
2025 Implementation->readGlobalFunctionBlock(Cursor, Scratch)) {
2026 Err = std::move(BlockErr);
2032 if (!HasValidControlBlock) {
2033 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
2034 "Missing control block");
2037 if (llvm::Error BlockErr =
2038 Implementation->readEnumConstantBlock(Cursor, Scratch)) {
2039 Err = std::move(BlockErr);
2045 if (!HasValidControlBlock) {
2046 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
2047 "Missing control block");
2050 if (llvm::Error BlockErr =
2051 Implementation->readTagBlock(Cursor, Scratch)) {
2052 Err = std::move(BlockErr);
2058 if (!HasValidControlBlock) {
2059 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
2060 "Missing control block");
2063 if (llvm::Error BlockErr =
2064 Implementation->readTypedefBlock(Cursor, Scratch)) {
2065 Err = std::move(BlockErr);
2073 if (
Cursor.SkipBlock()) {
2074 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
2075 "Failed to skip unknown top-level block");
2082 if (!
Cursor.AtEndOfStream()) {
2083 Err = llvm::createStringError(llvm::inconvertibleErrorCode(),
2084 "Bitstream has unread data after all blocks");
2093 llvm::VersionTuple SwiftVersion) {
2094 llvm::Error Err = llvm::Error::success();
2095 std::unique_ptr<APINotesReader> Reader(
2096 new APINotesReader(InputBuffer.release(), SwiftVersion, Err));
2101 return std::move(Reader);
2104template <
typename T>
2106 llvm::VersionTuple Version,
2108 : Results(
std::move(R)) {
2110 assert(!Results.empty());
2111 assert(llvm::is_sorted(
2113 [](
const std::pair<llvm::VersionTuple, T> &left,
2114 const std::pair<llvm::VersionTuple, T> &right) ->
bool {
2119 assert((&left == &right || left.first != right.first) &&
2120 "two entries for the same version");
2121 return left.first < right.first;
2124 Selected = std::nullopt;
2125 for (
unsigned i = 0, n = Results.size(); i != n; ++i) {
2126 if (!Version.empty() && Results[i].first >= Version) {
2138 if (!Selected && Results[0].first.empty())
2143 -> std::optional<ContextID> {
2145 return std::nullopt;
2149 return std::nullopt;
2156 return std::nullopt;
2164 return std::nullopt;
2168 return std::nullopt;
2172 return std::nullopt;
2178 -> std::optional<ContextID> {
2180 return std::nullopt;
2184 return std::nullopt;
2191 return std::nullopt;
2199 return std::nullopt;
2203 return std::nullopt;
2207 return std::nullopt;
2216 return std::nullopt;
2220 return std::nullopt;
2223 std::make_tuple(CtxID.Value, *PropertyID, (
char)IsInstance));
2225 return std::nullopt;
2231 bool IsInstanceMethod)
2234 return std::nullopt;
2238 return std::nullopt;
2241 ObjCMethodTableInfo::internal_key_type{CtxID.Value, *SelID,
2244 return std::nullopt;
2252 return std::nullopt;
2256 return std::nullopt;
2261 return std::nullopt;
2269 return std::nullopt;
2273 return std::nullopt;
2278 return std::nullopt;
2284 std::optional<Context> Ctx)
2287 return std::nullopt;
2291 return std::nullopt;
2297 return std::nullopt;
2303 std::optional<Context> Ctx)
2306 return std::nullopt;
2310 return std::nullopt;
2316 return std::nullopt;
2324 return std::nullopt;
2328 return std::nullopt;
2332 return std::nullopt;
2338 std::optional<Context> ParentCtx)
2339 -> std::optional<ContextID> {
2341 return std::nullopt;
2345 return std::nullopt;
2350 return std::nullopt;
2358 return std::nullopt;
2362 return std::nullopt;
2368 return std::nullopt;
2374 std::optional<Context> Ctx)
2377 return std::nullopt;
2381 return std::nullopt;
2387 return std::nullopt;
2393 llvm::StringRef Name, std::optional<ContextID> ParentNamespaceID)
2394 -> std::optional<ContextID> {
2396 return std::nullopt;
2400 return std::nullopt;
2402 uint32_t RawParentNamespaceID =
2403 ParentNamespaceID ? ParentNamespaceID->Value : -1;
2407 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