16
16
#include " llvm/DebugInfo/DWARF/DWARFDataExtractor.h"
17
17
#include " llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h"
18
18
#include " llvm/DebugInfo/DWARF/DWARFDebugLine.h"
19
- #include " llvm/MCCAS/MCCASDebugV1.h"
20
19
#include " llvm/MC/MCAsmBackend.h"
21
20
#include " llvm/MC/MCContext.h"
22
21
#include " llvm/MC/MCObjectFileInfo.h"
22
+ #include " llvm/MCCAS/MCCASDebugV1.h"
23
23
#include " llvm/Support/BinaryStreamWriter.h"
24
+ #include " llvm/Support/Compression.h"
24
25
#include " llvm/Support/Endian.h"
25
26
#include " llvm/Support/EndianStream.h"
26
27
#include < memory>
@@ -1893,7 +1894,13 @@ struct DIEDataWriter : public DataWriter {
1893
1894
// / is described by some DIEAbbrevRef block.
1894
1895
struct DistinctDataWriter : public DataWriter {
1895
1896
Expected<DIEDistinctDataRef> getCASNode (MCCASBuilder &CASBuilder) {
1896
- return DIEDistinctDataRef::create (CASBuilder, toStringRef (Data));
1897
+ SmallVector<uint8_t > CompressedBuff;
1898
+ compression::zlib::compress (arrayRefFromStringRef (toStringRef (Data)),
1899
+ CompressedBuff);
1900
+ // Reserve 8 bytes for ULEB to store the size of the uncompressed data.
1901
+ CompressedBuff.append (8 , 0 );
1902
+ encodeULEB128 (Data.size (), CompressedBuff.end () - 8 , 8 /* Pad to*/ );
1903
+ return DIEDistinctDataRef::create (CASBuilder, toStringRef (CompressedBuff));
1897
1904
}
1898
1905
};
1899
1906
@@ -3401,7 +3408,16 @@ Error mccasformats::v1::visitDebugInfo(
3401
3408
return LoadedTopRef.takeError ();
3402
3409
3403
3410
StringRef DistinctData = LoadedTopRef->DistinctData .getData ();
3404
- BinaryStreamReader DistinctReader (DistinctData, support::endianness::little);
3411
+ ArrayRef<uint8_t > BuffRef = arrayRefFromStringRef (DistinctData);
3412
+ auto UncompressedSize = decodeULEB128 (BuffRef.data () + BuffRef.size () - 8 );
3413
+ BuffRef = BuffRef.drop_back (8 );
3414
+ SmallVector<uint8_t > OutBuff;
3415
+ if (auto E =
3416
+ compression::zlib::decompress (BuffRef, OutBuff, UncompressedSize))
3417
+ return E;
3418
+ auto UncompressedDistinctData = toStringRef (OutBuff);
3419
+ BinaryStreamReader DistinctReader (UncompressedDistinctData,
3420
+ support::endianness::little);
3405
3421
ArrayRef<char > HeaderData;
3406
3422
3407
3423
auto BeginOffset = DistinctReader.getOffset ();
@@ -3423,8 +3439,9 @@ Error mccasformats::v1::visitDebugInfo(
3423
3439
HeaderCallback (toStringRef (HeaderData));
3424
3440
3425
3441
append_range (TotAbbrevEntries, LoadedTopRef->AbbrevEntries );
3426
- DIEVisitor Visitor{TotAbbrevEntries, DistinctReader, DistinctData,
3427
- HeaderCallback, StartTagCallback, AttrCallback,
3428
- EndTagCallback, NewBlockCallback};
3442
+ DIEVisitor Visitor{TotAbbrevEntries, DistinctReader,
3443
+ UncompressedDistinctData, HeaderCallback,
3444
+ StartTagCallback, AttrCallback,
3445
+ EndTagCallback, NewBlockCallback};
3429
3446
return Visitor.visitDIERef (LoadedTopRef->RootDIE );
3430
3447
}
0 commit comments