13
13
#include " llvm/ADT/SmallString.h"
14
14
#include " llvm/ADT/StringRef.h"
15
15
#include " llvm/ADT/Twine.h"
16
+ #include " llvm/BinaryFormat/MachO.h"
16
17
#include " llvm/Config/llvm-config.h"
17
18
#include " llvm/ExecutionEngine/JITSymbol.h"
18
19
#include " llvm/ExecutionEngine/Orc/LLJIT.h"
19
20
#include " llvm/Support/Casting.h"
20
21
#include " llvm/Support/Path.h"
22
+ #include " llvm/Object/MachO.h"
21
23
22
24
#ifdef USE_CLING
23
25
@@ -36,6 +38,43 @@ namespace compat {
36
38
37
39
using Interpreter = cling::Interpreter;
38
40
41
+ #ifdef __APPLE__
42
+ // Define a minimal mach header for JIT'd code.
43
+ static MachO::mach_header_64 fake_mach_header = {
44
+ .magic = MachO::MH_MAGIC_64,
45
+ .cputype = MachO::CPU_TYPE_ARM64,
46
+ .cpusubtype = MachO::CPU_SUBTYPE_ARM64_ALL,
47
+ .filetype = MachO::MH_DYLIB,
48
+ .ncmds = 0 ,
49
+ .sizeofcmds = 0 ,
50
+ .flags = 0 ,
51
+ .reserved = 0 };
52
+
53
+ // Declare libunwind SPI types and functions.
54
+ struct unw_dynamic_unwind_sections {
55
+ uintptr_t dso_base;
56
+ uintptr_t dwarf_section;
57
+ size_t dwarf_section_length;
58
+ uintptr_t compact_unwind_section;
59
+ size_t compact_unwind_section_length;
60
+ };
61
+
62
+ int find_dynamic_unwind_sections (uintptr_t addr,
63
+ unw_dynamic_unwind_sections * info) {
64
+ info->dso_base = (uintptr_t )&fake_mach_header;
65
+ info->dwarf_section = 0 ;
66
+ info->dwarf_section_length = 0 ;
67
+ info->compact_unwind_section = 0 ;
68
+ info->compact_unwind_section_length = 0 ;
69
+ return 1 ;
70
+ }
71
+
72
+ // Typedef for callback above.
73
+ typedef int (*unw_find_dynamic_unwind_sections)(
74
+ uintptr_t addr, struct unw_dynamic_unwind_sections * info);
75
+
76
+ #endif
77
+
39
78
inline void maybeMangleDeclName (const clang::GlobalDecl& GD,
40
79
std::string& mangledName) {
41
80
cling::utils::Analyze::maybeMangleDeclName (GD, mangledName);
@@ -151,6 +190,15 @@ createClangInterpreter(std::vector<const char*>& args) {
151
190
return std::move (*innerOrErr);
152
191
}
153
192
193
+ #ifdef __APPLE__
194
+ inline void removeFindDynamicUnwindSections () {
195
+ if (auto * unw_remove_find_dynamic_unwind_sections = (int (*)(
196
+ unw_find_dynamic_unwind_sections find_dynamic_unwind_sections))
197
+ dlsym (RTLD_DEFAULT, " __unw_remove_find_dynamic_unwind_sections" ))
198
+ unw_remove_find_dynamic_unwind_sections (find_dynamic_unwind_sections);
199
+ }
200
+ #endif
201
+
154
202
inline void maybeMangleDeclName (const clang::GlobalDecl& GD,
155
203
std::string& mangledName) {
156
204
// copied and adapted from CodeGen::CodeGenModule::getMangledName
0 commit comments