1*04eeddc0SDimitry Andric //===----- AllocationActions.gpp -- JITLink allocation support calls -----===// 2*04eeddc0SDimitry Andric // 3*04eeddc0SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*04eeddc0SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*04eeddc0SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*04eeddc0SDimitry Andric // 7*04eeddc0SDimitry Andric //===----------------------------------------------------------------------===// 8*04eeddc0SDimitry Andric 9*04eeddc0SDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/AllocationActions.h" 10*04eeddc0SDimitry Andric 11*04eeddc0SDimitry Andric namespace llvm { 12*04eeddc0SDimitry Andric namespace orc { 13*04eeddc0SDimitry Andric namespace shared { 14*04eeddc0SDimitry Andric 15*04eeddc0SDimitry Andric Expected<std::vector<WrapperFunctionCall>> runFinalizeActions(AllocActions & AAs)16*04eeddc0SDimitry AndricrunFinalizeActions(AllocActions &AAs) { 17*04eeddc0SDimitry Andric std::vector<WrapperFunctionCall> DeallocActions; 18*04eeddc0SDimitry Andric DeallocActions.reserve(numDeallocActions(AAs)); 19*04eeddc0SDimitry Andric 20*04eeddc0SDimitry Andric for (auto &AA : AAs) { 21*04eeddc0SDimitry Andric if (AA.Finalize) 22*04eeddc0SDimitry Andric if (auto Err = AA.Finalize.runWithSPSRetErrorMerged()) 23*04eeddc0SDimitry Andric return joinErrors(std::move(Err), runDeallocActions(DeallocActions)); 24*04eeddc0SDimitry Andric 25*04eeddc0SDimitry Andric if (AA.Dealloc) 26*04eeddc0SDimitry Andric DeallocActions.push_back(std::move(AA.Dealloc)); 27*04eeddc0SDimitry Andric } 28*04eeddc0SDimitry Andric 29*04eeddc0SDimitry Andric AAs.clear(); 30*04eeddc0SDimitry Andric return DeallocActions; 31*04eeddc0SDimitry Andric } 32*04eeddc0SDimitry Andric runDeallocActions(ArrayRef<WrapperFunctionCall> DAs)33*04eeddc0SDimitry AndricError runDeallocActions(ArrayRef<WrapperFunctionCall> DAs) { 34*04eeddc0SDimitry Andric Error Err = Error::success(); 35*04eeddc0SDimitry Andric while (!DAs.empty()) { 36*04eeddc0SDimitry Andric Err = joinErrors(std::move(Err), DAs.back().runWithSPSRetErrorMerged()); 37*04eeddc0SDimitry Andric DAs = DAs.drop_back(); 38*04eeddc0SDimitry Andric } 39*04eeddc0SDimitry Andric return Err; 40*04eeddc0SDimitry Andric } 41*04eeddc0SDimitry Andric 42*04eeddc0SDimitry Andric } // namespace shared 43*04eeddc0SDimitry Andric } // namespace orc 44*04eeddc0SDimitry Andric } // namespace llvm 45