Skip to content

Commit 0c597a8

Browse files
committed
Dependencies: Move YAML reader and writer code to swift-dependency-tool
1 parent d9073c8 commit 0c597a8

File tree

3 files changed

+129
-142
lines changed

3 files changed

+129
-142
lines changed

include/swift/AST/FineGrainedDependencies.h

-55
Original file line numberDiff line numberDiff line change
@@ -804,15 +804,6 @@ class SourceFileDepGraph {
804804
forEachNode([&](SourceFileDepGraphNode *n) { delete n; });
805805
}
806806

807-
/// Goes at the start of an emitted YAML file to help tools recognize it.
808-
/// May vary in the future according to version, etc.
809-
std::string yamlProlog(const bool hadCompilationError) const {
810-
return std::string("# Fine-grained v0\n") +
811-
(!hadCompilationError ? ""
812-
: "# Dependencies are unknown because a "
813-
"compilation error occurred.\n");
814-
}
815-
816807
SourceFileDepGraphNode *getNode(size_t sequenceNumber) const;
817808

818809
InterfaceAndImplementationPair<SourceFileDepGraphNode>
@@ -1016,50 +1007,4 @@ template <typename GraphT> class DotFileEmitter {
10161007
} // end namespace fine_grained_dependencies
10171008
} // end namespace swift
10181009

1019-
//==============================================================================
1020-
// MARK: Declarations for YAMLTraits for reading/writing of SourceFileDepGraph
1021-
//==============================================================================
1022-
1023-
// This introduces a redefinition where ever std::is_same_t<size_t, uint64_t>
1024-
// holds
1025-
#if !(defined(__linux__) || defined(_WIN64))
1026-
LLVM_YAML_DECLARE_SCALAR_TRAITS(size_t, QuotingType::None)
1027-
#endif
1028-
LLVM_YAML_DECLARE_ENUM_TRAITS(swift::fine_grained_dependencies::NodeKind)
1029-
LLVM_YAML_DECLARE_ENUM_TRAITS(swift::fine_grained_dependencies::DeclAspect)
1030-
LLVM_YAML_DECLARE_MAPPING_TRAITS(
1031-
swift::fine_grained_dependencies::DependencyKey)
1032-
LLVM_YAML_DECLARE_MAPPING_TRAITS(swift::fine_grained_dependencies::DepGraphNode)
1033-
1034-
namespace llvm {
1035-
namespace yaml {
1036-
template <>
1037-
struct MappingContextTraits<
1038-
swift::fine_grained_dependencies::SourceFileDepGraphNode,
1039-
swift::fine_grained_dependencies::SourceFileDepGraph> {
1040-
using SourceFileDepGraphNode =
1041-
swift::fine_grained_dependencies::SourceFileDepGraphNode;
1042-
using SourceFileDepGraph =
1043-
swift::fine_grained_dependencies::SourceFileDepGraph;
1044-
1045-
static void mapping(IO &io, SourceFileDepGraphNode &node,
1046-
SourceFileDepGraph &g);
1047-
};
1048-
1049-
template <>
1050-
struct SequenceTraits<
1051-
std::vector<swift::fine_grained_dependencies::SourceFileDepGraphNode *>> {
1052-
using SourceFileDepGraphNode =
1053-
swift::fine_grained_dependencies::SourceFileDepGraphNode;
1054-
using NodeVec = std::vector<SourceFileDepGraphNode *>;
1055-
static size_t size(IO &, NodeVec &vec);
1056-
static SourceFileDepGraphNode &element(IO &, NodeVec &vec, size_t index);
1057-
};
1058-
1059-
} // namespace yaml
1060-
} // namespace llvm
1061-
1062-
LLVM_YAML_DECLARE_MAPPING_TRAITS(
1063-
swift::fine_grained_dependencies::SourceFileDepGraph)
1064-
10651010
#endif // SWIFT_AST_FINE_GRAINED_DEPENDENCIES_H

lib/AST/FineGrainedDependencies.cpp

