1*810390e3Srobert //===- elfnix_platform.h ----------------------------------------*- C++ -*-===// 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 // ORC Runtime support for dynamic loading features on ELF-based platforms. 10*810390e3Srobert // 11*810390e3Srobert //===----------------------------------------------------------------------===// 12*810390e3Srobert 13*810390e3Srobert #ifndef ORC_RT_ELFNIX_PLATFORM_H 14*810390e3Srobert #define ORC_RT_ELFNIX_PLATFORM_H 15*810390e3Srobert 16*810390e3Srobert #include "common.h" 17*810390e3Srobert #include "executor_address.h" 18*810390e3Srobert 19*810390e3Srobert // Atexit functions. 20*810390e3Srobert ORC_RT_INTERFACE int __orc_rt_elfnix_cxa_atexit(void (*func)(void *), void *arg, 21*810390e3Srobert void *dso_handle); 22*810390e3Srobert ORC_RT_INTERFACE int __orc_rt_elfnix_atexit(void (*func)(void *)); 23*810390e3Srobert ORC_RT_INTERFACE void __orc_rt_elfnix_cxa_finalize(void *dso_handle); 24*810390e3Srobert 25*810390e3Srobert // dlfcn functions. 26*810390e3Srobert ORC_RT_INTERFACE const char *__orc_rt_elfnix_jit_dlerror(); 27*810390e3Srobert ORC_RT_INTERFACE void *__orc_rt_elfnix_jit_dlopen(const char *path, int mode); 28*810390e3Srobert ORC_RT_INTERFACE int __orc_rt_elfnix_jit_dlclose(void *dso_handle); 29*810390e3Srobert ORC_RT_INTERFACE void *__orc_rt_elfnix_jit_dlsym(void *dso_handle, 30*810390e3Srobert const char *symbol); 31*810390e3Srobert 32*810390e3Srobert namespace __orc_rt { 33*810390e3Srobert namespace elfnix { 34*810390e3Srobert 35*810390e3Srobert struct ELFNixPerObjectSectionsToRegister { 36*810390e3Srobert ExecutorAddrRange EHFrameSection; 37*810390e3Srobert ExecutorAddrRange ThreadDataSection; 38*810390e3Srobert }; 39*810390e3Srobert 40*810390e3Srobert struct ELFNixJITDylibInitializers { 41*810390e3Srobert using SectionList = std::vector<ExecutorAddrRange>; 42*810390e3Srobert 43*810390e3Srobert ELFNixJITDylibInitializers() = default; ELFNixJITDylibInitializersELFNixJITDylibInitializers44*810390e3Srobert ELFNixJITDylibInitializers(std::string Name, ExecutorAddr DSOHandleAddress) 45*810390e3Srobert : Name(std::move(Name)), DSOHandleAddress(std::move(DSOHandleAddress)) {} 46*810390e3Srobert 47*810390e3Srobert std::string Name; 48*810390e3Srobert ExecutorAddr DSOHandleAddress; 49*810390e3Srobert 50*810390e3Srobert std::vector<std::pair<std::string, SectionList>> InitSections; 51*810390e3Srobert }; 52*810390e3Srobert 53*810390e3Srobert class ELFNixJITDylibDeinitializers {}; 54*810390e3Srobert 55*810390e3Srobert using ELFNixJITDylibInitializerSequence = 56*810390e3Srobert std::vector<ELFNixJITDylibInitializers>; 57*810390e3Srobert 58*810390e3Srobert using ELFNixJITDylibDeinitializerSequence = 59*810390e3Srobert std::vector<ELFNixJITDylibDeinitializers>; 60*810390e3Srobert 61*810390e3Srobert enum dlopen_mode : int { 62*810390e3Srobert ORC_RT_RTLD_LAZY = 0x1, 63*810390e3Srobert ORC_RT_RTLD_NOW = 0x2, 64*810390e3Srobert ORC_RT_RTLD_LOCAL = 0x4, 65*810390e3Srobert ORC_RT_RTLD_GLOBAL = 0x8 66*810390e3Srobert }; 67*810390e3Srobert 68*810390e3Srobert } // end namespace elfnix 69*810390e3Srobert 70*810390e3Srobert using SPSELFNixPerObjectSectionsToRegister = 71*810390e3Srobert SPSTuple<SPSExecutorAddrRange, SPSExecutorAddrRange>; 72*810390e3Srobert 73*810390e3Srobert template <> 74*810390e3Srobert class SPSSerializationTraits<SPSELFNixPerObjectSectionsToRegister, 75*810390e3Srobert elfnix::ELFNixPerObjectSectionsToRegister> { 76*810390e3Srobert 77*810390e3Srobert public: size(const elfnix::ELFNixPerObjectSectionsToRegister & MOPOSR)78*810390e3Srobert static size_t size(const elfnix::ELFNixPerObjectSectionsToRegister &MOPOSR) { 79*810390e3Srobert return SPSELFNixPerObjectSectionsToRegister::AsArgList::size( 80*810390e3Srobert MOPOSR.EHFrameSection, MOPOSR.ThreadDataSection); 81*810390e3Srobert } 82*810390e3Srobert 83*810390e3Srobert static bool serialize(SPSOutputBuffer & OB,const elfnix::ELFNixPerObjectSectionsToRegister & MOPOSR)84*810390e3Srobert serialize(SPSOutputBuffer &OB, 85*810390e3Srobert const elfnix::ELFNixPerObjectSectionsToRegister &MOPOSR) { 86*810390e3Srobert return SPSELFNixPerObjectSectionsToRegister::AsArgList::serialize( 87*810390e3Srobert OB, MOPOSR.EHFrameSection, MOPOSR.ThreadDataSection); 88*810390e3Srobert } 89*810390e3Srobert deserialize(SPSInputBuffer & IB,elfnix::ELFNixPerObjectSectionsToRegister & MOPOSR)90*810390e3Srobert static bool deserialize(SPSInputBuffer &IB, 91*810390e3Srobert elfnix::ELFNixPerObjectSectionsToRegister &MOPOSR) { 92*810390e3Srobert return SPSELFNixPerObjectSectionsToRegister::AsArgList::deserialize( 93*810390e3Srobert IB, MOPOSR.EHFrameSection, MOPOSR.ThreadDataSection); 94*810390e3Srobert } 95*810390e3Srobert }; 96*810390e3Srobert 97*810390e3Srobert using SPSNamedExecutorAddrRangeSequenceMap = 98*810390e3Srobert SPSSequence<SPSTuple<SPSString, SPSExecutorAddrRangeSequence>>; 99*810390e3Srobert 100*810390e3Srobert using SPSELFNixJITDylibInitializers = 101*810390e3Srobert SPSTuple<SPSString, SPSExecutorAddr, SPSNamedExecutorAddrRangeSequenceMap>; 102*810390e3Srobert 103*810390e3Srobert using SPSELFNixJITDylibInitializerSequence = 104*810390e3Srobert SPSSequence<SPSELFNixJITDylibInitializers>; 105*810390e3Srobert 106*810390e3Srobert /// Serialization traits for ELFNixJITDylibInitializers. 107*810390e3Srobert template <> 108*810390e3Srobert class SPSSerializationTraits<SPSELFNixJITDylibInitializers, 109*810390e3Srobert elfnix::ELFNixJITDylibInitializers> { 110*810390e3Srobert public: size(const elfnix::ELFNixJITDylibInitializers & MOJDIs)111*810390e3Srobert static size_t size(const elfnix::ELFNixJITDylibInitializers &MOJDIs) { 112*810390e3Srobert return SPSELFNixJITDylibInitializers::AsArgList::size( 113*810390e3Srobert MOJDIs.Name, MOJDIs.DSOHandleAddress, MOJDIs.InitSections); 114*810390e3Srobert } 115*810390e3Srobert serialize(SPSOutputBuffer & OB,const elfnix::ELFNixJITDylibInitializers & MOJDIs)116*810390e3Srobert static bool serialize(SPSOutputBuffer &OB, 117*810390e3Srobert const elfnix::ELFNixJITDylibInitializers &MOJDIs) { 118*810390e3Srobert return SPSELFNixJITDylibInitializers::AsArgList::serialize( 119*810390e3Srobert OB, MOJDIs.Name, MOJDIs.DSOHandleAddress, MOJDIs.InitSections); 120*810390e3Srobert } 121*810390e3Srobert deserialize(SPSInputBuffer & IB,elfnix::ELFNixJITDylibInitializers & MOJDIs)122*810390e3Srobert static bool deserialize(SPSInputBuffer &IB, 123*810390e3Srobert elfnix::ELFNixJITDylibInitializers &MOJDIs) { 124*810390e3Srobert return SPSELFNixJITDylibInitializers::AsArgList::deserialize( 125*810390e3Srobert IB, MOJDIs.Name, MOJDIs.DSOHandleAddress, MOJDIs.InitSections); 126*810390e3Srobert } 127*810390e3Srobert }; 128*810390e3Srobert 129*810390e3Srobert } // end namespace __orc_rt 130*810390e3Srobert 131*810390e3Srobert #endif // ORC_RT_ELFNIX_PLATFORM_H 132