about summary refs log tree commit diff
path: root/src/rt
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2011-11-10 22:15:50 -0800
committerNiko Matsakis <niko@alum.mit.edu>2011-11-16 15:16:40 -0800
commit59e2a0a9c1434db65afc6c94752de3cf2ab761a0 (patch)
treef953d937b1913018b169870caa3dc6318025a3d4 /src/rt
parent4fc34e23faddf02c2ed85ee97ae929b36a9aaa1b (diff)
downloadrust-59e2a0a9c1434db65afc6c94752de3cf2ab761a0.tar.gz
rust-59e2a0a9c1434db65afc6c94752de3cf2ab761a0.zip
add shim upcall func
Diffstat (limited to 'src/rt')
-rw-r--r--src/rt/arch/x86_64/ccall.S16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/rt/arch/x86_64/ccall.S b/src/rt/arch/x86_64/ccall.S
index d9221067175..7a69aecedbf 100644
--- a/src/rt/arch/x86_64/ccall.S
+++ b/src/rt/arch/x86_64/ccall.S
@@ -56,3 +56,19 @@ upcall_call_c_stack_float:
     pop %rbp
     ret
 
+#if defined(__APPLE__) || defined(_WIN32)
+.globl _upcall_call_c_stack_shim
+_upcall_call_c_stack_shim:
+#else
+.globl upcall_call_c_stack_shim
+upcall_call_c_stack_shim
+#endif
+    push %rbp
+    mov %rsp,%rbp          // save rsp
+    mov ARG1,%rsp          // switch stack
+    mov ARG0,%r11          // Remember target address
+    mov ARG1,ARG0          // setup the parameter shim expects
+    call *%r11
+    mov %rbp,%rsp
+    pop %rbp
+    ret