xref: /openbsd-src/gnu/llvm/compiler-rt/lib/orc/elfnix_platform.h (revision 810390e339a5425391477d5d41c78d7cab2424ac)
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