[clang] Don't require FileManager for creating an output file (#164665)

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()`.
This commit is contained in:
Jan Svoboda 2025-10-24 11:05:22 -07:00 committed by GitHub
parent 224f18e549
commit 6de1c25d6b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 11 additions and 17 deletions

View File

@ -287,8 +287,12 @@ public:
/// 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.

View File

@ -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;
}

View File

@ -882,7 +882,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;
}

View File

@ -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,