[Lldb-commits] [lldb] 0e3c316 - [llvm][clang] Use the VFS in `FileCollector` (#160788)

via lldb-commits lldb-commits at lists.llvm.org
Fri Sep 26 08:17:35 PDT 2025


Author: Jan Svoboda
Date: 2025-09-26T08:17:31-07:00
New Revision: 0e3c3165ea33043b8fa0457e535f50ca59312278

URL: https://github.com/llvm/llvm-project/commit/0e3c3165ea33043b8fa0457e535f50ca59312278
DIFF: https://github.com/llvm/llvm-project/commit/0e3c3165ea33043b8fa0457e535f50ca59312278.diff

LOG: [llvm][clang] Use the VFS in `FileCollector` (#160788)

This PR changes `llvm::FileCollector` to use the `llvm::vfs::FileSystem`
API for making file paths absolute instead of using
`llvm::sys::fs::make_absolute()` directly. This matches the behavior of
the compiler on most other input files.

Added: 
    

Modified: 
    clang/include/clang/Frontend/Utils.h
    clang/lib/Frontend/CompilerInstance.cpp
    lldb/source/Plugins/ExpressionParser/Clang/ModuleDependencyCollector.h
    llvm/include/llvm/Support/FileCollector.h
    llvm/lib/Support/FileCollector.cpp
    llvm/tools/dsymutil/Reproducer.cpp
    llvm/unittests/Support/FileCollectorTest.cpp

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Frontend/Utils.h b/clang/include/clang/Frontend/Utils.h
index f86c2f5074de0..49fd920d1ec43 100644
--- a/clang/include/clang/Frontend/Utils.h
+++ b/clang/include/clang/Frontend/Utils.h
@@ -143,8 +143,9 @@ class ModuleDependencyCollector : public DependencyCollector {
   std::error_code copyToRoot(StringRef Src, StringRef Dst = {});
 
 public:
-  ModuleDependencyCollector(std::string DestDir)
-      : DestDir(std::move(DestDir)) {}
+  ModuleDependencyCollector(std::string DestDir,
+                            IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS)
+      : DestDir(std::move(DestDir)), Canonicalizer(std::move(VFS)) {}
   ~ModuleDependencyCollector() override { writeFileMap(); }
 
   StringRef getDest() { return DestDir; }

diff  --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp
index d6f3aec981336..c989ad2e5155c 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -503,7 +503,7 @@ void CompilerInstance::createPreprocessor(TranslationUnitKind TUKind) {
   // then we're the top level compiler instance and need to create one.
   if (!ModuleDepCollector && !DepOpts.ModuleDependencyOutputDir.empty()) {
     ModuleDepCollector = std::make_shared<ModuleDependencyCollector>(
-        DepOpts.ModuleDependencyOutputDir);
+        DepOpts.ModuleDependencyOutputDir, getVirtualFileSystemPtr());
   }
 
   // If there is a module dep collector, register with other dep collectors

diff  --git a/lldb/source/Plugins/ExpressionParser/Clang/ModuleDependencyCollector.h b/lldb/source/Plugins/ExpressionParser/Clang/ModuleDependencyCollector.h
index 4fe727460fdb9..dcba0d9c34962 100644
--- a/lldb/source/Plugins/ExpressionParser/Clang/ModuleDependencyCollector.h
+++ b/lldb/source/Plugins/ExpressionParser/Clang/ModuleDependencyCollector.h
@@ -19,8 +19,8 @@ class ModuleDependencyCollectorAdaptor
 public:
   ModuleDependencyCollectorAdaptor(
       std::shared_ptr<llvm::FileCollectorBase> file_collector)
-      : clang::ModuleDependencyCollector(""), m_file_collector(file_collector) {
-  }
+      : clang::ModuleDependencyCollector("", llvm::vfs::getRealFileSystem()),
+        m_file_collector(file_collector) {}
 
   void addFile(llvm::StringRef Filename,
                llvm::StringRef FileDst = {}) override {

diff  --git a/llvm/include/llvm/Support/FileCollector.h b/llvm/include/llvm/Support/FileCollector.h
index b00bf3174e654..9cc6776b948ba 100644
--- a/llvm/include/llvm/Support/FileCollector.h
+++ b/llvm/include/llvm/Support/FileCollector.h
@@ -81,19 +81,25 @@ class LLVM_ABI FileCollector : public FileCollectorBase {
     /// Canonicalize a pair of virtual and real paths.
     LLVM_ABI PathStorage canonicalize(StringRef SrcPath);
 
+    explicit PathCanonicalizer(IntrusiveRefCntPtr<vfs::FileSystem> VFS)
+        : VFS(std::move(VFS)) {}
+
   private:
     /// Replace with a (mostly) real path, or don't modify. Resolves symlinks
     /// in the directory, using \a CachedDirs to avoid redundant lookups, but
     /// leaves the filename as a possible symlink.
     void updateWithRealPath(SmallVectorImpl<char> &Path);
 
+    IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS;
+
     StringMap<std::string> CachedDirs;
   };
 
   /// \p Root is the directory where collected files are will be stored.
   /// \p OverlayRoot is VFS mapping root.
   /// \p Root directory gets created in copyFiles unless it already exists.
-  FileCollector(std::string Root, std::string OverlayRoot);
+  FileCollector(std::string Root, std::string OverlayRoot,
+                IntrusiveRefCntPtr<vfs::FileSystem> VFS);
 
   /// Write the yaml mapping (for the VFS) to the given file.
   std::error_code writeMapping(StringRef MappingFile);

diff  --git a/llvm/lib/Support/FileCollector.cpp b/llvm/lib/Support/FileCollector.cpp
index edb5313d43eec..5dc224a6d427b 100644
--- a/llvm/lib/Support/FileCollector.cpp
+++ b/llvm/lib/Support/FileCollector.cpp
@@ -49,8 +49,9 @@ static bool isCaseSensitivePath(StringRef Path) {
   return true;
 }
 
-FileCollector::FileCollector(std::string Root, std::string OverlayRoot)
-    : Root(Root), OverlayRoot(OverlayRoot) {
+FileCollector::FileCollector(std::string Root, std::string OverlayRoot,
+                             IntrusiveRefCntPtr<vfs::FileSystem> VFS)
+    : Root(Root), OverlayRoot(OverlayRoot), Canonicalizer(std::move(VFS)) {
   assert(sys::path::is_absolute(Root) && "Root not absolute");
   assert(sys::path::is_absolute(OverlayRoot) && "OverlayRoot not absolute");
 }
@@ -88,9 +89,9 @@ void FileCollector::PathCanonicalizer::updateWithRealPath(
 }
 
 /// Make Path absolute.
-static void makeAbsolute(SmallVectorImpl<char> &Path) {
+static void makeAbsolute(vfs::FileSystem &VFS, SmallVectorImpl<char> &Path) {
   // We need an absolute src path to append to the root.
-  sys::fs::make_absolute(Path);
+  VFS.makeAbsolute(Path);
 
   // Canonicalize src to a native path to avoid mixed separator styles.
   sys::path::native(Path);
@@ -105,7 +106,7 @@ FileCollector::PathCanonicalizer::PathStorage
 FileCollector::PathCanonicalizer::canonicalize(StringRef SrcPath) {
   PathStorage Paths;
   Paths.VirtualPath = SrcPath;
-  makeAbsolute(Paths.VirtualPath);
+  makeAbsolute(*VFS, Paths.VirtualPath);
 
   // If a ".." component is present after a symlink component, remove_dots may
   // lead to the wrong real destination path. Let the source be canonicalized

diff  --git a/llvm/tools/dsymutil/Reproducer.cpp b/llvm/tools/dsymutil/Reproducer.cpp
index 31e49cdd0518c..0c1d3f90af299 100644
--- a/llvm/tools/dsymutil/Reproducer.cpp
+++ b/llvm/tools/dsymutil/Reproducer.cpp
@@ -37,9 +37,10 @@ ReproducerGenerate::ReproducerGenerate(std::error_code &EC, int Argc,
                                        char **Argv, bool GenerateOnExit)
     : Root(createReproducerDir(EC)), GenerateOnExit(GenerateOnExit) {
   llvm::append_range(Args, ArrayRef(Argv, Argc));
+  auto RealFS = vfs::getRealFileSystem();
   if (!Root.empty())
-    FC = std::make_shared<FileCollector>(Root, Root);
-  VFS = FileCollector::createCollectorVFS(vfs::getRealFileSystem(), FC);
+    FC = std::make_shared<FileCollector>(Root, Root, RealFS);
+  VFS = FileCollector::createCollectorVFS(std::move(RealFS), FC);
 }
 
 ReproducerGenerate::~ReproducerGenerate() {

diff  --git a/llvm/unittests/Support/FileCollectorTest.cpp b/llvm/unittests/Support/FileCollectorTest.cpp
index 184d0e3fdfd17..0ece86947b4f2 100644
--- a/llvm/unittests/Support/FileCollectorTest.cpp
+++ b/llvm/unittests/Support/FileCollectorTest.cpp
@@ -43,7 +43,8 @@ class TestingFileCollector : public FileCollector {
 TEST(FileCollectorTest, addFile) {
   TempDir root("add_file_root", /*Unique*/ true);
   std::string root_fs(root.path());
-  TestingFileCollector FileCollector(root_fs, root_fs);
+  TestingFileCollector FileCollector(root_fs, root_fs,
+                                     vfs::getRealFileSystem());
 
   FileCollector.addFile("/path/to/a");
   FileCollector.addFile("/path/to/b");
@@ -77,7 +78,8 @@ TEST(FileCollectorTest, addDirectory) {
   TempFile c(ccc.str());
 
   std::string root_fs(file_root.path());
-  TestingFileCollector FileCollector(root_fs, root_fs);
+  TestingFileCollector FileCollector(root_fs, root_fs,
+                                     vfs::getRealFileSystem());
 
   FileCollector.addDirectory(file_root.path());
 
@@ -105,7 +107,8 @@ TEST(FileCollectorTest, copyFiles) {
   // Create file collector and add files.
   TempDir root("copy_files_root", /*Unique*/ true);
   std::string root_fs(root.path());
-  TestingFileCollector FileCollector(root_fs, root_fs);
+  TestingFileCollector FileCollector(root_fs, root_fs,
+                                     vfs::getRealFileSystem());
   FileCollector.addFile(a.path());
   FileCollector.addFile(b.path());
   FileCollector.addFile(c.path());
@@ -133,7 +136,8 @@ TEST(FileCollectorTest, recordAndConstructDirectory) {
   // Create file collector and add files.
   TempDir root("copy_files_root", /*Unique*/ true);
   std::string root_fs(root.path());
-  TestingFileCollector FileCollector(root_fs, root_fs);
+  TestingFileCollector FileCollector(root_fs, root_fs,
+                                     vfs::getRealFileSystem());
   FileCollector.addFile(a.path());
 
   // The empty directory isn't seen until we add it.
@@ -169,7 +173,8 @@ TEST(FileCollectorTest, recordVFSAccesses) {
   // Create file collector and add files.
   TempDir root("copy_files_root", /*Unique*/ true);
   std::string root_fs(root.path());
-  auto Collector = std::make_shared<TestingFileCollector>(root_fs, root_fs);
+  auto Collector = std::make_shared<TestingFileCollector>(
+      root_fs, root_fs, vfs::getRealFileSystem());
   auto VFS =
       FileCollector::createCollectorVFS(vfs::getRealFileSystem(), Collector);
   VFS->status(a.path());
@@ -216,7 +221,8 @@ TEST(FileCollectorTest, Symlinks) {
   // Root where files are copied to.
   TempDir reproducer_root("reproducer_root", /*Unique*/ true);
   std::string root_fs(reproducer_root.path());
-  TestingFileCollector FileCollector(root_fs, root_fs);
+  TestingFileCollector FileCollector(root_fs, root_fs,
+                                     vfs::getRealFileSystem());
 
   // Add all the files to the collector.
   FileCollector.addFile(a.path());
@@ -264,7 +270,8 @@ TEST(FileCollectorTest, recordVFSSymlinkAccesses) {
   // Create file collector and add files.
   TempDir root("copy_files_root", true);
   std::string root_fs(root.path());
-  auto Collector = std::make_shared<TestingFileCollector>(root_fs, root_fs);
+  auto Collector = std::make_shared<TestingFileCollector>(
+      root_fs, root_fs, vfs::getRealFileSystem());
   auto VFS =
       FileCollector::createCollectorVFS(vfs::getRealFileSystem(), Collector);
   SmallString<256> Output;


        


More information about the lldb-commits mailing list