[PATCH] D132405: [clang][deps] Split translation units into individual -cc1 or other commands

Jan Svoboda via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Aug 23 12:23:53 PDT 2022


jansvoboda11 added inline comments.


================
Comment at: clang/include/clang/Tooling/DependencyScanning/DependencyScanningTool.h:34
+/// \see FullDependencies::Commands.
+class Command {
+public:
----------------
benlangmuir wrote:
> jansvoboda11 wrote:
> > Have you considered using the `Job`/`Command` classes the driver uses? What are the downsides of doing that?
> The `driver::Command`/`driver::JobList` is not standalone from the driver - it depends on an external `const Action &`, `const Tool &`, and a few `const char *`, so if we used it we would also need to preserve the `Compilation` and `Driver` they came from somewhere, or change  the API so the commands were only available inside a callback with limited scope that they are immediately copied out of.  I'm also not sure what the consequences of mutating Commands are (there is a `replaceArguments`, but I don't know if it could break invariants).
Makes sense, let's keep this as-is then.


================
Comment at: clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp:155
+void FullDependencyConsumer::handleInvocation(CompilerInvocation CI) {
+  clearImplicitModuleBuildOptions(CI);
+  Commands.push_back(std::make_unique<CC1Command>(std::move(CI)));
----------------
benlangmuir wrote:
> jansvoboda11 wrote:
> > Shouldn't this be a responsibility of the dependency scanner?
> Good question! I was mirroring how it works for modules where we do this in the `ModuleDepCollector` and store the whole invocation in the `ModuleDeps`.  But I guess that's "inside" the dep scanner, and this is "outside".  Happy to shuffle things around.
> 
> What is your opinion of  `takeFullDependencies()` adding to `FrontendOpts.ModuleFiles`, ? That is also arguably the scanner's responsibility.
> 
> Another thing we could do here is remove `BuildInvocation` from `FullDependencies` and `ModuleDeps` and only expose the serialized `-cc1` arguments.  It would simplify the new code a bit since there'd only be one kind of "command".   On the other hand, I could also see it being potentially useful to have the whole invocation available if you were writing a C++ tool that used the scanner API rather than just clang-scan-deps itself.
> Good question! I was mirroring how it works for modules where we do this in the `ModuleDepCollector` and store the whole invocation in the `ModuleDeps`. But I guess that's "inside" the dep scanner, and this is "outside". Happy to shuffle things around.
As discussed offline, I'd prefer keeping `CompilerInvocation` internal to the dependency scanner and exposing simple types (`std::vector<std::string>` for the command line) unless clients need more flexibility.

> What is your opinion of `takeFullDependencies()` adding to `FrontendOpts.ModuleFiles`, ? That is also arguably the scanner's responsibility.
I'd prefer adding to `FrontendOpts.ModuleFiles` earlier, before the consumer.

> Another thing we could do here is remove `BuildInvocation` from `FullDependencies` and `ModuleDeps` and only expose the serialized `-cc1` arguments. It would simplify the new code a bit since there'd only be one kind of "command". On the other hand, I could also see it being potentially useful to have the whole invocation available if you were writing a C++ tool that used the scanner API rather than just clang-scan-deps itself.
+1


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D132405/new/

https://reviews.llvm.org/D132405



More information about the cfe-commits mailing list