diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-08-28 16:27:42 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-08-31 16:20:36 -0700 |
| commit | b999973c0ffa86738daab277cd6e985248ef08aa (patch) | |
| tree | dd9bf206a6b6a5d19e3f8873f370540b9ad27063 /src | |
| parent | a02ab41b65927c39e912ea820b5dff5032ad5695 (diff) | |
Add a morestack_addr (temporary) intrinsic
Diffstat (limited to 'src')
| -rw-r--r-- | src/rustc/middle/trans/foreign.rs | 10 | ||||
| -rw-r--r-- | src/rustc/middle/typeck/check.rs | 3 | ||||
| -rw-r--r-- | src/test/run-pass/morestack-address.rs | 11 |
3 files changed, 24 insertions, 0 deletions
diff --git a/src/rustc/middle/trans/foreign.rs b/src/rustc/middle/trans/foreign.rs index 34ccdb3d6e5..05f1d83cc89 100644 --- a/src/rustc/middle/trans/foreign.rs +++ b/src/rustc/middle/trans/foreign.rs @@ -993,6 +993,16 @@ fn trans_intrinsic(ccx: @crate_ctxt, decl: ValueRef, item: @ast::foreign_item, lv_temporary), arg_vals(~[frameaddress_val]), ignore); } + ~"morestack_addr" => { + // XXX This is a hack to grab the address of this particular + // native function. There should be a general in-language + // way to do this + let llfty = type_of_fn(bcx.ccx(), ~[], ty::mk_nil(bcx.tcx())); + let morestack_addr = decl_cdecl_fn( + bcx.ccx().llmod, ~"__morestack", llfty); + let morestack_addr = PointerCast(bcx, morestack_addr, T_ptr(T_nil())); + Store(bcx, morestack_addr, fcx.llretptr); + } _ => { // Could we make this an enum rather than a string? does it get // checked earlier? diff --git a/src/rustc/middle/typeck/check.rs b/src/rustc/middle/typeck/check.rs index 57a53904337..da096cbab24 100644 --- a/src/rustc/middle/typeck/check.rs +++ b/src/rustc/middle/typeck/check.rs @@ -2590,6 +2590,9 @@ fn check_intrinsic_type(ccx: @crate_ctxt, it: @ast::foreign_item) { }); (0u, ~[arg(ast::by_ref, fty)], ty::mk_nil(tcx)) } + ~"morestack_addr" => { + (0u, ~[], ty::mk_nil_ptr(tcx)) + } other => { tcx.sess.span_err(it.span, ~"unrecognized intrinsic function: `" + other + ~"`"); diff --git a/src/test/run-pass/morestack-address.rs b/src/test/run-pass/morestack-address.rs new file mode 100644 index 00000000000..7f0adcf0920 --- /dev/null +++ b/src/test/run-pass/morestack-address.rs @@ -0,0 +1,11 @@ +#[nolink] +#[abi = "rust-intrinsic"] +extern mod rusti { + fn morestack_addr() -> *(); +} + +fn main() { + let addr = rusti::morestack_addr(); + assert addr.is_not_null(); + error!("%?", addr); +} \ No newline at end of file |
