diff --git a/src/comp/back/upcall.rs b/src/comp/back/upcall.rs index 774cb30c001e..19cde1975370 100644 --- a/src/comp/back/upcall.rs +++ b/src/comp/back/upcall.rs @@ -37,7 +37,8 @@ type upcalls = log_type: ValueRef, dynastack_mark: ValueRef, dynastack_alloc: ValueRef, - dynastack_free: ValueRef}; + dynastack_free: ValueRef, + rust_personality: ValueRef}; fn declare_upcalls(_tn: type_names, tydesc_type: TypeRef, taskptr_type: TypeRef, llmod: ModuleRef) -> @upcalls { @@ -89,7 +90,9 @@ fn declare_upcalls(_tn: type_names, tydesc_type: TypeRef, dynastack_alloc: d("dynastack_alloc_2", [T_size_t(), T_ptr(tydesc_type)], T_ptr(T_i8())), - dynastack_free: d("dynastack_free", [T_ptr(T_i8())], T_void())}; + dynastack_free: d("dynastack_free", [T_ptr(T_i8())], T_void()), + rust_personality: dr("rust_personality", [], T_i32()) + }; } // // Local Variables: diff --git a/src/rt/rust_upcall.cpp b/src/rt/rust_upcall.cpp index 2d7791e876f3..0f5c11537feb 100644 --- a/src/rt/rust_upcall.cpp +++ b/src/rt/rust_upcall.cpp @@ -1,6 +1,8 @@ #include "rust_gc.h" #include "rust_internal.h" #include "rust_upcall.h" +#include +#include // Upcalls. @@ -190,6 +192,26 @@ upcall_dynastack_free(rust_task *task, void *ptr) { return task->dynastack.free(ptr); } +extern "C" _Unwind_Reason_Code +__gxx_personality_v0(int version, + _Unwind_Action actions, + uint64_t exception_class, + _Unwind_Exception *ue_header, + _Unwind_Context *context); + +extern "C" _Unwind_Reason_Code +upcall_rust_personality(int version, + _Unwind_Action actions, + uint64_t exception_class, + _Unwind_Exception *ue_header, + _Unwind_Context *context) { + return __gxx_personality_v0(version, + actions, + exception_class, + ue_header, + context); +} + // // Local Variables: // mode: C++ diff --git a/src/rt/rustrt.def.in b/src/rt/rustrt.def.in index a0e7c972eebe..246ac261f8f3 100644 --- a/src/rt/rustrt.def.in +++ b/src/rt/rustrt.def.in @@ -78,5 +78,6 @@ upcall_vec_grow upcall_vec_push upcall_log_type upcall_malloc +upcall_rust_personality upcall_shared_malloc upcall_shared_free