/// \brief Create the function corresponding to the clone of the /// original closure with the signature modified to reflect promoted /// parameters (which are specified by PromotedArgIndices). SILFunction *PromotedParamCloner::initCloned(SILFunction *Orig, IsSerialized_t Serialized, ArgIndexList &PromotedArgIndices, llvm::StringRef ClonedName) { SILModule &M = Orig->getModule(); SmallVector<SILParameterInfo, 4> ClonedInterfaceArgTys; // Generate a new parameter list with deleted parameters removed. SILFunctionType *OrigFTI = Orig->getLoweredFunctionType(); unsigned Index = Orig->getConventions().getSILArgIndexOfFirstParam(); for (auto ¶m : OrigFTI->getParameters()) { if (count(PromotedArgIndices, Index)) { auto boxTy = param.getSILStorageType().castTo<SILBoxType>(); assert(boxTy->getLayout()->getFields().size() == 1 && "promoting compound box not implemented"); SILType paramTy; { Lowering::GenericContextScope scope(Orig->getModule().Types, OrigFTI->getGenericSignature()); paramTy = boxTy->getFieldType(Orig->getModule(), 0); } auto promotedParam = SILParameterInfo(paramTy.getSwiftRValueType(), ParameterConvention::Indirect_InoutAliasable); ClonedInterfaceArgTys.push_back(promotedParam); } else { ClonedInterfaceArgTys.push_back(param); } ++Index; } // Create the new function type for the cloned function with some of // the parameters promoted. auto ClonedTy = SILFunctionType::get( OrigFTI->getGenericSignature(), OrigFTI->getExtInfo(), OrigFTI->getCoroutineKind(), OrigFTI->getCalleeConvention(), ClonedInterfaceArgTys, OrigFTI->getYields(), OrigFTI->getResults(), OrigFTI->getOptionalErrorResult(), M.getASTContext(), OrigFTI->getWitnessMethodConformanceOrNone()); assert((Orig->isTransparent() || Orig->isBare() || Orig->getLocation()) && "SILFunction missing location"); assert((Orig->isTransparent() || Orig->isBare() || Orig->getDebugScope()) && "SILFunction missing DebugScope"); assert(!Orig->isGlobalInit() && "Global initializer cannot be cloned"); auto *Fn = M.createFunction( SILLinkage::Shared, ClonedName, ClonedTy, Orig->getGenericEnvironment(), Orig->getLocation(), Orig->isBare(), IsNotTransparent, Serialized, Orig->getEntryCount(), Orig->isThunk(), Orig->getClassSubclassScope(), Orig->getInlineStrategy(), Orig->getEffectsKind(), Orig, Orig->getDebugScope()); for (auto &Attr : Orig->getSemanticsAttrs()) { Fn->addSemanticsAttr(Attr); } if (!Orig->hasQualifiedOwnership()) { Fn->setUnqualifiedOwnership(); } return Fn; }
/// \brief Create the function corresponding to the clone of the /// original closure with the signature modified to reflect promoted /// parameters (which are specified by PromotedParamIndices). SILFunction* PromotedParamCloner::initCloned(SILFunction *Orig, ParamIndexList &PromotedParamIndices, llvm::StringRef ClonedName) { SILModule &M = Orig->getModule(); SmallVector<SILParameterInfo, 4> ClonedInterfaceArgTys; // Generate a new parameter list with deleted parameters removed. SILFunctionType *OrigFTI = Orig->getLoweredFunctionType(); unsigned Index = OrigFTI->getNumIndirectResults(); for (auto ¶m : OrigFTI->getParameters()) { if (std::count(PromotedParamIndices.begin(), PromotedParamIndices.end(), Index)) { auto paramTy = param.getType()->castTo<SILBoxType>() ->getBoxedAddressType(); auto promotedParam = SILParameterInfo(paramTy.getSwiftRValueType(), ParameterConvention::Indirect_InoutAliasable); ClonedInterfaceArgTys.push_back(promotedParam); } else { ClonedInterfaceArgTys.push_back(param); } ++Index; } // Create the new function type for the cloned function with some of // the parameters promoted. auto ClonedTy = SILFunctionType::get(OrigFTI->getGenericSignature(), OrigFTI->getExtInfo(), OrigFTI->getCalleeConvention(), ClonedInterfaceArgTys, OrigFTI->getAllResults(), OrigFTI->getOptionalErrorResult(), M.getASTContext()); assert((Orig->isTransparent() || Orig->isBare() || Orig->getLocation()) && "SILFunction missing location"); assert((Orig->isTransparent() || Orig->isBare() || Orig->getDebugScope()) && "SILFunction missing DebugScope"); assert(!Orig->isGlobalInit() && "Global initializer cannot be cloned"); auto *Fn = M.getOrCreateFunction( SILLinkage::Shared, ClonedName, ClonedTy, Orig->getContextGenericParams(), Orig->getLocation(), Orig->isBare(), IsNotTransparent, Orig->isFragile(), Orig->isThunk(), Orig->getClassVisibility(), Orig->getInlineStrategy(), Orig->getEffectsKind(), Orig, Orig->getDebugScope()); for (auto &Attr : Orig->getSemanticsAttrs()) { Fn->addSemanticsAttr(Attr); } Fn->setDeclCtx(Orig->getDeclContext()); return Fn; }