X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FSupport%2FCompression.cpp;h=b5ddb7002cade054282a19d5cf9905c09fcd59f6;hb=6220c8f960fe287efcfc27f46ab6ad48e5b3c5d2;hp=497b17ec92b06b167a10d3c17aaed33f38b626a7;hpb=a0bd5df0867e054b9740bc734325cdeabfe3825a;p=oota-llvm.git diff --git a/lib/Support/Compression.cpp b/lib/Support/Compression.cpp index 497b17ec92b..b5ddb7002ca 100644 --- a/lib/Support/Compression.cpp +++ b/lib/Support/Compression.cpp @@ -15,6 +15,7 @@ #include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/StringRef.h" #include "llvm/Config/config.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MemoryBuffer.h" #if LLVM_ENABLE_ZLIB == 1 && HAVE_ZLIB_H @@ -31,6 +32,7 @@ static int encodeZlibCompressionLevel(zlib::CompressionLevel Level) { case zlib::DefaultCompression: return Z_DEFAULT_COMPRESSION; case zlib::BestSizeCompression: return 9; } + llvm_unreachable("Invalid zlib::CompressionLevel!"); } static zlib::Status encodeZlibReturnValue(int ReturnValue) { @@ -54,9 +56,12 @@ zlib::Status zlib::compress(StringRef InputBuffer, Status Res = encodeZlibReturnValue(::compress2( (Bytef *)TmpBuffer.get(), &CompressedSize, (const Bytef *)InputBuffer.data(), InputBuffer.size(), CLevel)); - if (Res == StatusOK) + if (Res == StatusOK) { CompressedBuffer.reset(MemoryBuffer::getMemBufferCopy( StringRef(TmpBuffer.get(), CompressedSize))); + // Tell MSan that memory initialized by zlib is valid. + __msan_unpoison(CompressedBuffer->getBufferStart(), CompressedSize); + } return Res; } @@ -67,12 +72,19 @@ zlib::Status zlib::uncompress(StringRef InputBuffer, Status Res = encodeZlibReturnValue( ::uncompress((Bytef *)TmpBuffer.get(), (uLongf *)&UncompressedSize, (const Bytef *)InputBuffer.data(), InputBuffer.size())); - if (Res == StatusOK) + if (Res == StatusOK) { UncompressedBuffer.reset(MemoryBuffer::getMemBufferCopy( StringRef(TmpBuffer.get(), UncompressedSize))); + // Tell MSan that memory initialized by zlib is valid. + __msan_unpoison(UncompressedBuffer->getBufferStart(), UncompressedSize); + } return Res; } +uint32_t zlib::crc32(StringRef Buffer) { + return ::crc32(0, (const Bytef *)Buffer.data(), Buffer.size()); +} + #else bool zlib::isAvailable() { return false; } zlib::Status zlib::compress(StringRef InputBuffer, @@ -85,5 +97,8 @@ zlib::Status zlib::uncompress(StringRef InputBuffer, size_t UncompressedSize) { return zlib::StatusUnsupported; } +uint32_t zlib::crc32(StringRef Buffer) { + llvm_unreachable("zlib::crc32 is unavailable"); +} #endif