Skip to content

Commit b930dbd

Browse files
jansvoboda11edymtt
authored andcommitted
rdar://81632946 [libclang][deps] Accept only driver invocations, don't modify them
(cherry picked from commit 7c44674)
1 parent 87bba67 commit b930dbd

File tree

4 files changed

+11
-45
lines changed

4 files changed

+11
-45
lines changed

clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ class DependencyScanningWorker {
6767
const CompilationDatabase &CDB,
6868
DependencyConsumer &Consumer);
6969

70+
/// Run the dependency scanning tool for a given clang driver invocation, and
71+
/// report the discovered dependencies to the provided consumer.
72+
///
73+
/// \returns A \c StringError with the diagnostic output if clang errors
74+
/// occurred, success otherwise.
7075
llvm::Error
7176
computeDependenciesForClangInvocation(StringRef WorkingDirectory,
7277
ArrayRef<std::string> Arguments,

clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -327,25 +327,9 @@ llvm::Error DependencyScanningWorker::computeDependencies(
327327
llvm::Error DependencyScanningWorker::computeDependenciesForClangInvocation(
328328
StringRef WorkingDirectory, ArrayRef<std::string> Arguments,
329329
DependencyConsumer &Consumer) {
330-
RealFS->setCurrentWorkingDirectory(WorkingDirectory);
331-
return runWithDiags(DiagOpts.get(), [&](DiagnosticConsumer &DC) {
332-
IntrusiveRefCntPtr<DiagnosticIDs> DiagID = new DiagnosticIDs();
333-
IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
334-
DiagnosticsEngine Diags(DiagID, &*DiagOpts, &DC, /*ShouldOwnClient=*/false);
335-
336-
llvm::opt::ArgStringList CC1Args;
337-
for (const auto &Arg : Arguments)
338-
CC1Args.push_back(Arg.c_str());
339-
std::unique_ptr<CompilerInvocation> Invocation(
340-
newInvocation(&Diags, CC1Args, /*BinaryName=*/nullptr));
341-
342-
DependencyScanningAction Action(WorkingDirectory, Consumer, DepFS,
343-
PPSkipMappings.get(), Format);
344-
345-
llvm::IntrusiveRefCntPtr<FileManager> FM = Files;
346-
if (!FM)
347-
FM = new FileManager(FileSystemOptions(), RealFS);
348-
return Action.runInvocation(std::move(Invocation), FM.get(),
349-
PCHContainerOps, &DC);
350-
});
330+
std::string Input("dependency-scanner-fake-input-file");
331+
StringRef Output("dependency-scanner-fake-output-file");
332+
SingleCommandCompilationDatabase CDB(
333+
CompileCommand(WorkingDirectory, Input, Arguments, Output));
334+
return computeDependencies(Input, WorkingDirectory, CDB, Consumer);
351335
}

clang/test/Index/Core/scan-deps.m

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,3 @@
1-
// RUN: rm -rf %t.mcp
2-
// RUN: echo %S > %t.result
3-
// RUN: c-index-test core --scan-deps %S -- %clang -cc1 -I %S/Inputs/module \
4-
// RUN: -fmodules -fmodules-cache-path=%t.mcp -fimplicit-module-maps \
5-
// RUN: -o FoE.o -x objective-c %s >> %t.result
6-
// RUN: cat %t.result | sed 's/\\/\//g' | FileCheck %s
7-
81
// Use driver arguments.
92
// RUN: rm -rf %t.mcp
103
// RUN: echo %S > %t.result

clang/tools/libclang/CDependencies.cpp

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -221,23 +221,7 @@ getFileDependencies(CXDependencyScannerWorker W, int argc,
221221

222222
DependencyScanningWorker *Worker = unwrap(W);
223223

224-
std::vector<std::string> Compilation;
225-
if (StringRef(argv[1]) == "-cc1")
226-
for (int i = 2; i < argc; ++i)
227-
Compilation.push_back(argv[i]);
228-
else {
229-
// Run the driver to get -cc1 args.
230-
ArrayRef<const char *> CArgs = llvm::makeArrayRef(argv, argv+argc);
231-
IntrusiveRefCntPtr<DiagnosticsEngine>
232-
Diags(CompilerInstance::createDiagnostics(new DiagnosticOptions));
233-
auto CI = createInvocationFromCommandLine(CArgs, Diags, /*VFS=*/nullptr,
234-
/*ShouldRecoverOnErrors=*/false, &Compilation);
235-
if (!CI) {
236-
if (error)
237-
*error = cxstring::createRef("failed creating 'cc1' arguments");
238-
return nullptr;
239-
}
240-
}
224+
std::vector<std::string> Compilation{argv, argv + argc};
241225

242226
if (Worker->getFormat() == ScanningOutputFormat::Full)
243227
return getFullDependencies(Worker, Compilation, WorkingDirectory, MDC,

0 commit comments

Comments
 (0)