diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2011-08-17 18:14:47 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2011-08-17 18:14:57 -0700 |
| commit | f17edf9829e88090445a7f8b3e74979ca08ecfa0 (patch) | |
| tree | fd90dd7fc3cbba3c4aa6efd9cb64525bb359807c /src/comp/middle | |
| parent | 0b7af403843d54c3200f8f9accbd2b279d6a7a0c (diff) | |
| download | rust-f17edf9829e88090445a7f8b3e74979ca08ecfa0.tar.gz rust-f17edf9829e88090445a7f8b3e74979ca08ecfa0.zip | |
rustc: Use obstacks in lieu of dynamically-allocated frames only when the frame is actually dynamically-sized
Diffstat (limited to 'src/comp/middle')
| -rw-r--r-- | src/comp/middle/trans.rs | 19 | ||||
| -rw-r--r-- | src/comp/middle/trans_common.rs | 1 |
2 files changed, 15 insertions, 5 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 8ecac617e19..9d797db2ee9 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -466,17 +466,28 @@ fn alloca(cx: &@block_ctxt, t: TypeRef) -> ValueRef { } fn array_alloca(cx: &@block_ctxt, t: TypeRef, n: ValueRef) -> ValueRef { + let bcx = cx; let builder = new_builder(cx.fcx.lldynamicallocas); + let lltaskptr = bcx_fcx(bcx).lltaskptr; alt bcx_fcx(cx).llobstacktoken { none. { - let dynastack_mark = bcx_ccx(cx).upcalls.dynastack_mark; - let lltaskptr = bcx_fcx(cx).lltaskptr; bcx_fcx(cx).llobstacktoken = - some(builder.Call(dynastack_mark, ~[lltaskptr])); + some(mk_obstack_token(bcx_ccx(cx), cx.fcx.lldynamicallocas, + lltaskptr)); } some(_) { /* no-op */ } } - ret builder.ArrayAlloca(t, n); + + let dynastack_alloc = bcx_ccx(bcx).upcalls.dynastack_alloc; + let llsz = builder.Mul(C_uint(llsize_of_real(bcx_ccx(bcx), t)), n); + let llresult = builder.Call(dynastack_alloc, ~[lltaskptr, llsz]); + ret builder.PointerCast(llresult, T_ptr(t)); +} + +fn mk_obstack_token(ccx: &@crate_ctxt, lldynamicallocas: BasicBlockRef, + lltaskptr: ValueRef) -> ValueRef { + let builder = new_builder(lldynamicallocas); + ret builder.Call(ccx.upcalls.dynastack_mark, ~[lltaskptr]); } diff --git a/src/comp/middle/trans_common.rs b/src/comp/middle/trans_common.rs index 2285aeefc8f..d37e01f573c 100644 --- a/src/comp/middle/trans_common.rs +++ b/src/comp/middle/trans_common.rs @@ -217,7 +217,6 @@ type fn_ctxt = { mutable llreturn: BasicBlockRef, // The token used to clear the dynamic allocas at the end of this frame. - // Will be |none| if there are no dynamic allocas. mutable llobstacktoken: option::t<ValueRef>, // The 'self' object currently in use in this function, if there |
