From 0c597a8b9221b416215f199a717c82f8fc4c3499 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 11 Jun 2020 15:25:11 -0400 Subject: [PATCH] Dependencies: Move YAML reader and writer code to swift-dependency-tool --- include/swift/AST/FineGrainedDependencies.h | 55 -------- lib/AST/FineGrainedDependencies.cpp | 86 ------------ .../swift-dependency-tool.cpp | 130 +++++++++++++++++- 3 files changed, 129 insertions(+), 142 deletions(-) diff --git a/include/swift/AST/FineGrainedDependencies.h b/include/swift/AST/FineGrainedDependencies.h index 381b4443c0cb3..e904cf4fbe703 100644 --- a/include/swift/AST/FineGrainedDependencies.h +++ b/include/swift/AST/FineGrainedDependencies.h @@ -804,15 +804,6 @@ class SourceFileDepGraph { forEachNode([&](SourceFileDepGraphNode *n) { delete n; }); } - /// Goes at the start of an emitted YAML file to help tools recognize it. - /// May vary in the future according to version, etc. - std::string yamlProlog(const bool hadCompilationError) const { - return std::string("# Fine-grained v0\n") + - (!hadCompilationError ? "" - : "# Dependencies are unknown because a " - "compilation error occurred.\n"); - } - SourceFileDepGraphNode *getNode(size_t sequenceNumber) const; InterfaceAndImplementationPair @@ -1016,50 +1007,4 @@ template class DotFileEmitter { } // end namespace fine_grained_dependencies } // end namespace swift -//============================================================================== -// MARK: Declarations for YAMLTraits for reading/writing of SourceFileDepGraph -//============================================================================== - -// This introduces a redefinition where ever std::is_same_t -// holds -#if !(defined(__linux__) || defined(_WIN64)) -LLVM_YAML_DECLARE_SCALAR_TRAITS(size_t, QuotingType::None) -#endif -LLVM_YAML_DECLARE_ENUM_TRAITS(swift::fine_grained_dependencies::NodeKind) -LLVM_YAML_DECLARE_ENUM_TRAITS(swift::fine_grained_dependencies::DeclAspect) -LLVM_YAML_DECLARE_MAPPING_TRAITS( - swift::fine_grained_dependencies::DependencyKey) -LLVM_YAML_DECLARE_MAPPING_TRAITS(swift::fine_grained_dependencies::DepGraphNode) - -namespace llvm { -namespace yaml { -template <> -struct MappingContextTraits< - swift::fine_grained_dependencies::SourceFileDepGraphNode, - swift::fine_grained_dependencies::SourceFileDepGraph> { - using SourceFileDepGraphNode = - swift::fine_grained_dependencies::SourceFileDepGraphNode; - using SourceFileDepGraph = - swift::fine_grained_dependencies::SourceFileDepGraph; - - static void mapping(IO &io, SourceFileDepGraphNode &node, - SourceFileDepGraph &g); -}; - -template <> -struct SequenceTraits< - std::vector> { - using SourceFileDepGraphNode = - swift::fine_grained_dependencies::SourceFileDepGraphNode; - using NodeVec = std::vector; - static size_t size(IO &, NodeVec &vec); - static SourceFileDepGraphNode &element(IO &, NodeVec &vec, size_t index); -}; - -} // namespace yaml -} // namespace llvm - -LLVM_YAML_DECLARE_MAPPING_TRAITS( - swift::fine_grained_dependencies::SourceFileDepGraph) - #endif // SWIFT_AST_FINE_GRAINED_DEPENDENCIES_H diff --git a/lib/AST/FineGrainedDependencies.cpp b/lib/AST/FineGrainedDependencies.cpp index 4a0c99bbfcd3c..5543d03c7f4a5 100644 --- a/lib/AST/FineGrainedDependencies.cpp +++ b/lib/AST/FineGrainedDependencies.cpp @@ -28,7 +28,6 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" -#include "llvm/Support/YAMLParser.h" // This file holds the definitions for the fine-grained dependency system @@ -371,88 +370,3 @@ void SourceFileDepGraph::emitDotFile(StringRef outputPath, return false; }); } - -//============================================================================== -// MARK: SourceFileDepGraph YAML reading & writing -//============================================================================== - -namespace llvm { -namespace yaml { -// This introduces a redefinition for Linux. -#if !(defined(__linux__) || defined(_WIN64)) -void ScalarTraits::output(const size_t &Val, void *, raw_ostream &out) { - out << Val; -} - -StringRef ScalarTraits::input(StringRef scalar, void *ctxt, - size_t &value) { - return scalar.getAsInteger(10, value) ? "could not parse size_t" : ""; -} -#endif - -void ScalarEnumerationTraits:: - enumeration(IO &io, swift::fine_grained_dependencies::NodeKind &value) { - using NodeKind = swift::fine_grained_dependencies::NodeKind; - io.enumCase(value, "topLevel", NodeKind::topLevel); - io.enumCase(value, "nominal", NodeKind::nominal); - io.enumCase(value, "potentialMember", NodeKind::potentialMember); - io.enumCase(value, "member", NodeKind::member); - io.enumCase(value, "dynamicLookup", NodeKind::dynamicLookup); - io.enumCase(value, "externalDepend", NodeKind::externalDepend); - io.enumCase(value, "sourceFileProvide", NodeKind::sourceFileProvide); -} - -void ScalarEnumerationTraits::enumeration( - IO &io, swift::fine_grained_dependencies::DeclAspect &value) { - using DeclAspect = swift::fine_grained_dependencies::DeclAspect; - io.enumCase(value, "interface", DeclAspect::interface); - io.enumCase(value, "implementation", DeclAspect::implementation); -} - -void MappingTraits::mapping( - IO &io, swift::fine_grained_dependencies::DependencyKey &key) { - io.mapRequired("kind", key.kind); - io.mapRequired("aspect", key.aspect); - io.mapRequired("context", key.context); - io.mapRequired("name", key.name); -} - -void MappingTraits::mapping( - IO &io, swift::fine_grained_dependencies::DepGraphNode &node) { - io.mapRequired("key", node.key); - io.mapOptional("fingerprint", node.fingerprint); -} - -void MappingContextTraits::mapping( - IO &io, SourceFileDepGraphNode &node, SourceFileDepGraph &g) { - MappingTraits::mapping(io, node); - io.mapRequired("sequenceNumber", node.sequenceNumber); - std::vector defsIDependUponVec(node.defsIDependUpon.begin(), - node.defsIDependUpon.end()); - io.mapRequired("defsIDependUpon", defsIDependUponVec); - io.mapRequired("isProvides", node.isProvides); - if (!io.outputting()) { - for (size_t u : defsIDependUponVec) - node.defsIDependUpon.insert(u); - } - assert(g.getNode(node.sequenceNumber) && "Bad sequence number"); -} - -size_t SequenceTraits>::size( - IO &, std::vector &vec) { - return vec.size(); -} - -SourceFileDepGraphNode & -SequenceTraits>::element( - IO &, std::vector &vec, size_t index) { - while (vec.size() <= index) - vec.push_back(new SourceFileDepGraphNode()); - return *vec[index]; -} - -void MappingTraits::mapping(IO &io, SourceFileDepGraph &g) { - io.mapRequired("allNodes", g.allNodes, g); -} -} // namespace yaml -} // namespace llvm diff --git a/tools/swift-dependency-tool/swift-dependency-tool.cpp b/tools/swift-dependency-tool/swift-dependency-tool.cpp index fd60d63c85070..cc6f50c0f8b8f 100644 --- a/tools/swift-dependency-tool/swift-dependency-tool.cpp +++ b/tools/swift-dependency-tool/swift-dependency-tool.cpp @@ -19,10 +19,138 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/YAMLParser.h" +#include "llvm/Support/YAMLTraits.h" using namespace swift; using namespace fine_grained_dependencies; +//============================================================================== +// MARK: SourceFileDepGraph YAML reading & writing +//============================================================================== + +// This introduces a redefinition where ever std::is_same_t +// holds +#if !(defined(__linux__) || defined(_WIN64)) +LLVM_YAML_DECLARE_SCALAR_TRAITS(size_t, QuotingType::None) +#endif +LLVM_YAML_DECLARE_ENUM_TRAITS(swift::fine_grained_dependencies::NodeKind) +LLVM_YAML_DECLARE_ENUM_TRAITS(swift::fine_grained_dependencies::DeclAspect) +LLVM_YAML_DECLARE_MAPPING_TRAITS( + swift::fine_grained_dependencies::DependencyKey) +LLVM_YAML_DECLARE_MAPPING_TRAITS(swift::fine_grained_dependencies::DepGraphNode) + +namespace llvm { +namespace yaml { +template <> +struct MappingContextTraits< + swift::fine_grained_dependencies::SourceFileDepGraphNode, + swift::fine_grained_dependencies::SourceFileDepGraph> { + using SourceFileDepGraphNode = + swift::fine_grained_dependencies::SourceFileDepGraphNode; + using SourceFileDepGraph = + swift::fine_grained_dependencies::SourceFileDepGraph; + + static void mapping(IO &io, SourceFileDepGraphNode &node, + SourceFileDepGraph &g); +}; + +template <> +struct SequenceTraits< + std::vector> { + using SourceFileDepGraphNode = + swift::fine_grained_dependencies::SourceFileDepGraphNode; + using NodeVec = std::vector; + static size_t size(IO &, NodeVec &vec); + static SourceFileDepGraphNode &element(IO &, NodeVec &vec, size_t index); +}; + +} // namespace yaml +} // namespace llvm + +LLVM_YAML_DECLARE_MAPPING_TRAITS( + swift::fine_grained_dependencies::SourceFileDepGraph) + +namespace llvm { +namespace yaml { +// This introduces a redefinition for Linux. +#if !(defined(__linux__) || defined(_WIN64)) +void ScalarTraits::output(const size_t &Val, void *, raw_ostream &out) { + out << Val; +} + +StringRef ScalarTraits::input(StringRef scalar, void *ctxt, + size_t &value) { + return scalar.getAsInteger(10, value) ? "could not parse size_t" : ""; +} +#endif + +void ScalarEnumerationTraits:: + enumeration(IO &io, swift::fine_grained_dependencies::NodeKind &value) { + using NodeKind = swift::fine_grained_dependencies::NodeKind; + io.enumCase(value, "topLevel", NodeKind::topLevel); + io.enumCase(value, "nominal", NodeKind::nominal); + io.enumCase(value, "potentialMember", NodeKind::potentialMember); + io.enumCase(value, "member", NodeKind::member); + io.enumCase(value, "dynamicLookup", NodeKind::dynamicLookup); + io.enumCase(value, "externalDepend", NodeKind::externalDepend); + io.enumCase(value, "sourceFileProvide", NodeKind::sourceFileProvide); +} + +void ScalarEnumerationTraits::enumeration( + IO &io, swift::fine_grained_dependencies::DeclAspect &value) { + using DeclAspect = swift::fine_grained_dependencies::DeclAspect; + io.enumCase(value, "interface", DeclAspect::interface); + io.enumCase(value, "implementation", DeclAspect::implementation); +} + +void MappingTraits::mapping( + IO &io, swift::fine_grained_dependencies::DependencyKey &key) { + io.mapRequired("kind", key.kind); + io.mapRequired("aspect", key.aspect); + io.mapRequired("context", key.context); + io.mapRequired("name", key.name); +} + +void MappingTraits::mapping( + IO &io, swift::fine_grained_dependencies::DepGraphNode &node) { + io.mapRequired("key", node.key); + io.mapOptional("fingerprint", node.fingerprint); +} + +void MappingContextTraits::mapping( + IO &io, SourceFileDepGraphNode &node, SourceFileDepGraph &g) { + MappingTraits::mapping(io, node); + io.mapRequired("sequenceNumber", node.sequenceNumber); + std::vector defsIDependUponVec(node.defsIDependUpon.begin(), + node.defsIDependUpon.end()); + io.mapRequired("defsIDependUpon", defsIDependUponVec); + io.mapRequired("isProvides", node.isProvides); + if (!io.outputting()) { + for (size_t u : defsIDependUponVec) + node.defsIDependUpon.insert(u); + } + assert(g.getNode(node.sequenceNumber) && "Bad sequence number"); +} + +size_t SequenceTraits>::size( + IO &, std::vector &vec) { + return vec.size(); +} + +SourceFileDepGraphNode & +SequenceTraits>::element( + IO &, std::vector &vec, size_t index) { + while (vec.size() <= index) + vec.push_back(new SourceFileDepGraphNode()); + return *vec[index]; +} + +void MappingTraits::mapping(IO &io, SourceFileDepGraph &g) { + io.mapRequired("allNodes", g.allNodes, g); +} +} // namespace yaml +} // namespace llvm + enum class ActionType : unsigned { None, BinaryToYAML, @@ -81,7 +209,7 @@ int main(int argc, char *argv[]) { bool hadError = withOutputFile(diags, options::OutputFilename, [&](llvm::raw_pwrite_stream &out) { - out << fg->yamlProlog(/*hadError=*/false); + out << "# Fine-grained v0\n"; llvm::yaml::Output yamlWriter(out); yamlWriter << *fg; return false;