@@ -176,16 +176,14 @@ static std::vector<ModuleDependencyID>
176
176
computeTopologicalSortOfExplicitDependencies (
177
177
const ModuleDependencyIDSetVector &allModules,
178
178
const ModuleDependenciesCache &cache) {
179
+ std::unordered_set<ModuleDependencyID> visited;
180
+ std::vector<ModuleDependencyID> result;
181
+ std::stack<ModuleDependencyID> stack;
182
+
179
183
// Must be explicitly-typed to allow recursion
180
- std::function<void (const ModuleDependencyID &,
181
- std::stack<ModuleDependencyID> &,
182
- std::unordered_set<ModuleDependencyID> &,
183
- std::vector<ModuleDependencyID> &)>
184
- visit;
185
- visit = [&visit, &cache](const ModuleDependencyID &moduleID,
186
- std::stack<ModuleDependencyID> &stack,
187
- std::unordered_set<ModuleDependencyID> &visited,
188
- std::vector<ModuleDependencyID> &result) {
184
+ std::function<void (const ModuleDependencyID &)> visit;
185
+ visit = [&visit, &cache, &visited, &result,
186
+ &stack](const ModuleDependencyID &moduleID) {
189
187
// Mark this node as visited -- we are done if it already was.
190
188
if (!visited.insert (moduleID).second )
191
189
return ;
@@ -196,7 +194,7 @@ computeTopologicalSortOfExplicitDependencies(
196
194
// since that would mean we have found a cycle, which should not
197
195
// be possible because we checked for cycles earlier.
198
196
stack.push (succID);
199
- visit (succID, stack, visited, result );
197
+ visit (succID);
200
198
auto top = stack.top ();
201
199
stack.pop ();
202
200
assert (top == succID);
@@ -206,13 +204,10 @@ computeTopologicalSortOfExplicitDependencies(
206
204
result.push_back (moduleID);
207
205
};
208
206
209
- std::unordered_set<ModuleDependencyID> visited;
210
- std::vector<ModuleDependencyID> result;
211
- std::stack<ModuleDependencyID> stack;
212
207
for (const auto &modID : allModules) {
213
208
assert (stack.empty ());
214
209
stack.push (modID);
215
- visit (modID, stack, visited, result );
210
+ visit (modID);
216
211
auto top = stack.top ();
217
212
stack.pop ();
218
213
assert (top == modID);
@@ -222,13 +217,15 @@ computeTopologicalSortOfExplicitDependencies(
222
217
return result;
223
218
}
224
219
225
- // / For each module in the graph, compute a set of all its dependencies
220
+ // / For each module in the graph, compute a set of all its dependencies,
226
221
// / direct *and* transitive.
227
222
static std::unordered_map<ModuleDependencyID,
228
223
std::set<ModuleDependencyID>>
229
224
computeTransitiveClosureOfExplicitDependencies (
230
225
const std::vector<ModuleDependencyID> &topologicallySortedModuleList,
231
226
const ModuleDependenciesCache &cache) {
227
+ // The usage of an ordered ::set is important to ensure the
228
+ // dependencies are listed in a deterministic order.
232
229
std::unordered_map<ModuleDependencyID, std::set<ModuleDependencyID>>
233
230
result;
234
231
for (const auto &modID : topologicallySortedModuleList)
@@ -286,7 +283,7 @@ resolveExplicitModuleInputs(ModuleDependencyID moduleID,
286
283
} break ;
287
284
case swift::ModuleDependencyKind::Clang: {
288
285
auto clangDepDetails = depInfo->getAsClangModule ();
289
- assert (binaryDepDetails && " Expected Clang Module dependency." );
286
+ assert (clangDepDetails && " Expected Clang Module dependency." );
290
287
commandLine.push_back (" -Xcc" );
291
288
commandLine.push_back (" -fmodule-file=" + depModuleID.first + " =" +
292
289
clangDepDetails->pcmOutputPath );
0 commit comments