about summary refs log tree commit diff
path: root/src/rt/rust_try.ll
diff options
context:
space:
mode:
Diffstat (limited to 'src/rt/rust_try.ll')
-rw-r--r--src/rt/rust_try.ll34
1 files changed, 34 insertions, 0 deletions
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(...)