//===--- SILOptimizerRequests.cpp - Requests for SIL Optimization --------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2020 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// #include "swift/AST/SILOptimizerRequests.h" #include "swift/AST/Evaluator.h" #include "swift/SILOptimizer/PassManager/PassPipeline.h" #include "swift/Subsystems.h" #include "llvm/ADT/Hashing.h" using namespace swift; namespace swift { // Implement the SILOptimizer type zone (zone 13). #define SWIFT_TYPEID_ZONE SILOptimizer #define SWIFT_TYPEID_HEADER "swift/AST/SILOptimizerTypeIDZone.def" #include "swift/Basic/ImplementTypeIDZone.h" #undef SWIFT_TYPEID_ZONE #undef SWIFT_TYPEID_HEADER } // end namespace swift //----------------------------------------------------------------------------// // ExecuteSILPipelineRequest computation. //----------------------------------------------------------------------------// bool SILPipelineExecutionDescriptor:: operator==(const SILPipelineExecutionDescriptor &other) const { return SM == other.SM && Plan == other.Plan && IsMandatory == other.IsMandatory && IRMod == other.IRMod; } llvm::hash_code swift::hash_value(const SILPipelineExecutionDescriptor &desc) { return llvm::hash_combine(desc.SM, desc.Plan, desc.IsMandatory, desc.IRMod); } void swift::simple_display(llvm::raw_ostream &out, const SILPipelineExecutionDescriptor &desc) { out << "Run pipelines { "; interleave( desc.Plan.getPipelines(), [&](SILPassPipeline stage) { out << stage.Name; }, [&]() { out << ", "; }); out << " } on "; simple_display(out, desc.SM); } SourceLoc swift::extractNearestSourceLoc(const SILPipelineExecutionDescriptor &desc) { return extractNearestSourceLoc(desc.SM); } //----------------------------------------------------------------------------// // LoweredSILRequest computation. //----------------------------------------------------------------------------// std::unique_ptr LoweredSILRequest::evaluate(Evaluator &evaluator, ASTLoweringDescriptor desc) const { auto silMod = evaluateOrFatal(evaluator, ASTLoweringRequest{desc}); silMod->installSILRemarkStreamer(); silMod->setSerializeSILAction([]() {}); runSILDiagnosticPasses(*silMod); { FrontendStatsTracer tracer(silMod->getASTContext().Stats, "SIL verification, pre-optimization"); silMod->verify(); } runSILOptimizationPasses(*silMod); { FrontendStatsTracer tracer(silMod->getASTContext().Stats, "SIL verification, post-optimization"); silMod->verify(); } runSILLoweringPasses(*silMod); return silMod; } // Define request evaluation functions for each of the SILGen requests. static AbstractRequestFunction *silOptimizerRequestFunctions[] = { #define SWIFT_REQUEST(Zone, Name, Sig, Caching, LocOptions) \ reinterpret_cast(&Name::evaluateRequest), #include "swift/AST/SILOptimizerTypeIDZone.def" #undef SWIFT_REQUEST }; void swift::registerSILOptimizerRequestFunctions(Evaluator &evaluator) { evaluator.registerRequestFunctions(Zone::SILOptimizer, silOptimizerRequestFunctions); }