[clang] [clang] Don't require `FileManager` for creating an output file (PR #164665)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 22 10:18:46 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Jan Svoboda (jansvoboda11)
<details>
<summary>Changes</summary>
Conceptually, the `CompilerInstance` doesn't need an instance of the `FileManager` to create an output file. This PR enables that, removing an edge-case in `cc1_main()`.
---
Full diff: https://github.com/llvm/llvm-project/pull/164665.diff
4 Files Affected:
- (modified) clang/include/clang/Basic/FileManager.h (+6-2)
- (modified) clang/lib/Basic/FileManager.cpp (+4-3)
- (modified) clang/lib/Frontend/CompilerInstance.cpp (+1-1)
- (modified) clang/tools/driver/cc1_main.cpp (-11)
``````````diff
diff --git a/clang/include/clang/Basic/FileManager.h b/clang/include/clang/Basic/FileManager.h
index 337911e99b303..fa7552b6ae41d 100644
--- a/clang/include/clang/Basic/FileManager.h
+++ b/clang/include/clang/Basic/FileManager.h
@@ -287,8 +287,12 @@ class FileManager : public RefCountedBase<FileManager> {
/// If path is not absolute and FileSystemOptions set the working
/// directory, the path is modified to be relative to the given
/// working directory.
- /// \returns true if \c path changed.
- bool FixupRelativePath(SmallVectorImpl<char> &path) const;
+ /// \returns true if \c Path changed.
+ bool FixupRelativePath(SmallVectorImpl<char> &Path) const {
+ return fixupRelativePath(FileSystemOpts, Path);
+ }
+ static bool fixupRelativePath(const FileSystemOptions &FileSystemOpts,
+ SmallVectorImpl<char> &Path);
/// Makes \c Path absolute taking into account FileSystemOptions and the
/// working directory option.
diff --git a/clang/lib/Basic/FileManager.cpp b/clang/lib/Basic/FileManager.cpp
index 7481e1ee9f7ea..e744cc0afcded 100644
--- a/clang/lib/Basic/FileManager.cpp
+++ b/clang/lib/Basic/FileManager.cpp
@@ -474,8 +474,9 @@ OptionalFileEntryRef FileManager::getBypassFile(FileEntryRef VF) {
return FileEntryRef(*Insertion.first);
}
-bool FileManager::FixupRelativePath(SmallVectorImpl<char> &path) const {
- StringRef pathRef(path.data(), path.size());
+bool FileManager::fixupRelativePath(const FileSystemOptions &FileSystemOpts,
+ SmallVectorImpl<char> &Path) {
+ StringRef pathRef(Path.data(), Path.size());
if (FileSystemOpts.WorkingDir.empty()
|| llvm::sys::path::is_absolute(pathRef))
@@ -483,7 +484,7 @@ bool FileManager::FixupRelativePath(SmallVectorImpl<char> &path) const {
SmallString<128> NewPath(FileSystemOpts.WorkingDir);
llvm::sys::path::append(NewPath, pathRef);
- path = NewPath;
+ Path = NewPath;
return true;
}
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp
index 374138fe4cf8f..010be94035e2d 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -885,7 +885,7 @@ CompilerInstance::createOutputFileImpl(StringRef OutputPath, bool Binary,
"File Manager is required to fix up relative path.\n");
AbsPath.emplace(OutputPath);
- FileMgr->FixupRelativePath(*AbsPath);
+ FileManager::fixupRelativePath(getFileSystemOpts(), *AbsPath);
OutputPath = *AbsPath;
}
diff --git a/clang/tools/driver/cc1_main.cpp b/clang/tools/driver/cc1_main.cpp
index 49f8843515a35..52cffa4ccbe1f 100644
--- a/clang/tools/driver/cc1_main.cpp
+++ b/clang/tools/driver/cc1_main.cpp
@@ -313,17 +313,6 @@ int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) {
llvm::TimerGroup::clearAll();
if (llvm::timeTraceProfilerEnabled()) {
- // It is possible that the compiler instance doesn't own a file manager here
- // if we're compiling a module unit. Since the file manager are owned by AST
- // when we're compiling a module unit. So the file manager may be invalid
- // here.
- //
- // It should be fine to create file manager here since the file system
- // options are stored in the compiler invocation and we can recreate the VFS
- // from the compiler invocation.
- if (!Clang->hasFileManager())
- Clang->createFileManager();
-
if (auto profilerOutput = Clang->createOutputFile(
Clang->getFrontendOpts().TimeTracePath, /*Binary=*/false,
/*RemoveFileOnSignal=*/false,
``````````
</details>
https://github.com/llvm/llvm-project/pull/164665
More information about the cfe-commits
mailing list