LLVM: lib/Object/Decompressor.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
16
17using namespace llvm;
19using namespace object;
20
22 bool IsLE, bool Is64Bit) {
24 if (Error Err = D.consumeCompressedHeader(Is64Bit, IsLE))
25 return std::move(Err);
26 return D;
27}
28
30 : SectionData(Data), DecompressedSize(0) {}
31
32Error Decompressor::consumeCompressedHeader(bool Is64Bit, bool IsLittleEndian) {
33 using namespace ELF;
34 uint64_t HdrSize = Is64Bit ? sizeof(Elf64_Chdr) : sizeof(Elf32_Chdr);
35 if (SectionData.size() < HdrSize)
36 return createError("corrupted compressed section header");
37
38 DataExtractor Extractor(SectionData, IsLittleEndian, 0);
40 auto ChType = Extractor.getUnsigned(&Offset, Is64Bit ? sizeof(Elf64_Word)
41 : sizeof(Elf32_Word));
42 switch (ChType) {
43 case ELFCOMPRESS_ZLIB:
45 break;
46 case ELFCOMPRESS_ZSTD:
48 break;
49 default:
50 return createError("unsupported compression type (" + Twine(ChType) + ")");
51 }
55
56
57 if (Is64Bit)
58 Offset += sizeof(Elf64_Word);
59
60 DecompressedSize = Extractor.getUnsigned(
61 &Offset, Is64Bit ? sizeof(Elf64_Xword) : sizeof(Elf32_Word));
62 SectionData = SectionData.substr(HdrSize);
64}
65
68 arrayRefFromStringRef(SectionData),
69 Output.data(), Output.size());
70}
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
size_t size() const
size - Get the array size.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
StringRef - Represent a constant reference to a string, i.e.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
constexpr size_t size() const
size - Get the string size.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Decompressor helps to handle decompression of compressed sections.
Error decompress(MutableArrayRef< uint8_t > Output)
Uncompress section data to raw buffer provided.
static Expected< Decompressor > create(StringRef Name, StringRef Data, bool IsLE, bool Is64Bit)
Create decompressor object.
const char * getReasonIfUnsupported(Format F)
Error decompress(DebugCompressionType T, ArrayRef< uint8_t > Input, uint8_t *Output, size_t UncompressedSize)
Format formatFor(DebugCompressionType Type)
Error createError(const Twine &Err)
This is an optimization pass for GlobalISel generic memory operations.