[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:
parent
224f18e549
commit
6de1c25d6b
@ -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.
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user