-86
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
#include "llvm/ADT/SmallVector.h"
2929
#include "llvm/Support/FileSystem.h"
3030
#include "llvm/Support/Path.h"
31-
#include "llvm/Support/YAMLParser.h"
3231

3332

3433
// This file holds the definitions for the fine-grained dependency system
@@ -371,88 +370,3 @@ void SourceFileDepGraph::emitDotFile(StringRef outputPath,
371370
return false;
372371
});
373372
}
374-
375-
//==============================================================================
376-
// MARK: SourceFileDepGraph YAML reading & writing
377-
//==============================================================================
378-
379-
namespace llvm {
380-
namespace yaml {
381-
// This introduces a redefinition for Linux.
382-
#if !(defined(__linux__) || defined(_WIN64))
383-
void ScalarTraits<size_t>::output(const size_t &Val, void *, raw_ostream &out) {
384-
out << Val;
385-
}
386-
387-
StringRef ScalarTraits<size_t>::input(StringRef scalar, void *ctxt,
388-
size_t &value) {
389-
return scalar.getAsInteger(10, value) ? "could not parse size_t" : "";
390-
}
391-
#endif
392-
393-
void ScalarEnumerationTraits<swift::fine_grained_dependencies::NodeKind>::
394-
enumeration(IO &io, swift::fine_grained_dependencies::NodeKind &value) {
395-
using NodeKind = swift::fine_grained_dependencies::NodeKind;
396-
io.enumCase(value, "topLevel", NodeKind::topLevel);
397-
io.enumCase(value, "nominal", NodeKind::nominal);
398-
io.enumCase(value, "potentialMember", NodeKind::potentialMember);
399-
io.enumCase(value, "member", NodeKind::member);
400-
io.enumCase(value, "dynamicLookup", NodeKind::dynamicLookup);
401-
io.enumCase(value, "externalDepend", NodeKind::externalDepend);
402-
io.enumCase(value, "sourceFileProvide", NodeKind::sourceFileProvide);
403-
}
404-
405-
void ScalarEnumerationTraits<DeclAspect>::enumeration(
406-
IO &io, swift::fine_grained_dependencies::DeclAspect &value) {
407-
using DeclAspect = swift::fine_grained_dependencies::DeclAspect;
408-
io.enumCase(value, "interface", DeclAspect::interface);
409-
io.enumCase(value, "implementation", DeclAspect::implementation);
410-
}
411-
412-
void MappingTraits<DependencyKey>::mapping(
413-
IO &io, swift::fine_grained_dependencies::DependencyKey &key) {
414-
io.mapRequired("kind", key.kind);
415-
io.mapRequired("aspect", key.aspect);
416-
io.mapRequired("context", key.context);
417-
io.mapRequired("name", key.name);
418-
}
419-
420-
void MappingTraits<DepGraphNode>::mapping(
421-
IO &io, swift::fine_grained_dependencies::DepGraphNode &node) {
422-
io.mapRequired("key", node.key);
423-
io.mapOptional("fingerprint", node.fingerprint);
424-
}
425-
426-
void MappingContextTraits<SourceFileDepGraphNode, SourceFileDepGraph>::mapping(
427-
IO &io, SourceFileDepGraphNode &node, SourceFileDepGraph &g) {
428-
MappingTraits<DepGraphNode>::mapping(io, node);
429-
io.mapRequired("sequenceNumber", node.sequenceNumber);
430-
std::vector<size_t> defsIDependUponVec(node.defsIDependUpon.begin(),
431-
node.defsIDependUpon.end());
432-
io.mapRequired("defsIDependUpon", defsIDependUponVec);
433-
io.mapRequired("isProvides", node.isProvides);
434-
if (!io.outputting()) {
435-
for (size_t u : defsIDependUponVec)
436-
node.defsIDependUpon.insert(u);
437-
}
438-
assert(g.getNode(node.sequenceNumber) && "Bad sequence number");
439-
}
440-
441-
size_t SequenceTraits<std::vector<SourceFileDepGraphNode *>>::size(
442-
IO &, std::vector<SourceFileDepGraphNode *> &vec) {
443-
return vec.size();
444-
}
445-
446-
SourceFileDepGraphNode &
447-
SequenceTraits<std::vector<SourceFileDepGraphNode *>>::element(
448-
IO &, std::vector<SourceFileDepGraphNode *> &vec, size_t index) {
449-
while (vec.size() <= index)
450-
vec.push_back(new SourceFileDepGraphNode());
451-
return *vec[index];
452-
}
453-
454-
void MappingTraits<SourceFileDepGraph>::mapping(IO &io, SourceFileDepGraph &g) {
455-
io.mapRequired("allNodes", g.allNodes, g);
456-
}
457-
} // namespace yaml
458-
} // namespace llvm

