Path: blob/main/contrib/llvm-project/compiler-rt/lib/orc/elfnix_platform.h
39566 views
//===- elfnix_platform.h ----------------------------------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// ORC Runtime support for dynamic loading features on ELF-based platforms.9//10//===----------------------------------------------------------------------===//1112#ifndef ORC_RT_ELFNIX_PLATFORM_H13#define ORC_RT_ELFNIX_PLATFORM_H1415#include "common.h"16#include "executor_address.h"1718// Atexit functions.19ORC_RT_INTERFACE int __orc_rt_elfnix_cxa_atexit(void (*func)(void *), void *arg,20void *dso_handle);21ORC_RT_INTERFACE int __orc_rt_elfnix_atexit(void (*func)(void *));22ORC_RT_INTERFACE void __orc_rt_elfnix_cxa_finalize(void *dso_handle);2324// dlfcn functions.25ORC_RT_INTERFACE const char *__orc_rt_elfnix_jit_dlerror();26ORC_RT_INTERFACE void *__orc_rt_elfnix_jit_dlopen(const char *path, int mode);27ORC_RT_INTERFACE int __orc_rt_elfnix_jit_dlclose(void *dso_handle);28ORC_RT_INTERFACE void *__orc_rt_elfnix_jit_dlsym(void *dso_handle,29const char *symbol);3031namespace __orc_rt {32namespace elfnix {3334struct ELFNixPerObjectSectionsToRegister {35ExecutorAddrRange EHFrameSection;36ExecutorAddrRange ThreadDataSection;37};3839struct ELFNixJITDylibInitializers {40using SectionList = std::vector<ExecutorAddrRange>;4142ELFNixJITDylibInitializers() = default;43ELFNixJITDylibInitializers(std::string Name, ExecutorAddr DSOHandleAddress)44: Name(std::move(Name)), DSOHandleAddress(std::move(DSOHandleAddress)) {}4546std::string Name;47ExecutorAddr DSOHandleAddress;4849std::vector<std::pair<std::string, SectionList>> InitSections;50};5152class ELFNixJITDylibDeinitializers {};5354using ELFNixJITDylibInitializerSequence =55std::vector<ELFNixJITDylibInitializers>;5657using ELFNixJITDylibDeinitializerSequence =58std::vector<ELFNixJITDylibDeinitializers>;5960enum dlopen_mode : int {61ORC_RT_RTLD_LAZY = 0x1,62ORC_RT_RTLD_NOW = 0x2,63ORC_RT_RTLD_LOCAL = 0x4,64ORC_RT_RTLD_GLOBAL = 0x865};6667} // end namespace elfnix6869using SPSELFNixPerObjectSectionsToRegister =70SPSTuple<SPSExecutorAddrRange, SPSExecutorAddrRange>;7172template <>73class SPSSerializationTraits<SPSELFNixPerObjectSectionsToRegister,74elfnix::ELFNixPerObjectSectionsToRegister> {7576public:77static size_t size(const elfnix::ELFNixPerObjectSectionsToRegister &MOPOSR) {78return SPSELFNixPerObjectSectionsToRegister::AsArgList::size(79MOPOSR.EHFrameSection, MOPOSR.ThreadDataSection);80}8182static bool83serialize(SPSOutputBuffer &OB,84const elfnix::ELFNixPerObjectSectionsToRegister &MOPOSR) {85return SPSELFNixPerObjectSectionsToRegister::AsArgList::serialize(86OB, MOPOSR.EHFrameSection, MOPOSR.ThreadDataSection);87}8889static bool deserialize(SPSInputBuffer &IB,90elfnix::ELFNixPerObjectSectionsToRegister &MOPOSR) {91return SPSELFNixPerObjectSectionsToRegister::AsArgList::deserialize(92IB, MOPOSR.EHFrameSection, MOPOSR.ThreadDataSection);93}94};9596using SPSNamedExecutorAddrRangeSequenceMap =97SPSSequence<SPSTuple<SPSString, SPSExecutorAddrRangeSequence>>;9899using SPSELFNixJITDylibInitializers =100SPSTuple<SPSString, SPSExecutorAddr, SPSNamedExecutorAddrRangeSequenceMap>;101102using SPSELFNixJITDylibInitializerSequence =103SPSSequence<SPSELFNixJITDylibInitializers>;104105/// Serialization traits for ELFNixJITDylibInitializers.106template <>107class SPSSerializationTraits<SPSELFNixJITDylibInitializers,108elfnix::ELFNixJITDylibInitializers> {109public:110static size_t size(const elfnix::ELFNixJITDylibInitializers &MOJDIs) {111return SPSELFNixJITDylibInitializers::AsArgList::size(112MOJDIs.Name, MOJDIs.DSOHandleAddress, MOJDIs.InitSections);113}114115static bool serialize(SPSOutputBuffer &OB,116const elfnix::ELFNixJITDylibInitializers &MOJDIs) {117return SPSELFNixJITDylibInitializers::AsArgList::serialize(118OB, MOJDIs.Name, MOJDIs.DSOHandleAddress, MOJDIs.InitSections);119}120121static bool deserialize(SPSInputBuffer &IB,122elfnix::ELFNixJITDylibInitializers &MOJDIs) {123return SPSELFNixJITDylibInitializers::AsArgList::deserialize(124IB, MOJDIs.Name, MOJDIs.DSOHandleAddress, MOJDIs.InitSections);125}126};127128} // end namespace __orc_rt129130#endif // ORC_RT_ELFNIX_PLATFORM_H131132133