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/ArrayRef.h" 13 #include "llvm/ADT/StringRef.h" 14 #include "llvm/Support/Compression.h" 15 #include "llvm/Support/Error.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({(uint8_t *)Out.data(), (size_t)DecompressedSize}); 36 } 37 38 /// Uncompress section data to raw buffer provided. 39 Error decompress(MutableArrayRef<uint8_t> Output); 40 41 /// Return memory buffer size required for decompression. getDecompressedSize()42 uint64_t getDecompressedSize() { return DecompressedSize; } 43 44 private: 45 Decompressor(StringRef Data); 46 47 Error consumeCompressedHeader(bool Is64Bit, bool IsLittleEndian); 48 49 StringRef SectionData; 50 uint64_t DecompressedSize; 51 DebugCompressionType CompressionType = DebugCompressionType::None; 52 }; 53 54 } // end namespace object 55 } // end namespace llvm 56 57 #endif // LLVM_OBJECT_DECOMPRESSOR_H 58