tools/swift-dependency-tool/swift-dependency-tool.cpp

+129-1
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,138 @@
1919
#include "llvm/Support/CommandLine.h"
2020
#include "llvm/Support/MemoryBuffer.h"
2121
#include "llvm/Support/YAMLParser.h"
22+
#include "llvm/Support/YAMLTraits.h"
2223

2324
using namespace swift;
2425
using namespace fine_grained_dependencies;
2526

27+
//==============================================================================
28+
// MARK: SourceFileDepGraph YAML reading & writing
29+
//==============================================================================
30+
31+
// This introduces a redefinition where ever std::is_same_t<size_t, uint64_t>
32+
// holds
33+
#if !(defined(__linux__) || defined(_WIN64))
34+
LLVM_YAML_DECLARE_SCALAR_TRAITS(size_t, QuotingType::None)
35+
#endif
36+
LLVM_YAML_DECLARE_ENUM_TRAITS(swift::fine_grained_dependencies::NodeKind)
37+
LLVM_YAML_DECLARE_ENUM_TRAITS(swift::fine_grained_dependencies::DeclAspect)
38+
LLVM_YAML_DECLARE_MAPPING_TRAITS(
39+
swift::fine_grained_dependencies::DependencyKey)
40+
LLVM_YAML_DECLARE_MAPPING_TRAITS(swift::fine_grained_dependencies::DepGraphNode)
41+
42+
namespace llvm {
43+
namespace yaml {
44+
template <>
45+
struct MappingContextTraits<
46+
swift::fine_grained_dependencies::SourceFileDepGraphNode,
47+
swift::fine_grained_dependencies::SourceFileDepGraph> {
48+
using SourceFileDepGraphNode =
49+
swift::fine_grained_dependencies::SourceFileDepGraphNode;
50+
using SourceFileDepGraph =
51+
swift::fine_grained_dependencies::SourceFileDepGraph;
52+
53+
static void mapping(IO &io, SourceFileDepGraphNode &node,
54+
SourceFileDepGraph &g);
55+
};
56+
57+
template <>
58+
struct SequenceTraits<
59+
std::vector<swift::fine_grained_dependencies::SourceFileDepGraphNode *>> {
60+
using SourceFileDepGraphNode =
61+
swift::fine_grained_dependencies::SourceFileDepGraphNode;
62+
using NodeVec = std::vector<SourceFileDepGraphNode *>;
63+
static size_t size(IO &, NodeVec &vec);
64+
static SourceFileDepGraphNode &element(IO &, NodeVec &vec, size_t index);
65+
};
66+
67+
} // namespace yaml
68+
} // namespace llvm
69+
70+
LLVM_YAML_DECLARE_MAPPING_TRAITS(
71+
swift::fine_grained_dependencies::SourceFileDepGraph)
72+
73+
namespace llvm {
74+
namespace yaml {
75+
// This introduces a redefinition for Linux.
76+
#if !(defined(__linux__) || defined(_WIN64))
77+
void ScalarTraits<size_t>::output(const size_t &Val, void *, raw_ostream &out) {
78+
out << Val;
79+
}
80+
81+
StringRef ScalarTraits<size_t>::input(StringRef scalar, void *ctxt,
82+
size_t &value) {
83+
return scalar.getAsInteger(10, value) ? "could not parse size_t" : "";
84+
}
85+
#endif
86+
87+
void ScalarEnumerationTraits<swift::fine_grained_dependencies::NodeKind>::
88+
enumeration(IO &io, swift::fine_grained_dependencies::NodeKind &value) {
89+
using NodeKind = swift::fine_grained_dependencies::NodeKind;
90+
io.enumCase(value, "topLevel", NodeKind::topLevel);
91+
io.enumCase(value, "nominal", NodeKind::nominal);
92+
io.enumCase(value, "potentialMember", NodeKind::potentialMember);
93+
io.enumCase(value, "member", NodeKind::member);
94+
io.enumCase(value, "dynamicLookup", NodeKind::dynamicLookup);
95+
io.enumCase(value, "externalDepend", NodeKind::externalDepend);
96+
io.enumCase(value, "sourceFileProvide", NodeKind::sourceFileProvide);
97+
}
98+
99+
void ScalarEnumerationTraits<DeclAspect>::enumeration(
100+
IO &io, swift::fine_grained_dependencies::DeclAspect &value) {
101+
using DeclAspect = swift::fine_grained_dependencies::DeclAspect;
102+
io.enumCase(value, "interface", DeclAspect::interface);
103+
io.enumCase(value, "implementation", DeclAspect::implementation);
104+
}
105+
106+
void MappingTraits<DependencyKey>::mapping(
107+
IO &io, swift::fine_grained_dependencies::DependencyKey &key) {
108+
io.mapRequired("kind", key.kind);
109+
io.mapRequired("aspect", key.aspect);
110+
io.mapRequired("context", key.context);
111+
io.mapRequired("name", key.name);
112+
}
113+
114+
void MappingTraits<DepGraphNode>::mapping(
115+
IO &io, swift::fine_grained_dependencies::DepGraphNode &node) {
116+
io.mapRequired("key", node.key);
117+
io.mapOptional("fingerprint", node.fingerprint);
118+
}
119+
120+
void MappingContextTraits<SourceFileDepGraphNode, SourceFileDepGraph>::mapping(
121+
IO &io, SourceFileDepGraphNode &node, SourceFileDepGraph &g) {
122+
MappingTraits<DepGraphNode>::mapping(io, node);
123+
io.mapRequired("sequenceNumber", node.sequenceNumber);
124+
std::vector<size_t> defsIDependUponVec(node.defsIDependUpon.begin(),
125+
node.defsIDependUpon.end());
126+
io.mapRequired("defsIDependUpon", defsIDependUponVec);
127+
io.mapRequired("isProvides", node.isProvides);
128+
if (!io.outputting()) {
129+
for (size_t u : defsIDependUponVec)
130+
node.defsIDependUpon.insert(u);
131+
}
132+
assert(g.getNode(node.sequenceNumber) && "Bad sequence number");
133+
}
134+
135+
size_t SequenceTraits<std::vector<SourceFileDepGraphNode *>>::size(
136+
IO &, std::vector<SourceFileDepGraphNode *> &vec) {
137+
return vec.size();
138+
}
139+
140+
SourceFileDepGraphNode &
141+
SequenceTraits<std::vector<SourceFileDepGraphNode *>>::element(
142+
IO &, std::vector<SourceFileDepGraphNode *> &vec, size_t index) {
143+
while (vec.size() <= index)
144+
vec.push_back(new SourceFileDepGraphNode());
145+
return *vec[index];
146+
}
147+
148+
void MappingTraits<SourceFileDepGraph>::mapping(IO &io, SourceFileDepGraph &g) {
149+
io.mapRequired("allNodes", g.allNodes, g);
150+
}
151+
} // namespace yaml
152+
} // namespace llvm
153+
26154
enum class ActionType : unsigned {
27155
None,
28156
BinaryToYAML,
@@ -81,7 +209,7 @@ int main(int argc, char *argv[]) {
81209
bool hadError =
82210
withOutputFile(diags, options::OutputFilename,
83211
[&](llvm::raw_pwrite_stream &out) {
84-
out << fg->yamlProlog(/*hadError=*/false);
212+
out << "# Fine-grained v0\n";
85213
llvm::yaml::Output yamlWriter(out);
86214
yamlWriter << *fg;
87215
return false;

0 commit comments

Comments
 (0)