annotate clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp @ 223:5f17cb93ff66 llvm-original

LLVM13 (2021/7/18)
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 18 Jul 2021 22:43:00 +0900
parents 79ff65ed7e25
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===- DependencyScanningTool.cpp - clang-scan-deps service ---------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #include "clang/Tooling/DependencyScanning/DependencyScanningTool.h"
anatofuz
parents:
diff changeset
10 #include "clang/Frontend/Utils.h"
anatofuz
parents:
diff changeset
11
anatofuz
parents:
diff changeset
12 namespace clang{
anatofuz
parents:
diff changeset
13 namespace tooling{
anatofuz
parents:
diff changeset
14 namespace dependencies{
anatofuz
parents:
diff changeset
15
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
16 std::vector<std::string> FullDependencies::getAdditionalArgs(
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
17 std::function<StringRef(ModuleID)> LookupPCMPath,
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
18 std::function<const ModuleDeps &(ModuleID)> LookupModuleDeps) const {
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
19 std::vector<std::string> Ret = getAdditionalArgsWithoutModulePaths();
150
anatofuz
parents:
diff changeset
20
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
21 std::vector<std::string> PCMPaths;
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
22 std::vector<std::string> ModMapPaths;
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
23 dependencies::detail::collectPCMAndModuleMapPaths(
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
24 ClangModuleDeps, LookupPCMPath, LookupModuleDeps, PCMPaths, ModMapPaths);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
25 for (const std::string &PCMPath : PCMPaths)
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
26 Ret.push_back("-fmodule-file=" + PCMPath);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
27 for (const std::string &ModMapPath : ModMapPaths)
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
28 Ret.push_back("-fmodule-map-file=" + ModMapPath);
150
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 return Ret;
anatofuz
parents:
diff changeset
31 }
anatofuz
parents:
diff changeset
32
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
33 std::vector<std::string>
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
34 FullDependencies::getAdditionalArgsWithoutModulePaths() const {
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
35 std::vector<std::string> Args{
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
36 "-fno-implicit-modules",
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
37 "-fno-implicit-module-maps",
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
38 };
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
39
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
40 for (const PrebuiltModuleDep &PMD : PrebuiltModuleDeps) {
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
41 Args.push_back("-fmodule-file=" + PMD.ModuleName + "=" + PMD.PCMFile);
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
42 Args.push_back("-fmodule-map-file=" + PMD.ModuleMapFile);
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
43 }
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
44
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
45 return Args;
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
46 }
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
47
150
anatofuz
parents:
diff changeset
48 DependencyScanningTool::DependencyScanningTool(
anatofuz
parents:
diff changeset
49 DependencyScanningService &Service)
anatofuz
parents:
diff changeset
50 : Worker(Service) {}
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 llvm::Expected<std::string> DependencyScanningTool::getDependencyFile(
anatofuz
parents:
diff changeset
53 const tooling::CompilationDatabase &Compilations, StringRef CWD) {
anatofuz
parents:
diff changeset
54 /// Prints out all of the gathered dependencies into a string.
anatofuz
parents:
diff changeset
55 class MakeDependencyPrinterConsumer : public DependencyConsumer {
anatofuz
parents:
diff changeset
56 public:
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
57 void
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
58 handleDependencyOutputOpts(const DependencyOutputOptions &Opts) override {
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
59 this->Opts = std::make_unique<DependencyOutputOptions>(Opts);
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
60 }
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
61
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
62 void handleFileDependency(StringRef File) override {
150
anatofuz
parents:
diff changeset
63 Dependencies.push_back(std::string(File));
anatofuz
parents:
diff changeset
64 }
anatofuz
parents:
diff changeset
65
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
66 void handlePrebuiltModuleDependency(PrebuiltModuleDep PMD) override {
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
67 // Same as `handleModuleDependency`.
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
68 }
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
69
150
anatofuz
parents:
diff changeset
70 void handleModuleDependency(ModuleDeps MD) override {
anatofuz
parents:
diff changeset
71 // These are ignored for the make format as it can't support the full
anatofuz
parents:
diff changeset
72 // set of deps, and handleFileDependency handles enough for implicitly
anatofuz
parents:
diff changeset
73 // built modules to work.
anatofuz
parents:
diff changeset
74 }
anatofuz
parents:
diff changeset
75
anatofuz
parents:
diff changeset
76 void handleContextHash(std::string Hash) override {}
anatofuz
parents:
diff changeset
77
anatofuz
parents:
diff changeset
78 void printDependencies(std::string &S) {
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
79 assert(Opts && "Handled dependency output options.");
150
anatofuz
parents:
diff changeset
80
anatofuz
parents:
diff changeset
81 class DependencyPrinter : public DependencyFileGenerator {
anatofuz
parents:
diff changeset
82 public:
anatofuz
parents:
diff changeset
83 DependencyPrinter(DependencyOutputOptions &Opts,
anatofuz
parents:
diff changeset
84 ArrayRef<std::string> Dependencies)
anatofuz
parents:
diff changeset
85 : DependencyFileGenerator(Opts) {
anatofuz
parents:
diff changeset
86 for (const auto &Dep : Dependencies)
anatofuz
parents:
diff changeset
87 addDependency(Dep);
anatofuz
parents:
diff changeset
88 }
anatofuz
parents:
diff changeset
89
anatofuz
parents:
diff changeset
90 void printDependencies(std::string &S) {
anatofuz
parents:
diff changeset
91 llvm::raw_string_ostream OS(S);
anatofuz
parents:
diff changeset
92 outputDependencyFile(OS);
anatofuz
parents:
diff changeset
93 }
anatofuz
parents:
diff changeset
94 };
anatofuz
parents:
diff changeset
95
anatofuz
parents:
diff changeset
96 DependencyPrinter Generator(*Opts, Dependencies);
anatofuz
parents:
diff changeset
97 Generator.printDependencies(S);
anatofuz
parents:
diff changeset
98 }
anatofuz
parents:
diff changeset
99
anatofuz
parents:
diff changeset
100 private:
anatofuz
parents:
diff changeset
101 std::unique_ptr<DependencyOutputOptions> Opts;
anatofuz
parents:
diff changeset
102 std::vector<std::string> Dependencies;
anatofuz
parents:
diff changeset
103 };
anatofuz
parents:
diff changeset
104
anatofuz
parents:
diff changeset
105 // We expect a single command here because if a source file occurs multiple
anatofuz
parents:
diff changeset
106 // times in the original CDB, then `computeDependencies` would run the
anatofuz
parents:
diff changeset
107 // `DependencyScanningAction` once for every time the input occured in the
anatofuz
parents:
diff changeset
108 // CDB. Instead we split up the CDB into single command chunks to avoid this
anatofuz
parents:
diff changeset
109 // behavior.
anatofuz
parents:
diff changeset
110 assert(Compilations.getAllCompileCommands().size() == 1 &&
anatofuz
parents:
diff changeset
111 "Expected a compilation database with a single command!");
anatofuz
parents:
diff changeset
112 std::string Input = Compilations.getAllCompileCommands().front().Filename;
anatofuz
parents:
diff changeset
113
anatofuz
parents:
diff changeset
114 MakeDependencyPrinterConsumer Consumer;
anatofuz
parents:
diff changeset
115 auto Result = Worker.computeDependencies(Input, CWD, Compilations, Consumer);
anatofuz
parents:
diff changeset
116 if (Result)
anatofuz
parents:
diff changeset
117 return std::move(Result);
anatofuz
parents:
diff changeset
118 std::string Output;
anatofuz
parents:
diff changeset
119 Consumer.printDependencies(Output);
anatofuz
parents:
diff changeset
120 return Output;
anatofuz
parents:
diff changeset
121 }
anatofuz
parents:
diff changeset
122
anatofuz
parents:
diff changeset
123 llvm::Expected<FullDependenciesResult>
anatofuz
parents:
diff changeset
124 DependencyScanningTool::getFullDependencies(
anatofuz
parents:
diff changeset
125 const tooling::CompilationDatabase &Compilations, StringRef CWD,
anatofuz
parents:
diff changeset
126 const llvm::StringSet<> &AlreadySeen) {
anatofuz
parents:
diff changeset
127 class FullDependencyPrinterConsumer : public DependencyConsumer {
anatofuz
parents:
diff changeset
128 public:
anatofuz
parents:
diff changeset
129 FullDependencyPrinterConsumer(const llvm::StringSet<> &AlreadySeen)
anatofuz
parents:
diff changeset
130 : AlreadySeen(AlreadySeen) {}
anatofuz
parents:
diff changeset
131
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
132 void
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
133 handleDependencyOutputOpts(const DependencyOutputOptions &Opts) override {}
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
134
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
135 void handleFileDependency(StringRef File) override {
150
anatofuz
parents:
diff changeset
136 Dependencies.push_back(std::string(File));
anatofuz
parents:
diff changeset
137 }
anatofuz
parents:
diff changeset
138
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
139 void handlePrebuiltModuleDependency(PrebuiltModuleDep PMD) override {
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
140 PrebuiltModuleDeps.emplace_back(std::move(PMD));
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
141 }
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
142
150
anatofuz
parents:
diff changeset
143 void handleModuleDependency(ModuleDeps MD) override {
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
144 ClangModuleDeps[MD.ID.ContextHash + MD.ID.ModuleName] = std::move(MD);
150
anatofuz
parents:
diff changeset
145 }
anatofuz
parents:
diff changeset
146
anatofuz
parents:
diff changeset
147 void handleContextHash(std::string Hash) override {
anatofuz
parents:
diff changeset
148 ContextHash = std::move(Hash);
anatofuz
parents:
diff changeset
149 }
anatofuz
parents:
diff changeset
150
anatofuz
parents:
diff changeset
151 FullDependenciesResult getFullDependencies() const {
anatofuz
parents:
diff changeset
152 FullDependencies FD;
anatofuz
parents:
diff changeset
153
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
154 FD.ID.ContextHash = std::move(ContextHash);
150
anatofuz
parents:
diff changeset
155
anatofuz
parents:
diff changeset
156 FD.FileDeps.assign(Dependencies.begin(), Dependencies.end());
anatofuz
parents:
diff changeset
157
anatofuz
parents:
diff changeset
158 for (auto &&M : ClangModuleDeps) {
anatofuz
parents:
diff changeset
159 auto &MD = M.second;
anatofuz
parents:
diff changeset
160 if (MD.ImportedByMainFile)
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
161 FD.ClangModuleDeps.push_back(MD.ID);
150
anatofuz
parents:
diff changeset
162 }
anatofuz
parents:
diff changeset
163
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
164 FD.PrebuiltModuleDeps = std::move(PrebuiltModuleDeps);
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
165
150
anatofuz
parents:
diff changeset
166 FullDependenciesResult FDR;
anatofuz
parents:
diff changeset
167
anatofuz
parents:
diff changeset
168 for (auto &&M : ClangModuleDeps) {
anatofuz
parents:
diff changeset
169 // TODO: Avoid handleModuleDependency even being called for modules
anatofuz
parents:
diff changeset
170 // we've already seen.
anatofuz
parents:
diff changeset
171 if (AlreadySeen.count(M.first))
anatofuz
parents:
diff changeset
172 continue;
anatofuz
parents:
diff changeset
173 FDR.DiscoveredModules.push_back(std::move(M.second));
anatofuz
parents:
diff changeset
174 }
anatofuz
parents:
diff changeset
175
anatofuz
parents:
diff changeset
176 FDR.FullDeps = std::move(FD);
anatofuz
parents:
diff changeset
177 return FDR;
anatofuz
parents:
diff changeset
178 }
anatofuz
parents:
diff changeset
179
anatofuz
parents:
diff changeset
180 private:
anatofuz
parents:
diff changeset
181 std::vector<std::string> Dependencies;
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
182 std::vector<PrebuiltModuleDep> PrebuiltModuleDeps;
150
anatofuz
parents:
diff changeset
183 std::unordered_map<std::string, ModuleDeps> ClangModuleDeps;
anatofuz
parents:
diff changeset
184 std::string ContextHash;
anatofuz
parents:
diff changeset
185 std::vector<std::string> OutputPaths;
anatofuz
parents:
diff changeset
186 const llvm::StringSet<> &AlreadySeen;
anatofuz
parents:
diff changeset
187 };
anatofuz
parents:
diff changeset
188
anatofuz
parents:
diff changeset
189 // We expect a single command here because if a source file occurs multiple
anatofuz
parents:
diff changeset
190 // times in the original CDB, then `computeDependencies` would run the
anatofuz
parents:
diff changeset
191 // `DependencyScanningAction` once for every time the input occured in the
anatofuz
parents:
diff changeset
192 // CDB. Instead we split up the CDB into single command chunks to avoid this
anatofuz
parents:
diff changeset
193 // behavior.
anatofuz
parents:
diff changeset
194 assert(Compilations.getAllCompileCommands().size() == 1 &&
anatofuz
parents:
diff changeset
195 "Expected a compilation database with a single command!");
anatofuz
parents:
diff changeset
196 std::string Input = Compilations.getAllCompileCommands().front().Filename;
anatofuz
parents:
diff changeset
197
anatofuz
parents:
diff changeset
198 FullDependencyPrinterConsumer Consumer(AlreadySeen);
anatofuz
parents:
diff changeset
199 llvm::Error Result =
anatofuz
parents:
diff changeset
200 Worker.computeDependencies(Input, CWD, Compilations, Consumer);
anatofuz
parents:
diff changeset
201 if (Result)
anatofuz
parents:
diff changeset
202 return std::move(Result);
anatofuz
parents:
diff changeset
203 return Consumer.getFullDependencies();
anatofuz
parents:
diff changeset
204 }
anatofuz
parents:
diff changeset
205
anatofuz
parents:
diff changeset
206 } // end namespace dependencies
anatofuz
parents:
diff changeset
207 } // end namespace tooling
anatofuz
parents:
diff changeset
208 } // end namespace clang