Skip to content

Conversation

qiongsiwu
Copy link

@qiongsiwu qiongsiwu commented Oct 14, 2025

The compiler instance sharing work requires significant refactoring of existing dependency scanner implementation. This PR cherry-picks all the pre-requisites into stable/21.x.

List of commits cherry-picked:

aa1b416
c7f3437
4205da0
55bef46
4957c47
f33fb0d
30633f3
5a339b0
0e35f56
b86ddae
4368616
cda542d

Part of work for rdar://136303612.

jansvoboda11 and others added 12 commits October 13, 2025 13:41
The dependency scanner was initially using a fair amount of infrastructure provided by the `clangTooling` library. Over time, the needs for bespoke handling of command lines grew and the overlap with the tooling library kept shrinking. I don't think the library provides any value anymore. I decided to remove the dependency and only reimplement the small bits required by the scanner. This allowed for a nice simplification, where we no longer need to create temporary dummy `FileManager` instances (mis-named as `DriverFileMgr` in some parts) and `SourceManager` instances to attach to the `DiagnosticsEngine`. That code was copied from the tooling library to support `DiagnosticConsumers` that expect these to exist. The scanner uses a closed set of consumers and none need these objects to exist. The motivation for this (hopefully NFC) patch are some new restrictions to how VFS's can be propagated in Clang that I'm working on. (cherry picked from commit aa1b416)
…50123)" This reverts commit 613caa9, essentially reapplying 4a4bdde after moving `normalizeModuleCachePath` from clangFrontend to clangLex. This PR is part of an effort to remove file system usage from the command line parsing code. The reason for that is that it's impossible to do file system access correctly without a configured VFS, and the VFS can only be configured after the command line is parsed. I don't want to intertwine command line parsing and VFS configuration, so I decided to perform the file system access after the command line is parsed and the VFS is configured - ideally right before the file system entity is used for the first time. This patch delays normalization of the module cache path until `CompilerInstance` is asked for the cache path in the current compilation context. (cherry picked from commit 55bef46)
…lvm#151545) Handles clang::DiagnosticsEngine and clang::DiagnosticIDs. For DiagnosticIDs, this mostly migrates from `new DiagnosticIDs` to convenience method `DiagnosticIDs::create()`. Part of cleanup llvm#151026 (cherry picked from commit c7f3437) Conflicts:	clang/tools/driver/cc1_main.cpp	clang/unittests/Driver/DXCModeTest.cpp	clang/unittests/Driver/SimpleDiagnosticConsumer.h	clang/unittests/Frontend/SearchPathTest.cpp	clang/unittests/Lex/HeaderSearchTest.cpp	clang/unittests/Tooling/RewriterTestContext.h
…lvm#151782) This commit handles the following types: - clang::ExternalASTSource - clang::TargetInfo - clang::ASTContext - clang::SourceManager - clang::FileManager Part of cleanup llvm#151026 (cherry picked from commit 4205da0) Conflicts:	clang/lib/Frontend/ASTUnit.cpp	clang/lib/Frontend/ChainedIncludesSource.cpp	clang/lib/Frontend/CompilerInstance.cpp
(cherry picked from commit 95ea104) Conflicts:	clang/include/clang/Frontend/CompilerInstance.h	clang/lib/Frontend/CompilerInstance.cpp
…y-vfs [clang] Fix CAS initialization after upstream llvm#158381 (cherry picked from commit 6d73002)
…lvm#158372) This PR uses the new-ish `llvm::vfs::FileSystem::visit()` interface to collect VFS overlay entries from an existing `FileSystem` instance rather than parsing the VFS YAML file anew. This prevents duplicate diagnostics as observed by `clang/test/VFS/broken-vfs-module-dep.c`. (cherry picked from commit 4957c47)
…llvm#158695) This PR changes the behavior of `clang::ExecuteCompilerInvocation()` so that it only returns early when the `DiagnosticsEngine` emitted errors **within** the function. Handling errors emitted before the function got called is a responsibility of the caller. Necessary for llvm#158381. (cherry picked from commit f33fb0d)
Normalizing an empty modules cache path results in an incorrect non-empty path (the working directory). This PR conditionalizes more code to avoid this. Tested downstream by swift/llvm-project and the `DependencyScanningCAPITests.DependencyScanningFSCacheOutOfDate` unit test. (cherry picked from commit 5a339b0)
(cherry picked from commit 3efcc0f) Conflicts:	clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp
…)` (llvm#160748) The `CompilerInstance::createSourceManager()` function currently accepts the `FileManager` to be used. However, all clients call `CompilerInstance::createFileManager()` prior to creating the `SourceManager`, and it never makes sense to use a `FileManager` in the `SourceManager` that's different from the rest of the compiler. Passing the `FileManager` explicitly is redundant, error-prone, and deviates from the style of other `CompilerInstance` initialization APIs. This PR therefore removes the `FileManager` parameter from `createSourceManager()` and also stops returning the `FileManager` pointer from `createFileManager()`, since that was its primary use. Now, `createSourceManager()` internally calls `getFileManager()` instead. (cherry picked from commit b86ddae) Conflicts:	clang/lib/Tooling/DependencyScanning/DependencyScannerImpl.cpp
(cherry picked from commit 286ea7d) Conflicts:	clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp
@qiongsiwu
Copy link
Author

@swift-ci please test.

@qiongsiwu
Copy link
Author

This PR makes the `VFS` parameter to `ASTUnit::LoadFromASTFile()` required and explicit, rather than silently defaulting to the real file system. This makes it easy to correctly propagate the fully-configured VFS and load any input files like the rest of the compiler does. (cherry picked from commit cda542d)
@qiongsiwu
Copy link
Author

@qiongsiwu
Copy link
Author

1 similar comment
@qiongsiwu
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

3 participants