xref: /llvm-project/compiler-rt/lib/orc/elfnix_platform.h (revision f363f9d61eaff7090a19d226ea8786b2987d4fcc)
1 //===- elfnix_platform.h ----------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // ORC Runtime support for dynamic loading features on ELF-based platforms.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef ORC_RT_ELFNIX_PLATFORM_H
14 #define ORC_RT_ELFNIX_PLATFORM_H
15 
16 #include "common.h"
17 #include "executor_address.h"
18 
19 // Atexit functions.
20 ORC_RT_INTERFACE int __orc_rt_elfnix_cxa_atexit(void (*func)(void *), void *arg,
21                                                 void *dso_handle);
22 ORC_RT_INTERFACE int __orc_rt_elfnix_atexit(void (*func)(void *));
23 ORC_RT_INTERFACE void __orc_rt_elfnix_cxa_finalize(void *dso_handle);
24 
25 // dlfcn functions.
26 ORC_RT_INTERFACE const char *__orc_rt_elfnix_jit_dlerror();
27 ORC_RT_INTERFACE void *__orc_rt_elfnix_jit_dlopen(const char *path, int mode);
28 ORC_RT_INTERFACE int __orc_rt_elfnix_jit_dlupdate(void *dso_handle);
29 ORC_RT_INTERFACE int __orc_rt_elfnix_jit_dlclose(void *dso_handle);
30 ORC_RT_INTERFACE void *__orc_rt_elfnix_jit_dlsym(void *dso_handle,
31                                                  const char *symbol);
32 
33 namespace orc_rt {
34 namespace elfnix {
35 
36 struct ELFNixPerObjectSectionsToRegister {
37   ExecutorAddrRange EHFrameSection;
38   ExecutorAddrRange ThreadDataSection;
39 };
40 
41 using ELFNixJITDylibDepInfo = std::vector<ExecutorAddr>;
42 
43 using ELFNixJITDylibDepInfoMap =
44     std::unordered_map<ExecutorAddr, ELFNixJITDylibDepInfo>;
45 
46 enum dlopen_mode : int {
47   ORC_RT_RTLD_LAZY = 0x1,
48   ORC_RT_RTLD_NOW = 0x2,
49   ORC_RT_RTLD_LOCAL = 0x4,
50   ORC_RT_RTLD_GLOBAL = 0x8
51 };
52 
53 } // namespace elfnix
54 
55 using SPSELFNixPerObjectSectionsToRegister =
56     SPSTuple<SPSExecutorAddrRange, SPSExecutorAddrRange>;
57 
58 template <>
59 class SPSSerializationTraits<SPSELFNixPerObjectSectionsToRegister,
60                              elfnix::ELFNixPerObjectSectionsToRegister> {
61 
62 public:
63   static size_t size(const elfnix::ELFNixPerObjectSectionsToRegister &MOPOSR) {
64     return SPSELFNixPerObjectSectionsToRegister::AsArgList::size(
65         MOPOSR.EHFrameSection, MOPOSR.ThreadDataSection);
66   }
67 
68   static bool
69   serialize(SPSOutputBuffer &OB,
70             const elfnix::ELFNixPerObjectSectionsToRegister &MOPOSR) {
71     return SPSELFNixPerObjectSectionsToRegister::AsArgList::serialize(
72         OB, MOPOSR.EHFrameSection, MOPOSR.ThreadDataSection);
73   }
74 
75   static bool deserialize(SPSInputBuffer &IB,
76                           elfnix::ELFNixPerObjectSectionsToRegister &MOPOSR) {
77     return SPSELFNixPerObjectSectionsToRegister::AsArgList::deserialize(
78         IB, MOPOSR.EHFrameSection, MOPOSR.ThreadDataSection);
79   }
80 };
81 
82 using SPSELFNixJITDylibDepInfo = SPSSequence<SPSExecutorAddr>;
83 using SPSELFNixJITDylibDepInfoMap =
84     SPSSequence<SPSTuple<SPSExecutorAddr, SPSELFNixJITDylibDepInfo>>;
85 
86 } // namespace orc_rt
87 
88 #endif // ORC_RT_ELFNIX_PLATFORM_H
89