[CAS] Workaround the missing file system dependency from clang importer

This commit is contained in:
Steven Wu
2023-06-06 11:12:40 -07:00
parent 9a3573bed1
commit 07a35e9bd3
3 changed files with 31 additions and 0 deletions

View File

@@ -409,6 +409,11 @@ public:
/// Reads the original source file name from PCH. /// Reads the original source file name from PCH.
std::string getOriginalSourceFile(StringRef PCHFilename); std::string getOriginalSourceFile(StringRef PCHFilename);
/// Add clang dependency file names.
///
/// \param files The list of file to append dependencies to.
void addClangInvovcationDependencies(std::vector<std::string> &files);
/// Makes a temporary replica of the ClangImporter's CompilerInstance, reads a /// Makes a temporary replica of the ClangImporter's CompilerInstance, reads a
/// module map into the replica and emits a PCM file for one of the modules it /// module map into the replica and emits a PCM file for one of the modules it
/// declares. Delegates to clang for everything except construction of the /// declares. Delegates to clang for everything except construction of the

View File

@@ -446,6 +446,11 @@ void SwiftDependencyScanningService::setupCachingDependencyScanningService(
} }
} }
// Fetch some dependency files from clang importer.
auto clangImporter = static_cast<ClangImporter *>(
Instance.getASTContext().getClangModuleLoader());
clangImporter->addClangInvovcationDependencies(CommonDependencyFiles);
auto CachingFS = auto CachingFS =
llvm::cas::createCachingOnDiskFileSystem(Instance.getObjectStore()); llvm::cas::createCachingOnDiskFileSystem(Instance.getObjectStore());
if (!CachingFS) { if (!CachingFS) {

View File

@@ -939,6 +939,27 @@ std::string ClangImporter::getOriginalSourceFile(StringRef PCHFilename) {
Impl.Instance->getPCHContainerReader(), Impl.Instance->getDiagnostics()); Impl.Instance->getPCHContainerReader(), Impl.Instance->getDiagnostics());
} }
void ClangImporter::addClangInvovcationDependencies(
std::vector<std::string> &files) {
auto addFiles = [&files](const auto &F) {
files.insert(files.end(), F.begin(), F.end());
};
auto &invocation = *Impl.Invocation;
// FIXME: Add file dependencies that are not accounted. The long term solution
// is to do a dependency scanning for clang importer and use that directly.
SmallVector<std::string, 4> HeaderMapFileNames;
Impl.Instance->getPreprocessor().getHeaderSearchInfo().getHeaderMapFileNames(
HeaderMapFileNames);
addFiles(HeaderMapFileNames);
addFiles(invocation.getHeaderSearchOpts().VFSOverlayFiles);
// FIXME: Should not depend on working directory. Build system/swift driver
// should not pass working directory here but if that option is passed,
// repect that and add that into CASFS.
auto CWD = invocation.getFileSystemOpts().WorkingDir;
if (!CWD.empty())
files.push_back(CWD);
}
Optional<std::string> Optional<std::string>
ClangImporter::getPCHFilename(const ClangImporterOptions &ImporterOptions, ClangImporter::getPCHFilename(const ClangImporterOptions &ImporterOptions,
StringRef SwiftPCHHash, bool &isExplicit) { StringRef SwiftPCHHash, bool &isExplicit) {