aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Driver/Driver.cpp
diff options
context:
space:
mode:
authorSerge Pavlov <sepavloff@gmail.com>2022-08-29 12:50:36 +0700
committerSerge Pavlov <sepavloff@gmail.com>2022-09-09 16:28:51 +0700
commit9424497e43aff088e014d65fd952ec557e28e6cf (patch)
tree9ad728dfd34df836e6678050656acc5e3441bc47 /clang/lib/Driver/Driver.cpp
parent1f639d1bd2f202f9bdf7c5023c93b4e3c8563413 (diff)
downloadllvm-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.cpp39
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);
}