1 //===-- Decompressor.h ------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===/ 9 10 #ifndef LLVM_OBJECT_DECOMPRESSOR_H 11 #define LLVM_OBJECT_DECOMPRESSOR_H 12 13 #include "llvm/ADT/SmallString.h" 14 #include "llvm/ADT/StringRef.h" 15 #include "llvm/Object/ObjectFile.h" 16 17 namespace llvm { 18 namespace object { 19 20 /// Decompressor helps to handle decompression of compressed sections. 21 class Decompressor { 22 public: 23 /// 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); 30 31 /// Resize the buffer and uncompress section data into it. 32 /// @param Out Destination buffer. resizeAndDecompress(T & Out)33 template <class T> Error resizeAndDecompress(T &Out) { 34 Out.resize(DecompressedSize); 35 return decompress({Out.data(), (size_t)DecompressedSize}); 36 } 37 38 /// Uncompress section data to raw buffer provided. 39 /// @param Buffer Destination buffer. 40 Error decompress(MutableArrayRef<char> Buffer); 41 42 /// Return memory buffer size required for decompression. getDecompressedSize()43 uint64_t getDecompressedSize() { return DecompressedSize; } 44 45 /// Return true if section is compressed, including gnu-styled case. 46 static bool isCompressed(const object::SectionRef &Section); 47 48 /// Return true if section is a ELF compressed one. 49 static bool isCompressedELFSection(uint64_t Flags, StringRef Name); 50 51 /// Return true if section name matches gnu style compressed one. 52 static bool isGnuStyle(StringRef Name); 53 54 private: 55 Decompressor(StringRef Data); 56 57 Error consumeCompressedGnuHeader(); 58 Error consumeCompressedZLibHeader(bool Is64Bit, bool IsLittleEndian); 59 60 StringRef SectionData; 61 uint64_t DecompressedSize; 62 }; 63 64 } // end namespace object 65 } // end namespace llvm 66 67 #endif // LLVM_OBJECT_DECOMPRESSOR_H 68