1 //===-- Decompressor.h ------------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===/ 8 9 #ifndef LLVM_OBJECT_DECOMPRESSOR_H 10 #define LLVM_OBJECT_DECOMPRESSOR_H 11 12 #include "llvm/ADT/SmallString.h" 13 #include "llvm/ADT/StringRef.h" 14 #include "llvm/Object/ObjectFile.h" 15 16 namespace llvm { 17 namespace object { 18 19 /// Decompressor helps to handle decompression of compressed sections. 20 class Decompressor { 21 public: 22 /// Create decompressor object. 23 /// @param Name Section name. 24 /// @param Data Section content. 25 /// @param IsLE Flag determines if Data is in little endian form. 26 /// @param Is64Bit Flag determines if object is 64 bit. 27 static Expected<Decompressor> create(StringRef Name, StringRef Data, 28 bool IsLE, bool Is64Bit); 29 30 /// Resize the buffer and uncompress section data into it. 31 /// @param Out Destination buffer. resizeAndDecompress(T & Out)32 template <class T> Error resizeAndDecompress(T &Out) { 33 Out.resize(DecompressedSize); 34 return decompress({Out.data(), (size_t)DecompressedSize}); 35 } 36 37 /// Uncompress section data to raw buffer provided. 38 /// @param Buffer Destination buffer. 39 Error decompress(MutableArrayRef<char> Buffer); 40 41 /// Return memory buffer size required for decompression. getDecompressedSize()42 uint64_t getDecompressedSize() { return DecompressedSize; } 43 44 /// Return true if section is compressed, including gnu-styled case. 45 static bool isCompressed(const object::SectionRef &Section); 46 47 /// Return true if section is a ELF compressed one. 48 static bool isCompressedELFSection(uint64_t Flags, StringRef Name); 49 50 /// Return true if section name matches gnu style compressed one. 51 static bool isGnuStyle(StringRef Name); 52 53 private: 54 Decompressor(StringRef Data); 55 56 Error consumeCompressedGnuHeader(); 57 Error consumeCompressedZLibHeader(bool Is64Bit, bool IsLittleEndian); 58 59 StringRef SectionData; 60 uint64_t DecompressedSize; 61 }; 62 63 } // end namespace object 64 } // end namespace llvm 65 66 #endif // LLVM_OBJECT_DECOMPRESSOR_H 67