1 //===- macho_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 Darwin dynamic loading features. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef ORC_RT_MACHO_PLATFORM_H 14 #define ORC_RT_MACHO_PLATFORM_H 15 16 #include "common.h" 17 #include "executor_address.h" 18 19 // Atexit functions. 20 ORC_RT_INTERFACE int __orc_rt_macho_cxa_atexit(void (*func)(void *), void *arg, 21 void *dso_handle); 22 ORC_RT_INTERFACE void __orc_rt_macho_cxa_finalize(void *dso_handle); 23 24 // dlfcn functions. 25 ORC_RT_INTERFACE const char *__orc_rt_macho_jit_dlerror(); 26 ORC_RT_INTERFACE void *__orc_rt_macho_jit_dlopen(const char *path, int mode); 27 ORC_RT_INTERFACE int __orc_rt_macho_jit_dlclose(void *dso_handle); 28 ORC_RT_INTERFACE void *__orc_rt_macho_jit_dlsym(void *dso_handle, 29 const char *symbol); 30 31 namespace __orc_rt { 32 namespace macho { 33 34 struct MachOJITDylibInitializers { 35 using SectionList = std::vector<ExecutorAddrRange>; 36 37 MachOJITDylibInitializers() = default; 38 MachOJITDylibInitializers(std::string Name, ExecutorAddr MachOHeaderAddress) 39 : Name(std::move(Name)), 40 MachOHeaderAddress(std::move(MachOHeaderAddress)) {} 41 42 std::string Name; 43 ExecutorAddr MachOHeaderAddress; 44 ExecutorAddr ObjCImageInfoAddress; 45 46 std::unordered_map<std::string, SectionList> InitSections; 47 }; 48 49 class MachOJITDylibDeinitializers {}; 50 51 using MachOJITDylibInitializerSequence = std::vector<MachOJITDylibInitializers>; 52 53 using MachOJITDylibDeinitializerSequence = 54 std::vector<MachOJITDylibDeinitializers>; 55 56 enum dlopen_mode : int { 57 ORC_RT_RTLD_LAZY = 0x1, 58 ORC_RT_RTLD_NOW = 0x2, 59 ORC_RT_RTLD_LOCAL = 0x4, 60 ORC_RT_RTLD_GLOBAL = 0x8 61 }; 62 63 } // end namespace macho 64 65 using SPSNamedExecutorAddrRangeSequenceMap = 66 SPSSequence<SPSTuple<SPSString, SPSExecutorAddrRangeSequence>>; 67 68 using SPSMachOJITDylibInitializers = 69 SPSTuple<SPSString, SPSExecutorAddr, SPSExecutorAddr, 70 SPSNamedExecutorAddrRangeSequenceMap>; 71 72 using SPSMachOJITDylibInitializerSequence = 73 SPSSequence<SPSMachOJITDylibInitializers>; 74 75 /// Serialization traits for MachOJITDylibInitializers. 76 template <> 77 class SPSSerializationTraits<SPSMachOJITDylibInitializers, 78 macho::MachOJITDylibInitializers> { 79 public: 80 static size_t size(const macho::MachOJITDylibInitializers &MOJDIs) { 81 return SPSMachOJITDylibInitializers::AsArgList::size( 82 MOJDIs.Name, MOJDIs.MachOHeaderAddress, MOJDIs.ObjCImageInfoAddress, 83 MOJDIs.InitSections); 84 } 85 86 static bool serialize(SPSOutputBuffer &OB, 87 const macho::MachOJITDylibInitializers &MOJDIs) { 88 return SPSMachOJITDylibInitializers::AsArgList::serialize( 89 OB, MOJDIs.Name, MOJDIs.MachOHeaderAddress, MOJDIs.ObjCImageInfoAddress, 90 MOJDIs.InitSections); 91 } 92 93 static bool deserialize(SPSInputBuffer &IB, 94 macho::MachOJITDylibInitializers &MOJDIs) { 95 return SPSMachOJITDylibInitializers::AsArgList::deserialize( 96 IB, MOJDIs.Name, MOJDIs.MachOHeaderAddress, MOJDIs.ObjCImageInfoAddress, 97 MOJDIs.InitSections); 98 } 99 }; 100 101 } // end namespace __orc_rt 102 103 #endif // ORC_RT_MACHO_PLATFORM_H 104