1*810390e3Srobert //===- dlfcn_wrapper.cpp --------------------------------------------------===//
2*810390e3Srobert //
3*810390e3Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*810390e3Srobert // See https://llvm.org/LICENSE.txt for license information.
5*810390e3Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*810390e3Srobert //
7*810390e3Srobert //===----------------------------------------------------------------------===//
8*810390e3Srobert //
9*810390e3Srobert // This file is a part of the ORC runtime support library.
10*810390e3Srobert //
11*810390e3Srobert //===----------------------------------------------------------------------===//
12*810390e3Srobert
13*810390e3Srobert #include "adt.h"
14*810390e3Srobert #include "common.h"
15*810390e3Srobert #include "wrapper_function_utils.h"
16*810390e3Srobert
17*810390e3Srobert #include <vector>
18*810390e3Srobert
19*810390e3Srobert using namespace __orc_rt;
20*810390e3Srobert
21*810390e3Srobert extern "C" const char *__orc_rt_jit_dlerror();
22*810390e3Srobert extern "C" void *__orc_rt_jit_dlopen(const char *path, int mode);
23*810390e3Srobert extern "C" int __orc_rt_jit_dlclose(void *dso_handle);
24*810390e3Srobert
25*810390e3Srobert ORC_RT_INTERFACE __orc_rt_CWrapperFunctionResult
__orc_rt_jit_dlerror_wrapper(const char * ArgData,size_t ArgSize)26*810390e3Srobert __orc_rt_jit_dlerror_wrapper(const char *ArgData, size_t ArgSize) {
27*810390e3Srobert return WrapperFunction<SPSString()>::handle(
28*810390e3Srobert ArgData, ArgSize,
29*810390e3Srobert []() { return std::string(__orc_rt_jit_dlerror()); })
30*810390e3Srobert .release();
31*810390e3Srobert }
32*810390e3Srobert
33*810390e3Srobert ORC_RT_INTERFACE __orc_rt_CWrapperFunctionResult
__orc_rt_jit_dlopen_wrapper(const char * ArgData,size_t ArgSize)34*810390e3Srobert __orc_rt_jit_dlopen_wrapper(const char *ArgData, size_t ArgSize) {
35*810390e3Srobert return WrapperFunction<SPSExecutorAddr(SPSString, int32_t)>::handle(
36*810390e3Srobert ArgData, ArgSize,
37*810390e3Srobert [](const std::string &Path, int32_t mode) {
38*810390e3Srobert return ExecutorAddr::fromPtr(
39*810390e3Srobert __orc_rt_jit_dlopen(Path.c_str(), mode));
40*810390e3Srobert })
41*810390e3Srobert .release();
42*810390e3Srobert }
43*810390e3Srobert
44*810390e3Srobert ORC_RT_INTERFACE __orc_rt_CWrapperFunctionResult
__orc_rt_jit_dlclose_wrapper(const char * ArgData,size_t ArgSize)45*810390e3Srobert __orc_rt_jit_dlclose_wrapper(const char *ArgData, size_t ArgSize) {
46*810390e3Srobert return WrapperFunction<int32_t(SPSExecutorAddr)>::handle(
47*810390e3Srobert ArgData, ArgSize,
48*810390e3Srobert [](ExecutorAddr &DSOHandle) {
49*810390e3Srobert return __orc_rt_jit_dlclose(DSOHandle.toPtr<void *>());
50*810390e3Srobert })
51*810390e3Srobert .release();
52*810390e3Srobert }
53