diff options
author | Serge Pavlov <sepavloff@gmail.com> | 2022-08-29 12:50:36 +0700 |
---|---|---|
committer | Serge Pavlov <sepavloff@gmail.com> | 2022-09-09 16:28:51 +0700 |
commit | 9424497e43aff088e014d65fd952ec557e28e6cf (patch) | |
tree | 9ad728dfd34df836e6678050656acc5e3441bc47 /clang/lib/Driver/Driver.cpp | |
parent | 1f639d1bd2f202f9bdf7c5023c93b4e3c8563413 (diff) | |
download | llvm-9424497e43aff088e014d65fd952ec557e28e6cf.zip llvm-9424497e43aff088e014d65fd952ec557e28e6cf.tar.gz llvm-9424497e43aff088e014d65fd952ec557e28e6cf.tar.bz2 |
[Clang] Use virtual FS in processing config files
Clang has support of virtual file system for the purpose of testing, but
treatment of config files did not use it. This change enables VFS in it
as well.
Differential Revision: https://reviews.llvm.org/D132867
Diffstat (limited to 'clang/lib/Driver/Driver.cpp')
-rw-r--r-- | clang/lib/Driver/Driver.cpp | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index ca8e0e5..217236f 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -911,7 +911,8 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, /// by Dirs. /// static bool searchForFile(SmallVectorImpl<char> &FilePath, - ArrayRef<StringRef> Dirs, StringRef FileName) { + ArrayRef<StringRef> Dirs, StringRef FileName, + llvm::vfs::FileSystem &FS) { SmallString<128> WPath; for (const StringRef &Dir : Dirs) { if (Dir.empty()) @@ -919,7 +920,8 @@ static bool searchForFile(SmallVectorImpl<char> &FilePath, WPath.clear(); llvm::sys::path::append(WPath, Dir, FileName); llvm::sys::path::native(WPath); - if (llvm::sys::fs::is_regular_file(WPath)) { + auto Status = FS.status(WPath); + if (Status && Status->getType() == llvm::sys::fs::file_type::regular_file) { FilePath = std::move(WPath); return true; } @@ -930,7 +932,7 @@ static bool searchForFile(SmallVectorImpl<char> &FilePath, bool Driver::readConfigFile(StringRef FileName) { // Try reading the given file. SmallVector<const char *, 32> NewCfgArgs; - if (!llvm::cl::readConfigFile(FileName, Saver, NewCfgArgs)) { + if (!llvm::cl::readConfigFile(FileName, Saver, NewCfgArgs, getVFS())) { Diag(diag::err_drv_cannot_read_config_file) << FileName; return true; } @@ -970,7 +972,7 @@ bool Driver::loadConfigFile() { SmallString<128> CfgDir; CfgDir.append( CLOptions->getLastArgValue(options::OPT_config_system_dir_EQ)); - if (CfgDir.empty() || llvm::sys::fs::make_absolute(CfgDir)) + if (CfgDir.empty() || getVFS().makeAbsolute(CfgDir)) SystemConfigDir.clear(); else SystemConfigDir = static_cast<std::string>(CfgDir); @@ -979,7 +981,7 @@ bool Driver::loadConfigFile() { SmallString<128> CfgDir; CfgDir.append( CLOptions->getLastArgValue(options::OPT_config_user_dir_EQ)); - if (CfgDir.empty() || llvm::sys::fs::make_absolute(CfgDir)) + if (CfgDir.empty() || getVFS().makeAbsolute(CfgDir)) UserConfigDir.clear(); else UserConfigDir = static_cast<std::string>(CfgDir); @@ -1004,13 +1006,16 @@ bool Driver::loadConfigFile() { // If argument contains directory separator, treat it as a path to // configuration file. if (llvm::sys::path::has_parent_path(CfgFileName)) { - SmallString<128> CfgFilePath; - if (llvm::sys::path::is_relative(CfgFileName)) - llvm::sys::fs::current_path(CfgFilePath); - llvm::sys::path::append(CfgFilePath, CfgFileName); - if (!llvm::sys::fs::is_regular_file(CfgFilePath)) { - Diag(diag::err_drv_config_file_not_exist) << CfgFilePath; - return true; + SmallString<128> CfgFilePath(CfgFileName); + if (llvm::sys::path::is_relative(CfgFilePath)) { + if (getVFS().makeAbsolute(CfgFilePath)) + return true; + auto Status = getVFS().status(CfgFilePath); + if (!Status || + Status->getType() != llvm::sys::fs::file_type::regular_file) { + Diag(diag::err_drv_config_file_not_exist) << CfgFilePath; + return true; + } } return readConfigFile(CfgFilePath); } @@ -1069,17 +1074,19 @@ bool Driver::loadConfigFile() { // Try to find config file. First try file with corrected architecture. llvm::SmallString<128> CfgFilePath; if (!FixedConfigFile.empty()) { - if (searchForFile(CfgFilePath, CfgFileSearchDirs, FixedConfigFile)) + if (searchForFile(CfgFilePath, CfgFileSearchDirs, FixedConfigFile, + getVFS())) return readConfigFile(CfgFilePath); // If 'x86_64-clang.cfg' was not found, try 'x86_64.cfg'. FixedConfigFile.resize(FixedArchPrefixLen); FixedConfigFile.append(".cfg"); - if (searchForFile(CfgFilePath, CfgFileSearchDirs, FixedConfigFile)) + if (searchForFile(CfgFilePath, CfgFileSearchDirs, FixedConfigFile, + getVFS())) return readConfigFile(CfgFilePath); } // Then try original file name. - if (searchForFile(CfgFilePath, CfgFileSearchDirs, CfgFileName)) + if (searchForFile(CfgFilePath, CfgFileSearchDirs, CfgFileName, getVFS())) return readConfigFile(CfgFilePath); // Finally try removing driver mode part: 'x86_64-clang.cfg' -> 'x86_64.cfg'. @@ -1087,7 +1094,7 @@ bool Driver::loadConfigFile() { !ClangNameParts.TargetPrefix.empty()) { CfgFileName.assign(ClangNameParts.TargetPrefix); CfgFileName.append(".cfg"); - if (searchForFile(CfgFilePath, CfgFileSearchDirs, CfgFileName)) + if (searchForFile(CfgFilePath, CfgFileSearchDirs, CfgFileName, getVFS())) return readConfigFile(CfgFilePath); } |