181ad6265SDimitry Andric //===- dlfcn_wrapper.cpp --------------------------------------------------===//
281ad6265SDimitry Andric //
381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric //
781ad6265SDimitry Andric //===----------------------------------------------------------------------===//
881ad6265SDimitry Andric //
981ad6265SDimitry Andric // This file is a part of the ORC runtime support library.
1081ad6265SDimitry Andric //
1181ad6265SDimitry Andric //===----------------------------------------------------------------------===//
1281ad6265SDimitry Andric
1381ad6265SDimitry Andric #include "adt.h"
1481ad6265SDimitry Andric #include "common.h"
1581ad6265SDimitry Andric #include "wrapper_function_utils.h"
1681ad6265SDimitry Andric
1781ad6265SDimitry Andric #include <vector>
1881ad6265SDimitry Andric
1981ad6265SDimitry Andric using namespace __orc_rt;
2081ad6265SDimitry Andric
2181ad6265SDimitry Andric extern "C" const char *__orc_rt_jit_dlerror();
2281ad6265SDimitry Andric extern "C" void *__orc_rt_jit_dlopen(const char *path, int mode);
2381ad6265SDimitry Andric extern "C" int __orc_rt_jit_dlclose(void *dso_handle);
2481ad6265SDimitry Andric
25*06c3fb27SDimitry Andric ORC_RT_INTERFACE orc_rt_CWrapperFunctionResult
__orc_rt_jit_dlerror_wrapper(const char * ArgData,size_t ArgSize)2681ad6265SDimitry Andric __orc_rt_jit_dlerror_wrapper(const char *ArgData, size_t ArgSize) {
2781ad6265SDimitry Andric return WrapperFunction<SPSString()>::handle(
2881ad6265SDimitry Andric ArgData, ArgSize,
2981ad6265SDimitry Andric []() { return std::string(__orc_rt_jit_dlerror()); })
3081ad6265SDimitry Andric .release();
3181ad6265SDimitry Andric }
3281ad6265SDimitry Andric
33*06c3fb27SDimitry Andric ORC_RT_INTERFACE orc_rt_CWrapperFunctionResult
__orc_rt_jit_dlopen_wrapper(const char * ArgData,size_t ArgSize)3481ad6265SDimitry Andric __orc_rt_jit_dlopen_wrapper(const char *ArgData, size_t ArgSize) {
3581ad6265SDimitry Andric return WrapperFunction<SPSExecutorAddr(SPSString, int32_t)>::handle(
3681ad6265SDimitry Andric ArgData, ArgSize,
3781ad6265SDimitry Andric [](const std::string &Path, int32_t mode) {
3881ad6265SDimitry Andric return ExecutorAddr::fromPtr(
3981ad6265SDimitry Andric __orc_rt_jit_dlopen(Path.c_str(), mode));
4081ad6265SDimitry Andric })
4181ad6265SDimitry Andric .release();
4281ad6265SDimitry Andric }
4381ad6265SDimitry Andric
44*06c3fb27SDimitry Andric ORC_RT_INTERFACE orc_rt_CWrapperFunctionResult
__orc_rt_jit_dlclose_wrapper(const char * ArgData,size_t ArgSize)4581ad6265SDimitry Andric __orc_rt_jit_dlclose_wrapper(const char *ArgData, size_t ArgSize) {
4681ad6265SDimitry Andric return WrapperFunction<int32_t(SPSExecutorAddr)>::handle(
4781ad6265SDimitry Andric ArgData, ArgSize,
4881ad6265SDimitry Andric [](ExecutorAddr &DSOHandle) {
4981ad6265SDimitry Andric return __orc_rt_jit_dlclose(DSOHandle.toPtr<void *>());
5081ad6265SDimitry Andric })
5181ad6265SDimitry Andric .release();
5281ad6265SDimitry Andric }
53