about summary refs log tree commit diff
path: root/src/rt
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-12-24 12:46:32 -0800
committerbors <bors@rust-lang.org>2013-12-24 12:46:32 -0800
commit32e730f122f06202eb48aefcc2cef6ee3e279a2f (patch)
tree1316fc154599be29d575beb850b1c4ca4a86c24c /src/rt
parentb8c87fd9fe649d3211bb53754fb692a825ecfdff (diff)
parente3b37154b0f321ad74f293d98d9be2ae512c2ec7 (diff)
downloadrust-32e730f122f06202eb48aefcc2cef6ee3e279a2f.tar.gz
rust-32e730f122f06202eb48aefcc2cef6ee3e279a2f.zip
auto merge of #11121 : vadimcn/rust/no-c++2, r=alexcrichton
This PR removes Rust's dependency on C++ for exception handling. Instead, it will use the unwind library API directly.

closes #10469
Diffstat (limited to 'src/rt')
-rw-r--r--src/rt/rust_cxx_glue.cpp31
-rw-r--r--src/rt/rust_try.ll34
-rw-r--r--src/rt/rust_upcall.c3
3 files changed, 37 insertions, 31 deletions
diff --git a/src/rt/rust_cxx_glue.cpp b/src/rt/rust_cxx_glue.cpp
deleted file mode 100644
index b44d29642c4..00000000000
--- a/src/rt/rust_cxx_glue.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-/* Foreign builtins which require C++ */
-
-#include "rust_globals.h"
-
-typedef void *(rust_try_fn)(void*, void*);
-
-extern "C" CDECL uintptr_t
-rust_try(rust_try_fn f, void *fptr, void *env) {
-    try {
-        f(fptr, env);
-    } catch (uintptr_t token) {
-        assert(token != 0);
-        return token;
-    }
-    return 0;
-}
-
-extern "C" CDECL void
-rust_begin_unwind(uintptr_t token) {
-    throw token;
-}
diff --git a/src/rt/rust_try.ll b/src/rt/rust_try.ll
new file mode 100644
index 00000000000..c912aa789bf
--- /dev/null
+++ b/src/rt/rust_try.ll
@@ -0,0 +1,34 @@
+; Copyright 2013 The Rust Project Developers. See the COPYRIGHT
+; file at the top-level directory of this distribution and at
+; http://rust-lang.org/COPYRIGHT.
+;
+; Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+; http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+; <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+; option. This file may not be copied, modified, or distributed
+; except according to those terms.
+
+; Rust's try-catch
+; When f(...) returns normally, the return value is null.
+; When f(...) throws, the return value is a pointer to the caught exception object.
+; See also: libstd/rt/unwind.rs
+
+define i8* @rust_try(void (i8*,i8*)* %f, i8* %fptr, i8* %env) {
+
+	invoke void %f(i8* %fptr, i8* %env)
+		to label %normal
+		unwind label %catch
+
+normal:
+	ret i8* null
+
+catch:
+	%1 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @rust_eh_personality_catch to i8*)
+			catch i8* null ; catch everything
+
+	; extract and return pointer to the exception object
+    %2 = extractvalue { i8*, i32 } %1, 0
+	ret i8* %2
+}
+
+declare i32 @rust_eh_personality_catch(...)
diff --git a/src/rt/rust_upcall.c b/src/rt/rust_upcall.c
index 6a3e7b7513c..daa46bab404 100644
--- a/src/rt/rust_upcall.c
+++ b/src/rt/rust_upcall.c
@@ -8,6 +8,9 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+// NOTE: remove this file after snapshot
+// unwind personality routine lives now in libstd/rt/unwind.rs
+
 /*
   Upcalls