about summary refs log tree commit diff
path: root/src/rt
diff options
context:
space:
mode:
authorRafael Ávila de Espíndola <respindola@mozilla.com>2011-05-18 15:43:48 -0400
committerRafael Ávila de Espíndola <respindola@mozilla.com>2011-05-18 15:43:48 -0400
commit96516e9ca263574fa58c2f0a48348fa0d876be10 (patch)
treef22492f3345878aee734420f550158ec5c571fa3 /src/rt
parent6a4a85f452ffe028e3be531f718c3545b1dc06ce (diff)
downloadrust-96516e9ca263574fa58c2f0a48348fa0d876be10.tar.gz
rust-96516e9ca263574fa58c2f0a48348fa0d876be10.zip
One exit_task_glue to rule them all.
Diffstat (limited to 'src/rt')
-rw-r--r--src/rt/new_exit.ll11
-rw-r--r--src/rt/rust.cpp2
-rw-r--r--src/rt/rust_crate.cpp5
-rw-r--r--src/rt/rust_dom.cpp2
-rw-r--r--src/rt/rust_internal.h3
-rw-r--r--src/rt/test/rust_test_runtime.cpp2
6 files changed, 16 insertions, 9 deletions
diff --git a/src/rt/new_exit.ll b/src/rt/new_exit.ll
new file mode 100644
index 00000000000..07798153ff4
--- /dev/null
+++ b/src/rt/new_exit.ll
@@ -0,0 +1,11 @@
+declare fastcc i32 @rust_native_rust_1(i32, i32)
+
+declare i32 @upcall_exit(i32)
+
+define void @rust_new_exit_task_glue(i32, i32, i32, i32, i32) {
+entry:
+  %5 = inttoptr i32 %0 to void (i32, i32, i32, i32)*
+  tail call fastcc void %5(i32 %1, i32 %2, i32 %3, i32 %4)
+  %6 = tail call fastcc i32 @rust_native_rust_1(i32 ptrtoint (i32 (i32)* @upcall_exit to i32), i32 %2)
+  ret void
+}
diff --git a/src/rt/rust.cpp b/src/rt/rust.cpp
index 0c7ec8d3abe..1e708be0a49 100644
--- a/src/rt/rust.cpp
+++ b/src/rt/rust.cpp
@@ -99,7 +99,7 @@ rust_start(uintptr_t main_fn, rust_crate const *crate, int argc,
     }
 
     uintptr_t main_args[4] = {0, 0, 0, (uintptr_t)args->args};
-    dom->root_task->start(crate->get_exit_task_glue(),
+    dom->root_task->start((uintptr_t)rust_new_exit_task_glue,
                           main_fn,
                           (uintptr_t)&main_args, sizeof(main_args));
 
diff --git a/src/rt/rust_crate.cpp b/src/rt/rust_crate.cpp
index 5e64a0125b3..6f1889ffc02 100644
--- a/src/rt/rust_crate.cpp
+++ b/src/rt/rust_crate.cpp
@@ -17,11 +17,6 @@ rust_crate::get_activate_glue() const {
 }
 
 uintptr_t
-rust_crate::get_exit_task_glue() const {
-  return ((uintptr_t)this + exit_task_glue_off);
-}
-
-uintptr_t
 rust_crate::get_unwind_glue() const {
   return ((uintptr_t)this + unwind_glue_off);
 }
diff --git a/src/rt/rust_dom.cpp b/src/rt/rust_dom.cpp
index 9c4faf56490..7a3ed513d66 100644
--- a/src/rt/rust_dom.cpp
+++ b/src/rt/rust_dom.cpp
@@ -263,7 +263,7 @@ rust_dom::start_main_loop() {
 
     DLOG(this, dom, "started domain loop");
     DLOG(this, dom, "activate glue: " PTR ", exit glue: " PTR,
-        root_crate->get_activate_glue(), root_crate->get_exit_task_glue());
+        root_crate->get_activate_glue(), rust_new_exit_task_glue);
 
     while (number_of_live_tasks() > 0) {
         A(this, kernel->is_deadlocked() == false, "deadlock");
diff --git a/src/rt/rust_internal.h b/src/rt/rust_internal.h
index dcc2501d61a..e743455b4dc 100644
--- a/src/rt/rust_internal.h
+++ b/src/rt/rust_internal.h
@@ -251,7 +251,6 @@ public:
     uintptr_t get_yield_glue() const;
     uintptr_t get_unwind_glue() const;
     uintptr_t get_gc_glue() const;
-    uintptr_t get_exit_task_glue() const;
 
     struct mem_area
     {
@@ -358,6 +357,8 @@ public:
     void flush();
 };
 
+extern "C" void rust_new_exit_task_glue();
+
 #include "rust_dwarf.h"
 
 class
diff --git a/src/rt/test/rust_test_runtime.cpp b/src/rt/test/rust_test_runtime.cpp
index 1cde532e94a..717d8b0c5f4 100644
--- a/src/rt/test/rust_test_runtime.cpp
+++ b/src/rt/test/rust_test_runtime.cpp
@@ -53,7 +53,7 @@ rust_task_test::worker::run() {
     rust_handle<rust_dom> *handle =
         kernel->create_domain(crate, "test");
     rust_dom *domain = handle->referent();
-    domain->root_task->start(crate->get_exit_task_glue(),
+    domain->root_task->start((uintptr_t)rust_new_exit_task_glue,
                              (uintptr_t)&task_entry, (uintptr_t)NULL, 0);
     domain->start_main_loop();
     kernel->destroy_domain(domain);