aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
diff options
context:
space:
mode:
authorAnubhab Ghosh <anubhabghosh.me@gmail.com>2022-08-21 02:02:51 +0530
committerAnubhab Ghosh <anubhabghosh.me@gmail.com>2022-08-27 11:07:09 +0530
commitc69df92b4f8b39a81cc0ba2a52b4f8a4bd655435 (patch)
tree345b381a8d4198e4eeabe89829f7e3bbbe0e09c5 /llvm/tools/llvm-jitlink/llvm-jitlink.cpp
parent3546b5c5207928be2ae2e3a86cf95b9ad024bd69 (diff)
downloadllvm-c69df92b4f8b39a81cc0ba2a52b4f8a4bd655435.zip
llvm-c69df92b4f8b39a81cc0ba2a52b4f8a4bd655435.tar.gz
llvm-c69df92b4f8b39a81cc0ba2a52b4f8a4bd655435.tar.bz2
[Orc] Use MapperJITLinkMemoryManager with InProcessMapper in llvm-jitlink tool
MapperJITLinkMemoryManager has slab allocation. Combined with InProcessMapper, it can replace InProcessMemoryManager. It can also replace JITLinkSlabAllocator through the InProcessDeltaMapper that adds an offset to the executor addresses for use in tests. Differential Revision: https://reviews.llvm.org/D132315
Diffstat (limited to 'llvm/tools/llvm-jitlink/llvm-jitlink.cpp')
-rw-r--r--llvm/tools/llvm-jitlink/llvm-jitlink.cpp93
1 files changed, 89 insertions, 4 deletions
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
index eb4b55c..117d02f 100644
--- 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 @@ static void dumpSectionContents(raw_ostream &OS, LinkGraph &G) {
}
}
+// 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<std::unique_ptr<InProcessDeltaMapper>> Create() {
+ auto PageSize = sys::Process::getPageSize();
+ if (!PageSize)
+ return PageSize.takeError();
+ return std::make_unique<InProcessDeltaMapper>(*PageSize, SlabAddress);
+ }
+
+ void reserve(size_t NumBytes, OnReservedFunction OnReserved) override {
+ InProcessMemoryMapper::reserve(
+ NumBytes, [this, OnReserved = std::move(OnReserved)](
+ Expected<ExecutorAddrRange> 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<ExecutorAddr> Result) mutable {
+ if (!Result)
+ return OnInitialized(Result.takeError());
+
+ OnInitialized(ExecutorAddr(Result->getValue() + DeltaAddr));
+ });
+ }
+
+ void deinitialize(ArrayRef<ExecutorAddr> Allocations,
+ OnDeinitializedFunction OnDeInitialized) override {
+ std::vector<ExecutorAddr> Addrs(Allocations.size());
+ for (const auto Base : Allocations) {
+ Addrs.push_back(Base - DeltaAddr);
+ }
+
+ InProcessMemoryMapper::deinitialize(Addrs, std::move(OnDeInitialized));
+ }
+
+ void release(ArrayRef<ExecutorAddr> Reservations,
+ OnReleasedFunction OnRelease) override {
+ std::vector<ExecutorAddr> 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 @@ Expected<uint64_t> getSlabAllocSize(StringRef SizeString) {
return SlabSize * Units;
}
-static std::unique_ptr<JITLinkMemoryManager> createMemoryManager() {
+static std::unique_ptr<JITLinkMemoryManager> createInProcessMemoryManager() {
if (!SlabAllocateSizeString.empty()) {
auto SlabSize = ExitOnErr(getSlabAllocSize(SlabAllocateSizeString));
- return ExitOnErr(JITLinkSlabAllocator::Create(SlabSize));
+
+ return ExitOnErr(
+ MapperJITLinkMemoryManager::CreateWithMapper<InProcessDeltaMapper>(
+ SlabSize));
}
- return ExitOnErr(InProcessMemoryManager::Create());
+
+#ifdef _WIN32
+ return ExitOnErr(
+ MapperJITLinkMemoryManager::CreateWithMapper<InProcessMemoryMapper>(
+ 1024 * 1024));
+#else
+ return ExitOnErr(
+ MapperJITLinkMemoryManager::CreateWithMapper<InProcessMemoryMapper>(
+ 1024 * 1024 * 1024));
+#endif
}
static Expected<MaterializationUnit::Interface>
@@ -1012,7 +1097,7 @@ Expected<std::unique_ptr<Session>> Session::Create(Triple TT) {
EPC = std::make_unique<SelfExecutorProcessControl>(
std::make_shared<SymbolStringPool>(),
std::make_unique<InPlaceTaskDispatcher>(), std::move(TT), *PageSize,
- createMemoryManager());
+ createInProcessMemoryManager());
}
Error Err = Error::success();