llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-analysis @llvm/pr-subscribers-clang Author: Aviral Goel (aviralg) <details> <summary>Changes</summary> This change removes support for `VFS` in `SerializationFormat` that was introduced in https://github.com/llvm/llvm-project/pull/179516/. `VFS` only provides a virtual input backend and its matched pair, `VirtualOutputBackend`, does not provide support for an `InMemoryOutputBackend`. There was an attempt from our end to implement this support in https://github.com/llvm/llvm-project/pull/179515 but it did not succeed. Supporting virtual reads but not virtual writes makes the SerializationFormat APIs asymmetric. So we have decided to remove `VFS` support altogether. --- Full diff: https://github.com/llvm/llvm-project/pull/180891.diff 7 Files Affected: - (modified) clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h (+1-5) - (modified) clang/include/clang/Analysis/Scalable/Serialization/SerializationFormatRegistry.h (+3-8) - (modified) clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp (-4) - (modified) clang/lib/Analysis/Scalable/Serialization/SerializationFormatRegistry.cpp (+3-5) - (modified) clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp (+6-5) - (modified) clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.h (+1-2) - (modified) clang/unittests/Analysis/Scalable/Registries/SerializationFormatRegistryTest.cpp (+28-9) ``````````diff diff --git a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h index c7438e2859da0..5a787d86adbcd 100644 --- a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h +++ b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h @@ -54,8 +54,7 @@ class SerializationFormat static const decltype(TUSummary::Data) &getData(const TUSummary &S); public: - explicit SerializationFormat( - llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS); + explicit SerializationFormat() = default; virtual ~SerializationFormat() = default; virtual TUSummary readTUSummary(llvm::StringRef Path) = 0; @@ -64,9 +63,6 @@ class SerializationFormat llvm::StringRef OutputDir) = 0; static char ID; // For RTTIExtends. - -protected: - llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS; }; template <class SerializerFn, class DeserializerFn> struct FormatInfoEntry { diff --git a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormatRegistry.h b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormatRegistry.h index 40281d549b402..d7e77b9b18f77 100644 --- a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormatRegistry.h +++ b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormatRegistry.h @@ -51,21 +51,16 @@ bool isFormatRegistered(llvm::StringRef FormatName); /// This might return null if the construction of the desired /// SerializationFormat failed. /// It's a fatal error if there is no format registered with the name. -std::unique_ptr<SerializationFormat> -makeFormat(llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS, - llvm::StringRef FormatName); +std::unique_ptr<SerializationFormat> makeFormat(llvm::StringRef FormatName); // Registry for adding new SerializationFormat implementations. -using SerializationFormatRegistry = - llvm::Registry<SerializationFormat, - llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>>; +using SerializationFormatRegistry = llvm::Registry<SerializationFormat>; } // namespace clang::ssaf namespace llvm { extern template class CLANG_TEMPLATE_ABI - Registry<clang::ssaf::SerializationFormat, - llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>>; + Registry<clang::ssaf::SerializationFormat>; } // namespace llvm #endif // CLANG_ANALYSIS_SCALABLE_SERIALIZATION_SERIALIZATION_FORMAT_REGISTRY_H diff --git a/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp b/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp index 1d62ea837616f..ca733c1b07051 100644 --- a/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp +++ b/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp @@ -14,10 +14,6 @@ using namespace clang::ssaf; -SerializationFormat::SerializationFormat( - llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS) - : FS(FS) {} - EntityIdTable &SerializationFormat::getIdTableForDeserialization(TUSummary &S) { return S.IdTable; } diff --git a/clang/lib/Analysis/Scalable/Serialization/SerializationFormatRegistry.cpp b/clang/lib/Analysis/Scalable/Serialization/SerializationFormatRegistry.cpp index f31a154866238..ed216b7691933 100644 --- a/clang/lib/Analysis/Scalable/Serialization/SerializationFormatRegistry.cpp +++ b/clang/lib/Analysis/Scalable/Serialization/SerializationFormatRegistry.cpp @@ -15,8 +15,7 @@ using namespace ssaf; // FIXME: LLVM_INSTANTIATE_REGISTRY can't be used here because it drops extra // type parameters. template class CLANG_EXPORT_TEMPLATE - llvm::Registry<clang::ssaf::SerializationFormat, - llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>>; + llvm::Registry<clang::ssaf::SerializationFormat>; bool ssaf::isFormatRegistered(llvm::StringRef FormatName) { for (const auto &Entry : SerializationFormatRegistry::entries()) @@ -26,11 +25,10 @@ bool ssaf::isFormatRegistered(llvm::StringRef FormatName) { } std::unique_ptr<SerializationFormat> -ssaf::makeFormat(llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS, - llvm::StringRef FormatName) { +ssaf::makeFormat(llvm::StringRef FormatName) { for (const auto &Entry : SerializationFormatRegistry::entries()) if (Entry.getName() == FormatName) - return Entry.instantiate(std::move(FS)); + return Entry.instantiate(); assert(false && "Unknown SerializationFormat name"); return nullptr; } diff --git a/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp b/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp index 03328e8bd9742..ec37f0e579518 100644 --- a/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp +++ b/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp @@ -17,6 +17,7 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/FileSystem.h" +#include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/raw_ostream.h" #include <cassert> #include <functional> @@ -28,9 +29,8 @@ using namespace ssaf; char MockSerializationFormat::ID = 0; -MockSerializationFormat::MockSerializationFormat( - llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS) - : llvm::RTTIExtends<MockSerializationFormat, SerializationFormat>(FS) { +MockSerializationFormat::MockSerializationFormat() + : llvm::RTTIExtends<MockSerializationFormat, SerializationFormat>() { for (const auto &FormatInfoEntry : llvm::Registry<FormatInfo>::entries()) { std::unique_ptr<FormatInfo> Info = FormatInfoEntry.instantiate(); bool Inserted = FormatInfos.try_emplace(Info->ForSummary, *Info).second; @@ -46,7 +46,7 @@ TUSummary MockSerializationFormat::readTUSummary(llvm::StringRef Path) { BuildNamespace NS(BuildNamespaceKind::CompilationUnit, "Mock.cpp"); TUSummary Summary(NS); - auto ManifestFile = FS->getBufferForFile(Path + "/analyses.txt"); + auto ManifestFile = llvm::MemoryBuffer::getFile(Path + "/analyses.txt"); assert(ManifestFile); // TODO Handle error. llvm::StringRef ManifestFileContent = (*ManifestFile)->getBuffer(); @@ -56,7 +56,8 @@ TUSummary MockSerializationFormat::readTUSummary(llvm::StringRef Path) { for (llvm::StringRef Analysis : Analyses) { SummaryName Name(Analysis.str()); - auto InputFile = FS->getBufferForFile(Path + "/" + Name.str() + ".special"); + auto InputFile = + llvm::MemoryBuffer::getFile(Path + "/" + Name.str() + ".special"); assert(InputFile); auto InfoIt = FormatInfos.find(Name); if (InfoIt == FormatInfos.end()) { diff --git a/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.h b/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.h index 25fb2f3b20551..c46d4e7288704 100644 --- a/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.h +++ b/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.h @@ -20,8 +20,7 @@ namespace clang::ssaf { class MockSerializationFormat final : public llvm::RTTIExtends<MockSerializationFormat, SerializationFormat> { public: - explicit MockSerializationFormat( - llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS); + explicit MockSerializationFormat(); TUSummary readTUSummary(llvm::StringRef Path) override; diff --git a/clang/unittests/Analysis/Scalable/Registries/SerializationFormatRegistryTest.cpp b/clang/unittests/Analysis/Scalable/Registries/SerializationFormatRegistryTest.cpp index 484c38309e3d8..7f17cdda5a082 100644 --- a/clang/unittests/Analysis/Scalable/Registries/SerializationFormatRegistryTest.cpp +++ b/clang/unittests/Analysis/Scalable/Registries/SerializationFormatRegistryTest.cpp @@ -13,7 +13,7 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Path.h" -#include "llvm/Support/VirtualFileSystem.h" +#include "llvm/Support/raw_ostream.h" #include "gtest/gtest.h" #include <memory> @@ -58,21 +58,40 @@ TEST(SerializationFormatRegistryTest, EnumeratingRegistryEntries) { } TEST(SerializationFormatRegistryTest, Roundtrip) { - auto Inputs = makeIntrusiveRefCnt<vfs::InMemoryFileSystem>(); - Inputs->addFile("input/analyses.txt", /*ModificationTime=*/{}, - MemoryBuffer::getMemBufferCopy("FancyAnalysis\n")); - Inputs->addFile("input/FancyAnalysis.special", /*ModificationTime=*/{}, - MemoryBuffer::getMemBufferCopy("Some FancyAnalysisData...")); + // Create temporary input directory + SmallString<128> InputDir; + std::error_code EC = sys::fs::createUniqueDirectory("ssaf-input", InputDir); + ASSERT_FALSE(EC) << "Failed to create input directory: " << EC.message(); + llvm::scope_exit CleanupInputOnExit( + [&] { sys::fs::remove_directories(InputDir); }); + + // Create input files + SmallString<128> AnalysesFile = InputDir; + sys::path::append(AnalysesFile, "analyses.txt"); + { + raw_fd_ostream OS(AnalysesFile, EC); + ASSERT_FALSE(EC) << "Failed to create analyses.txt: " << EC.message(); + OS << "FancyAnalysis\n"; + } + + SmallString<128> FancyAnalysisFile = InputDir; + sys::path::append(FancyAnalysisFile, "FancyAnalysis.special"); + { + raw_fd_ostream OS(FancyAnalysisFile, EC); + ASSERT_FALSE(EC) << "Failed to create FancyAnalysis.special: " + << EC.message(); + OS << "Some FancyAnalysisData..."; + } std::unique_ptr<SerializationFormat> Format = - makeFormat(Inputs, "MockSerializationFormat"); + makeFormat("MockSerializationFormat"); ASSERT_TRUE(Format); - TUSummary LoadedSummary = Format->readTUSummary("input"); + TUSummary LoadedSummary = Format->readTUSummary(InputDir); // Create a temporary output directory SmallString<128> OutputDir; - std::error_code EC = sys::fs::createUniqueDirectory("ssaf-test", OutputDir); + EC = sys::fs::createUniqueDirectory("ssaf-test", OutputDir); ASSERT_FALSE(EC) << "Failed to create temporary directory: " << EC.message(); llvm::scope_exit CleanupOnExit( [&] { sys::fs::remove_directories(OutputDir); }); `````````` </details> https://github.com/llvm/llvm-project/pull/180891 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
