================
@@ -74,13 +79,131 @@ class MakeDependencyPrinterConsumer : public
DependencyConsumer {
};
} // anonymous namespace
+static std::pair<std::unique_ptr<driver::Driver>,
+ std::unique_ptr<driver::Compilation>>
+buildCompilation(ArrayRef<std::string> CommandLine, DiagnosticsEngine &Diags,
+ IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS,
+ llvm::BumpPtrAllocator &Alloc) {
+ auto Argv = llvm::map_to_vector<256>(
+ CommandLine, [](const auto &Arg) { return Arg.c_str(); });
+
+ std::unique_ptr<driver::Driver> Driver = std::make_unique<driver::Driver>(
+ Argv[0], llvm::sys::getDefaultTargetTriple(), Diags,
+ "clang LLVM compiler", FS);
+ Driver->setTitle("clang_based_tool");
+
+ bool CLMode = driver::IsClangCL(
+ driver::getDriverMode(Argv[0], ArrayRef(Argv).slice(1)));
+
+ if (llvm::Error E =
+ driver::expandResponseFiles(Argv, CLMode, Alloc, FS.get())) {
+ Diags.Report(diag::err_drv_expand_response_file)
+ << llvm::toString(std::move(E));
+ return std::make_pair(nullptr, nullptr);
+ }
+
+ std::unique_ptr<driver::Compilation> Compilation(
+ Driver->BuildCompilation(Argv));
+ if (!Compilation)
+ return std::make_pair(nullptr, nullptr);
+
+ if (Compilation->containsError())
+ return std::make_pair(nullptr, nullptr);
+
+ if (Compilation->getJobs().empty()) {
+ Diags.Report(diag::err_fe_expected_compiler_job)
+ << llvm::join(CommandLine, " ");
+ return std::make_pair(nullptr, nullptr);
+ }
+
+ return std::make_pair(std::move(Driver), std::move(Compilation));
+}
+
+/// Constructs the full -cc1 command line, including executable, for the given
+/// driver \c Cmd.
+static std::vector<std::string>
+buildCC1CommandLine(const driver::Command &Cmd) {
+ const auto &Args = Cmd.getArguments();
+ std::vector<std::string> Out;
+ Out.reserve(Args.size() + 1);
+ Out.emplace_back(Cmd.getExecutable());
+ llvm::append_range(Out, Args);
+ return Out;
+}
+
+static bool computeDependenciesForDriverCommandLine(
+ DependencyScanningWorker &Worker, StringRef WorkingDirectory,
+ ArrayRef<std::string> CommandLine, DependencyConsumer &Consumer,
+ DependencyActionController &Controller, DiagnosticsEngine &Diags,
+ IntrusiveRefCntPtr<llvm::vfs::OverlayFileSystem> OverlayFS) {
+ Worker.getVFS().setCurrentWorkingDirectory(WorkingDirectory);
+
+ // Compilation holds a non-owning a reference to the Driver, hence we need to
+ // keep the Driver alive when we use Compilation. Arguments to commands may
be
+ // owned by Alloc when expanded from response files.
+ llvm::BumpPtrAllocator Alloc;
+ const auto [Driver, Compilation] =
+ buildCompilation(CommandLine, Diags, &Worker.getVFS(), Alloc);
+ if (!Compilation)
+ return false;
+
+ const auto CC1CommandLines =
+ llvm::map_to_vector(Compilation->getJobs(), buildCC1CommandLine);
+ const auto CC1CommandLinesView = llvm::map_to_vector(
+ CC1CommandLines, [](const auto &CC1Cmds) { return ArrayRef(CC1Cmds); });
----------------
jansvoboda11 wrote:
To me this is overusing `auto`. It's difficult to see what types are being used
here. Similar to my previous comment, I'd probably prefer a simple for loop to
do the transformation.
https://github.com/llvm/llvm-project/pull/172347
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits