diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/ExecutorProcessControl.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/ExecutorProcessControl.cpp | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/ExecutorProcessControl.cpp b/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/ExecutorProcessControl.cpp index 412b9f95ea62..361fcd4a2e9c 100644 --- a/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/ExecutorProcessControl.cpp +++ b/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/ExecutorProcessControl.cpp @@ -75,12 +75,10 @@ SelfExecutorProcessControl::Create( Expected<tpctypes::DylibHandle> SelfExecutorProcessControl::loadDylib(const char *DylibPath) { std::string ErrMsg; - auto Dylib = std::make_unique<sys::DynamicLibrary>( - sys::DynamicLibrary::getPermanentLibrary(DylibPath, &ErrMsg)); - if (!Dylib->isValid()) + auto Dylib = sys::DynamicLibrary::getPermanentLibrary(DylibPath, &ErrMsg); + if (!Dylib.isValid()) return make_error<StringError>(std::move(ErrMsg), inconvertibleErrorCode()); - DynamicLibraries.push_back(std::move(Dylib)); - return pointerToJITTargetAddress(DynamicLibraries.back().get()); + return ExecutorAddr::fromPtr(Dylib.getOSSpecificHandle()); } Expected<std::vector<tpctypes::LookupResult>> @@ -88,26 +86,20 @@ SelfExecutorProcessControl::lookupSymbols(ArrayRef<LookupRequest> Request) { std::vector<tpctypes::LookupResult> R; for (auto &Elem : Request) { - auto *Dylib = jitTargetAddressToPointer<sys::DynamicLibrary *>(Elem.Handle); - assert(llvm::any_of(DynamicLibraries, - [=](const std::unique_ptr<sys::DynamicLibrary> &DL) { - return DL.get() == Dylib; - }) && - "Invalid handle"); - - R.push_back(std::vector<JITTargetAddress>()); + sys::DynamicLibrary Dylib(Elem.Handle.toPtr<void *>()); + R.push_back(std::vector<ExecutorAddr>()); for (auto &KV : Elem.Symbols) { auto &Sym = KV.first; std::string Tmp((*Sym).data() + !!GlobalManglingPrefix, (*Sym).size() - !!GlobalManglingPrefix); - void *Addr = Dylib->getAddressOfSymbol(Tmp.c_str()); + void *Addr = Dylib.getAddressOfSymbol(Tmp.c_str()); if (!Addr && KV.second == SymbolLookupFlags::RequiredSymbol) { // FIXME: Collect all failing symbols before erroring out. SymbolNameVector MissingSymbols; MissingSymbols.push_back(Sym); return make_error<SymbolsNotFound>(SSP, std::move(MissingSymbols)); } - R.back().push_back(pointerToJITTargetAddress(Addr)); + R.back().push_back(ExecutorAddr::fromPtr(Addr)); } } @@ -121,6 +113,18 @@ SelfExecutorProcessControl::runAsMain(ExecutorAddr MainFnAddr, return orc::runAsMain(MainFnAddr.toPtr<MainTy>(), Args); } +Expected<int32_t> +SelfExecutorProcessControl::runAsVoidFunction(ExecutorAddr VoidFnAddr) { + using VoidTy = int (*)(); + return orc::runAsVoidFunction(VoidFnAddr.toPtr<VoidTy>()); +} + +Expected<int32_t> +SelfExecutorProcessControl::runAsIntFunction(ExecutorAddr IntFnAddr, int Arg) { + using IntTy = int (*)(int); + return orc::runAsIntFunction(IntFnAddr.toPtr<IntTy>(), Arg); +} + void SelfExecutorProcessControl::callWrapperAsync(ExecutorAddr WrapperFnAddr, IncomingWFRHandler SendResult, ArrayRef<char> ArgBuffer) { |