xref: /freebsd-src/contrib/llvm-project/compiler-rt/lib/orc/dlfcn_wrapper.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
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