//===-- llvm/Support/Compression.h ---Compression----------------*- 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
 
//
 
//===----------------------------------------------------------------------===//
 
//
 
// This file contains basic functions for compression/decompression.
 
//
 
//===----------------------------------------------------------------------===//
 
 
 
#ifndef LLVM_SUPPORT_COMPRESSION_H
 
#define LLVM_SUPPORT_COMPRESSION_H
 
 
 
#include "llvm/ADT/ArrayRef.h"
 
#include "llvm/Support/DataTypes.h"
 
 
 
namespace llvm {
 
template <typename T> class SmallVectorImpl;
 
class Error;
 
 
 
// None indicates no compression. The other members are a subset of
 
// compression::Format, which is used for compressed debug sections in some
 
// object file formats (e.g. ELF). This is a separate class as we may add new
 
// compression::Format members for non-debugging purposes.
 
enum class DebugCompressionType {
 
  None, ///< No compression
 
  Zlib, ///< zlib
 
  Zstd, ///< Zstandard
 
};
 
 
 
namespace compression {
 
namespace zlib {
 
 
 
constexpr int NoCompression = 0;
 
constexpr int BestSpeedCompression = 1;
 
constexpr int DefaultCompression = 6;
 
constexpr int BestSizeCompression = 9;
 
 
 
bool isAvailable();
 
 
 
void compress(ArrayRef<uint8_t> Input,
 
              SmallVectorImpl<uint8_t> &CompressedBuffer,
 
              int Level = DefaultCompression);
 
 
 
Error decompress(ArrayRef<uint8_t> Input, uint8_t *Output,
 
                 size_t &UncompressedSize);
 
 
 
Error decompress(ArrayRef<uint8_t> Input, SmallVectorImpl<uint8_t> &Output,
 
                 size_t UncompressedSize);
 
 
 
} // End of namespace zlib
 
 
 
namespace zstd {
 
 
 
constexpr int NoCompression = -5;
 
constexpr int BestSpeedCompression = 1;
 
constexpr int DefaultCompression = 5;
 
constexpr int BestSizeCompression = 12;
 
 
 
bool isAvailable();
 
 
 
void compress(ArrayRef<uint8_t> Input,
 
              SmallVectorImpl<uint8_t> &CompressedBuffer,
 
              int Level = DefaultCompression);
 
 
 
Error decompress(ArrayRef<uint8_t> Input, uint8_t *Output,
 
                 size_t &UncompressedSize);
 
 
 
Error decompress(ArrayRef<uint8_t> Input, SmallVectorImpl<uint8_t> &Output,
 
                 size_t UncompressedSize);
 
 
 
} // End of namespace zstd
 
 
 
enum class Format {
 
  Zlib,
 
  Zstd,
 
};
 
 
 
inline Format formatFor(DebugCompressionType Type) {
 
  switch (Type) {
 
  case DebugCompressionType::None:
 
    llvm_unreachable("not a compression type");
 
  case DebugCompressionType::Zlib:
 
    return Format::Zlib;
 
  case DebugCompressionType::Zstd:
 
    return Format::Zstd;
 
  }
 
  llvm_unreachable("");
 
}
 
 
 
struct Params {
 
  constexpr Params(Format F)
 
      : format(F), level(F == Format::Zlib ? zlib::DefaultCompression
 
                                           : zstd::DefaultCompression) {}
 
  Params(DebugCompressionType Type) : Params(formatFor(Type)) {}
 
 
 
  Format format;
 
  int level;
 
  // This may support multi-threading for zstd in the future. Note that
 
  // different threads may produce different output, so be careful if certain
 
  // output determinism is desired.
 
};
 
 
 
// Return nullptr if LLVM was built with support (LLVM_ENABLE_ZLIB,
 
// LLVM_ENABLE_ZSTD) for the specified compression format; otherwise
 
// return a string literal describing the reason.
 
const char *getReasonIfUnsupported(Format F);
 
 
 
// Compress Input with the specified format P.Format. If Level is -1, use
 
// *::DefaultCompression for the format.
 
void compress(Params P, ArrayRef<uint8_t> Input,
 
              SmallVectorImpl<uint8_t> &Output);
 
 
 
// Decompress Input. The uncompressed size must be available.
 
Error decompress(DebugCompressionType T, ArrayRef<uint8_t> Input,
 
                 uint8_t *Output, size_t UncompressedSize);
 
Error decompress(Format F, ArrayRef<uint8_t> Input,
 
                 SmallVectorImpl<uint8_t> &Output, size_t UncompressedSize);
 
Error decompress(DebugCompressionType T, ArrayRef<uint8_t> Input,
 
                 SmallVectorImpl<uint8_t> &Output, size_t UncompressedSize);
 
 
 
} // End of namespace compression
 
 
 
} // End of namespace llvm
 
 
 
#endif