23 PCHContainerOps = std::make_shared<PCHContainerOperations>();
25 PCHContainerOps->registerReader(
26 std::make_unique<ObjectFilePCHContainerReader>());
28 PCHContainerOps->registerWriter(std::make_unique<RawPCHContainerWriter>());
30 if (Service.shouldTraceVFS())
31 FS = llvm::makeIntrusiveRefCnt<llvm::vfs::TracingFileSystem>(std::move(FS));
33 switch (Service.getMode()) {
35 DepFS = llvm::makeIntrusiveRefCnt<DependencyScanningWorkerFilesystem>(
36 Service.getSharedCache(), FS);
47 StringRef WorkingDirectory,
const std::vector<std::string> &CommandLine,
49 std::optional<llvm::MemoryBufferRef> TUBuffer) {
56 return llvm::Error::success();
57 return llvm::make_error<llvm::StringError>(
58 DiagPrinterWithOS.
DiagnosticsOS.str(), llvm::inconvertibleErrorCode());
62 StringRef WorkingDirectory,
const std::vector<std::string> &CommandLine,
64 StringRef ModuleName) {
71 return llvm::Error::success();
72 return llvm::make_error<llvm::StringError>(
73 DiagPrinterWithOS.
DiagnosticsOS.str(), llvm::inconvertibleErrorCode());
93 const std::vector<std::string> &CommandLine,
96 std::shared_ptr<clang::PCHContainerOperations> &PCHContainerOps,
102 if (!Action.
runInvocation(std::move(Invocation), std::move(FS),
111bool DependencyScanningWorker::scanDependencies(
112 StringRef WorkingDirectory,
const std::vector<std::string> &CommandLine,
114 DiagnosticConsumer &DC, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS,
115 std::optional<StringRef> ModuleName) {
116 DignosticsEngineWithDiagOpts DiagEngineWithCmdAndOpts(CommandLine, FS, DC);
117 DependencyScanningAction Action(Service, WorkingDirectory, Consumer,
118 Controller, DepFS, ModuleName);
121 if (CommandLine[1] ==
"-cc1") {
123 CommandLine, Action, FS, PCHContainerOps,
124 *DiagEngineWithCmdAndOpts.DiagEngine, Consumer);
127 CommandLine, *DiagEngineWithCmdAndOpts.DiagEngine, FS,
128 [&](
const driver::Command &Cmd) {
129 if (StringRef(Cmd.getCreator().getName()) !=
"clang") {
132 Consumer.handleBuildCommand(
133 {Cmd.getExecutable(),
134 {Cmd.getArguments().begin(), Cmd.getArguments().end()}});
139 std::vector<std::string> Argv;
148 std::move(Argv), Action, FS, PCHContainerOps,
149 *DiagEngineWithCmdAndOpts.DiagEngine, Consumer);
153 if (
Success && !Action.hasScanned())
154 DiagEngineWithCmdAndOpts.DiagEngine->Report(
155 diag::err_fe_expected_compiler_job)
156 << llvm::join(CommandLine,
" ");
159 if (!Action.hasDiagConsumerFinished())
162 return Success && Action.hasScanned();
166 StringRef WorkingDirectory,
const std::vector<std::string> &CommandLine,
171 BaseFS, CommandLine, WorkingDirectory, *TUBuffer);
172 return scanDependencies(WorkingDirectory, FinalCommandLine, Consumer,
173 Controller, DC, FinalFS,
176 BaseFS->setCurrentWorkingDirectory(WorkingDirectory);
177 return scanDependencies(WorkingDirectory, CommandLine, Consumer, Controller,
178 DC, BaseFS, std::nullopt);
183 StringRef WorkingDirectory,
const std::vector<std::string> &CommandLine,
187 BaseFS, CommandLine, WorkingDirectory, ModuleName);
189 return scanDependencies(WorkingDirectory, ModifiedCommandLine, Consumer,
190 Controller, DC, OverlayFS, ModuleName);
static bool forEachDriverJob(ArrayRef< std::string > ArgStrs, DiagnosticsEngine &Diags, IntrusiveRefCntPtr< llvm::vfs::FileSystem > FS, llvm::function_ref< bool(const driver::Command &Cmd)> Callback)
static bool createAndRunToolInvocation(const std::vector< std::string > &CommandLine, DependencyScanningAction &Action, IntrusiveRefCntPtr< llvm::vfs::FileSystem > FS, std::shared_ptr< clang::PCHContainerOperations > &PCHContainerOps, DiagnosticsEngine &Diags, DependencyConsumer &Consumer)
Abstract interface, implemented by clients of the front-end, which formats and prints fully processed...
virtual void finish()
Callback to inform the diagnostic client that processing of all source files has ended.
Concrete class used by the front-end to report problems and issues.
DiagnosticConsumer * getClient()
Command - An executable path/name and argument vector to execute.
const llvm::opt::ArgStringList & getArguments() const
const char * getExecutable() const
The JSON file list parser is used to communicate input to InstallAPI.
@ Success
Annotation was successful.
TextDiagnosticPrinter DiagPrinter
llvm::raw_string_ostream DiagnosticsOS