1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===-- Decompressor.h ------------------------------------------*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===/
- #ifndef LLVM_OBJECT_DECOMPRESSOR_H
- #define LLVM_OBJECT_DECOMPRESSOR_H
- #include "llvm/ADT/SmallString.h"
- #include "llvm/ADT/StringRef.h"
- #include "llvm/Object/ObjectFile.h"
- namespace llvm {
- namespace object {
- /// Decompressor helps to handle decompression of compressed sections.
- class Decompressor {
- public:
- /// Create decompressor object.
- /// @param Name Section name.
- /// @param Data Section content.
- /// @param IsLE Flag determines if Data is in little endian form.
- /// @param Is64Bit Flag determines if object is 64 bit.
- static Expected<Decompressor> create(StringRef Name, StringRef Data,
- bool IsLE, bool Is64Bit);
- /// Resize the buffer and uncompress section data into it.
- /// @param Out Destination buffer.
- template <class T> Error resizeAndDecompress(T &Out) {
- Out.resize(DecompressedSize);
- return decompress({Out.data(), (size_t)DecompressedSize});
- }
- /// Uncompress section data to raw buffer provided.
- /// @param Buffer Destination buffer.
- Error decompress(MutableArrayRef<char> Buffer);
- /// Return memory buffer size required for decompression.
- uint64_t getDecompressedSize() { return DecompressedSize; }
- /// Return true if section is compressed, including gnu-styled case.
- static bool isCompressed(const object::SectionRef &Section);
- /// Return true if section is a ELF compressed one.
- static bool isCompressedELFSection(uint64_t Flags, StringRef Name);
- /// Return true if section name matches gnu style compressed one.
- static bool isGnuStyle(StringRef Name);
- private:
- Decompressor(StringRef Data);
- Error consumeCompressedGnuHeader();
- Error consumeCompressedZLibHeader(bool Is64Bit, bool IsLittleEndian);
- StringRef SectionData;
- uint64_t DecompressedSize;
- };
- } // end namespace object
- } // end namespace llvm
- #endif // LLVM_OBJECT_DECOMPRESSOR_H
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|