//===--------------- 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 Mapper); template static Expected> CreateWithMapper(size_t ReservationGranularity, Args &&...A) { auto Mapper = MemoryMapperType::Create(std::forward(A)...); if (!Mapper) return Mapper.takeError(); return std::make_unique(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 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; AvailableMemoryMap::Allocator AMAllocator; IntervalMap AvailableMemory; // Ranges that have been reserved in executor and already allocated DenseMap UsedMemory; std::unique_ptr Mapper; }; } // end namespace orc } // end namespace llvm #endif // LLVM_EXECUTIONENGINE_ORC_MAPPERJITLINKMEMORYMANAGER_H