//===--- NecessaryBindings.h - Optimizing archetype bindings ----*- C++ -*-===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 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 // //===----------------------------------------------------------------------===// // // This file defines a utility class for saving and restoring the // archetype metadata necessary in order to carry out value operations // on a type. // // This is a supplemental API of GenProto. // //===----------------------------------------------------------------------===// #ifndef SWIFT_IRGEN_NECESSARYBINDINGS_H #define SWIFT_IRGEN_NECESSARYBINDINGS_H #include "GenericRequirement.h" #include "llvm/ADT/SetVector.h" #include "swift/AST/Types.h" namespace swift { class CanType; class ProtocolDecl; class ProtocolConformanceRef; namespace irgen { class Address; class IRGenFunction; class IRGenModule; class Size; /// NecessaryBindings - The set of metadata that must be saved in /// order to perform some set of operations on a type. class NecessaryBindings { llvm::SetVector Requirements; public: NecessaryBindings() = default; /// Collect the necessary bindings to invoke a function with the given /// signature. static NecessaryBindings forFunctionInvocations(IRGenModule &IGM, CanSILFunctionType origType, const SubstitutionMap &subs); /// Add whatever information is necessary to reconstruct type metadata /// for the given type. void addTypeMetadata(CanType type); /// Get the requirement from the bindings at index i. const GenericRequirement &operator[](size_t i) const { return Requirements[i]; } size_t size() const { return Requirements.size(); } /// Add whatever information is necessary to reconstruct a witness table /// reference for the given type. void addProtocolConformance(CanType type, ProtocolConformanceRef conf); /// Is the work to do trivial? bool empty() const { return Requirements.empty(); } /// Returns the required size of the bindings. /// Pointer alignment is sufficient. Size getBufferSize(IRGenModule &IGM) const; /// Save the necessary bindings to the given buffer. void save(IRGenFunction &IGF, Address buffer) const; /// Restore the necessary bindings from the given buffer. void restore(IRGenFunction &IGF, Address buffer) const; const llvm::SetVector &getRequirements() const { return Requirements; } }; } // end namespace irgen } // end namespace swift #endif