Skip to content

Commit 9a88bef

Browse files
committed
Start Keeping Track of Files With Dependencies in the DependencyCollector
This completely obviates the need for the referenced name trackers rdar://59076016
1 parent 21e6bad commit 9a88bef

File tree

3 files changed

+46
-42
lines changed

3 files changed

+46
-42
lines changed

include/swift/AST/Evaluator.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,12 @@ class Evaluator {
262262
void registerRequestFunctions(Zone zone,
263263
ArrayRef<AbstractRequestFunction *> functions);
264264

265+
void enumerateReferencesInFile(
266+
const SourceFile *SF,
267+
evaluator::DependencyRecorder::ReferenceEnumerator f) const {
268+
return recorder.enumerateReferencesInFile(SF, f);
269+
}
270+
265271
/// Retrieve the result produced by evaluating a request that can
266272
/// be cached.
267273
template<typename Request,

include/swift/AST/EvaluatorDependencies.h

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,8 @@ struct DependencyRecorder {
253253
private:
254254
/// A stack of dependency sources in the order they were evaluated.
255255
llvm::SmallVector<evaluator::DependencySource, 8> dependencySources;
256+
llvm::DenseMap<SourceFile *, DependencyCollector::ReferenceSet>
257+
fileReferences;
256258
llvm::DenseMap<AnyRequest, DependencyCollector::ReferenceSet>
257259
requestReferences;
258260
Mode mode;
@@ -269,6 +271,12 @@ struct DependencyRecorder {
269271
void record(const llvm::SetVector<swift::ActiveRequest> &stack,
270272
llvm::function_ref<void(DependencyCollector &)> rec);
271273

274+
public:
275+
using ReferenceEnumerator =
276+
llvm::function_ref<void(const DependencyCollector::Reference &)>;
277+
void enumerateReferencesInFile(const SourceFile *SF,
278+
ReferenceEnumerator f) const ;
279+
272280
public:
273281
/// Returns the scope of the current active scope.
274282
///
@@ -331,25 +339,6 @@ struct DependencyRecorder {
331339
return dependencySources.front().getPointer();
332340
}
333341

334-
/// If there is an active dependency source, returns its
335-
/// \c ReferencedNameTracker. Else, returns \c nullptr.
336-
ReferencedNameTracker *getActiveDependencyTracker() const {
337-
SourceFile *source = nullptr;
338-
switch (mode) {
339-
case Mode::StatusQuo:
340-
source = getActiveDependencySourceOrNull();
341-
break;
342-
case Mode::ExperimentalPrivateDependencies:
343-
source = getFirstDependencySourceOrNull();
344-
break;
345-
}
346-
347-
if (!source)
348-
return nullptr;
349-
350-
return source->getRequestBasedReferencedNameTracker();
351-
}
352-
353342
/// Returns \c true if the scope of the current active source cascades.
354343
///
355344
/// If there is no active scope, the result always cascades.

lib/AST/Evaluator.cpp

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -381,28 +381,12 @@ void Evaluator::dumpDependenciesGraphviz() const {
381381

382382
void evaluator::DependencyRecorder::realize(
383383
const DependencyCollector::Reference &ref) {
384-
auto *tracker = getActiveDependencyTracker();
385-
assert(tracker && "cannot realize dependency without name tracker!");
386-
387-
using Kind = evaluator::DependencyCollector::Reference::Kind;
388-
switch (ref.kind) {
389-
case Kind::Empty:
390-
case Kind::Tombstone:
391-
llvm_unreachable("cannot record empty dependency");
392-
case Kind::UsedMember:
393-
tracker->addUsedMember({ref.subject, ref.name}, isActiveSourceCascading());
394-
break;
395-
case Kind::PotentialMember:
396-
tracker->addUsedMember({ref.subject, Identifier()},
397-
isActiveSourceCascading());
398-
break;
399-
case Kind::TopLevel:
400-
tracker->addTopLevelName(ref.name, isActiveSourceCascading());
401-
break;
402-
case Kind::Dynamic:
403-
tracker->addDynamicLookupName(ref.name, isActiveSourceCascading());
404-
break;
384+
auto *source = getActiveDependencySourceOrNull();
385+
assert(source && "cannot realize dependency without associated file!");
386+
if (!source->hasInterfaceHash()) {
387+
return;
405388
}
389+
fileReferences[source].insert(ref);
406390
}
407391

408392
void evaluator::DependencyCollector::addUsedMember(NominalTypeDecl *subject,
@@ -449,7 +433,8 @@ void evaluator::DependencyRecorder::record(
449433
const llvm::SetVector<swift::ActiveRequest> &stack,
450434
llvm::function_ref<void(DependencyCollector &)> rec) {
451435
assert(!isRecording && "Probably not a good idea to allow nested recording");
452-
if (!getActiveDependencyTracker()) {
436+
auto *source = getActiveDependencySourceOrNull();
437+
if (!source || !source->hasInterfaceHash()) {
453438
return;
454439
}
455440

@@ -480,7 +465,8 @@ void evaluator::DependencyRecorder::record(
480465
void evaluator::DependencyRecorder::replay(const swift::ActiveRequest &req) {
481466
assert(!isRecording && "Probably not a good idea to allow nested recording");
482467

483-
if (mode == Mode::StatusQuo || !getActiveDependencyTracker()) {
468+
auto *source = getActiveDependencySourceOrNull();
469+
if (mode == Mode::StatusQuo || !source || !source->hasInterfaceHash()) {
484470
return;
485471
}
486472

@@ -497,3 +483,26 @@ void evaluator::DependencyRecorder::replay(const swift::ActiveRequest &req) {
497483
realize(ref);
498484
}
499485
}
486+
487+
using namespace swift;
488+
489+
void evaluator::DependencyRecorder::enumerateReferencesInFile(
490+
const SourceFile *SF, ReferenceEnumerator f) const {
491+
auto entry = fileReferences.find(SF);
492+
if (entry == fileReferences.end()) {
493+
return;
494+
}
495+
496+
for (const auto &ref : entry->getSecond()) {
497+
switch (ref.kind) {
498+
case DependencyCollector::Reference::Kind::Empty:
499+
case DependencyCollector::Reference::Kind::Tombstone:
500+
llvm_unreachable("Cannot enumerate dead reference!");
501+
case DependencyCollector::Reference::Kind::UsedMember:
502+
case DependencyCollector::Reference::Kind::PotentialMember:
503+
case DependencyCollector::Reference::Kind::TopLevel:
504+
case DependencyCollector::Reference::Kind::Dynamic:
505+
f(ref);
506+
}
507+
}
508+
}

0 commit comments

Comments
 (0)