
runFinalizeActions takes an AllocActions vector and attempts to run its finalize actions. If any finalize action fails then all paired dealloc actions up to the failing pair are run, and the error(s) returned. If all finalize actions succeed then a vector containing the dealloc actions is returned. runDeallocActions takes a vector<WrapperFunctionCall> containing dealloc action calls and runs them all, returning any error(s). These helpers are intended to simplify the implementation of JITLinkMemoryManager::InFlightAlloc::finalize and JITLinkMemoryManager::deallocate overrides by taking care of execution (and potential roll-back) of allocation actions.
45 lines
1.3 KiB
C++
45 lines
1.3 KiB
C++
//===----- AllocationActions.gpp -- JITLink allocation support calls -----===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/ExecutionEngine/Orc/Shared/AllocationActions.h"
|
|
|
|
namespace llvm {
|
|
namespace orc {
|
|
namespace shared {
|
|
|
|
Expected<std::vector<WrapperFunctionCall>>
|
|
runFinalizeActions(AllocActions &AAs) {
|
|
std::vector<WrapperFunctionCall> DeallocActions;
|
|
DeallocActions.reserve(numDeallocActions(AAs));
|
|
|
|
for (auto &AA : AAs) {
|
|
if (AA.Finalize)
|
|
if (auto Err = AA.Finalize.runWithSPSRetErrorMerged())
|
|
return joinErrors(std::move(Err), runDeallocActions(DeallocActions));
|
|
|
|
if (AA.Dealloc)
|
|
DeallocActions.push_back(std::move(AA.Dealloc));
|
|
}
|
|
|
|
AAs.clear();
|
|
return DeallocActions;
|
|
}
|
|
|
|
Error runDeallocActions(ArrayRef<WrapperFunctionCall> DAs) {
|
|
Error Err = Error::success();
|
|
while (!DAs.empty()) {
|
|
Err = joinErrors(std::move(Err), DAs.back().runWithSPSRetErrorMerged());
|
|
DAs = DAs.drop_back();
|
|
}
|
|
return Err;
|
|
}
|
|
|
|
} // namespace shared
|
|
} // namespace orc
|
|
} // namespace llvm
|