diff --git a/llvm/include/llvm/ExecutionEngine/Orc/MemoryMapper.h b/llvm/include/llvm/ExecutionEngine/Orc/MemoryMapper.h --- a/llvm/include/llvm/ExecutionEngine/Orc/MemoryMapper.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/MemoryMapper.h @@ -78,7 +78,7 @@ virtual ~MemoryMapper(); }; -class InProcessMemoryMapper final : public MemoryMapper { +class InProcessMemoryMapper : public MemoryMapper { public: InProcessMemoryMapper(size_t PageSize); diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp --- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp +++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp @@ -26,6 +26,7 @@ #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h" #include "llvm/ExecutionEngine/Orc/IndirectionUtils.h" #include "llvm/ExecutionEngine/Orc/MachOPlatform.h" +#include "llvm/ExecutionEngine/Orc/MapperJITLinkMemoryManager.h" #include "llvm/ExecutionEngine/Orc/ObjectFileInterface.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h" @@ -454,6 +455,78 @@ } } +// A memory mapper with a fake offset applied only used for -noexec testing +class InProcessDeltaMapper final : public InProcessMemoryMapper { +public: + InProcessDeltaMapper(size_t PageSize, uint64_t TargetAddr) + : InProcessMemoryMapper(PageSize), TargetMapAddr(TargetAddr), + DeltaAddr(0) {} + + static Expected> Create() { + auto PageSize = sys::Process::getPageSize(); + if (!PageSize) + return PageSize.takeError(); + return std::make_unique(*PageSize, SlabAddress); + } + + void reserve(size_t NumBytes, OnReservedFunction OnReserved) override { + InProcessMemoryMapper::reserve( + NumBytes, [this, OnReserved = std::move(OnReserved)]( + Expected Result) mutable { + if (!Result) + return OnReserved(Result.takeError()); + + assert(DeltaAddr == 0 && "Overwriting previous offset"); + if (TargetMapAddr != ~0ULL) + DeltaAddr = TargetMapAddr - Result->Start.getValue(); + auto OffsetRange = ExecutorAddrRange(Result->Start + DeltaAddr, + Result->End + DeltaAddr); + + OnReserved(OffsetRange); + }); + } + + char *prepare(ExecutorAddr Addr, size_t ContentSize) override { + return InProcessMemoryMapper::prepare(Addr - DeltaAddr, ContentSize); + } + + void initialize(AllocInfo &AI, OnInitializedFunction OnInitialized) override { + auto FixedAI = AI; + FixedAI.MappingBase -= DeltaAddr; + InProcessMemoryMapper::initialize( + FixedAI, [this, OnInitialized = std::move(OnInitialized)]( + Expected Result) mutable { + if (!Result) + return OnInitialized(Result.takeError()); + + OnInitialized(ExecutorAddr(Result->getValue() + DeltaAddr)); + }); + } + + void deinitialize(ArrayRef Allocations, + OnDeinitializedFunction OnDeInitialized) override { + std::vector Addrs(Allocations.size()); + for (const auto Base : Allocations) { + Addrs.push_back(Base - DeltaAddr); + } + + InProcessMemoryMapper::deinitialize(Addrs, std::move(OnDeInitialized)); + } + + void release(ArrayRef Reservations, + OnReleasedFunction OnRelease) override { + std::vector Addrs(Reservations.size()); + for (const auto Base : Reservations) { + Addrs.push_back(Base - DeltaAddr); + } + InProcessMemoryMapper::release(Addrs, std::move(OnRelease)); + } + +private: + uint64_t TargetMapAddr; + uint64_t DeltaAddr; +}; + class JITLinkSlabAllocator final : public JITLinkMemoryManager { private: struct FinalizedAllocInfo { @@ -721,12 +794,24 @@ return SlabSize * Units; } -static std::unique_ptr createMemoryManager() { +static std::unique_ptr createInProcessMemoryManager() { if (!SlabAllocateSizeString.empty()) { auto SlabSize = ExitOnErr(getSlabAllocSize(SlabAllocateSizeString)); - return ExitOnErr(JITLinkSlabAllocator::Create(SlabSize)); + + return ExitOnErr( + MapperJITLinkMemoryManager::CreateWithMapper( + SlabSize)); } - return ExitOnErr(InProcessMemoryManager::Create()); + +#ifdef _WIN32 + return ExitOnErr( + MapperJITLinkMemoryManager::CreateWithMapper( + 1024 * 1024)); +#else + return ExitOnErr( + MapperJITLinkMemoryManager::CreateWithMapper( + 1024 * 1024 * 1024)); +#endif } static Expected @@ -1012,7 +1097,7 @@ EPC = std::make_unique( std::make_shared(), std::make_unique(), std::move(TT), *PageSize, - createMemoryManager()); + createInProcessMemoryManager()); } Error Err = Error::success();