123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- AllocationActions.h -- JITLink allocation support calls -*- C++ -*-===//
- //
- // 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
- //
- //===----------------------------------------------------------------------===//
- //
- // Structures for making memory allocation support calls.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_EXECUTIONENGINE_ORC_SHARED_ALLOCATIONACTIONS_H
- #define LLVM_EXECUTIONENGINE_ORC_SHARED_ALLOCATIONACTIONS_H
- #include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h"
- #include "llvm/ExecutionEngine/Orc/Shared/WrapperFunctionUtils.h"
- #include "llvm/Support/Memory.h"
- #include <vector>
- namespace llvm {
- namespace orc {
- namespace shared {
- /// A pair of WrapperFunctionCalls, one to be run at finalization time, one to
- /// be run at deallocation time.
- ///
- /// AllocActionCallPairs should be constructed for paired operations (e.g.
- /// __register_ehframe and __deregister_ehframe for eh-frame registration).
- /// See comments for AllocActions for execution ordering.
- ///
- /// For unpaired operations one or the other member can be left unused, as
- /// AllocationActionCalls with an FnAddr of zero will be skipped.
- struct AllocActionCallPair {
- WrapperFunctionCall Finalize;
- WrapperFunctionCall Dealloc;
- };
- /// A vector of allocation actions to be run for this allocation.
- ///
- /// Finalize allocations will be run in order at finalize time. Dealloc
- /// actions will be run in reverse order at deallocation time.
- using AllocActions = std::vector<AllocActionCallPair>;
- /// Returns the number of deallocaton actions in the given AllocActions array.
- ///
- /// This can be useful if clients want to pre-allocate room for deallocation
- /// actions with the rest of their memory.
- inline size_t numDeallocActions(const AllocActions &AAs) {
- return llvm::count_if(
- AAs, [](const AllocActionCallPair &P) { return !!P.Dealloc; });
- }
- /// Run finalize actions.
- ///
- /// If any finalize action fails then the corresponding dealloc actions will be
- /// run in reverse order (not including the deallocation action for the failed
- /// finalize action), and the error for the failing action will be returned.
- ///
- /// If all finalize actions succeed then a vector of deallocation actions will
- /// be returned. The dealloc actions should be run by calling
- /// runDeallocationActions. If this function succeeds then the AA argument will
- /// be cleared before the function returns.
- Expected<std::vector<WrapperFunctionCall>>
- runFinalizeActions(AllocActions &AAs);
- /// Run deallocation actions.
- /// Dealloc actions will be run in reverse order (from last element of DAs to
- /// first).
- Error runDeallocActions(ArrayRef<WrapperFunctionCall> DAs);
- using SPSAllocActionCallPair =
- SPSTuple<SPSWrapperFunctionCall, SPSWrapperFunctionCall>;
- template <>
- class SPSSerializationTraits<SPSAllocActionCallPair,
- AllocActionCallPair> {
- using AL = SPSAllocActionCallPair::AsArgList;
- public:
- static size_t size(const AllocActionCallPair &AAP) {
- return AL::size(AAP.Finalize, AAP.Dealloc);
- }
- static bool serialize(SPSOutputBuffer &OB,
- const AllocActionCallPair &AAP) {
- return AL::serialize(OB, AAP.Finalize, AAP.Dealloc);
- }
- static bool deserialize(SPSInputBuffer &IB,
- AllocActionCallPair &AAP) {
- return AL::deserialize(IB, AAP.Finalize, AAP.Dealloc);
- }
- };
- } // end namespace shared
- } // end namespace orc
- } // end namespace llvm
- #endif // LLVM_EXECUTIONENGINE_ORC_SHARED_ALLOCATIONACTIONS_H
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|