1 //===-- Decompressor.h ------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===/
10 #ifndef LLVM_OBJECT_DECOMPRESSOR_H
11 #define LLVM_OBJECT_DECOMPRESSOR_H
13 #include "llvm/ADT/StringRef.h"
14 #include "llvm/ADT/SmallString.h"
15 #include "llvm/Object/ObjectFile.h"
20 /// @brief Decompressor helps to handle decompression of compressed sections.
23 /// @brief Create decompressor object.
24 /// @param Name Section name.
25 /// @param Data Section content.
26 /// @param IsLE Flag determines if Data is in little endian form.
27 /// @param Is64Bit Flag determines if object is 64 bit.
28 static Expected<Decompressor> create(StringRef Name, StringRef Data,
29 bool IsLE, bool Is64Bit);
31 /// @brief Resize the buffer and uncompress section data into it.
32 /// @param Out Destination buffer.
33 Error decompress(SmallString<32> &Out);
35 /// @brief Uncompress section data to raw buffer provided.
36 /// @param Buffer Destination buffer.
37 Error decompress(MutableArrayRef<char> Buffer);
39 /// @brief Return memory buffer size required for decompression.
40 uint64_t getDecompressedSize() { return DecompressedSize; }
42 /// @brief Return true if section is compressed, including gnu-styled case.
43 static bool isCompressed(const object::SectionRef &Section);
45 /// @brief Return true if section is a ELF compressed one.
46 static bool isCompressedELFSection(uint64_t Flags, StringRef Name);
48 /// @brief Return true if section name matches gnu style compressed one.
49 static bool isGnuStyle(StringRef Name);
52 Decompressor(StringRef Data);
54 Error consumeCompressedGnuHeader();
55 Error consumeCompressedZLibHeader(bool Is64Bit, bool IsLittleEndian);
57 StringRef SectionData;
58 uint64_t DecompressedSize;
61 } // end namespace object
62 } // end namespace llvm
64 #endif // LLVM_OBJECT_DECOMPRESSOR_H