@@ -505,12 +505,13 @@ static Error materializeDebugInfoOpt(MCCASReader &Reader,
505
505
StringRef FormData, bool ) {
506
506
if (Form == dwarf::Form::DW_FORM_ref4_cas ||
507
507
Form == dwarf::Form::DW_FORM_strp_cas) {
508
- auto Reader = BinaryStreamReader (FormData, support::endianness::little);
509
- uint64_t Data64;
510
- if (auto Err = Reader.readULEB128 (Data64))
511
- handleAllErrors (std::move (Err));
508
+ DataExtractor Extractor (FormData, true , 8 );
509
+ DataExtractor::Cursor Cursor (0 );
510
+ uint64_t Data64 = Extractor.getULEB128 (Cursor);
511
+ if (!Cursor)
512
+ handleAllErrors (Cursor.takeError ());
512
513
uint32_t Data32 = Data64;
513
- assert (Data32 == Data64 && Reader. empty ( ));
514
+ assert (Data32 == Data64 && Extractor. eof (Cursor ));
514
515
SectionStream->write (reinterpret_cast <char *>(&Data32), sizeof (Data32));
515
516
} else
516
517
*SectionStream << FormData;
@@ -1703,13 +1704,14 @@ Error MCCASBuilder::createStringSection(
1703
1704
// / Reads and returns the length field of a dwarf header contained in Reader,
1704
1705
// / assuming Reader is positioned at the beginning of the header. The Reader's
1705
1706
// / state is advanced to the first byte after the header.
1706
- static Expected<size_t > getSizeFromDwarfHeader (BinaryStreamReader &Reader) {
1707
+ static Expected<size_t > getSizeFromDwarfHeader (DataExtractor &Extractor,
1708
+ DataExtractor::Cursor &Cursor) {
1707
1709
// From DWARF 5 section 7.4:
1708
1710
// In the 32-bit DWARF format, an initial length field [...] is an unsigned
1709
1711
// 4-byte integer (which must be less than 0xfffffff0);
1710
- uint32_t Word1;
1711
- if (auto E = Reader. readInteger (Word1) )
1712
- return std::move (E );
1712
+ uint32_t Word1 = Extractor. getU32 (Cursor) ;
1713
+ if (!Cursor )
1714
+ return Cursor. takeError ( );
1713
1715
1714
1716
// TODO: handle 64-bit DWARF format.
1715
1717
if (Word1 >= 0xfffffff0 )
@@ -1727,43 +1729,45 @@ static Expected<CUInfo>
1727
1729
getAndSetDebugAbbrevOffsetAndSkip (MutableArrayRef<char > CUData,
1728
1730
support::endianness Endian,
1729
1731
std::optional<uint32_t > NewOffset) {
1730
- BinaryStreamReader Reader (toStringRef (CUData), Endian);
1731
- Expected<size_t > Size = getSizeFromDwarfHeader (Reader);
1732
+ DataExtractor Extractor (toStringRef (CUData),
1733
+ Endian == support::endianness::little, 8 );
1734
+ DataExtractor::Cursor Cursor (0 );
1735
+ Expected<size_t > Size = getSizeFromDwarfHeader (Extractor, Cursor);
1732
1736
if (!Size)
1733
1737
return Size.takeError ();
1734
1738
1735
- size_t AfterSizeOffset = Reader. getOffset ();
1739
+ size_t AfterSizeOffset = Cursor. tell ();
1736
1740
1737
1741
// 2-byte Dwarf version identifier.
1738
- uint16_t DwarfVersion;
1739
- if (auto E = Reader. readInteger (DwarfVersion) )
1740
- return std::move (E );
1742
+ uint16_t DwarfVersion = Extractor. getU16 (Cursor) ;
1743
+ if (!Cursor )
1744
+ return Cursor. takeError ( );
1741
1745
1742
1746
if (DwarfVersion >= 5 ) {
1743
1747
// From Dwarf 5 Section 7.5.1.1:
1744
1748
// Compile Unit Header Format is now changed with unit_type and address_size
1745
1749
// after the version. Parse both values from the header.
1746
- uint8_t UnitType;
1747
- if (auto E = Reader. readInteger (UnitType) )
1748
- return std::move (E );
1750
+ uint8_t UnitType = Extractor. getU8 (Cursor) ;
1751
+ if (!Cursor )
1752
+ return Cursor. takeError ( );
1749
1753
if (UnitType != dwarf::DW_UT_compile)
1750
1754
return createStringError (
1751
1755
inconvertibleErrorCode (),
1752
1756
" Unit type is not DW_UT_compile, and is incompatible with MCCAS!" );
1753
- uint8_t AddressSize;
1754
- if (auto E = Reader. readInteger (AddressSize) )
1755
- return std::move (E );
1757
+ uint8_t AddressSize = Extractor. getU8 (Cursor) ;
1758
+ if (!Cursor )
1759
+ return Cursor. takeError ( );
1756
1760
if (AddressSize != 8 )
1757
1761
return createStringError (
1758
1762
inconvertibleErrorCode (),
1759
1763
" Address size is not 8 bytes, unsupported architecture for MCCAS!" );
1760
1764
}
1761
1765
1762
1766
// TODO: Handle Dwarf 64 format, which uses 8 bytes.
1763
- size_t AbbrevPosition = Reader. getOffset ();
1764
- uint32_t AbbrevOffset;
1765
- if (auto E = Reader. readInteger (AbbrevOffset) )
1766
- return std::move (E );
1767
+ size_t AbbrevPosition = Cursor. tell ();
1768
+ uint32_t AbbrevOffset = Extractor. getU32 (Cursor) ;
1769
+ if (!Cursor )
1770
+ return Cursor. takeError ( );
1767
1771
1768
1772
if (NewOffset.has_value ()) {
1769
1773
// FIXME: safe but ugly cast. Similar to: llvm::arrayRefFromStringRef.
@@ -1775,11 +1779,8 @@ getAndSetDebugAbbrevOffsetAndSkip(MutableArrayRef<char> CUData,
1775
1779
return std::move (E);
1776
1780
}
1777
1781
1778
- Reader.setOffset (AfterSizeOffset);
1779
- if (auto E = Reader.skip (*Size))
1780
- return std::move (E);
1781
-
1782
- return CUInfo{Reader.getOffset (), AbbrevOffset, DwarfVersion};
1782
+ Cursor.seek (AfterSizeOffset + *Size);
1783
+ return CUInfo{Cursor.tell (), AbbrevOffset, DwarfVersion};
1783
1784
}
1784
1785
1785
1786
// / Given a list of MCFragments, return a vector with the concatenation of their
@@ -3102,14 +3103,15 @@ struct DIEVisitor {
3102
3103
3103
3104
Error visitDIERef (DIEDedupeTopLevelRef Ref);
3104
3105
Error visitDIERef (ArrayRef<DIEDataRef> &DIEChildrenStack);
3105
- Error visitDIEAttrs (BinaryStreamReader &DataReader, StringRef DIEData ,
3106
- ArrayRef<AbbrevContent> DIEContents);
3106
+ Error visitDIEAttrs (DataExtractor &Extractor, DataExtractor::Cursor &Cursor ,
3107
+ StringRef DIEData, ArrayRef<AbbrevContent> DIEContents);
3107
3108
Error materializeAbbrevDIE (unsigned AbbrevIdx);
3108
3109
3109
3110
uint16_t DwarfVersion;
3110
3111
SmallVector<AbbrevEntry> AbbrevEntryCache;
3111
3112
ArrayRef<StringRef> AbbrevEntries;
3112
- BinaryStreamReader DistinctReader;
3113
+ DataExtractor DistinctExtractor;
3114
+ DataExtractor::Cursor DistinctCursor;
3113
3115
StringRef DistinctData;
3114
3116
3115
3117
std::function<void (StringRef)> HeaderCallback;
@@ -3120,7 +3122,8 @@ struct DIEVisitor {
3120
3122
std::function<void (StringRef)> NewBlockCallback;
3121
3123
};
3122
3124
3123
- Error DIEVisitor::visitDIEAttrs (BinaryStreamReader &DataReader,
3125
+ Error DIEVisitor::visitDIEAttrs (DataExtractor &Extractor,
3126
+ DataExtractor::Cursor &Cursor,
3124
3127
StringRef DIEData,
3125
3128
ArrayRef<AbbrevContent> DIEContents) {
3126
3129
constexpr auto IsLittleEndian = true ;
@@ -3130,29 +3133,32 @@ Error DIEVisitor::visitDIEAttrs(BinaryStreamReader &DataReader,
3130
3133
3131
3134
for (auto Contents : DIEContents) {
3132
3135
bool DataInDistinct = Contents.FormInDistinctData ;
3133
- auto &ReaderForData = DataInDistinct ? DistinctReader : DataReader;
3136
+ auto &ExtractorForData = DataInDistinct ? DistinctExtractor : Extractor;
3137
+ auto &CursorForData = DataInDistinct ? DistinctCursor : Cursor;
3134
3138
StringRef DataToUse = DataInDistinct ? DistinctData : DIEData;
3135
3139
Expected<uint64_t > FormSize =
3136
3140
Contents.FormSize
3137
3141
? *Contents.FormSize
3138
3142
: getFormSize (Contents.Form , FormParams, DataToUse,
3139
- ReaderForData. getOffset (), IsLittleEndian, AddrSize);
3143
+ CursorForData. tell (), IsLittleEndian, AddrSize);
3140
3144
if (!FormSize)
3141
3145
return FormSize.takeError ();
3142
3146
3143
- ArrayRef<char > RawBytes;
3144
- if (auto E = ReaderForData.readArray (RawBytes, *FormSize))
3145
- return E;
3146
- AttrCallback (Contents.Attr , Contents.Form , toStringRef (RawBytes),
3147
- DataInDistinct);
3147
+ StringRef RawBytes;
3148
+ if (*FormSize)
3149
+ RawBytes = ExtractorForData.getBytes (CursorForData, *FormSize);
3150
+ if (!CursorForData)
3151
+ return CursorForData.takeError ();
3152
+ AttrCallback (Contents.Attr , Contents.Form , RawBytes, DataInDistinct);
3148
3153
}
3149
3154
return Error::success ();
3150
3155
}
3151
3156
3152
- static Expected<uint64_t > readAbbrevIdx (BinaryStreamReader &Reader) {
3153
- uint64_t Idx;
3154
- if (auto E = Reader.readULEB128 (Idx))
3155
- return std::move (E);
3157
+ static Expected<uint64_t > readAbbrevIdx (DataExtractor &Extractor,
3158
+ DataExtractor::Cursor &Cursor) {
3159
+ uint64_t Idx = Extractor.getULEB128 (Cursor);
3160
+ if (!Cursor)
3161
+ return Cursor.takeError ();
3156
3162
return Idx;
3157
3163
}
3158
3164
@@ -3273,12 +3279,13 @@ Error DIEVisitor::materializeAbbrevDIE(unsigned AbbrevIdx) {
3273
3279
// / implementation of a Depth First Search, and this function is used to
3274
3280
// / simulate a return from a recursive callback, by restoring the locals to a
3275
3281
// / previous stack frame.
3276
- static void popStack (BinaryStreamReader &Reader, StringRef &Data,
3282
+ static void popStack (DataExtractor &Extractor, DataExtractor::Cursor &Cursor,
3283
+ StringRef &Data,
3277
3284
std::stack<std::pair<StringRef, unsigned >> &StackOfNodes) {
3278
3285
auto DataAndOffset = StackOfNodes.top ();
3279
- Reader = BinaryStreamReader (DataAndOffset.first , support::endianness::little );
3286
+ Extractor = DataExtractor (DataAndOffset.first , true , 8 );
3280
3287
Data = DataAndOffset.first ;
3281
- Reader. setOffset (DataAndOffset.second );
3288
+ Cursor. seek (DataAndOffset.second );
3282
3289
StackOfNodes.pop ();
3283
3290
}
3284
3291
@@ -3292,11 +3299,13 @@ Error DIEVisitor::visitDIERef(ArrayRef<DIEDataRef> &DIEChildrenStack) {
3292
3299
std::stack<std::pair<StringRef, unsigned >> StackOfNodes;
3293
3300
auto Data = DIEChildrenStack.empty () ? StringRef ()
3294
3301
: DIEChildrenStack.front ().getData ();
3295
- BinaryStreamReader Reader (Data, support::endianness::little);
3302
+ DataExtractor Extractor (Data, true , 8 );
3303
+ DataExtractor::Cursor Cursor (0 );
3296
3304
3297
- while (!DistinctReader. empty ( )) {
3305
+ while (!DistinctExtractor. eof (DistinctCursor )) {
3298
3306
3299
- Expected<uint64_t > MaybeAbbrevIdx = readAbbrevIdx (DistinctReader);
3307
+ Expected<uint64_t > MaybeAbbrevIdx =
3308
+ readAbbrevIdx (DistinctExtractor, DistinctCursor);
3300
3309
if (!MaybeAbbrevIdx)
3301
3310
return MaybeAbbrevIdx.takeError ();
3302
3311
auto AbbrevIdx = *MaybeAbbrevIdx;
@@ -3306,20 +3315,21 @@ Error DIEVisitor::visitDIERef(ArrayRef<DIEDataRef> &DIEChildrenStack) {
3306
3315
// continue materialization of the parent's siblings that may exist.
3307
3316
if (AbbrevIdx == getEndOfDIESiblingsMarker ()) {
3308
3317
EndTagCallback (true /* HadChildren*/ );
3309
- if (!StackOfNodes.empty () && Reader. empty ( ))
3310
- popStack (Reader , Data, StackOfNodes);
3318
+ if (!StackOfNodes.empty () && Extractor. eof (Cursor ))
3319
+ popStack (Extractor, Cursor , Data, StackOfNodes);
3311
3320
continue ;
3312
3321
}
3313
3322
3314
3323
// If we see a DIEInAnotherBlockMarker, we know that the next DIE is in
3315
3324
// another CAS Block, we have to push the current CAS Object on the stack,
3316
3325
// and materialize the next DIE from the DIEChildrenStack.
3317
3326
if (AbbrevIdx == getDIEInAnotherBlockMarker ()) {
3318
- StackOfNodes.push (std::make_pair (Data, Reader. getOffset ()));
3327
+ StackOfNodes.push (std::make_pair (Data, Cursor. tell ()));
3319
3328
DIEChildrenStack = DIEChildrenStack.drop_front ();
3320
3329
Data = DIEChildrenStack.front ().getData ();
3321
3330
NewBlockCallback (DIEChildrenStack.front ().getID ().toString ());
3322
- Reader = BinaryStreamReader (Data, support::endianness::little);
3331
+ Extractor = DataExtractor (Data, true , 8 );
3332
+ Cursor.seek (0 );
3323
3333
continue ;
3324
3334
}
3325
3335
@@ -3328,16 +3338,16 @@ Error DIEVisitor::visitDIERef(ArrayRef<DIEDataRef> &DIEChildrenStack) {
3328
3338
AbbrevEntryCache[decodeAbbrevIndexAsAbbrevSetIdx (AbbrevIdx)];
3329
3339
StartTagCallback (AbbrevEntryCacheVal.Tag , AbbrevIdx);
3330
3340
3331
- if (auto E =
3332
- visitDIEAttrs (Reader, Data, AbbrevEntryCacheVal.AbbrevContents ))
3341
+ if (auto E = visitDIEAttrs (Extractor, Cursor, Data,
3342
+ AbbrevEntryCacheVal.AbbrevContents ))
3333
3343
return E;
3334
3344
3335
3345
// If the current DIE doesn't have any children, the current CAS Object will
3336
3346
// not contain any more data, pop the stack to continue materializing its
3337
3347
// parent's siblings that may exist.
3338
3348
if (!AbbrevEntryCacheVal.HasChildren ) {
3339
- if (!StackOfNodes.empty () && Reader. empty ( ))
3340
- popStack (Reader , Data, StackOfNodes);
3349
+ if (!StackOfNodes.empty () && Extractor. eof (Cursor ))
3350
+ popStack (Extractor, Cursor , Data, StackOfNodes);
3341
3351
EndTagCallback (false /* HadChildren*/ );
3342
3352
}
3343
3353
}
@@ -3346,8 +3356,9 @@ Error DIEVisitor::visitDIERef(ArrayRef<DIEDataRef> &DIEChildrenStack) {
3346
3356
3347
3357
Error DIEVisitor::visitDIERef (DIEDedupeTopLevelRef StartDIERef) {
3348
3358
3349
- auto Offset = DistinctReader.getOffset ();
3350
- Expected<uint64_t > MaybeAbbrevIdx = readAbbrevIdx (DistinctReader);
3359
+ auto Offset = DistinctCursor.tell ();
3360
+ Expected<uint64_t > MaybeAbbrevIdx =
3361
+ readAbbrevIdx (DistinctExtractor, DistinctCursor);
3351
3362
if (!MaybeAbbrevIdx)
3352
3363
return MaybeAbbrevIdx.takeError ();
3353
3364
auto AbbrevIdx = *MaybeAbbrevIdx;
@@ -3356,7 +3367,7 @@ Error DIEVisitor::visitDIERef(DIEDedupeTopLevelRef StartDIERef) {
3356
3367
assert (AbbrevIdx != getEndOfDIESiblingsMarker () &&
3357
3368
AbbrevIdx != getDIEInAnotherBlockMarker ());
3358
3369
3359
- DistinctReader. setOffset (Offset);
3370
+ DistinctCursor. seek (Offset);
3360
3371
3361
3372
NewBlockCallback (StartDIERef.getID ().toString ());
3362
3373
@@ -3394,34 +3405,36 @@ Error mccasformats::v1::visitDebugInfo(
3394
3405
compression::zlib::decompress (BuffRef, OutBuff, UncompressedSize))
3395
3406
return E;
3396
3407
DistinctData = toStringRef (OutBuff);
3397
- BinaryStreamReader DistinctReader (DistinctData, support::endianness::little);
3398
- #else
3399
- BinaryStreamReader DistinctReader (DistinctData, support::endianness::little);
3400
3408
#endif
3401
- ArrayRef<char > HeaderData;
3409
+ DataExtractor DistinctExtractor (DistinctData, true , 8 );
3410
+ DataExtractor::Cursor DistinctCursor (0 );
3402
3411
3403
- auto BeginOffset = DistinctReader.getOffset ();
3404
- auto Size = getSizeFromDwarfHeader (DistinctReader);
3412
+ auto Size = getSizeFromDwarfHeader (DistinctExtractor, DistinctCursor);
3405
3413
if (!Size)
3406
3414
return Size.takeError ();
3407
3415
3408
3416
// 2-byte Dwarf version identifier.
3409
- uint16_t DwarfVersion;
3410
- if (auto E = DistinctReader.readInteger (DwarfVersion))
3411
- return E;
3412
-
3413
- DistinctReader.setOffset (BeginOffset);
3417
+ uint16_t DwarfVersion = DistinctExtractor.getU16 (DistinctCursor);
3418
+ DistinctCursor.seek (0 );
3414
3419
3415
- if (auto E = DistinctReader.readArray (
3416
- HeaderData,
3417
- DwarfVersion >= 5 ? Dwarf5HeaderSize32Bit : Dwarf4HeaderSize32Bit))
3418
- return E;
3419
- HeaderCallback (toStringRef (HeaderData));
3420
+ StringRef HeaderData = DistinctExtractor.getBytes (
3421
+ DistinctCursor,
3422
+ DwarfVersion >= 5 ? Dwarf5HeaderSize32Bit : Dwarf4HeaderSize32Bit);
3423
+ if (!DistinctCursor)
3424
+ return DistinctCursor.takeError ();
3425
+ HeaderCallback (HeaderData);
3420
3426
3421
3427
append_range (TotAbbrevEntries, LoadedTopRef->AbbrevEntries );
3422
- DIEVisitor Visitor{DwarfVersion, {}, TotAbbrevEntries,
3423
- DistinctReader, DistinctData, HeaderCallback,
3424
- StartTagCallback, AttrCallback, EndTagCallback,
3428
+ DIEVisitor Visitor{DwarfVersion,
3429
+ {},
3430
+ TotAbbrevEntries,
3431
+ DistinctExtractor,
3432
+ DataExtractor::Cursor (DistinctCursor.tell ()),
3433
+ DistinctData,
3434
+ HeaderCallback,
3435
+ StartTagCallback,
3436
+ AttrCallback,
3437
+ EndTagCallback,
3425
3438
NewBlockCallback};
3426
3439
return Visitor.visitDIERef (LoadedTopRef->RootDIE );
3427
3440
}
0 commit comments