about summary refs log tree commit diff
path: root/src/rustc
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-06-05 18:47:18 -0700
committerBrian Anderson <banderson@mozilla.com>2012-06-06 23:39:56 -0700
commit5f4837ad6ac5ceb7277796a817db35b137da4813 (patch)
treea14bccf3d245451657e6a6d73269f48fd477dad1 /src/rustc
parent231097960c80e0968d90b5634b3f663989130bac (diff)
downloadrust-5f4837ad6ac5ceb7277796a817db35b137da4813.tar.gz
rust-5f4837ad6ac5ceb7277796a817db35b137da4813.zip
core: Start on a stack walker
Diffstat (limited to 'src/rustc')
-rw-r--r--src/rustc/middle/trans/native.rs22
-rw-r--r--src/rustc/middle/typeck/check.rs15
2 files changed, 35 insertions, 2 deletions
diff --git a/src/rustc/middle/trans/native.rs b/src/rustc/middle/trans/native.rs
index 1f399343f13..60b25410212 100644
--- a/src/rustc/middle/trans/native.rs
+++ b/src/rustc/middle/trans/native.rs
@@ -875,7 +875,27 @@ fn trans_intrinsic(ccx: @crate_ctxt, decl: ValueRef, item: @ast::native_item,
       "frame_address" {
         let frameaddress = ccx.intrinsics.get("llvm.frameaddress");
         let frameaddress_val = Call(bcx, frameaddress, [C_i32(0i32)]);
-        Store(bcx, frameaddress_val, fcx.llretptr);
+        let fty = ty::mk_fn(bcx.tcx(), {
+            purity: ast::impure_fn,
+            proto: ast::proto_any,
+            inputs: [{
+                mode: ast::expl(ast::by_val),
+                ty: ty::mk_imm_ptr(
+                    bcx.tcx(),
+                    ty::mk_mach_uint(bcx.tcx(), ast::ty_u8))
+            }],
+            output: ty::mk_nil(bcx.tcx()),
+            ret_style: ast::return_val,
+            constraints: []
+        });
+        bcx = trans_call_inner(bcx, none, fty, ty::mk_nil(bcx.tcx()),
+                               { |bcx|
+                                   lval_no_env(
+                                       bcx,
+                                       get_param(decl, first_real_arg),
+                                       temporary)
+                               },
+                               arg_vals([frameaddress_val]), ignore);
       }
     }
     build_return(bcx);
diff --git a/src/rustc/middle/typeck/check.rs b/src/rustc/middle/typeck/check.rs
index a6bb333c34e..22d31a8fe72 100644
--- a/src/rustc/middle/typeck/check.rs
+++ b/src/rustc/middle/typeck/check.rs
@@ -2318,7 +2318,20 @@ fn check_intrinsic_type(ccx: @crate_ctxt, it: @ast::native_item) {
         (1u, [arg(ast::by_ref, visitor_iface)], ty::mk_nil(tcx))
       }
       "frame_address" {
-        (0u, [], ty::mk_imm_ptr(tcx, ty::mk_mach_uint(tcx, ast::ty_u8)))
+        let fty = ty::mk_fn(ccx.tcx, {
+            purity: ast::impure_fn,
+            proto: ast::proto_any,
+            inputs: [{
+                mode: ast::expl(ast::by_val),
+                ty: ty::mk_imm_ptr(
+                    ccx.tcx,
+                    ty::mk_mach_uint(ccx.tcx, ast::ty_u8))
+            }],
+            output: ty::mk_nil(ccx.tcx),
+            ret_style: ast::return_val,
+            constraints: []
+        });
+        (0u, [arg(ast::by_ref, fty)], ty::mk_nil(tcx))
       }
       other {
         tcx.sess.span_err(it.span, "unrecognized intrinsic function: `" +