//===- elfnix_platform.h ----------------------------------------*- 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 // //===----------------------------------------------------------------------===// // // ORC Runtime support for dynamic loading features on ELF-based platforms. // //===----------------------------------------------------------------------===// #ifndef ORC_RT_ELFNIX_PLATFORM_H #define ORC_RT_ELFNIX_PLATFORM_H #include "common.h" #include "executor_address.h" // Atexit functions. ORC_RT_INTERFACE int __orc_rt_elfnix_cxa_atexit(void (*func)(void *), void *arg, void *dso_handle); ORC_RT_INTERFACE int __orc_rt_elfnix_atexit(void (*func)(void *)); ORC_RT_INTERFACE void __orc_rt_elfnix_cxa_finalize(void *dso_handle); // dlfcn functions. ORC_RT_INTERFACE const char *__orc_rt_elfnix_jit_dlerror(); ORC_RT_INTERFACE void *__orc_rt_elfnix_jit_dlopen(const char *path, int mode); ORC_RT_INTERFACE int __orc_rt_elfnix_jit_dlclose(void *dso_handle); ORC_RT_INTERFACE void *__orc_rt_elfnix_jit_dlsym(void *dso_handle, const char *symbol); namespace __orc_rt { namespace elfnix { struct ELFNixPerObjectSectionsToRegister { ExecutorAddrRange EHFrameSection; ExecutorAddrRange ThreadDataSection; }; struct ELFNixJITDylibInitializers { using SectionList = std::vector; ELFNixJITDylibInitializers() = default; ELFNixJITDylibInitializers(std::string Name, ExecutorAddr DSOHandleAddress) : Name(std::move(Name)), DSOHandleAddress(std::move(DSOHandleAddress)) {} std::string Name; ExecutorAddr DSOHandleAddress; std::vector> InitSections; }; class ELFNixJITDylibDeinitializers {}; using ELFNixJITDylibInitializerSequence = std::vector; using ELFNixJITDylibDeinitializerSequence = std::vector; enum dlopen_mode : int { ORC_RT_RTLD_LAZY = 0x1, ORC_RT_RTLD_NOW = 0x2, ORC_RT_RTLD_LOCAL = 0x4, ORC_RT_RTLD_GLOBAL = 0x8 }; } // end namespace elfnix using SPSELFNixPerObjectSectionsToRegister = SPSTuple; template <> class SPSSerializationTraits { public: static size_t size(const elfnix::ELFNixPerObjectSectionsToRegister &MOPOSR) { return SPSELFNixPerObjectSectionsToRegister::AsArgList::size( MOPOSR.EHFrameSection, MOPOSR.ThreadDataSection); } static bool serialize(SPSOutputBuffer &OB, const elfnix::ELFNixPerObjectSectionsToRegister &MOPOSR) { return SPSELFNixPerObjectSectionsToRegister::AsArgList::serialize( OB, MOPOSR.EHFrameSection, MOPOSR.ThreadDataSection); } static bool deserialize(SPSInputBuffer &IB, elfnix::ELFNixPerObjectSectionsToRegister &MOPOSR) { return SPSELFNixPerObjectSectionsToRegister::AsArgList::deserialize( IB, MOPOSR.EHFrameSection, MOPOSR.ThreadDataSection); } }; using SPSNamedExecutorAddrRangeSequenceMap = SPSSequence>; using SPSELFNixJITDylibInitializers = SPSTuple; using SPSELFNixJITDylibInitializerSequence = SPSSequence; /// Serialization traits for ELFNixJITDylibInitializers. template <> class SPSSerializationTraits { public: static size_t size(const elfnix::ELFNixJITDylibInitializers &MOJDIs) { return SPSELFNixJITDylibInitializers::AsArgList::size( MOJDIs.Name, MOJDIs.DSOHandleAddress, MOJDIs.InitSections); } static bool serialize(SPSOutputBuffer &OB, const elfnix::ELFNixJITDylibInitializers &MOJDIs) { return SPSELFNixJITDylibInitializers::AsArgList::serialize( OB, MOJDIs.Name, MOJDIs.DSOHandleAddress, MOJDIs.InitSections); } static bool deserialize(SPSInputBuffer &IB, elfnix::ELFNixJITDylibInitializers &MOJDIs) { return SPSELFNixJITDylibInitializers::AsArgList::deserialize( IB, MOJDIs.Name, MOJDIs.DSOHandleAddress, MOJDIs.InitSections); } }; } // end namespace __orc_rt #endif // ORC_RT_ELFNIX_PLATFORM_H