[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