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 Andric runFinalizeActions(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 Andric Error 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