/// Set up epilogue work for the thunk arguments based in the given argument. /// Default implementation simply passes it through. void FunctionSignatureTransform:: OwnedToGuaranteedAddArgumentRelease(ArgumentDescriptor &AD, SILBuilder &Builder, SILFunction *F) { // If we have any arguments that were consumed but are now guaranteed, // insert a release_value. if (!AD.OwnedToGuaranteed) { return; } SILInstruction *Call = findOnlyApply(F); if (isa<ApplyInst>(Call)) { Builder.setInsertionPoint(&*std::next(SILBasicBlock::iterator(Call))); Builder.createReleaseValue(RegularLocation(SourceLoc()), F->getArguments()[AD.Index], Builder.getDefaultAtomicity()); } else { SILBasicBlock *NormalBB = dyn_cast<TryApplyInst>(Call)->getNormalBB(); Builder.setInsertionPoint(&*NormalBB->begin()); Builder.createReleaseValue(RegularLocation(SourceLoc()), F->getArguments()[AD.Index], Builder.getDefaultAtomicity()); SILBasicBlock *ErrorBB = dyn_cast<TryApplyInst>(Call)->getErrorBB(); Builder.setInsertionPoint(&*ErrorBB->begin()); Builder.createReleaseValue(RegularLocation(SourceLoc()), F->getArguments()[AD.Index], Builder.getDefaultAtomicity()); } }
void swift:: addReleasesForConvertedOwnedParameter(SILBuilder &Builder, SILLocation Loc, OperandValueArrayRef Parameters, ArrayRef<ArgumentDescriptor> &ArgDescs) { // If we have any arguments that were consumed but are now guaranteed, // insert a release_value. for (auto &ArgDesc : ArgDescs) { // The argument is dead. Make sure we have a release to balance out // the retain for creating the @owned parameter. if (ArgDesc.IsEntirelyDead && ArgDesc.Arg->getKnownParameterInfo().getConvention() == ParameterConvention::Direct_Owned) { Builder.createReleaseValue(Loc, Parameters[ArgDesc.Index]); continue; } if (ArgDesc.CalleeRelease.empty()) continue; Builder.createReleaseValue(Loc, Parameters[ArgDesc.Index]); } }
void swift:: addReleasesForConvertedOwnedParameter(SILBuilder &Builder, SILLocation Loc, ArrayRef<SILArgument*> Parameters, ArrayRef<ArgumentDescriptor> &ArgDescs) { // If we have any arguments that were consumed but are now guaranteed, // insert a release_value. for (auto &ArgDesc : ArgDescs) { if (ArgDesc.CalleeRelease.empty()) continue; Builder.createReleaseValue(Loc, Parameters[ArgDesc.Index]); } }