Files
gps/tools/local/circt/include/llvm/ExecutionEngine/Orc/SimpleRemoteMemoryMapper.h
T
2026-07-12 11:01:51 +03:00

88 lines
3.2 KiB
C++

//===- SimpleRemoteMemoryMapper.h - Remote memory mapper --------*- 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
//
//===----------------------------------------------------------------------===//
//
// A simple memory mapper that uses EPC calls to implement reserve, initialize,
// deinitialize, and release.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_EXECUTIONENGINE_ORC_SIMPLEREMOTEMEMORYMAPPER_H
#define LLVM_EXECUTIONENGINE_ORC_SIMPLEREMOTEMEMORYMAPPER_H
#include "llvm/ExecutionEngine/Orc/MemoryMapper.h"
namespace llvm::orc {
/// Manages remote memory by making SPS-based EPC calls.
class LLVM_ABI SimpleRemoteMemoryMapper final : public MemoryMapper {
public:
struct SymbolAddrs {
ExecutorAddr Instance;
ExecutorAddr Reserve;
ExecutorAddr Initialize;
ExecutorAddr Deinitialize;
ExecutorAddr Release;
};
SimpleRemoteMemoryMapper(ExecutorProcessControl &EPC, SymbolAddrs SAs);
static Expected<std::unique_ptr<SimpleRemoteMemoryMapper>>
Create(ExecutorProcessControl &EPC, SymbolAddrs SAs) {
return std::make_unique<SimpleRemoteMemoryMapper>(EPC, SAs);
}
unsigned int getPageSize() override { return EPC.getPageSize(); }
/// Reserves memory in the remote process by calling a remote
/// SPS-wrapper-function with signature
///
/// SPSExpected<SPSExecutorAddr>(uint64_t Size).
///
/// On success, returns the base address of the reserved range.
void reserve(size_t NumBytes, OnReservedFunction OnReserved) override;
char *prepare(jitlink::LinkGraph &G, ExecutorAddr Addr,
size_t ContentSize) override;
/// Initializes memory within a previously reserved region (applying
/// protections and running any finalization actions) by calling a remote
/// SPS-wrapper-function with signature
///
/// SPSExpected<SPSExecutorAddr>(SPSFinalizeRequest)
///
/// On success, returns a key that can be used to deinitialize the region.
void initialize(AllocInfo &AI, OnInitializedFunction OnInitialized) override;
/// Given a series of keys from previous initialize calls, deinitialize
/// previously initialized memory regions (running dealloc actions, resetting
/// permissions and decommitting if possible) by calling a remote
/// SPS-wrapper-function with signature
///
/// SPSError(SPSSequence<SPSExecutorAddr> Keys)
///
void deinitialize(ArrayRef<ExecutorAddr> Allocations,
OnDeinitializedFunction OnDeInitialized) override;
/// Given a sequence of base addresses from previous reserve calls, release
/// the underlying ranges (deinitializing any remaining regions within them)
/// by calling a remote SPS-wrapper-function with signature
///
/// SPSError(SPSSequence<SPSExecutorAddr> Bases)
///
void release(ArrayRef<ExecutorAddr> Reservations,
OnReleasedFunction OnRelease) override;
private:
ExecutorProcessControl &EPC;
SymbolAddrs SAs;
};
} // namespace llvm::orc
#endif // LLVM_EXECUTIONENGINE_ORC_SIMPLEREMOTEMEMORYMAPPER_H