Home | History | Annotate | Download | only in Object
      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/StringRef.h"
     14 #include "llvm/ADT/SmallString.h"
     15 #include "llvm/Object/ObjectFile.h"
     16 
     17 namespace llvm {
     18 namespace object {
     19 
     20 /// @brief Decompressor helps to handle decompression of compressed sections.
     21 class Decompressor {
     22 public:
     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);
     30 
     31   /// @brief Resize the buffer and uncompress section data into it.
     32   /// @param Out         Destination buffer.
     33   Error decompress(SmallString<32> &Out);
     34 
     35   /// @brief Uncompress section data to raw buffer provided.
     36   /// @param Buffer      Destination buffer.
     37   Error decompress(MutableArrayRef<char> Buffer);
     38 
     39   /// @brief Return memory buffer size required for decompression.
     40   uint64_t getDecompressedSize() { return DecompressedSize; }
     41 
     42   /// @brief Return true if section is compressed, including gnu-styled case.
     43   static bool isCompressed(const object::SectionRef &Section);
     44 
     45   /// @brief Return true if section is a ELF compressed one.
     46   static bool isCompressedELFSection(uint64_t Flags, StringRef Name);
     47 
     48   /// @brief Return true if section name matches gnu style compressed one.
     49   static bool isGnuStyle(StringRef Name);
     50 
     51 private:
     52   Decompressor(StringRef Data);
     53 
     54   Error consumeCompressedGnuHeader();
     55   Error consumeCompressedZLibHeader(bool Is64Bit, bool IsLittleEndian);
     56 
     57   StringRef SectionData;
     58   uint64_t DecompressedSize;
     59 };
     60 
     61 } // end namespace object
     62 } // end namespace llvm
     63 
     64 #endif // LLVM_OBJECT_DECOMPRESSOR_H
     65