@@ -325,7 +325,7 @@ class BiIndexedTwoStageMap {
325
325
// / Write out the .swiftdeps file for a frontend compilation of a primary file.
326
326
bool emitReferenceDependencies (DiagnosticEngine &diags, SourceFile *SF,
327
327
const DependencyTracker &depTracker,
328
- StringRef outputPath);
328
+ StringRef outputPath, bool alsoEmitDotFile );
329
329
// ==============================================================================
330
330
// MARK: Enums
331
331
// ==============================================================================
@@ -438,8 +438,8 @@ class DependencyKey {
438
438
name () {}
439
439
440
440
// / For constructing a key in the frontend.
441
- DependencyKey (NodeKind kind, DeclAspect aspect, std::string context,
442
- std::string name)
441
+ DependencyKey (NodeKind kind, DeclAspect aspect, const std::string & context,
442
+ const std::string & name)
443
443
: kind(kind), aspect(aspect), context(context), name(name) {
444
444
assert (verify ());
445
445
}
@@ -449,7 +449,7 @@ class DependencyKey {
449
449
StringRef getContext () const { return context; }
450
450
StringRef getName () const { return name; }
451
451
452
- StringRef getSwiftDepsFromSourceFileProvide () const {
452
+ StringRef getSwiftDepsFromASourceFileProvideNodeKey () const {
453
453
assert (getKind () == NodeKind::sourceFileProvide &&
454
454
" Receiver must be sourceFileProvide." );
455
455
return getName ();
@@ -494,11 +494,19 @@ class DependencyKey {
494
494
static std::string computeNameForProvidedEntity (Entity);
495
495
496
496
// / Given some type of depended-upon entity create the key.
497
- template <NodeKind kind, typename Entity>
498
- static DependencyKey createDependedUponKey (const Entity &);
497
+ static DependencyKey createDependedUponKey (StringRef mangledHolderName,
498
+ StringRef memberBaseName);
499
+
500
+ template <NodeKind kind>
501
+ static DependencyKey createDependedUponKey (StringRef);
502
+
503
+ static DependencyKey
504
+ createTransitiveKeyForWholeSourceFile (StringRef swiftDeps);
499
505
500
506
std::string humanReadableName () const ;
501
507
508
+ StringRef aspectName () const { return DeclAspectNames[size_t (aspect)]; }
509
+
502
510
void dump (llvm::raw_ostream &os) const { os << asString () << " \n " ; }
503
511
SWIFT_DEBUG_DUMP { dump (llvm::errs ()); }
504
512
@@ -535,6 +543,13 @@ struct std::hash<typename swift::fine_grained_dependencies::DeclAspect> {
535
543
}
536
544
};
537
545
546
+ namespace swift {
547
+ namespace fine_grained_dependencies {
548
+ using ContextNameFingerprint =
549
+ std::tuple<std::string, std::string, Optional<std::string>>;
550
+ }
551
+ } // namespace swift
552
+
538
553
// ==============================================================================
539
554
// MARK: DepGraphNode
540
555
// ==============================================================================
@@ -684,6 +699,9 @@ class SourceFileDepGraphNode : public DepGraphNode {
684
699
}
685
700
686
701
// / Record the sequence number, \p n, of another use.
702
+ // / The relationship between an interface and its implementation is NOT
703
+ // / included here. See \c
704
+ // / SourceFileDepGraph::findExistingNodePairOrCreateAndAddIfNew.
687
705
void addDefIDependUpon (size_t n) {
688
706
if (n != getSequenceNumber ())
689
707
defsIDependUpon.insert (n);
@@ -696,8 +714,29 @@ class SourceFileDepGraphNode : public DepGraphNode {
696
714
bool verify () const {
697
715
DepGraphNode::verify ();
698
716
assert (getIsProvides () || isDepends ());
717
+ assert (verifySequenceNumber ());
699
718
return true ;
700
719
}
720
+
721
+ bool verifySequenceNumber () const {
722
+ const auto &k = getKey ();
723
+ if (k.getKind () != NodeKind::sourceFileProvide)
724
+ return true ;
725
+ switch (k.getAspect ()) {
726
+ case DeclAspect::interface:
727
+ assert (getSequenceNumber () == sourceFileProvidesInterfaceSequenceNumber);
728
+ return true ;
729
+ case DeclAspect::implementation:
730
+ assert (getSequenceNumber () ==
731
+ sourceFileProvidesImplementationSequenceNumber);
732
+ return true ;
733
+ default :
734
+ llvm_unreachable (" neither interface nor implementation" );
735
+ }
736
+ }
737
+ static constexpr const size_t sourceFileProvidesInterfaceSequenceNumber = 0 ;
738
+ static constexpr const size_t sourceFileProvidesImplementationSequenceNumber =
739
+ 1 ;
701
740
};
702
741
703
742
// ==============================================================================
@@ -727,6 +766,25 @@ class SourceFileDepGraph {
727
766
SourceFileDepGraph (const SourceFileDepGraph &g) = delete ;
728
767
SourceFileDepGraph (SourceFileDepGraph &&g) = default ;
729
768
769
+ // / Simulate loading for unit testing:
770
+ // / \param swiftDepsFileName The name of the swiftdeps file of the phony job
771
+ // / \param includePrivateDeps Whether the graph includes intra-file arcs
772
+ // / \param hadCompilationError Simulate a compilation error
773
+ // / \param interfaceHash The interface hash of the simulated graph
774
+ // / \param simpleNamesByRDK A map of vectors of names keyed by reference
775
+ // / dependency key \param compoundNamesByRDK A map of (mangledHolder,
776
+ // / baseName) pairs keyed by reference dependency key. For single-name
777
+ // / dependencies, an initial underscore indicates that the name does not
778
+ // / cascade. For compound names, it is the first name, the holder which
779
+ // / indicates non-cascading. For member names, an initial underscore indicates
780
+ // / file-privacy.
781
+ static SourceFileDepGraph
782
+ simulateLoad (std::string swiftDepsFileName, const bool includePrivateDeps,
783
+ const bool hadCompilationError, std::string interfaceHash,
784
+ llvm::StringMap<std::vector<std::string>> simpleNamesByRDK,
785
+ llvm::StringMap<std::vector<std::pair<std::string, std::string>>>
786
+ compoundNamesByRDK);
787
+
730
788
// / Nodes are owned by the graph.
731
789
~SourceFileDepGraph () {
732
790
forEachNode ([&](SourceFileDepGraphNode *n) { delete n; });
@@ -746,7 +804,7 @@ class SourceFileDepGraph {
746
804
InterfaceAndImplementationPair<SourceFileDepGraphNode>
747
805
getSourceFileNodePair () const ;
748
806
749
- StringRef getSwiftDepsFromSourceFileProvide () const ;
807
+ StringRef getSwiftDepsOfJobThatProducedThisGraph () const ;
750
808
751
809
std::string getGraphID () const {
752
810
return getSourceFileNodePair ().getInterface ()->getKey ().humanReadableName ();
@@ -770,12 +828,13 @@ class SourceFileDepGraph {
770
828
// / The frontend creates a pair of nodes for every tracked Decl and the source
771
829
// / file itself.
772
830
InterfaceAndImplementationPair<SourceFileDepGraphNode>
773
- findExistingNodePairOrCreateAndAddIfNew (NodeKind k, StringRef context,
774
- StringRef name,
775
- Optional<std::string> fingerprint);
831
+ findExistingNodePairOrCreateAndAddIfNew (
832
+ NodeKind k, const ContextNameFingerprint &contextNameFingerprint);
776
833
777
- SourceFileDepGraphNode *findExistingNodeOrCreateIfNew (
778
- DependencyKey key, Optional<std::string> fingerprint, bool isProvides);
834
+ SourceFileDepGraphNode *
835
+ findExistingNodeOrCreateIfNew (DependencyKey key,
836
+ const Optional<std::string> &fingerprint,
837
+ bool isProvides);
779
838
780
839
// / \p Use is the Node that must be rebuilt when \p def changes.
781
840
// / Record that fact in the graph.
@@ -800,14 +859,14 @@ class SourceFileDepGraph {
800
859
// / Ensure that when read, the graph is the same as what was written.
801
860
bool verifyReadsWhatIsWritten (StringRef path) const ;
802
861
862
+ bool verifySequenceNumber () const ;
863
+
803
864
private:
804
865
void addNode (SourceFileDepGraphNode *n) {
805
866
n->setSequenceNumber (allNodes.size ());
806
- assert (allNodes.size () < 2 ==
807
- (n->getKey ().getKind () == NodeKind::sourceFileProvide) &&
808
- " First two and only first two nodes should be sourceFileProvide "
809
- " nodes." );
810
867
allNodes.push_back (n);
868
+ assert (n->verifySequenceNumber () &&
869
+ " Certain nodes must be in certain places" );
811
870
}
812
871
};
813
872
@@ -892,7 +951,7 @@ template <typename GraphT> class DotFileEmitter {
892
951
}
893
952
void emitArcs () {
894
953
g.forEachArc ([&](const NodeT *def, const NodeT *use) {
895
- if (includeGraphArc (use, def ))
954
+ if (includeGraphArc (def, use ))
896
955
emitGraphArc (def, use);
897
956
});
898
957
}
0 commit comments