49
49
#include < unistd.h>
50
50
#endif // WIN32
51
51
52
+ #ifdef __APPLE__
53
+ // Define a minimal mach header for JIT'd code, to support exceptions on osx 14
54
+ // and later. See llvm/llvm-project#49036
55
+ static llvm::MachO::mach_header_64 fake_mach_header = {
56
+ .magic = llvm::MachO::MH_MAGIC_64,
57
+ .cputype = llvm::MachO::CPU_TYPE_ARM64,
58
+ .cpusubtype = llvm::MachO::CPU_SUBTYPE_ARM64_ALL,
59
+ .filetype = llvm::MachO::MH_DYLIB,
60
+ .ncmds = 0 ,
61
+ .sizeofcmds = 0 ,
62
+ .flags = 0 ,
63
+ .reserved = 0 };
64
+
65
+ // Declare libunwind SPI types and functions.
66
+ struct unw_dynamic_unwind_sections {
67
+ uintptr_t dso_base;
68
+ uintptr_t dwarf_section;
69
+ size_t dwarf_section_length;
70
+ uintptr_t compact_unwind_section;
71
+ size_t compact_unwind_section_length;
72
+ };
73
+
74
+ int find_dynamic_unwind_sections (uintptr_t addr,
75
+ unw_dynamic_unwind_sections* info) {
76
+ info->dso_base = (uintptr_t )&fake_mach_header;
77
+ info->dwarf_section = 0 ;
78
+ info->dwarf_section_length = 0 ;
79
+ info->compact_unwind_section = 0 ;
80
+ info->compact_unwind_section_length = 0 ;
81
+ return 1 ;
82
+ }
83
+
84
+ // Typedef for callback above.
85
+ typedef int (*unw_find_dynamic_unwind_sections)(
86
+ uintptr_t addr, struct unw_dynamic_unwind_sections * info);
87
+
88
+ #endif // __APPLE__
89
+
52
90
namespace Cpp {
53
91
54
92
using namespace clang ;
@@ -62,7 +100,15 @@ namespace Cpp {
62
100
// This might fix the issue https://reviews.llvm.org/D107087
63
101
// FIXME: For now we just leak the Interpreter.
64
102
struct InterpDeleter {
65
- ~InterpDeleter () { sInterpreter .release (); }
103
+ ~InterpDeleter () {
104
+ #ifdef __APPLE__
105
+ if (auto * unw_remove_find_dynamic_unwind_sections = (int (*)(
106
+ unw_find_dynamic_unwind_sections find_dynamic_unwind_sections))
107
+ dlsym (RTLD_DEFAULT, " __unw_remove_find_dynamic_unwind_sections" ))
108
+ unw_remove_find_dynamic_unwind_sections (find_dynamic_unwind_sections);
109
+ #endif
110
+ sInterpreter .release ();
111
+ }
66
112
} Deleter;
67
113
68
114
static compat::Interpreter& getInterp () {
@@ -2612,6 +2658,14 @@ namespace Cpp {
2612
2658
// FIXME: Enable this assert once we figure out how to fix the multiple
2613
2659
// calls to CreateInterpreter.
2614
2660
// assert(!sInterpreter && "Interpreter already set.");
2661
+ #ifdef __APPLE__
2662
+ // Add a handler to support exceptions from interpreted code.
2663
+ // See llvm/llvm-project#49036
2664
+ if (auto * unw_add_find_dynamic_unwind_sections = (int (*)(
2665
+ unw_find_dynamic_unwind_sections find_dynamic_unwind_sections))
2666
+ dlsym (RTLD_DEFAULT, " __unw_add_find_dynamic_unwind_sections" ))
2667
+ unw_add_find_dynamic_unwind_sections (find_dynamic_unwind_sections);
2668
+ #endif // __APPLE__
2615
2669
sInterpreter .reset (I);
2616
2670
return I;
2617
2671
}
0 commit comments