@@ -55,7 +55,7 @@ static bool enterTopLevelModuleBlock(llvm::BitstreamCursor &cursor,
55
55
56
56
if (next.ID == llvm::bitc::BLOCKINFO_BLOCK_ID) {
57
57
if (shouldReadBlockInfo) {
58
- if (cursor.ReadBlockInfoBlock ())
58
+ if (! cursor.ReadBlockInfoBlock ())
59
59
return false ;
60
60
} else {
61
61
if (cursor.SkipBlock ())
@@ -77,23 +77,25 @@ static bool enterTopLevelModuleBlock(llvm::BitstreamCursor &cursor,
77
77
static bool readOptionsBlock (llvm::BitstreamCursor &cursor,
78
78
SmallVectorImpl<uint64_t > &scratch,
79
79
ExtendedValidationInfo &extendedInfo) {
80
- auto next = cursor.advance ();
81
- while (next.Kind != llvm::BitstreamEntry::EndBlock) {
82
- if (next.Kind == llvm::BitstreamEntry::Error)
80
+ while (!cursor.AtEndOfStream ()) {
81
+ auto entry = cursor.advance ();
82
+ if (entry.Kind == llvm::BitstreamEntry::EndBlock)
83
+ break ;
84
+
85
+ if (entry.Kind == llvm::BitstreamEntry::Error)
83
86
return false ;
84
87
85
- if (next .Kind == llvm::BitstreamEntry::SubBlock) {
88
+ if (entry .Kind == llvm::BitstreamEntry::SubBlock) {
86
89
// Unknown metadata sub-block, possibly for use by a future version of
87
90
// the module format.
88
91
if (cursor.SkipBlock ())
89
92
return false ;
90
- next = cursor.advance ();
91
93
continue ;
92
94
}
93
95
94
96
scratch.clear ();
95
97
StringRef blobData;
96
- unsigned kind = cursor.readRecord (next .ID , scratch, &blobData);
98
+ unsigned kind = cursor.readRecord (entry .ID , scratch, &blobData);
97
99
switch (kind) {
98
100
case options_block::SDK_PATH:
99
101
extendedInfo.setSDKPath (blobData);
@@ -119,8 +121,6 @@ static bool readOptionsBlock(llvm::BitstreamCursor &cursor,
119
121
// module format.
120
122
break ;
121
123
}
122
-
123
- next = cursor.advance ();
124
124
}
125
125
126
126
return true ;
@@ -135,15 +135,18 @@ validateControlBlock(llvm::BitstreamCursor &cursor,
135
135
ValidationInfo result;
136
136
bool versionSeen = false ;
137
137
138
- auto next = cursor.advance ();
139
- while (next.Kind != llvm::BitstreamEntry::EndBlock) {
140
- if (next.Kind == llvm::BitstreamEntry::Error) {
138
+ while (!cursor.AtEndOfStream ()) {
139
+ auto entry = cursor.advance ();
140
+ if (entry.Kind == llvm::BitstreamEntry::EndBlock)
141
+ break ;
142
+
143
+ if (entry.Kind == llvm::BitstreamEntry::Error) {
141
144
result.status = Status::Malformed;
142
145
return result;
143
146
}
144
147
145
- if (next .Kind == llvm::BitstreamEntry::SubBlock) {
146
- if (next .ID == OPTIONS_BLOCK_ID && extendedInfo) {
148
+ if (entry .Kind == llvm::BitstreamEntry::SubBlock) {
149
+ if (entry .ID == OPTIONS_BLOCK_ID && extendedInfo) {
147
150
cursor.EnterSubBlock (OPTIONS_BLOCK_ID);
148
151
if (!readOptionsBlock (cursor, scratch, *extendedInfo)) {
149
152
result.status = Status::Malformed;
@@ -157,13 +160,12 @@ validateControlBlock(llvm::BitstreamCursor &cursor,
157
160
return result;
158
161
}
159
162
}
160
- next = cursor.advance ();
161
163
continue ;
162
164
}
163
165
164
166
scratch.clear ();
165
167
StringRef blobData;
166
- unsigned kind = cursor.readRecord (next .ID , scratch, &blobData);
168
+ unsigned kind = cursor.readRecord (entry .ID , scratch, &blobData);
167
169
switch (kind) {
168
170
case control_block::METADATA: {
169
171
if (versionSeen) {
@@ -209,8 +211,6 @@ validateControlBlock(llvm::BitstreamCursor &cursor,
209
211
// module format.
210
212
break ;
211
213
}
212
-
213
- next = cursor.advance ();
214
214
}
215
215
216
216
return result;
@@ -232,31 +232,31 @@ ValidationInfo serialization::validateSerializedAST(
232
232
reinterpret_cast <uintptr_t >(data.data ()) % 4 != 0 )
233
233
return result;
234
234
235
- llvm::BitstreamReader reader (reinterpret_cast <const uint8_t *>(data.begin ()),
236
- reinterpret_cast <const uint8_t *>(data.end ()));
237
- llvm::BitstreamCursor cursor (reader);
235
+ llvm::BitstreamCursor cursor (data);
238
236
SmallVector<uint64_t , 32 > scratch;
239
237
240
238
if (!checkModuleSignature (cursor) ||
241
239
!enterTopLevelModuleBlock (cursor, MODULE_BLOCK_ID, false ))
242
240
return result;
243
241
244
- auto topLevelEntry = cursor.advance ();
245
- while (topLevelEntry.Kind == llvm::BitstreamEntry::SubBlock) {
242
+ llvm::BitstreamEntry topLevelEntry;
243
+
244
+ while (!cursor.AtEndOfStream ()) {
245
+ topLevelEntry = cursor.advance ();
246
+ if (topLevelEntry.Kind != llvm::BitstreamEntry::SubBlock)
247
+ break ;
248
+
246
249
if (topLevelEntry.ID == CONTROL_BLOCK_ID) {
247
250
cursor.EnterSubBlock (CONTROL_BLOCK_ID);
248
251
result = validateControlBlock (cursor, scratch, extendedInfo);
249
252
if (result.status == Status::Malformed)
250
253
return result;
251
-
252
254
} else {
253
255
if (cursor.SkipBlock ()) {
254
256
result.status = Status::Malformed;
255
257
return result;
256
258
}
257
259
}
258
-
259
- topLevelEntry = cursor.advance (AF_DontPopBlockAtEnd);
260
260
}
261
261
262
262
if (topLevelEntry.Kind == llvm::BitstreamEntry::EndBlock) {
@@ -466,9 +466,9 @@ bool ModuleFile::readIndexBlock(llvm::BitstreamCursor &cursor) {
466
466
SmallVector<uint64_t , 4 > scratch;
467
467
StringRef blobData;
468
468
469
- while (true ) {
470
- auto next = cursor.advance ();
471
- switch (next .Kind ) {
469
+ while (!cursor. AtEndOfStream () ) {
470
+ auto entry = cursor.advance ();
471
+ switch (entry .Kind ) {
472
472
case llvm::BitstreamEntry::EndBlock:
473
473
return true ;
474
474
@@ -484,7 +484,7 @@ bool ModuleFile::readIndexBlock(llvm::BitstreamCursor &cursor) {
484
484
case llvm::BitstreamEntry::Record:
485
485
scratch.clear ();
486
486
blobData = {};
487
- unsigned kind = cursor.readRecord (next .ID , scratch, &blobData);
487
+ unsigned kind = cursor.readRecord (entry .ID , scratch, &blobData);
488
488
489
489
switch (kind) {
490
490
case index_block::DECL_OFFSETS:
@@ -648,9 +648,9 @@ bool ModuleFile::readCommentBlock(llvm::BitstreamCursor &cursor) {
648
648
SmallVector<uint64_t , 4 > scratch;
649
649
StringRef blobData;
650
650
651
- while (true ) {
652
- auto next = cursor.advance ();
653
- switch (next .Kind ) {
651
+ while (!cursor. AtEndOfStream () ) {
652
+ auto entry = cursor.advance ();
653
+ switch (entry .Kind ) {
654
654
case llvm::BitstreamEntry::EndBlock:
655
655
return true ;
656
656
@@ -665,7 +665,7 @@ bool ModuleFile::readCommentBlock(llvm::BitstreamCursor &cursor) {
665
665
666
666
case llvm::BitstreamEntry::Record:
667
667
scratch.clear ();
668
- unsigned kind = cursor.readRecord (next .ID , scratch, &blobData);
668
+ unsigned kind = cursor.readRecord (entry .ID , scratch, &blobData);
669
669
670
670
switch (kind) {
671
671
case comment_block::DECL_COMMENTS:
@@ -699,18 +699,6 @@ static Optional<swift::LibraryKind> getActualLibraryKind(unsigned rawKind) {
699
699
return None;
700
700
}
701
701
702
- static const uint8_t *getStartBytePtr (llvm::MemoryBuffer *buffer) {
703
- if (!buffer)
704
- return nullptr ;
705
- return reinterpret_cast <const uint8_t *>(buffer->getBufferStart ());
706
- }
707
-
708
- static const uint8_t *getEndBytePtr (llvm::MemoryBuffer *buffer) {
709
- if (!buffer)
710
- return nullptr ;
711
- return reinterpret_cast <const uint8_t *>(buffer->getBufferEnd ());
712
- }
713
-
714
702
static bool areCompatibleArchitectures (const llvm::Triple &moduleTarget,
715
703
const llvm::Triple &ctxTarget) {
716
704
if (moduleTarget.getArch () == ctxTarget.getArch ())
@@ -764,17 +752,13 @@ ModuleFile::ModuleFile(
764
752
serialization::ExtendedValidationInfo *extInfo)
765
753
: ModuleInputBuffer(std::move(moduleInputBuffer)),
766
754
ModuleDocInputBuffer(std::move(moduleDocInputBuffer)),
767
- ModuleInputReader(getStartBytePtr(this ->ModuleInputBuffer.get()),
768
- getEndBytePtr(this ->ModuleInputBuffer.get())),
769
- ModuleDocInputReader(getStartBytePtr(this ->ModuleDocInputBuffer.get()),
770
- getEndBytePtr(this ->ModuleDocInputBuffer.get())),
771
755
DeserializedTypeCallback([](Type ty) {}) {
772
756
assert (getStatus () == Status::Valid);
773
757
Bits.IsFramework = isFramework;
774
758
775
759
PrettyModuleFileDeserialization stackEntry (*this );
776
760
777
- llvm::BitstreamCursor cursor{ModuleInputReader };
761
+ llvm::BitstreamCursor cursor{ModuleInputBuffer-> getMemBufferRef () };
778
762
779
763
if (!checkModuleSignature (cursor) ||
780
764
!enterTopLevelModuleBlock (cursor, MODULE_BLOCK_ID)) {
@@ -787,8 +771,13 @@ ModuleFile::ModuleFile(
787
771
bool hasValidControlBlock = false ;
788
772
SmallVector<uint64_t , 64 > scratch;
789
773
790
- auto topLevelEntry = cursor.advance ();
791
- while (topLevelEntry.Kind == llvm::BitstreamEntry::SubBlock) {
774
+ llvm::BitstreamEntry topLevelEntry;
775
+
776
+ while (!cursor.AtEndOfStream ()) {
777
+ topLevelEntry = cursor.advance ();
778
+ if (topLevelEntry.Kind != llvm::BitstreamEntry::SubBlock)
779
+ break ;
780
+
792
781
switch (topLevelEntry.ID ) {
793
782
case CONTROL_BLOCK_ID: {
794
783
cursor.EnterSubBlock (CONTROL_BLOCK_ID);
@@ -996,15 +985,18 @@ ModuleFile::ModuleFile(
996
985
if (!this ->ModuleDocInputBuffer )
997
986
return ;
998
987
999
- llvm::BitstreamCursor docCursor{ModuleDocInputReader };
988
+ llvm::BitstreamCursor docCursor{ModuleDocInputBuffer-> getMemBufferRef () };
1000
989
if (!checkModuleDocSignature (docCursor) ||
1001
990
!enterTopLevelModuleBlock (docCursor, MODULE_DOC_BLOCK_ID)) {
1002
991
error (Status::MalformedDocumentation);
1003
992
return ;
1004
993
}
1005
994
1006
- topLevelEntry = docCursor.advance ();
1007
- while (topLevelEntry.Kind == llvm::BitstreamEntry::SubBlock) {
995
+ while (!docCursor.AtEndOfStream ()) {
996
+ topLevelEntry = docCursor.advance ();
997
+ if (topLevelEntry.Kind != llvm::BitstreamEntry::SubBlock)
998
+ break ;
999
+
1008
1000
switch (topLevelEntry.ID ) {
1009
1001
case COMMENT_BLOCK_ID: {
1010
1002
if (!hasValidControlBlock || !readCommentBlock (docCursor)) {
@@ -1023,8 +1015,6 @@ ModuleFile::ModuleFile(
1023
1015
}
1024
1016
break ;
1025
1017
}
1026
-
1027
- topLevelEntry = docCursor.advance (AF_DontPopBlockAtEnd);
1028
1018
}
1029
1019
1030
1020
if (topLevelEntry.Kind != llvm::BitstreamEntry::EndBlock) {
0 commit comments