aboutsummaryrefslogtreecommitdiff
path: root/clang/tools/clang-scan-deps
diff options
context:
space:
mode:
Diffstat (limited to 'clang/tools/clang-scan-deps')
-rw-r--r--clang/tools/clang-scan-deps/ClangScanDeps.cpp67
-rw-r--r--clang/tools/clang-scan-deps/Opts.td4
2 files changed, 59 insertions, 12 deletions
diff --git a/clang/tools/clang-scan-deps/ClangScanDeps.cpp b/clang/tools/clang-scan-deps/ClangScanDeps.cpp
index c11a348..5f5bf42 100644
--- a/clang/tools/clang-scan-deps/ClangScanDeps.cpp
+++ b/clang/tools/clang-scan-deps/ClangScanDeps.cpp
@@ -87,7 +87,7 @@ static std::string ModuleFilesDir;
static bool EagerLoadModules;
static unsigned NumThreads = 0;
static std::string CompilationDB;
-static std::optional<std::string> ModuleName;
+static std::optional<std::string> ModuleNames;
static std::vector<std::string> ModuleDepTargets;
static std::string TranslationUnitFile;
static bool DeprecatedDriverCommand;
@@ -205,8 +205,8 @@ static void ParseArgs(int argc, char **argv) {
if (const llvm::opt::Arg *A = Args.getLastArg(OPT_compilation_database_EQ))
CompilationDB = A->getValue();
- if (const llvm::opt::Arg *A = Args.getLastArg(OPT_module_name_EQ))
- ModuleName = A->getValue();
+ if (const llvm::opt::Arg *A = Args.getLastArg(OPT_module_names_EQ))
+ ModuleNames = A->getValue();
for (const llvm::opt::Arg *A : Args.filtered(OPT_dependency_target_EQ))
ModuleDepTargets.emplace_back(A->getValue());
@@ -664,6 +664,16 @@ static bool handleModuleResult(StringRef ModuleName,
return false;
}
+static void handleErrorWithInfoString(StringRef Info, llvm::Error E,
+ SharedStream &OS, SharedStream &Errs) {
+ llvm::handleAllErrors(std::move(E), [&Info, &Errs](llvm::StringError &Err) {
+ Errs.applyLocked([&](raw_ostream &OS) {
+ OS << "Error: " << Info << ":\n";
+ OS << Err.getMessage();
+ });
+ });
+}
+
class P1689Deps {
public:
void printDependencies(raw_ostream &OS) {
@@ -1008,7 +1018,7 @@ int clang_scan_deps_main(int argc, char **argv, const llvm::ToolContext &) {
};
if (Format == ScanningOutputFormat::Full)
- FD.emplace(!ModuleName ? Inputs.size() : 0);
+ FD.emplace(!ModuleNames ? Inputs.size() : 0);
std::atomic<size_t> NumStatusCalls = 0;
std::atomic<size_t> NumOpenFileForReadCalls = 0;
@@ -1082,13 +1092,48 @@ int clang_scan_deps_main(int argc, char **argv, const llvm::ToolContext &) {
MakeformatOS, Errs))
HadErrors = true;
}
- } else if (ModuleName) {
- auto MaybeModuleDepsGraph = WorkerTool.getModuleDependencies(
- *ModuleName, Input->CommandLine, CWD, AlreadySeenModules,
- LookupOutput);
- if (handleModuleResult(*ModuleName, MaybeModuleDepsGraph, *FD,
- LocalIndex, DependencyOS, Errs))
- HadErrors = true;
+ } else if (ModuleNames) {
+ StringRef ModuleNameRef(*ModuleNames);
+ SmallVector<StringRef> Names;
+ ModuleNameRef.split(Names, ',');
+
+ if (Names.size() == 1) {
+ auto MaybeModuleDepsGraph = WorkerTool.getModuleDependencies(
+ Names[0], Input->CommandLine, CWD, AlreadySeenModules,
+ LookupOutput);
+ if (handleModuleResult(Names[0], MaybeModuleDepsGraph, *FD,
+ LocalIndex, DependencyOS, Errs))
+ HadErrors = true;
+ } else {
+ if (llvm::Error Err =
+ WorkerTool.initializeCompilerInstanceWithContext(
+ CWD, Input->CommandLine)) {
+ handleErrorWithInfoString(
+ "Compiler instance with context setup error", std::move(Err),
+ DependencyOS, Errs);
+ HadErrors = true;
+ continue;
+ }
+
+ for (auto N : Names) {
+ auto MaybeModuleDepsGraph =
+ WorkerTool.computeDependenciesByNameWithContext(
+ N, AlreadySeenModules, LookupOutput);
+ if (handleModuleResult(N, MaybeModuleDepsGraph, *FD, LocalIndex,
+ DependencyOS, Errs)) {
+ HadErrors = true;
+ break;
+ }
+ }
+
+ if (llvm::Error Err =
+ WorkerTool.finalizeCompilerInstanceWithContext()) {
+ handleErrorWithInfoString(
+ "Compiler instance with context finialization error",
+ std::move(Err), DependencyOS, Errs);
+ HadErrors = true;
+ }
+ }
} else {
std::unique_ptr<llvm::MemoryBuffer> TU;
std::optional<llvm::MemoryBufferRef> TUBuffer;
diff --git a/clang/tools/clang-scan-deps/Opts.td b/clang/tools/clang-scan-deps/Opts.td
index 7a63b18..6ea9d82 100644
--- a/clang/tools/clang-scan-deps/Opts.td
+++ b/clang/tools/clang-scan-deps/Opts.td
@@ -26,7 +26,9 @@ def eager_load_pcm : F<"eager-load-pcm", "Load PCM files eagerly (instead of laz
def j : Arg<"j", "Number of worker threads to use (default: use all concurrent threads)">;
defm compilation_database : Eq<"compilation-database", "Compilation database">;
-defm module_name : Eq<"module-name", "the module of which the dependencies are to be computed">;
+defm module_names
+ : Eq<"module-names", "A comma separated list of names of modules of which "
+ "the dependencies are to be computed">;
defm dependency_target : Eq<"dependency-target", "The names of dependency targets for the dependency file">;
defm tu_buffer_path: Eq<"tu-buffer-path", "The path to the translation unit for depscan. Not compatible with -module-name">;