diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink-executor/llvm-jitlink-executor.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink-executor/llvm-jitlink-executor.cpp index 34246ca4a39a5..71c83f2badb8f 100644 --- a/llvm/tools/llvm-jitlink/llvm-jitlink-executor/llvm-jitlink-executor.cpp +++ b/llvm/tools/llvm-jitlink/llvm-jitlink-executor/llvm-jitlink-executor.cpp @@ -11,6 +11,7 @@ //===----------------------------------------------------------------------===// #include "llvm/ADT/StringRef.h" +#include "llvm/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/SimpleExecutorMemoryManager.h" @@ -164,6 +165,9 @@ int main(int argc, char *argv[]) { SimpleRemoteEPCServer::defaultBootstrapSymbols(); S.services().push_back( std::make_unique()); + S.services().push_back( + std::make_unique< + rt_bootstrap::ExecutorSharedMemoryMapperService>()); return Error::success(); }, InFD, OutFD)); diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp index 117d02f7bff9f..53c708fd77e24 100644 --- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp +++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp @@ -28,6 +28,7 @@ #include "llvm/ExecutionEngine/Orc/MachOPlatform.h" #include "llvm/ExecutionEngine/Orc/MapperJITLinkMemoryManager.h" #include "llvm/ExecutionEngine/Orc/ObjectFileInterface.h" +#include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h" #include "llvm/MC/MCAsmInfo.h" @@ -237,6 +238,11 @@ static cl::opt cl::desc("Show FailedToMaterialize errors"), cl::init(false), cl::cat(JITLinkCategory)); +static cl::opt UseSharedMemory( + "use-shared-memory", + cl::desc("Use shared memory to transfer generated code and data"), + cl::init(false), cl::cat(JITLinkCategory)); + static ExitOnError ExitOnErr; static LLVM_ATTRIBUTE_USED void linkComponents() { @@ -814,6 +820,35 @@ static std::unique_ptr createInProcessMemoryManager() { #endif } +Expected> +createSharedMemoryManager(SimpleRemoteEPC &SREPC) { + SharedMemoryMapper::SymbolAddrs SAs; + if (auto Err = SREPC.getBootstrapSymbols( + {{SAs.Instance, rt::ExecutorSharedMemoryMapperServiceInstanceName}, + {SAs.Reserve, + rt::ExecutorSharedMemoryMapperServiceReserveWrapperName}, + {SAs.Initialize, + rt::ExecutorSharedMemoryMapperServiceInitializeWrapperName}, + {SAs.Deinitialize, + rt::ExecutorSharedMemoryMapperServiceDeinitializeWrapperName}, + {SAs.Release, + rt::ExecutorSharedMemoryMapperServiceReleaseWrapperName}})) + return std::move(Err); + +#ifdef _WIN32 + size_t SlabSize = 1024 * 1024; +#else + size_t SlabSize = 1024 * 1024 * 1024; +#endif + + if (!SlabAllocateSizeString.empty()) + SlabSize = ExitOnErr(getSlabAllocSize(SlabAllocateSizeString)); + + return MapperJITLinkMemoryManager::CreateWithMapper( + SlabSize, SREPC, SAs); +} size_t SlabSize = 1024 * 1024 * 1024; + + static Expected getTestObjectFileInterface(Session &S, MemoryBufferRef O) { @@ -970,9 +1005,13 @@ static Expected> launchExecutor() { close(ToExecutor[ReadEnd]); close(FromExecutor[WriteEnd]); + auto S = SimpleRemoteEPC::Setup(); + if (UseSharedMemory) + S.CreateMemoryManager = createSharedMemoryManager; + return SimpleRemoteEPC::Create( - std::make_unique(), - SimpleRemoteEPC::Setup(), FromExecutor[ReadEnd], ToExecutor[WriteEnd]); + std::make_unique(), std::move(S), + FromExecutor[ReadEnd], ToExecutor[WriteEnd]); #endif } @@ -1056,9 +1095,13 @@ static Expected> connectToExecutor() { if (!SockFD) return SockFD.takeError(); + auto S = SimpleRemoteEPC::Setup(); + if (UseSharedMemory) + S.CreateMemoryManager = createSharedMemoryManager; + return SimpleRemoteEPC::Create( std::make_unique(), - SimpleRemoteEPC::Setup(), *SockFD, *SockFD); + std::move(S), *SockFD, *SockFD); #endif }