clang 20.0.0 (based on r547379) from build 12806354. Bug: http://b/379133546 Test: N/A Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
132 lines
4.2 KiB
C++
132 lines
4.2 KiB
C++
//===-- 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, bool EnableLdm = false);
|
|
|
|
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) {}
|
|
constexpr Params(Format F, int L, bool Ldm = false)
|
|
: format(F), level(L), zstdEnableLdm(Ldm) {}
|
|
Params(DebugCompressionType Type) : Params(formatFor(Type)) {}
|
|
|
|
Format format;
|
|
int level;
|
|
bool zstdEnableLdm = false; // Enable zstd long distance matching
|
|
// 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
|