about summary refs log tree commit diff
path: root/src/rt/rust_upcall.cpp
diff options
context:
space:
mode:
authorklutzy <klutzytheklutzy@gmail.com>2013-08-12 22:36:57 +0900
committerklutzy <klutzytheklutzy@gmail.com>2013-08-26 22:15:45 +0900
commit63e53b8af2f37f9eb8eda0087b02f8deba252c2f (patch)
tree8c50a39f1d4bbf112dd05bb796027707d904e3a3 /src/rt/rust_upcall.cpp
parentef20bd44bdf3a500700604c3b3c8f8969233fd9a (diff)
downloadrust-63e53b8af2f37f9eb8eda0087b02f8deba252c2f.tar.gz
rust-63e53b8af2f37f9eb8eda0087b02f8deba252c2f.zip
rt: Support SEH/SJLJ personality routine
Diffstat (limited to 'src/rt/rust_upcall.cpp')
-rw-r--r--src/rt/rust_upcall.cpp22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/rt/rust_upcall.cpp b/src/rt/rust_upcall.cpp
index 21c0d219242..7ccb06a3296 100644
--- a/src/rt/rust_upcall.cpp
+++ b/src/rt/rust_upcall.cpp
@@ -54,8 +54,18 @@ upcall_call_shim_on_rust_stack(void *args, void *fn_ptr) {
 
 /**********************************************************************/
 
+#ifdef __SEH__
+#  define PERSONALITY_FUNC __gxx_personality_seh0
+#else
+#  ifdef __USING_SJLJ_EXCEPTIONS__
+#    define PERSONALITY_FUNC __gxx_personality_sjlj
+#  else
+#    define PERSONALITY_FUNC __gxx_personality_v0
+#  endif
+#endif
+
 extern "C" _Unwind_Reason_Code
-__gxx_personality_v0(int version,
+PERSONALITY_FUNC(int version,
                      _Unwind_Action actions,
                      uint64_t exception_class,
                      _Unwind_Exception *ue_header,
@@ -72,11 +82,11 @@ struct s_rust_personality_args {
 
 extern "C" void
 upcall_s_rust_personality(s_rust_personality_args *args) {
-    args->retval = __gxx_personality_v0(args->version,
-                                        args->actions,
-                                        args->exception_class,
-                                        args->ue_header,
-                                        args->context);
+    args->retval = PERSONALITY_FUNC(args->version,
+                                    args->actions,
+                                    args->exception_class,
+                                    args->ue_header,
+                                    args->context);
 }
 
 /**