//===------- MemoryAccess.h - Executor memory access APIs -------*- 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 // //===----------------------------------------------------------------------===// // // Utilities for accessing memory in the executor processes. // //===----------------------------------------------------------------------===// #ifndef LLVM_EXECUTIONENGINE_ORC_MEMORYACCESS_H #define LLVM_EXECUTIONENGINE_ORC_MEMORYACCESS_H #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/FunctionExtras.h" #include "llvm/ExecutionEngine/Orc/Shared/TargetProcessControlTypes.h" #include "llvm/Support/MSVCErrorWorkarounds.h" #include namespace llvm::orc { /// APIs for manipulating memory in the target process. class LLVM_ABI MemoryAccess { public: /// Callback function for asynchronous writes. using WriteResultFn = unique_function; template using ReadUIntsResult = std::vector; template using OnReadUIntsCompleteFn = unique_function>)>; using ReadPointersResult = std::vector; using OnReadPointersCompleteFn = unique_function)>; using ReadBuffersResult = std::vector>; using OnReadBuffersCompleteFn = unique_function)>; using ReadStringsResult = std::vector; using OnReadStringsCompleteFn = unique_function)>; virtual ~MemoryAccess(); virtual void writeUInt8sAsync(ArrayRef Ws, WriteResultFn OnWriteComplete) = 0; virtual void writeUInt16sAsync(ArrayRef Ws, WriteResultFn OnWriteComplete) = 0; virtual void writeUInt32sAsync(ArrayRef Ws, WriteResultFn OnWriteComplete) = 0; virtual void writeUInt64sAsync(ArrayRef Ws, WriteResultFn OnWriteComplete) = 0; virtual void writePointersAsync(ArrayRef Ws, WriteResultFn OnWriteComplete) = 0; virtual void writeBuffersAsync(ArrayRef Ws, WriteResultFn OnWriteComplete) = 0; virtual void readUInt8sAsync(ArrayRef Rs, OnReadUIntsCompleteFn OnComplete) = 0; virtual void readUInt16sAsync(ArrayRef Rs, OnReadUIntsCompleteFn OnComplete) = 0; virtual void readUInt32sAsync(ArrayRef Rs, OnReadUIntsCompleteFn OnComplete) = 0; virtual void readUInt64sAsync(ArrayRef Rs, OnReadUIntsCompleteFn OnComplete) = 0; virtual void readPointersAsync(ArrayRef Rs, OnReadPointersCompleteFn OnComplete) = 0; virtual void readBuffersAsync(ArrayRef Rs, OnReadBuffersCompleteFn OnComplete) = 0; virtual void readStringsAsync(ArrayRef Rs, OnReadStringsCompleteFn OnComplete) = 0; Error writeUInt8s(ArrayRef Ws) { std::promise ResultP; auto ResultF = ResultP.get_future(); writeUInt8sAsync(Ws, [&](Error Err) { ResultP.set_value(std::move(Err)); }); return ResultF.get(); } Error writeUInt16s(ArrayRef Ws) { std::promise ResultP; auto ResultF = ResultP.get_future(); writeUInt16sAsync(Ws, [&](Error Err) { ResultP.set_value(std::move(Err)); }); return ResultF.get(); } Error writeUInt32s(ArrayRef Ws) { std::promise ResultP; auto ResultF = ResultP.get_future(); writeUInt32sAsync(Ws, [&](Error Err) { ResultP.set_value(std::move(Err)); }); return ResultF.get(); } Error writeUInt64s(ArrayRef Ws) { std::promise ResultP; auto ResultF = ResultP.get_future(); writeUInt64sAsync(Ws, [&](Error Err) { ResultP.set_value(std::move(Err)); }); return ResultF.get(); } Error writePointers(ArrayRef Ws) { std::promise ResultP; auto ResultF = ResultP.get_future(); writePointersAsync(Ws, [&](Error Err) { ResultP.set_value(std::move(Err)); }); return ResultF.get(); } Error writeBuffers(ArrayRef Ws) { std::promise ResultP; auto ResultF = ResultP.get_future(); writeBuffersAsync(Ws, [&](Error Err) { ResultP.set_value(std::move(Err)); }); return ResultF.get(); } Expected> readUInt8s(ArrayRef Rs) { std::promise>> P; readUInt8sAsync(Rs, [&](Expected> Result) { P.set_value(std::move(Result)); }); return P.get_future().get(); } Expected> readUInt16s(ArrayRef Rs) { std::promise>> P; readUInt16sAsync(Rs, [&](Expected> Result) { P.set_value(std::move(Result)); }); return P.get_future().get(); } Expected> readUInt32s(ArrayRef Rs) { std::promise>> P; readUInt32sAsync(Rs, [&](Expected> Result) { P.set_value(std::move(Result)); }); return P.get_future().get(); } Expected> readUInt64s(ArrayRef Rs) { std::promise>> P; readUInt64sAsync(Rs, [&](Expected> Result) { P.set_value(std::move(Result)); }); return P.get_future().get(); } Expected readPointers(ArrayRef Rs) { std::promise> P; readPointersAsync(Rs, [&](Expected Result) { P.set_value(std::move(Result)); }); return P.get_future().get(); } Expected readBuffers(ArrayRef Rs) { std::promise> P; readBuffersAsync(Rs, [&](Expected Result) { P.set_value(std::move(Result)); }); return P.get_future().get(); } Expected readStrings(ArrayRef Rs) { std::promise> P; readStringsAsync(Rs, [&](Expected Result) { P.set_value(std::move(Result)); }); return P.get_future().get(); } }; } // namespace llvm::orc #endif // LLVM_EXECUTIONENGINE_ORC_MEMORYACCESS_H