diff --git a/clang-tools-extra/clangd/index/Serialization.cpp b/clang-tools-extra/clangd/index/Serialization.cpp index f7045f0be3fde8..ee86ed5714ecca 100644 --- a/clang-tools-extra/clangd/index/Serialization.cpp +++ b/clang-tools-extra/clangd/index/Serialization.cpp @@ -190,9 +190,9 @@ class StringTableOut { RawTable.append(std::string(S)); RawTable.push_back(0); } - if (llvm::zlib::isAvailable()) { + if (llvm::compression::zlib::isAvailable()) { llvm::SmallString<1> Compressed; - llvm::zlib::compress(RawTable, Compressed); + llvm::compression::zlib::compress(RawTable, Compressed); write32(RawTable.size(), OS); OS << Compressed; } else { @@ -223,7 +223,7 @@ llvm::Expected readStringTable(llvm::StringRef Data) { llvm::SmallString<1> UncompressedStorage; if (UncompressedSize == 0) // No compression Uncompressed = R.rest(); - else if (llvm::zlib::isAvailable()) { + else if (llvm::compression::zlib::isAvailable()) { // Don't allocate a massive buffer if UncompressedSize was corrupted // This is effective for sharded index, but not big monolithic ones, as // once compressed size reaches 4MB nothing can be ruled out. @@ -233,8 +233,8 @@ llvm::Expected readStringTable(llvm::StringRef Data) { return error("Bad stri table: uncompress {0} -> {1} bytes is implausible", R.rest().size(), UncompressedSize); - if (llvm::Error E = llvm::zlib::uncompress(R.rest(), UncompressedStorage, - UncompressedSize)) + if (llvm::Error E = llvm::compression::zlib::uncompress( + R.rest(), UncompressedStorage, UncompressedSize)) return std::move(E); Uncompressed = UncompressedStorage; } else diff --git a/clang-tools-extra/clangd/unittests/SerializationTests.cpp b/clang-tools-extra/clangd/unittests/SerializationTests.cpp index 70873efe5776ca..e99626ba75d77a 100644 --- a/clang-tools-extra/clangd/unittests/SerializationTests.cpp +++ b/clang-tools-extra/clangd/unittests/SerializationTests.cpp @@ -391,7 +391,7 @@ TEST(SerializationTest, NoCrashOnBadArraySize) { // Check we detect invalid string table size size without allocating it first. // If this detection fails, the test should allocate a huge array and crash. TEST(SerializationTest, NoCrashOnBadStringTableSize) { - if (!llvm::zlib::isAvailable()) { + if (!llvm::compression::zlib::isAvailable()) { log("skipping test, no zlib"); return; } diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 10d2b9202b7c62..2c4d39343183cf 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1144,7 +1144,7 @@ static void RenderDebugInfoCompressionArgs(const ArgList &Args, if (Value == "none") { CmdArgs.push_back("--compress-debug-sections=none"); } else if (Value == "zlib") { - if (llvm::zlib::isAvailable()) { + if (llvm::compression::zlib::isAvailable()) { CmdArgs.push_back( Args.MakeArgString("--compress-debug-sections=" + Twine(Value))); } else { diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index d853805bf97e87..096f4a5514b17c 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -1462,13 +1462,13 @@ bool ASTReader::ReadSLocEntry(int ID) { unsigned RecCode = MaybeRecCode.get(); if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) { - if (!llvm::zlib::isAvailable()) { + if (!llvm::compression::zlib::isAvailable()) { Error("zlib is not available"); return nullptr; } SmallString<0> Uncompressed; - if (llvm::Error E = - llvm::zlib::uncompress(Blob, Uncompressed, Record[0])) { + if (llvm::Error E = llvm::compression::zlib::uncompress( + Blob, Uncompressed, Record[0])) { Error("could not decompress embedded file contents: " + llvm::toString(std::move(E))); return nullptr; diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 1787909bb6f771..290557386e63da 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -2001,8 +2001,8 @@ static void emitBlob(llvm::BitstreamWriter &Stream, StringRef Blob, // Compress the buffer if possible. We expect that almost all PCM // consumers will not want its contents. SmallString<0> CompressedBuffer; - if (llvm::zlib::isAvailable()) { - llvm::zlib::compress(Blob.drop_back(1), CompressedBuffer); + if (llvm::compression::zlib::isAvailable()) { + llvm::compression::zlib::compress(Blob.drop_back(1), CompressedBuffer); RecordDataType Record[] = {SM_SLOC_BUFFER_BLOB_COMPRESSED, Blob.size() - 1}; Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv, Record, CompressedBuffer); diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 659f20967282a4..4c26cba1cb4f82 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -951,7 +951,7 @@ static bool getCompressDebugSections(opt::InputArgList &args) { return false; if (s != "zlib") error("unknown --compress-debug-sections value: " + s); - if (!zlib::isAvailable()) + if (!compression::zlib::isAvailable()) error("--compress-debug-sections: zlib is not available"); return true; } diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 0dd17ae4bbcb33..f34718e8ed750d 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -73,7 +73,7 @@ InputSectionBase::InputSectionBase(InputFile *file, uint64_t flags, // If SHF_COMPRESSED is set, parse the header. The legacy .zdebug format is no // longer supported. if (flags & SHF_COMPRESSED) { - if (!zlib::isAvailable()) + if (!compression::zlib::isAvailable()) error(toString(file) + ": contains a compressed section, " + "but zlib is not available"); invokeELFT(parseCompressedHeader); @@ -122,7 +122,8 @@ void InputSectionBase::uncompress() const { uncompressedBuf = bAlloc().Allocate(size); } - if (Error e = zlib::uncompress(toStringRef(rawData), uncompressedBuf, size)) + if (Error e = compression::zlib::uncompress(toStringRef(rawData), + uncompressedBuf, size)) fatal(toString(this) + ": uncompress failed: " + llvm::toString(std::move(e))); rawData = makeArrayRef((uint8_t *)uncompressedBuf, size); @@ -1217,7 +1218,8 @@ template void InputSection::writeTo(uint8_t *buf) { // to the buffer. if (uncompressedSize >= 0) { size_t size = uncompressedSize; - if (Error e = zlib::uncompress(toStringRef(rawData), (char *)buf, size)) + if (Error e = compression::zlib::uncompress(toStringRef(rawData), + (char *)buf, size)) fatal(toString(this) + ": uncompress failed: " + llvm::toString(std::move(e))); uint8_t *bufEnd = buf + size; diff --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst index 23810a9227ebe3..756ed3e98c3bd5 100644 --- a/llvm/docs/ReleaseNotes.rst +++ b/llvm/docs/ReleaseNotes.rst @@ -202,6 +202,11 @@ Changes to the C API * Add ``LLVMDeleteInstruction`` function which allows deleting instructions that are not inserted into a basic block. +* Refactor compression namespaces across the project, making way for a possible + introduction of alternatives to zlib compression in the llvm toolchain. + Changes are as follows: + * Relocate the ``llvm::zlib`` namespace to ``llvm::compression::zlib``. + Changes to the Go bindings -------------------------- diff --git a/llvm/include/llvm/Support/Compression.h b/llvm/include/llvm/Support/Compression.h index e6f898229412e3..7d9e12e771f31f 100644 --- a/llvm/include/llvm/Support/Compression.h +++ b/llvm/include/llvm/Support/Compression.h @@ -20,6 +20,8 @@ template class SmallVectorImpl; class Error; class StringRef; +namespace compression { + namespace zlib { static constexpr int NoCompression = 0; @@ -41,7 +43,9 @@ Error uncompress(StringRef InputBuffer, uint32_t crc32(StringRef Buffer); -} // End of namespace zlib +} // End of namespace zlib + +} // End of namespace compression } // End of namespace llvm diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index eda495693595db..14ea5dc2fddd24 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -876,8 +876,9 @@ void ELFWriter::writeSectionData(const MCAssembler &Asm, MCSection &Sec, Asm.writeSectionData(VecOS, &Section, Layout); SmallVector CompressedContents; - zlib::compress(StringRef(UncompressedData.data(), UncompressedData.size()), - CompressedContents); + compression::zlib::compress( + StringRef(UncompressedData.data(), UncompressedData.size()), + CompressedContents); bool ZlibStyle = MAI->compressDebugSections() == DebugCompressionType::Z; if (!maybeWriteCompression(UncompressedData.size(), CompressedContents, diff --git a/llvm/lib/ObjCopy/ELF/ELFObject.cpp b/llvm/lib/ObjCopy/ELF/ELFObject.cpp index 72ea63d5213764..9f4101b135af76 100644 --- a/llvm/lib/ObjCopy/ELF/ELFObject.cpp +++ b/llvm/lib/ObjCopy/ELF/ELFObject.cpp @@ -468,8 +468,9 @@ Error ELFSectionWriter::visit(const DecompressedSection &Sec) { Sec.OriginalData.size() - DataOffset); SmallVector DecompressedContent; - if (Error Err = zlib::uncompress(CompressedContent, DecompressedContent, - static_cast(Sec.Size))) + if (Error Err = + compression::zlib::uncompress(CompressedContent, DecompressedContent, + static_cast(Sec.Size))) return createStringError(errc::invalid_argument, "'" + Sec.Name + "': " + toString(std::move(Err))); @@ -544,9 +545,10 @@ CompressedSection::CompressedSection(const SectionBase &Sec, DebugCompressionType CompressionType) : SectionBase(Sec), CompressionType(CompressionType), DecompressedSize(Sec.OriginalData.size()), DecompressedAlign(Sec.Align) { - zlib::compress(StringRef(reinterpret_cast(OriginalData.data()), - OriginalData.size()), - CompressedData); + compression::zlib::compress( + StringRef(reinterpret_cast(OriginalData.data()), + OriginalData.size()), + CompressedData); assert(CompressionType != DebugCompressionType::None); Flags |= ELF::SHF_COMPRESSED; diff --git a/llvm/lib/Object/Decompressor.cpp b/llvm/lib/Object/Decompressor.cpp index de067ed59ac541..787ca7a303213a 100644 --- a/llvm/lib/Object/Decompressor.cpp +++ b/llvm/lib/Object/Decompressor.cpp @@ -19,7 +19,7 @@ using namespace object; Expected Decompressor::create(StringRef Name, StringRef Data, bool IsLE, bool Is64Bit) { - if (!zlib::isAvailable()) + if (!compression::zlib::isAvailable()) return createError("zlib is not available"); Decompressor D(Data); @@ -94,5 +94,5 @@ bool Decompressor::isCompressedELFSection(uint64_t Flags, StringRef Name) { Error Decompressor::decompress(MutableArrayRef Buffer) { size_t Size = Buffer.size(); - return zlib::uncompress(SectionData, Buffer.data(), Size); + return compression::zlib::uncompress(SectionData, Buffer.data(), Size); } diff --git a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp index 1a187795a8a0dc..d34f25703ec5da 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp @@ -119,7 +119,7 @@ Error RawCoverageFilenamesReader::read(CovMapVersion Version) { return Err; if (CompressedLen > 0) { - if (!zlib::isAvailable()) + if (!compression::zlib::isAvailable()) return make_error( coveragemap_error::decompression_failed); @@ -129,8 +129,8 @@ Error RawCoverageFilenamesReader::read(CovMapVersion Version) { // Read compressed filenames. StringRef CompressedFilenames = Data.substr(0, CompressedLen); Data = Data.substr(CompressedLen); - auto Err = - zlib::uncompress(CompressedFilenames, StorageBuf, UncompressedLen); + auto Err = compression::zlib::uncompress(CompressedFilenames, StorageBuf, + UncompressedLen); if (Err) { consumeError(std::move(Err)); return make_error( diff --git a/llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp b/llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp index 781a2901dbb9f6..19b5bce785a44b 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp @@ -47,10 +47,11 @@ void CoverageFilenamesSectionWriter::write(raw_ostream &OS, bool Compress) { } SmallString<128> CompressedStr; - bool doCompression = - Compress && zlib::isAvailable() && DoInstrProfNameCompression; + bool doCompression = Compress && compression::zlib::isAvailable() && + DoInstrProfNameCompression; if (doCompression) - zlib::compress(FilenamesStr, CompressedStr, zlib::BestSizeCompression); + compression::zlib::compress(FilenamesStr, CompressedStr, + compression::zlib::BestSizeCompression); // ::= // diff --git a/llvm/lib/ProfileData/InstrProf.cpp b/llvm/lib/ProfileData/InstrProf.cpp index 48ac5ce0d60788..183f23058426c3 100644 --- a/llvm/lib/ProfileData/InstrProf.cpp +++ b/llvm/lib/ProfileData/InstrProf.cpp @@ -467,8 +467,9 @@ Error collectPGOFuncNameStrings(ArrayRef NameStrs, } SmallString<128> CompressedNameStrings; - zlib::compress(StringRef(UncompressedNameStrings), CompressedNameStrings, - zlib::BestSizeCompression); + compression::zlib::compress(StringRef(UncompressedNameStrings), + CompressedNameStrings, + compression::zlib::BestSizeCompression); return WriteStringToResult(CompressedNameStrings.size(), CompressedNameStrings); @@ -488,7 +489,7 @@ Error collectPGOFuncNameStrings(ArrayRef NameVars, NameStrs.push_back(std::string(getPGOFuncNameVarInitializer(NameVar))); } return collectPGOFuncNameStrings( - NameStrs, zlib::isAvailable() && doCompression, Result); + NameStrs, compression::zlib::isAvailable() && doCompression, Result); } Error readPGOFuncNameStrings(StringRef NameStrings, InstrProfSymtab &Symtab) { @@ -504,14 +505,14 @@ Error readPGOFuncNameStrings(StringRef NameStrings, InstrProfSymtab &Symtab) { SmallString<128> UncompressedNameStrings; StringRef NameStrings; if (isCompressed) { - if (!llvm::zlib::isAvailable()) + if (!llvm::compression::zlib::isAvailable()) return make_error(instrprof_error::zlib_unavailable); StringRef CompressedNameStrings(reinterpret_cast(P), CompressedSize); - if (Error E = - zlib::uncompress(CompressedNameStrings, UncompressedNameStrings, - UncompressedSize)) { + if (Error E = compression::zlib::uncompress(CompressedNameStrings, + UncompressedNameStrings, + UncompressedSize)) { consumeError(std::move(E)); return make_error(instrprof_error::uncompress_failed); } diff --git a/llvm/lib/ProfileData/SampleProfReader.cpp b/llvm/lib/ProfileData/SampleProfReader.cpp index 280e3c6cb8d1a9..628d5e45f2d295 100644 --- a/llvm/lib/ProfileData/SampleProfReader.cpp +++ b/llvm/lib/ProfileData/SampleProfReader.cpp @@ -877,7 +877,7 @@ std::error_code SampleProfileReaderExtBinaryBase::decompressSection( if (std::error_code EC = CompressSize.getError()) return EC; - if (!llvm::zlib::isAvailable()) + if (!llvm::compression::zlib::isAvailable()) return sampleprof_error::zlib_unavailable; StringRef CompressedStrings(reinterpret_cast(Data), @@ -885,7 +885,7 @@ std::error_code SampleProfileReaderExtBinaryBase::decompressSection( char *Buffer = Allocator.Allocate(DecompressBufSize); size_t UCSize = DecompressBufSize; llvm::Error E = - zlib::uncompress(CompressedStrings, Buffer, UCSize); + compression::zlib::uncompress(CompressedStrings, Buffer, UCSize); if (E) return sampleprof_error::uncompress_failed; DecompressBuf = reinterpret_cast(Buffer); diff --git a/llvm/lib/ProfileData/SampleProfWriter.cpp b/llvm/lib/ProfileData/SampleProfWriter.cpp index 8ec6b7ebc29ee3..6db874f803bed4 100644 --- a/llvm/lib/ProfileData/SampleProfWriter.cpp +++ b/llvm/lib/ProfileData/SampleProfWriter.cpp @@ -78,7 +78,7 @@ SampleProfileWriterExtBinaryBase::markSectionStart(SecType Type, } std::error_code SampleProfileWriterExtBinaryBase::compressAndOutput() { - if (!llvm::zlib::isAvailable()) + if (!llvm::compression::zlib::isAvailable()) return sampleprof_error::zlib_unavailable; std::string &UncompressedStrings = static_cast(LocalBufStream.get())->str(); @@ -86,8 +86,8 @@ std::error_code SampleProfileWriterExtBinaryBase::compressAndOutput() { return sampleprof_error::success; auto &OS = *OutputStream; SmallString<128> CompressedStrings; - zlib::compress(UncompressedStrings, CompressedStrings, - zlib::BestSizeCompression); + compression::zlib::compress(UncompressedStrings, CompressedStrings, + compression::zlib::BestSizeCompression); encodeULEB128(UncompressedStrings.size(), OS); encodeULEB128(CompressedStrings.size(), OS); OS << CompressedStrings.str(); diff --git a/llvm/lib/Support/Compression.cpp b/llvm/lib/Support/Compression.cpp index 983a6348bbe4ec..c1a64d56119c38 100644 --- a/llvm/lib/Support/Compression.cpp +++ b/llvm/lib/Support/Compression.cpp @@ -22,11 +22,9 @@ #endif using namespace llvm; +using namespace llvm::compression; #if LLVM_ENABLE_ZLIB -static Error createError(StringRef Err) { - return make_error(Err, inconvertibleErrorCode()); -} static StringRef convertZlibCodeToString(int Code) { switch (Code) { @@ -70,15 +68,17 @@ Error zlib::uncompress(StringRef InputBuffer, char *UncompressedBuffer, // Tell MemorySanitizer that zlib output buffer is fully initialized. // This avoids a false report when running LLVM with uninstrumented ZLib. __msan_unpoison(UncompressedBuffer, UncompressedSize); - return Res ? createError(convertZlibCodeToString(Res)) : Error::success(); + return Res ? make_error(convertZlibCodeToString(Res), + inconvertibleErrorCode()) + : Error::success(); } Error zlib::uncompress(StringRef InputBuffer, SmallVectorImpl &UncompressedBuffer, size_t UncompressedSize) { UncompressedBuffer.resize_for_overwrite(UncompressedSize); - Error E = - uncompress(InputBuffer, UncompressedBuffer.data(), UncompressedSize); + Error E = zlib::uncompress(InputBuffer, UncompressedBuffer.data(), + UncompressedSize); UncompressedBuffer.truncate(UncompressedSize); return E; } diff --git a/llvm/tools/llvm-mc/llvm-mc.cpp b/llvm/tools/llvm-mc/llvm-mc.cpp index 2a525f53ec2987..3e737b9fbaa0ef 100644 --- a/llvm/tools/llvm-mc/llvm-mc.cpp +++ b/llvm/tools/llvm-mc/llvm-mc.cpp @@ -403,7 +403,7 @@ int main(int argc, char **argv) { MAI->setRelaxELFRelocations(RelaxELFRel); if (CompressDebugSections != DebugCompressionType::None) { - if (!zlib::isAvailable()) { + if (!compression::zlib::isAvailable()) { WithColor::error(errs(), ProgName) << "build tools with zlib to enable -compress-debug-sections"; return 1; diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp index 5b2b4b5704d81a..94841eff371444 100644 --- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp +++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp @@ -739,7 +739,7 @@ objcopy::parseObjcopyOptions(ArrayRef RawArgsArr, .str() .c_str()); } - if (!zlib::isAvailable()) + if (!compression::zlib::isAvailable()) return createStringError( errc::invalid_argument, "LLVM was not compiled with LLVM_ENABLE_ZLIB: can not compress"); @@ -998,7 +998,7 @@ objcopy::parseObjcopyOptions(ArrayRef RawArgsArr, "--decompress-debug-sections"); } - if (Config.DecompressDebugSections && !zlib::isAvailable()) + if (Config.DecompressDebugSections && !compression::zlib::isAvailable()) return createStringError( errc::invalid_argument, "LLVM was not compiled with LLVM_ENABLE_ZLIB: cannot decompress"); diff --git a/llvm/unittests/ProfileData/InstrProfTest.cpp b/llvm/unittests/ProfileData/InstrProfTest.cpp index e097b374224e0f..6f11a2e6262205 100644 --- a/llvm/unittests/ProfileData/InstrProfTest.cpp +++ b/llvm/unittests/ProfileData/InstrProfTest.cpp @@ -1147,14 +1147,16 @@ TEST_P(MaybeSparseInstrProfTest, instr_prof_symtab_compression_test) { // Compressing: std::string FuncNameStrings1; EXPECT_THAT_ERROR(collectPGOFuncNameStrings( - FuncNames1, (DoCompression && zlib::isAvailable()), + FuncNames1, + (DoCompression && compression::zlib::isAvailable()), FuncNameStrings1), Succeeded()); // Compressing: std::string FuncNameStrings2; EXPECT_THAT_ERROR(collectPGOFuncNameStrings( - FuncNames2, (DoCompression && zlib::isAvailable()), + FuncNames2, + (DoCompression && compression::zlib::isAvailable()), FuncNameStrings2), Succeeded()); diff --git a/llvm/unittests/Support/CompressionTest.cpp b/llvm/unittests/Support/CompressionTest.cpp index 911069f39f11ca..4c351cfbb70fb5 100644 --- a/llvm/unittests/Support/CompressionTest.cpp +++ b/llvm/unittests/Support/CompressionTest.cpp @@ -18,6 +18,7 @@ #include "gtest/gtest.h" using namespace llvm; +using namespace llvm::compression; namespace {