| //===--------------- MapperJITLinkMemoryManager.h -*- 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 |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // Implements JITLinkMemoryManager using MemoryMapper |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_EXECUTIONENGINE_ORC_MAPPERJITLINKMEMORYMANAGER_H |
| #define LLVM_EXECUTIONENGINE_ORC_MAPPERJITLINKMEMORYMANAGER_H |
| |
| #include "llvm/ADT/IntervalMap.h" |
| #include "llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h" |
| #include "llvm/ExecutionEngine/Orc/MemoryMapper.h" |
| |
| namespace llvm { |
| namespace orc { |
| |
| class MapperJITLinkMemoryManager : public jitlink::JITLinkMemoryManager { |
| public: |
| MapperJITLinkMemoryManager(size_t ReservationGranularity, |
| std::unique_ptr<MemoryMapper> Mapper); |
| |
| template <class MemoryMapperType, class... Args> |
| static Expected<std::unique_ptr<MapperJITLinkMemoryManager>> |
| CreateWithMapper(size_t ReservationGranularity, Args &&...A) { |
| auto Mapper = MemoryMapperType::Create(std::forward<Args>(A)...); |
| if (!Mapper) |
| return Mapper.takeError(); |
| |
| return std::make_unique<MapperJITLinkMemoryManager>(ReservationGranularity, |
| std::move(*Mapper)); |
| } |
| |
| void allocate(const jitlink::JITLinkDylib *JD, jitlink::LinkGraph &G, |
| OnAllocatedFunction OnAllocated) override; |
| // synchronous overload |
| using JITLinkMemoryManager::allocate; |
| |
| void deallocate(std::vector<FinalizedAlloc> Allocs, |
| OnDeallocatedFunction OnDeallocated) override; |
| // synchronous overload |
| using JITLinkMemoryManager::deallocate; |
| |
| private: |
| class InFlightAlloc; |
| |
| std::mutex Mutex; |
| |
| // We reserve multiples of this from the executor address space |
| size_t ReservationUnits; |
| |
| // Ranges that have been reserved in executor but not yet allocated |
| using AvailableMemoryMap = IntervalMap<ExecutorAddr, bool>; |
| AvailableMemoryMap::Allocator AMAllocator; |
| IntervalMap<ExecutorAddr, bool> AvailableMemory; |
| |
| // Ranges that have been reserved in executor and already allocated |
| DenseMap<ExecutorAddr, ExecutorAddrDiff> UsedMemory; |
| |
| std::unique_ptr<MemoryMapper> Mapper; |
| }; |
| |
| } // end namespace orc |
| } // end namespace llvm |
| |
| #endif // LLVM_EXECUTIONENGINE_ORC_MAPPERJITLINKMEMORYMANAGER_H |