xref: /freebsd-src/contrib/llvm-project/compiler-rt/lib/orc/elfnix_platform.h (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
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