12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===--------------- 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
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|