aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Support/Compression.cpp
diff options
context:
space:
mode:
authorFangrui Song <i@maskray.me>2022-09-08 00:58:54 -0700
committerFangrui Song <i@maskray.me>2022-09-08 00:58:55 -0700
commita41977dd0f4fd7aaad5ec380d50782296a690b47 (patch)
treef387eb917d2aec30288ec3c5fa73944cf995b2e7 /llvm/lib/Support/Compression.cpp
parentfd2475049e882e6c70a745cbe0799749ba184910 (diff)
downloadllvm-a41977dd0f4fd7aaad5ec380d50782296a690b47.zip
llvm-a41977dd0f4fd7aaad5ec380d50782296a690b47.tar.gz
llvm-a41977dd0f4fd7aaad5ec380d50782296a690b47.tar.bz2
[Support] Add llvm::compression::{getReasonIfUnsupported,compress,decompress}
as high-level API on top of `llvm::compression::{zlib,zstd}::*`: * getReasonIfUnsupported: return nullptr if the specified format is supported, or (if unsupported) a string like `LLVM was not built with LLVM_ENABLE_ZLIB ...` * compress: dispatch to zlib::uncompress or zstd::uncompress * decompress: dispatch to zlib::uncompress or zstd::uncompress Move `llvm::DebugCompressionType` from MC to Support to avoid Support->MC cyclic dependency. There are 40+ uses in llvm-project. Add another enum class `llvm::compression::Format` to represent supported compression formats, which may be a superset of ELF compression formats. See D130458 (llvm-objcopy --{,de}compress-debug-sections for zstd) for a use case. Link: https://discourse.llvm.org/t/rfc-zstandard-as-a-second-compression-method-to-llvm/63399 ("[RFC] Zstandard as a second compression method to LLVM") --- Note: this patch alone will cause -Wswitch to llvm/lib/ObjCopy/ELF/ELFObject.cpp Reviewed By: ckissane, dblaikie Differential Revision: https://reviews.llvm.org/D130506
Diffstat (limited to 'llvm/lib/Support/Compression.cpp')
-rw-r--r--llvm/lib/Support/Compression.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/llvm/lib/Support/Compression.cpp b/llvm/lib/Support/Compression.cpp
index e8fb715..9a04716 100644
--- a/llvm/lib/Support/Compression.cpp
+++ b/llvm/lib/Support/Compression.cpp
@@ -27,6 +27,52 @@
using namespace llvm;
using namespace llvm::compression;
+const char *compression::getReasonIfUnsupported(compression::Format F) {
+ switch (F) {
+ case compression::Format::Zlib:
+ if (zlib::isAvailable())
+ return nullptr;
+ return "LLVM was not built with LLVM_ENABLE_ZLIB or did not find zlib at "
+ "build time";
+ case compression::Format::Zstd:
+ if (zstd::isAvailable())
+ return nullptr;
+ return "LLVM was not built with LLVM_ENABLE_ZSTD or did not find zstd at "
+ "build time";
+ }
+ llvm_unreachable("");
+}
+
+void compression::compress(Params P, ArrayRef<uint8_t> Input,
+ SmallVectorImpl<uint8_t> &Output) {
+ switch (P.format) {
+ case compression::Format::Zlib:
+ zlib::compress(Input, Output, P.level);
+ break;
+ case compression::Format::Zstd:
+ zstd::compress(Input, Output, P.level);
+ break;
+ }
+}
+
+Error compression::decompress(compression::Format F, ArrayRef<uint8_t> Input,
+ SmallVectorImpl<uint8_t> &Output,
+ size_t UncompressedSize) {
+ switch (F) {
+ case compression::Format::Zlib:
+ return zlib::uncompress(Input, Output, UncompressedSize);
+ case compression::Format::Zstd:
+ return zstd::uncompress(Input, Output, UncompressedSize);
+ }
+ llvm_unreachable("");
+}
+
+Error compression::decompress(DebugCompressionType T, ArrayRef<uint8_t> Input,
+ SmallVectorImpl<uint8_t> &Output,
+ size_t UncompressedSize) {
+ return decompress(formatFor(T), Input, Output, UncompressedSize);
+}
+
#if LLVM_ENABLE_ZLIB
static StringRef convertZlibCodeToString(int Code) {