// Eagerly visiting all used conformances leads to a large blowup // in the amount of SIL we read in. For optimization purposes we can defer // reading in most conformances until we need them for devirtualization. // However, we *must* pull in shared clang-importer-derived conformances // we potentially use, since we may not otherwise have a local definition. static bool mustDeserializeProtocolConformance(SILModule &M, ProtocolConformanceRef c) { if (!c.isConcrete()) return false; auto conformance = c.getConcrete()->getRootNormalConformance(); return M.Types.protocolRequiresWitnessTable(conformance->getProtocol()) && isa<ClangModuleUnit>(conformance->getDeclContext() ->getModuleScopeContext()); }
std::pair<SILWitnessTable *, ArrayRef<Substitution>> SILModule:: lookUpWitnessTable(ProtocolConformanceRef C, bool deserializeLazily) { // If we have an abstract conformance passed in (a legal value), just return // nullptr. if (!C.isConcrete()) return {nullptr, {}}; return lookUpWitnessTable(C.getConcrete()); }
Type TypeChecker::getWitnessType(Type type, ProtocolDecl *protocol, ProtocolConformanceRef conformance, Identifier name, Diag<> brokenProtocolDiag) { Type ty = ProtocolConformance::getTypeWitnessByName(type, conformance, name, this); if (!ty && !(conformance.isConcrete() && conformance.getConcrete()->isInvalid())) diagnose(protocol->getLoc(), brokenProtocolDiag); return ty; }