diff options
| author | bors <bors@rust-lang.org> | 2013-12-24 12:46:32 -0800 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-12-24 12:46:32 -0800 |
| commit | 32e730f122f06202eb48aefcc2cef6ee3e279a2f (patch) | |
| tree | 1316fc154599be29d575beb850b1c4ca4a86c24c /src/rt | |
| parent | b8c87fd9fe649d3211bb53754fb692a825ecfdff (diff) | |
| parent | e3b37154b0f321ad74f293d98d9be2ae512c2ec7 (diff) | |
| download | rust-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.cpp | 31 | ||||
| -rw-r--r-- | src/rt/rust_try.ll | 34 | ||||
| -rw-r--r-- | src/rt/rust_upcall.c | 3 |
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 |
