[PATCH] D156234: [clang][deps] provide support for cc1 command line scanning
jansvoboda11 added a comment. This looks pretty good! I'm not sure unit testing is the best choice here, since we're not checking for low-level properties or hard-to-observe behavior. In general LIT tests are easier to write/maintain/understand and don't require recompiling, so I'd suggest to transform the existing unit test into something similar to tests in `clang/test/ClangScanDeps/`. Comment at: clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp:414 + std::vector Args = Action.takeLastCC1Arguments(); + Consumer.handleBuildCommand({Executable, std::move(Args)}); + return true; Comment at: clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp:507 + // dependency scanning filesystem. + return createAndRunToolInvocation(Argv, Action, *FileMgr, +PCHContainerOps, *Diags, Consumer); CHANGES SINCE LAST ACTION https://reviews.llvm.org/D156234/new/ https://reviews.llvm.org/D156234 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D156234: [clang][deps] provide support for cc1 command line scanning
cpsughrue updated this revision to Diff 544127. cpsughrue edited the summary of this revision. cpsughrue added a comment. Fixed formatting issues CHANGES SINCE LAST ACTION https://reviews.llvm.org/D156234/new/ https://reviews.llvm.org/D156234 Files: clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp clang/unittests/Tooling/DependencyScannerTest.cpp Index: clang/unittests/Tooling/DependencyScannerTest.cpp === --- clang/unittests/Tooling/DependencyScannerTest.cpp +++ clang/unittests/Tooling/DependencyScannerTest.cpp @@ -240,6 +240,36 @@ "test.cpp.o: /root/test.cpp /root/header.h\n"); } +TEST(DependencyScanner, ScanDepsWithCC1) { + std::vector CommandLine = { + "clang","-cc1", "-triple", "x86_64-apple-macosx10.7", "-x", "c++", + "test.cpp", "-o", "test.cpp.o"}; + StringRef CWD = "/root"; + + auto VFS = new llvm::vfs::InMemoryFileSystem(); + VFS->setCurrentWorkingDirectory(CWD); + auto Sept = llvm::sys::path::get_separator(); + std::string HeaderPath = + std::string(llvm::formatv("{0}root{0}header.h", Sept)); + std::string TestPath = std::string(llvm::formatv("{0}root{0}test.cpp", Sept)); + + VFS->addFile(HeaderPath, 0, llvm::MemoryBuffer::getMemBuffer("\n")); + VFS->addFile(TestPath, 0, + llvm::MemoryBuffer::getMemBuffer("#include \"header.h\"\n")); + + DependencyScanningService Service(ScanningMode::DependencyDirectivesScan, +ScanningOutputFormat::Make); + DependencyScanningTool ScanTool(Service, VFS); + + std::string DepFile; + ASSERT_THAT_ERROR( + ScanTool.getDependencyFile(CommandLine, CWD).moveInto(DepFile), + llvm::Succeeded()); + using llvm::sys::path::convert_to_slash; + EXPECT_EQ(convert_to_slash(DepFile), +"test.cpp.o: /root/test.cpp /root/header.h\n"); +} + TEST(DependencyScanner, ScanDepsWithModuleLookup) { std::vector CommandLine = { "clang", Index: clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp === --- clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp +++ clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp @@ -385,6 +385,9 @@ if (!Compilation) return false; + if (Compilation->containsError()) +return false; + for (const driver::Command : Compilation->getJobs()) { if (!Callback(Job)) return false; @@ -392,6 +395,26 @@ return true; } +static bool createAndRunToolInvocation( +std::vector CommandLine, DependencyScanningAction , +FileManager , +std::shared_ptr , +DiagnosticsEngine , DependencyConsumer ) { + + // Save executable path before providing CommandLine to ToolInvocation + std::string Executable = CommandLine[0]; + ToolInvocation Invocation(std::move(CommandLine), , , +PCHContainerOps); + Invocation.setDiagnosticConsumer(Diags.getClient()); + Invocation.setDiagnosticOptions(()); + if (!Invocation.run()) +return false; + + std::vector Args = Action.takeLastCC1Arguments(); + Consumer.handleBuildCommand({Executable, std::move(Args)}); + return true; +} + bool DependencyScanningWorker::computeDependencies( StringRef WorkingDirectory, const std::vector , DependencyConsumer , DependencyActionController , @@ -454,37 +477,37 @@ DependencyScanningAction Action(WorkingDirectory, Consumer, Controller, DepFS, Format, OptimizeArgs, EagerLoadModules, DisableFree, ModuleName); - bool Success = forEachDriverJob( - FinalCommandLine, *Diags, *FileMgr, [&](const driver::Command ) { -if (StringRef(Cmd.getCreator().getName()) != "clang") { - // Non-clang command. Just pass through to the dependency - // consumer. - Consumer.handleBuildCommand( - {Cmd.getExecutable(), - {Cmd.getArguments().begin(), Cmd.getArguments().end()}}); - return true; -} - -std::vector Argv; -Argv.push_back(Cmd.getExecutable()); -Argv.insert(Argv.end(), Cmd.getArguments().begin(), -Cmd.getArguments().end()); - -// Create an invocation that uses the underlying file -// system to ensure that any file system requests that -// are made by the driver do not go through the -// dependency scanning filesystem. -ToolInvocation Invocation(std::move(Argv), , &*FileMgr, - PCHContainerOps); -Invocation.setDiagnosticConsumer(Diags->getClient()); -Invocation.setDiagnosticOptions(>getDiagnosticOptions()); -if (!Invocation.run()) - return false; - -std::vector Args = Action.takeLastCC1Arguments(); -Consumer.handleBuildCommand({Cmd.getExecutable(), std::move(Args)}); -return true; - }); +
[PATCH] D156234: [clang][deps] provide support for cc1 command line scanning
cpsughrue created this revision. cpsughrue added reviewers: Bigcheese, jansvoboda11. Herald added a project: All. cpsughrue requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. Allow users to run a dependency scan with a cc1 command line in addition to a driver command line. The scan was being carried out with a cc1 command line, but `DependencyScanningWorker::computeDependencies` assumed that the user always provided a driver command line. Now `DependencyScanningWorker::computeDependencies` can handle the case where the user provides a cc1 command line. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D156234 Files: clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp clang/unittests/Tooling/DependencyScannerTest.cpp Index: clang/unittests/Tooling/DependencyScannerTest.cpp === --- clang/unittests/Tooling/DependencyScannerTest.cpp +++ clang/unittests/Tooling/DependencyScannerTest.cpp @@ -240,6 +240,42 @@ "test.cpp.o: /root/test.cpp /root/header.h\n"); } +TEST(DependencyScanner, ScanDepsWithCC1) { + std::vector CommandLine = {"clang", + "-cc1", + "-triple", + "x86_64-apple-macosx10.7", + "-x", + "c++", + "test.cpp", + "-o", + "test.cpp.o"}; + StringRef CWD = "/root"; + + auto VFS = new llvm::vfs::InMemoryFileSystem(); + VFS->setCurrentWorkingDirectory(CWD); + auto Sept = llvm::sys::path::get_separator(); + std::string HeaderPath = + std::string(llvm::formatv("{0}root{0}header.h", Sept)); + std::string TestPath = std::string(llvm::formatv("{0}root{0}test.cpp", Sept)); + + VFS->addFile(HeaderPath, 0, llvm::MemoryBuffer::getMemBuffer("\n")); + VFS->addFile(TestPath, 0, + llvm::MemoryBuffer::getMemBuffer("#include \"header.h\"\n")); + + DependencyScanningService Service(ScanningMode::DependencyDirectivesScan, +ScanningOutputFormat::Make); + DependencyScanningTool ScanTool(Service, VFS); + + std::string DepFile; + ASSERT_THAT_ERROR( + ScanTool.getDependencyFile(CommandLine, CWD).moveInto(DepFile), + llvm::Succeeded()); + using llvm::sys::path::convert_to_slash; + EXPECT_EQ(convert_to_slash(DepFile), +"test.cpp.o: /root/test.cpp /root/header.h\n"); +} + TEST(DependencyScanner, ScanDepsWithModuleLookup) { std::vector CommandLine = { "clang", Index: clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp === --- clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp +++ clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp @@ -385,6 +385,9 @@ if (!Compilation) return false; + if (Compilation->containsError()) +return false; + for (const driver::Command : Compilation->getJobs()) { if (!Callback(Job)) return false; @@ -392,6 +395,26 @@ return true; } +static bool createAndRunToolInvocation( +std::vector CommandLine, DependencyScanningAction , +FileManager , +std::shared_ptr , +DiagnosticsEngine , DependencyConsumer ) { + + // Save executable path before providing CommandLine to ToolInvocation + std::string Executable = CommandLine[0]; + ToolInvocation Invocation(std::move(CommandLine), , , +PCHContainerOps); + Invocation.setDiagnosticConsumer(Diags.getClient()); + Invocation.setDiagnosticOptions(()); + if (!Invocation.run()) +return false; + + std::vector Args = Action.takeLastCC1Arguments(); + Consumer.handleBuildCommand({Executable, std::move(Args)}); + return true; +} + bool DependencyScanningWorker::computeDependencies( StringRef WorkingDirectory, const std::vector , DependencyConsumer , DependencyActionController , @@ -454,37 +477,37 @@ DependencyScanningAction Action(WorkingDirectory, Consumer, Controller, DepFS, Format, OptimizeArgs, EagerLoadModules, DisableFree, ModuleName); - bool Success = forEachDriverJob( - FinalCommandLine, *Diags, *FileMgr, [&](const driver::Command ) { -if (StringRef(Cmd.getCreator().getName()) != "clang") { - // Non-clang command. Just pass through to the dependency - // consumer. - Consumer.handleBuildCommand( - {Cmd.getExecutable(), - {Cmd.getArguments().begin(), Cmd.getArguments().end()}}); - return true; -} - -std::vector Argv; -Argv.push_back(Cmd.getExecutable()); -Argv.insert(Argv.end(),