@@ -765,82 +765,82 @@ SILPassPipelinePlan::getPassPipelineForKinds(const SILOptions &Options,
765
765
// Dumping And Loading Pass Pipelines from Yaml
766
766
// ===----------------------------------------------------------------------===//
767
767
768
+ namespace {
769
+
770
+ struct YAMLPassPipeline {
771
+ std::string name;
772
+ std::vector<PassKind> passes;
773
+
774
+ YAMLPassPipeline () {}
775
+ YAMLPassPipeline (const SILPassPipeline &pipeline,
776
+ SILPassPipelinePlan::PipelineKindRange pipelineKinds)
777
+ : name(pipeline.Name), passes() {
778
+ llvm::copy (pipelineKinds, std::back_inserter (passes));
779
+ }
780
+ };
781
+
782
+ } // end anonymous namespace
783
+
784
+ namespace llvm {
785
+ namespace yaml {
786
+
787
+ template <> struct ScalarEnumerationTraits <PassKind> {
788
+ static void enumeration (IO &io, PassKind &value) {
789
+ #define PASS (ID, TAG, NAME ) io.enumCase(value, #TAG, PassKind::ID);
790
+ #include " swift/SILOptimizer/PassManager/Passes.def"
791
+ }
792
+ };
793
+
794
+ template <> struct MappingTraits <YAMLPassPipeline> {
795
+ static void mapping (IO &io, YAMLPassPipeline &info) {
796
+ io.mapRequired (" name" , info.name );
797
+ io.mapRequired (" passes" , info.passes );
798
+ }
799
+ };
800
+
801
+ } // namespace yaml
802
+ } // namespace llvm
803
+
804
+ LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR (PassKind)
805
+ LLVM_YAML_IS_DOCUMENT_LIST_VECTOR(YAMLPassPipeline)
806
+
768
807
void SILPassPipelinePlan::dump() {
769
808
print (llvm::errs ());
770
809
llvm::errs () << ' \n ' ;
771
810
}
772
811
773
812
void SILPassPipelinePlan::print (llvm::raw_ostream &os) {
774
- // Our pipelines yaml representation is simple, we just output it ourselves
775
- // rather than use the yaml writer interface. We want to use the yaml reader
776
- // interface to be resilient against slightly different forms of yaml.
777
- os << " [\n " ;
778
- interleave (getPipelines (),
779
- [&](const SILPassPipeline &Pipeline) {
780
- os << " [\n " ;
781
-
782
- os << " \" " << Pipeline.Name << " \" " ;
783
- for (PassKind Kind : getPipelinePasses (Pipeline)) {
784
- os << " ,\n [\" " << PassKindID (Kind) << " \" ,"
785
- << " \" " << PassKindTag (Kind) << " \" ]" ;
786
- }
787
- },
788
- [&] { os << " \n ],\n " ; });
789
- os << " \n ]\n " ;
790
- os << ' ]' ;
813
+ llvm::yaml::Output out (os);
814
+ std::vector<YAMLPassPipeline> data;
815
+ transform (getPipelines (), std::back_inserter (data),
816
+ [&](const SILPassPipeline &pipeline) {
817
+ return YAMLPassPipeline (pipeline, getPipelinePasses (pipeline));
818
+ });
819
+ out << data;
791
820
}
792
821
793
822
SILPassPipelinePlan
794
- SILPassPipelinePlan::getPassPipelineFromFile (const SILOptions &Options,
795
- StringRef Filename) {
796
- namespace yaml = llvm::yaml;
797
- LLVM_DEBUG (llvm::dbgs () << " Parsing Pass Pipeline from " << Filename << " \n " );
798
-
799
- // Load the input file.
800
- llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> FileBufOrErr =
801
- llvm::MemoryBuffer::getFileOrSTDIN (Filename);
802
- if (!FileBufOrErr) {
803
- llvm_unreachable (" Failed to read yaml file" );
804
- }
805
-
806
- StringRef Buffer = FileBufOrErr->get ()->getBuffer ();
807
- llvm::SourceMgr SM;
808
- yaml::Stream Stream (Buffer, SM);
809
- yaml::document_iterator DI = Stream.begin ();
810
- assert (DI != Stream.end () && " Failed to read a document" );
811
- yaml::Node *N = DI->getRoot ();
812
- assert (N && " Failed to find a root" );
823
+ SILPassPipelinePlan::getPassPipelineFromFile (const SILOptions &options,
824
+ StringRef filename) {
825
+ std::vector<YAMLPassPipeline> yamlPipelines;
826
+ {
827
+ // Load the input file.
828
+ llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> fileBufOrErr =
829
+ llvm::MemoryBuffer::getFileOrSTDIN (filename);
830
+ if (!fileBufOrErr) {
831
+ llvm_unreachable (" Failed to read yaml file" );
832
+ }
813
833
814
- SILPassPipelinePlan P (Options);
834
+ llvm::yaml::Input in (fileBufOrErr->get ()->getBuffer ());
835
+ in >> yamlPipelines;
836
+ }
815
837
816
- auto *RootList = cast<yaml::SequenceNode>(N);
817
- llvm::SmallVector<PassKind, 32 > Passes;
818
- for (yaml::Node &PipelineNode :
819
- make_range (RootList->begin (), RootList->end ())) {
820
- Passes.clear ();
821
- LLVM_DEBUG (llvm::dbgs () << " New Pipeline:\n " );
822
-
823
- auto *Desc = cast<yaml::SequenceNode>(&PipelineNode);
824
- yaml::SequenceNode::iterator DescIter = Desc->begin ();
825
- StringRef Name = cast<yaml::ScalarNode>(&*DescIter)->getRawValue ();
826
- LLVM_DEBUG (llvm::dbgs () << " Name: \" " << Name << " \"\n " );
827
- ++DescIter;
828
-
829
- for (auto DescEnd = Desc->end (); DescIter != DescEnd; ++DescIter) {
830
- auto *InnerPassList = cast<yaml::SequenceNode>(&*DescIter);
831
- auto *FirstNode = &*InnerPassList->begin ();
832
- StringRef PassName = cast<yaml::ScalarNode>(FirstNode)->getRawValue ();
833
- unsigned Size = PassName.size () - 2 ;
834
- PassName = PassName.substr (1 , Size);
835
- LLVM_DEBUG (llvm::dbgs () << " Pass: \" " << PassName << " \"\n " );
836
- auto Kind = PassKindFromString (PassName);
837
- assert (Kind != PassKind::invalidPassKind && " Found invalid pass kind?!" );
838
- Passes.push_back (Kind);
839
- }
838
+ SILPassPipelinePlan silPlan (options);
840
839
841
- P.startPipeline (Name);
842
- P.addPasses (Passes);
840
+ for (auto &pipeline : yamlPipelines) {
841
+ silPlan.startPipeline (pipeline.name );
842
+ silPlan.addPasses (pipeline.passes );
843
843
}
844
844
845
- return P ;
845
+ return silPlan ;
846
846
}
0 commit comments