diff --git a/compiler-rt/lib/orc/coff_platform.cpp b/compiler-rt/lib/orc/coff_platform.cpp index 49b805a0ec7d..346d896f6c94 100644 --- a/compiler-rt/lib/orc/coff_platform.cpp +++ b/compiler-rt/lib/orc/coff_platform.cpp @@ -17,7 +17,6 @@ #include "debug.h" #include "error.h" -#include "jit_dispatch.h" #include "wrapper_function_utils.h" #include @@ -316,9 +315,9 @@ Error COFFPlatformRuntimeState::dlopenFull(JITDylibState &JDS) { // Call back to the JIT to push the initializers. Expected DepInfoMap((COFFJITDylibDepInfoMap())); if (auto Err = WrapperFunction( - SPSExecutorAddr)>:: - call(JITDispatch(&__orc_rt_coff_push_initializers_tag), DepInfoMap, - ExecutorAddr::fromPtr(JDS.Header))) + SPSExecutorAddr)>::call(&__orc_rt_coff_push_initializers_tag, + DepInfoMap, + ExecutorAddr::fromPtr(JDS.Header))) return Err; if (!DepInfoMap) return DepInfoMap.takeError(); @@ -446,9 +445,10 @@ COFFPlatformRuntimeState::lookupSymbolInJITDylib(void *header, std::string_view Sym) { Expected Result((ExecutorAddr())); if (auto Err = WrapperFunction( - SPSExecutorAddr, - SPSString)>::call(JITDispatch(&__orc_rt_coff_symbol_lookup_tag), - Result, ExecutorAddr::fromPtr(header), Sym)) + SPSExecutorAddr, SPSString)>::call(&__orc_rt_coff_symbol_lookup_tag, + Result, + ExecutorAddr::fromPtr(header), + Sym)) return std::move(Err); return Result; } diff --git a/compiler-rt/lib/orc/elfnix_platform.cpp b/compiler-rt/lib/orc/elfnix_platform.cpp index bd76e3ed0ece..dc6af65dc996 100644 --- a/compiler-rt/lib/orc/elfnix_platform.cpp +++ b/compiler-rt/lib/orc/elfnix_platform.cpp @@ -14,7 +14,6 @@ #include "common.h" #include "compiler.h" #include "error.h" -#include "jit_dispatch.h" #include "wrapper_function_utils.h" #include @@ -353,9 +352,10 @@ ELFNixPlatformRuntimeState::lookupSymbolInJITDylib(void *DSOHandle, std::string_view Sym) { Expected Result((ExecutorAddr())); if (auto Err = WrapperFunction( - SPSExecutorAddr, - SPSString)>::call(JITDispatch(&__orc_rt_elfnix_symbol_lookup_tag), - Result, ExecutorAddr::fromPtr(DSOHandle), Sym)) + SPSExecutorAddr, SPSString)>::call(&__orc_rt_elfnix_symbol_lookup_tag, + Result, + ExecutorAddr::fromPtr(DSOHandle), + Sym)) return std::move(Err); return Result; } @@ -368,9 +368,8 @@ ELFNixPlatformRuntimeState::getJITDylibInitializersByName( std::string PathStr(Path.data(), Path.size()); if (auto Err = WrapperFunction( - SPSString)>:: - call(JITDispatch(&__orc_rt_elfnix_get_initializers_tag), Result, - Path)) + SPSString)>::call(&__orc_rt_elfnix_get_initializers_tag, Result, + Path)) return std::move(Err); return Result; } diff --git a/compiler-rt/lib/orc/jit_dispatch.h b/compiler-rt/lib/orc/jit_dispatch.h deleted file mode 100644 index 9b2329fa1e4f..000000000000 --- a/compiler-rt/lib/orc/jit_dispatch.h +++ /dev/null @@ -1,50 +0,0 @@ -//===------ jit_dispatch.h - Call back to an ORC controller -----*- 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 -// -//===----------------------------------------------------------------------===// -// -// This file is a part of the ORC runtime support library. -// -//===----------------------------------------------------------------------===// - -#ifndef ORC_RT_JIT_DISPATCH_H -#define ORC_RT_JIT_DISPATCH_H - -#include "common.h" -#include "wrapper_function_utils.h" - -namespace orc_rt { - -class JITDispatch { -public: - JITDispatch(const void *FnTag) : FnTag(FnTag) {} - - WrapperFunctionResult operator()(const char *ArgData, size_t ArgSize) { - // Since the functions cannot be zero/unresolved on Windows, the following - // reference taking would always be non-zero, thus generating a compiler - // warning otherwise. -#if !defined(_WIN32) - if (ORC_RT_UNLIKELY(!&__orc_rt_jit_dispatch_ctx)) - return WrapperFunctionResult::createOutOfBandError( - "__orc_rt_jit_dispatch_ctx not set") - .release(); - if (ORC_RT_UNLIKELY(!&__orc_rt_jit_dispatch)) - return WrapperFunctionResult::createOutOfBandError( - "__orc_rt_jit_dispatch not set") - .release(); -#endif - - return __orc_rt_jit_dispatch(&__orc_rt_jit_dispatch_ctx, FnTag, ArgData, - ArgSize); - } - -private: - const void *FnTag; -}; - -} // namespace orc_rt - -#endif // ORC_RT_JIT_DISPATCH_H diff --git a/compiler-rt/lib/orc/macho_platform.cpp b/compiler-rt/lib/orc/macho_platform.cpp index c092545b2a36..1974d3f0ef33 100644 --- a/compiler-rt/lib/orc/macho_platform.cpp +++ b/compiler-rt/lib/orc/macho_platform.cpp @@ -16,7 +16,6 @@ #include "debug.h" #include "error.h" #include "interval_map.h" -#include "jit_dispatch.h" #include "wrapper_function_utils.h" #include @@ -916,7 +915,7 @@ Error MachOPlatformRuntimeState::requestPushSymbols( Error OpErr = Error::success(); if (auto Err = WrapperFunction>)>:: - call(JITDispatch(&__orc_rt_macho_push_symbols_tag), OpErr, + call(&__orc_rt_macho_push_symbols_tag, OpErr, ExecutorAddr::fromPtr(JDS.Header), Symbols)) { cantFail(std::move(OpErr)); return std::move(Err); @@ -1146,9 +1145,8 @@ Error MachOPlatformRuntimeState::dlopenFull( // Unlock so that we can accept the initializer update. JDStatesLock.unlock(); if (auto Err = WrapperFunction( - SPSExecutorAddr)>:: - call(JITDispatch(&__orc_rt_macho_push_initializers_tag), DepInfo, - ExecutorAddr::fromPtr(JDS.Header))) + SPSExecutorAddr)>::call(&__orc_rt_macho_push_initializers_tag, + DepInfo, ExecutorAddr::fromPtr(JDS.Header))) return Err; JDStatesLock.lock(); diff --git a/compiler-rt/lib/orc/wrapper_function_utils.h b/compiler-rt/lib/orc/wrapper_function_utils.h index d5a709a04621..e65aac0fe4e5 100644 --- a/compiler-rt/lib/orc/wrapper_function_utils.h +++ b/compiler-rt/lib/orc/wrapper_function_utils.h @@ -13,9 +13,10 @@ #ifndef ORC_RT_WRAPPER_FUNCTION_UTILS_H #define ORC_RT_WRAPPER_FUNCTION_UTILS_H +#include "orc_rt/c_api.h" +#include "common.h" #include "error.h" #include "executor_address.h" -#include "orc_rt/c_api.h" #include "simple_packed_serialization.h" #include @@ -287,22 +288,30 @@ private: using ResultSerializer = detail::ResultSerializer; public: - template - static Error call(DispatchFn &&Dispatch, RetT &Result, const ArgTs &...Args) { + template + static Error call(const void *FnTag, RetT &Result, const ArgTs &...Args) { // RetT might be an Error or Expected value. Set the checked flag now: // we don't want the user to have to check the unused result if this // operation fails. detail::ResultDeserializer::makeSafe(Result); + // Since the functions cannot be zero/unresolved on Windows, the following + // reference taking would always be non-zero, thus generating a compiler + // warning otherwise. +#if !defined(_WIN32) + if (ORC_RT_UNLIKELY(!&__orc_rt_jit_dispatch_ctx)) + return make_error("__orc_rt_jit_dispatch_ctx not set"); + if (ORC_RT_UNLIKELY(!&__orc_rt_jit_dispatch)) + return make_error("__orc_rt_jit_dispatch not set"); +#endif auto ArgBuffer = WrapperFunctionResult::fromSPSArgs>(Args...); if (const char *ErrMsg = ArgBuffer.getOutOfBandError()) return make_error(ErrMsg); - WrapperFunctionResult ResultBuffer = - Dispatch(ArgBuffer.data(), ArgBuffer.size()); - + WrapperFunctionResult ResultBuffer = __orc_rt_jit_dispatch( + &__orc_rt_jit_dispatch_ctx, FnTag, ArgBuffer.data(), ArgBuffer.size()); if (auto ErrMsg = ResultBuffer.getOutOfBandError()) return make_error(ErrMsg);