1349cc55cSDimitry Andric //===- elfnix_platform.h ----------------------------------------*- C++ -*-===// 2349cc55cSDimitry Andric // 3349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6349cc55cSDimitry Andric // 7349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 8349cc55cSDimitry Andric // 9349cc55cSDimitry Andric // ORC Runtime support for dynamic loading features on ELF-based platforms. 10349cc55cSDimitry Andric // 11349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 12349cc55cSDimitry Andric 13349cc55cSDimitry Andric #ifndef ORC_RT_ELFNIX_PLATFORM_H 14349cc55cSDimitry Andric #define ORC_RT_ELFNIX_PLATFORM_H 15349cc55cSDimitry Andric 16349cc55cSDimitry Andric #include "common.h" 17349cc55cSDimitry Andric #include "executor_address.h" 18349cc55cSDimitry Andric 19349cc55cSDimitry Andric // Atexit functions. 20349cc55cSDimitry Andric ORC_RT_INTERFACE int __orc_rt_elfnix_cxa_atexit(void (*func)(void *), void *arg, 21349cc55cSDimitry Andric void *dso_handle); 22349cc55cSDimitry Andric ORC_RT_INTERFACE int __orc_rt_elfnix_atexit(void (*func)(void *)); 23349cc55cSDimitry Andric ORC_RT_INTERFACE void __orc_rt_elfnix_cxa_finalize(void *dso_handle); 24349cc55cSDimitry Andric 25349cc55cSDimitry Andric // dlfcn functions. 26349cc55cSDimitry Andric ORC_RT_INTERFACE const char *__orc_rt_elfnix_jit_dlerror(); 27349cc55cSDimitry Andric ORC_RT_INTERFACE void *__orc_rt_elfnix_jit_dlopen(const char *path, int mode); 28349cc55cSDimitry Andric ORC_RT_INTERFACE int __orc_rt_elfnix_jit_dlclose(void *dso_handle); 29349cc55cSDimitry Andric ORC_RT_INTERFACE void *__orc_rt_elfnix_jit_dlsym(void *dso_handle, 30349cc55cSDimitry Andric const char *symbol); 31349cc55cSDimitry Andric 32349cc55cSDimitry Andric namespace __orc_rt { 33349cc55cSDimitry Andric namespace elfnix { 34349cc55cSDimitry Andric 35349cc55cSDimitry Andric struct ELFNixPerObjectSectionsToRegister { 36349cc55cSDimitry Andric ExecutorAddrRange EHFrameSection; 37349cc55cSDimitry Andric ExecutorAddrRange ThreadDataSection; 38349cc55cSDimitry Andric }; 39349cc55cSDimitry Andric 40349cc55cSDimitry Andric struct ELFNixJITDylibInitializers { 41349cc55cSDimitry Andric using SectionList = std::vector<ExecutorAddrRange>; 42349cc55cSDimitry Andric 43349cc55cSDimitry Andric ELFNixJITDylibInitializers() = default; ELFNixJITDylibInitializersELFNixJITDylibInitializers44349cc55cSDimitry Andric ELFNixJITDylibInitializers(std::string Name, ExecutorAddr DSOHandleAddress) 45349cc55cSDimitry Andric : Name(std::move(Name)), DSOHandleAddress(std::move(DSOHandleAddress)) {} 46349cc55cSDimitry Andric 47349cc55cSDimitry Andric std::string Name; 48349cc55cSDimitry Andric ExecutorAddr DSOHandleAddress; 49349cc55cSDimitry Andric 50*81ad6265SDimitry Andric std::vector<std::pair<std::string, SectionList>> InitSections; 51349cc55cSDimitry Andric }; 52349cc55cSDimitry Andric 53349cc55cSDimitry Andric class ELFNixJITDylibDeinitializers {}; 54349cc55cSDimitry Andric 55349cc55cSDimitry Andric using ELFNixJITDylibInitializerSequence = 56349cc55cSDimitry Andric std::vector<ELFNixJITDylibInitializers>; 57349cc55cSDimitry Andric 58349cc55cSDimitry Andric using ELFNixJITDylibDeinitializerSequence = 59349cc55cSDimitry Andric std::vector<ELFNixJITDylibDeinitializers>; 60349cc55cSDimitry Andric 61349cc55cSDimitry Andric enum dlopen_mode : int { 62349cc55cSDimitry Andric ORC_RT_RTLD_LAZY = 0x1, 63349cc55cSDimitry Andric ORC_RT_RTLD_NOW = 0x2, 64349cc55cSDimitry Andric ORC_RT_RTLD_LOCAL = 0x4, 65349cc55cSDimitry Andric ORC_RT_RTLD_GLOBAL = 0x8 66349cc55cSDimitry Andric }; 67349cc55cSDimitry Andric 68349cc55cSDimitry Andric } // end namespace elfnix 69349cc55cSDimitry Andric 70349cc55cSDimitry Andric using SPSELFNixPerObjectSectionsToRegister = 71349cc55cSDimitry Andric SPSTuple<SPSExecutorAddrRange, SPSExecutorAddrRange>; 72349cc55cSDimitry Andric 73349cc55cSDimitry Andric template <> 74349cc55cSDimitry Andric class SPSSerializationTraits<SPSELFNixPerObjectSectionsToRegister, 75349cc55cSDimitry Andric elfnix::ELFNixPerObjectSectionsToRegister> { 76349cc55cSDimitry Andric 77349cc55cSDimitry Andric public: size(const elfnix::ELFNixPerObjectSectionsToRegister & MOPOSR)78349cc55cSDimitry Andric static size_t size(const elfnix::ELFNixPerObjectSectionsToRegister &MOPOSR) { 79349cc55cSDimitry Andric return SPSELFNixPerObjectSectionsToRegister::AsArgList::size( 80349cc55cSDimitry Andric MOPOSR.EHFrameSection, MOPOSR.ThreadDataSection); 81349cc55cSDimitry Andric } 82349cc55cSDimitry Andric 83349cc55cSDimitry Andric static bool serialize(SPSOutputBuffer & OB,const elfnix::ELFNixPerObjectSectionsToRegister & MOPOSR)84349cc55cSDimitry Andric serialize(SPSOutputBuffer &OB, 85349cc55cSDimitry Andric const elfnix::ELFNixPerObjectSectionsToRegister &MOPOSR) { 86349cc55cSDimitry Andric return SPSELFNixPerObjectSectionsToRegister::AsArgList::serialize( 87349cc55cSDimitry Andric OB, MOPOSR.EHFrameSection, MOPOSR.ThreadDataSection); 88349cc55cSDimitry Andric } 89349cc55cSDimitry Andric deserialize(SPSInputBuffer & IB,elfnix::ELFNixPerObjectSectionsToRegister & MOPOSR)90349cc55cSDimitry Andric static bool deserialize(SPSInputBuffer &IB, 91349cc55cSDimitry Andric elfnix::ELFNixPerObjectSectionsToRegister &MOPOSR) { 92349cc55cSDimitry Andric return SPSELFNixPerObjectSectionsToRegister::AsArgList::deserialize( 93349cc55cSDimitry Andric IB, MOPOSR.EHFrameSection, MOPOSR.ThreadDataSection); 94349cc55cSDimitry Andric } 95349cc55cSDimitry Andric }; 96349cc55cSDimitry Andric 97349cc55cSDimitry Andric using SPSNamedExecutorAddrRangeSequenceMap = 98349cc55cSDimitry Andric SPSSequence<SPSTuple<SPSString, SPSExecutorAddrRangeSequence>>; 99349cc55cSDimitry Andric 100349cc55cSDimitry Andric using SPSELFNixJITDylibInitializers = 101349cc55cSDimitry Andric SPSTuple<SPSString, SPSExecutorAddr, SPSNamedExecutorAddrRangeSequenceMap>; 102349cc55cSDimitry Andric 103349cc55cSDimitry Andric using SPSELFNixJITDylibInitializerSequence = 104349cc55cSDimitry Andric SPSSequence<SPSELFNixJITDylibInitializers>; 105349cc55cSDimitry Andric 106349cc55cSDimitry Andric /// Serialization traits for ELFNixJITDylibInitializers. 107349cc55cSDimitry Andric template <> 108349cc55cSDimitry Andric class SPSSerializationTraits<SPSELFNixJITDylibInitializers, 109349cc55cSDimitry Andric elfnix::ELFNixJITDylibInitializers> { 110349cc55cSDimitry Andric public: size(const elfnix::ELFNixJITDylibInitializers & MOJDIs)111349cc55cSDimitry Andric static size_t size(const elfnix::ELFNixJITDylibInitializers &MOJDIs) { 112349cc55cSDimitry Andric return SPSELFNixJITDylibInitializers::AsArgList::size( 113349cc55cSDimitry Andric MOJDIs.Name, MOJDIs.DSOHandleAddress, MOJDIs.InitSections); 114349cc55cSDimitry Andric } 115349cc55cSDimitry Andric serialize(SPSOutputBuffer & OB,const elfnix::ELFNixJITDylibInitializers & MOJDIs)116349cc55cSDimitry Andric static bool serialize(SPSOutputBuffer &OB, 117349cc55cSDimitry Andric const elfnix::ELFNixJITDylibInitializers &MOJDIs) { 118349cc55cSDimitry Andric return SPSELFNixJITDylibInitializers::AsArgList::serialize( 119349cc55cSDimitry Andric OB, MOJDIs.Name, MOJDIs.DSOHandleAddress, MOJDIs.InitSections); 120349cc55cSDimitry Andric } 121349cc55cSDimitry Andric deserialize(SPSInputBuffer & IB,elfnix::ELFNixJITDylibInitializers & MOJDIs)122349cc55cSDimitry Andric static bool deserialize(SPSInputBuffer &IB, 123349cc55cSDimitry Andric elfnix::ELFNixJITDylibInitializers &MOJDIs) { 124349cc55cSDimitry Andric return SPSELFNixJITDylibInitializers::AsArgList::deserialize( 125349cc55cSDimitry Andric IB, MOJDIs.Name, MOJDIs.DSOHandleAddress, MOJDIs.InitSections); 126349cc55cSDimitry Andric } 127349cc55cSDimitry Andric }; 128349cc55cSDimitry Andric 129349cc55cSDimitry Andric } // end namespace __orc_rt 130349cc55cSDimitry Andric 131349cc55cSDimitry Andric #endif // ORC_RT_ELFNIX_PLATFORM_H 132