xref: /netbsd-src/external/apache2/llvm/dist/llvm/lib/Support/Compression.cpp (revision 82d56013d7b633d116a93943de88e08335357a7c)
17330f729Sjoerg //===--- Compression.cpp - Compression implementation ---------------------===//
27330f729Sjoerg //
37330f729Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47330f729Sjoerg // See https://llvm.org/LICENSE.txt for license information.
57330f729Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67330f729Sjoerg //
77330f729Sjoerg //===----------------------------------------------------------------------===//
87330f729Sjoerg //
97330f729Sjoerg //  This file implements compression functions.
107330f729Sjoerg //
117330f729Sjoerg //===----------------------------------------------------------------------===//
127330f729Sjoerg 
137330f729Sjoerg #include "llvm/Support/Compression.h"
147330f729Sjoerg #include "llvm/ADT/SmallVector.h"
157330f729Sjoerg #include "llvm/ADT/StringRef.h"
167330f729Sjoerg #include "llvm/Config/config.h"
177330f729Sjoerg #include "llvm/Support/Compiler.h"
187330f729Sjoerg #include "llvm/Support/Error.h"
197330f729Sjoerg #include "llvm/Support/ErrorHandling.h"
20*82d56013Sjoerg #if LLVM_ENABLE_ZLIB
217330f729Sjoerg #include <zlib.h>
227330f729Sjoerg #endif
237330f729Sjoerg 
247330f729Sjoerg using namespace llvm;
257330f729Sjoerg 
26*82d56013Sjoerg #if LLVM_ENABLE_ZLIB
createError(StringRef Err)277330f729Sjoerg static Error createError(StringRef Err) {
287330f729Sjoerg   return make_error<StringError>(Err, inconvertibleErrorCode());
297330f729Sjoerg }
307330f729Sjoerg 
convertZlibCodeToString(int Code)317330f729Sjoerg static StringRef convertZlibCodeToString(int Code) {
327330f729Sjoerg   switch (Code) {
337330f729Sjoerg   case Z_MEM_ERROR:
347330f729Sjoerg     return "zlib error: Z_MEM_ERROR";
357330f729Sjoerg   case Z_BUF_ERROR:
367330f729Sjoerg     return "zlib error: Z_BUF_ERROR";
377330f729Sjoerg   case Z_STREAM_ERROR:
387330f729Sjoerg     return "zlib error: Z_STREAM_ERROR";
397330f729Sjoerg   case Z_DATA_ERROR:
407330f729Sjoerg     return "zlib error: Z_DATA_ERROR";
417330f729Sjoerg   case Z_OK:
427330f729Sjoerg   default:
437330f729Sjoerg     llvm_unreachable("unknown or unexpected zlib status code");
447330f729Sjoerg   }
457330f729Sjoerg }
467330f729Sjoerg 
isAvailable()477330f729Sjoerg bool zlib::isAvailable() { return true; }
487330f729Sjoerg 
compress(StringRef InputBuffer,SmallVectorImpl<char> & CompressedBuffer,int Level)497330f729Sjoerg Error zlib::compress(StringRef InputBuffer,
507330f729Sjoerg                      SmallVectorImpl<char> &CompressedBuffer, int Level) {
517330f729Sjoerg   unsigned long CompressedSize = ::compressBound(InputBuffer.size());
527330f729Sjoerg   CompressedBuffer.reserve(CompressedSize);
537330f729Sjoerg   int Res =
547330f729Sjoerg       ::compress2((Bytef *)CompressedBuffer.data(), &CompressedSize,
557330f729Sjoerg                   (const Bytef *)InputBuffer.data(), InputBuffer.size(), Level);
567330f729Sjoerg   // Tell MemorySanitizer that zlib output buffer is fully initialized.
577330f729Sjoerg   // This avoids a false report when running LLVM with uninstrumented ZLib.
587330f729Sjoerg   __msan_unpoison(CompressedBuffer.data(), CompressedSize);
597330f729Sjoerg   CompressedBuffer.set_size(CompressedSize);
607330f729Sjoerg   return Res ? createError(convertZlibCodeToString(Res)) : Error::success();
617330f729Sjoerg }
627330f729Sjoerg 
uncompress(StringRef InputBuffer,char * UncompressedBuffer,size_t & UncompressedSize)637330f729Sjoerg Error zlib::uncompress(StringRef InputBuffer, char *UncompressedBuffer,
647330f729Sjoerg                        size_t &UncompressedSize) {
657330f729Sjoerg   int Res =
667330f729Sjoerg       ::uncompress((Bytef *)UncompressedBuffer, (uLongf *)&UncompressedSize,
677330f729Sjoerg                    (const Bytef *)InputBuffer.data(), InputBuffer.size());
687330f729Sjoerg   // Tell MemorySanitizer that zlib output buffer is fully initialized.
697330f729Sjoerg   // This avoids a false report when running LLVM with uninstrumented ZLib.
707330f729Sjoerg   __msan_unpoison(UncompressedBuffer, UncompressedSize);
717330f729Sjoerg   return Res ? createError(convertZlibCodeToString(Res)) : Error::success();
727330f729Sjoerg }
737330f729Sjoerg 
uncompress(StringRef InputBuffer,SmallVectorImpl<char> & UncompressedBuffer,size_t UncompressedSize)747330f729Sjoerg Error zlib::uncompress(StringRef InputBuffer,
757330f729Sjoerg                        SmallVectorImpl<char> &UncompressedBuffer,
767330f729Sjoerg                        size_t UncompressedSize) {
77*82d56013Sjoerg   UncompressedBuffer.reserve(UncompressedSize);
787330f729Sjoerg   Error E =
797330f729Sjoerg       uncompress(InputBuffer, UncompressedBuffer.data(), UncompressedSize);
80*82d56013Sjoerg   UncompressedBuffer.set_size(UncompressedSize);
817330f729Sjoerg   return E;
827330f729Sjoerg }
837330f729Sjoerg 
crc32(StringRef Buffer)847330f729Sjoerg uint32_t zlib::crc32(StringRef Buffer) {
857330f729Sjoerg   return ::crc32(0, (const Bytef *)Buffer.data(), Buffer.size());
867330f729Sjoerg }
877330f729Sjoerg 
887330f729Sjoerg #else
isAvailable()897330f729Sjoerg bool zlib::isAvailable() { return false; }
compress(StringRef InputBuffer,SmallVectorImpl<char> & CompressedBuffer,int Level)907330f729Sjoerg Error zlib::compress(StringRef InputBuffer,
917330f729Sjoerg                      SmallVectorImpl<char> &CompressedBuffer, int Level) {
927330f729Sjoerg   llvm_unreachable("zlib::compress is unavailable");
937330f729Sjoerg }
uncompress(StringRef InputBuffer,char * UncompressedBuffer,size_t & UncompressedSize)947330f729Sjoerg Error zlib::uncompress(StringRef InputBuffer, char *UncompressedBuffer,
957330f729Sjoerg                        size_t &UncompressedSize) {
967330f729Sjoerg   llvm_unreachable("zlib::uncompress is unavailable");
977330f729Sjoerg }
uncompress(StringRef InputBuffer,SmallVectorImpl<char> & UncompressedBuffer,size_t UncompressedSize)987330f729Sjoerg Error zlib::uncompress(StringRef InputBuffer,
997330f729Sjoerg                        SmallVectorImpl<char> &UncompressedBuffer,
1007330f729Sjoerg                        size_t UncompressedSize) {
1017330f729Sjoerg   llvm_unreachable("zlib::uncompress is unavailable");
1027330f729Sjoerg }
crc32(StringRef Buffer)1037330f729Sjoerg uint32_t zlib::crc32(StringRef Buffer) {
1047330f729Sjoerg   llvm_unreachable("zlib::crc32 is unavailable");
1057330f729Sjoerg }
1067330f729Sjoerg #endif
107