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