diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-06-05 18:47:18 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-06-06 23:39:56 -0700 |
| commit | 5f4837ad6ac5ceb7277796a817db35b137da4813 (patch) | |
| tree | a14bccf3d245451657e6a6d73269f48fd477dad1 /src/rustc | |
| parent | 231097960c80e0968d90b5634b3f663989130bac (diff) | |
| download | rust-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.rs | 22 | ||||
| -rw-r--r-- | src/rustc/middle/typeck/check.rs | 15 |
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: `" + |
