4949#include < unistd.h>
5050#endif // WIN32
5151
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+
5290namespace Cpp {
5391
5492 using namespace clang ;
@@ -62,7 +100,15 @@ namespace Cpp {
62100 // This might fix the issue https://reviews.llvm.org/D107087
63101 // FIXME: For now we just leak the Interpreter.
64102 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+ }
66112 } Deleter;
67113
68114 static compat::Interpreter& getInterp () {
@@ -2605,6 +2651,14 @@ namespace Cpp {
26052651 // FIXME: Enable this assert once we figure out how to fix the multiple
26062652 // calls to CreateInterpreter.
26072653 // assert(!sInterpreter && "Interpreter already set.");
2654+ #ifdef __APPLE__
2655+ // Add a handler to support exceptions from interpreted code.
2656+ // See llvm/llvm-project#49036
2657+ if (auto * unw_add_find_dynamic_unwind_sections = (int (*)(
2658+ unw_find_dynamic_unwind_sections find_dynamic_unwind_sections))
2659+ dlsym (RTLD_DEFAULT, " __unw_add_find_dynamic_unwind_sections" ))
2660+ unw_add_find_dynamic_unwind_sections (find_dynamic_unwind_sections);
2661+ #endif // __APPLE__
26082662 sInterpreter .reset (I);
26092663 return I;
26102664 }
0 commit comments