about summary refs log tree commit diff
path: root/src/comp/middle
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2011-08-17 18:14:47 -0700
committerPatrick Walton <pcwalton@mimiga.net>2011-08-17 18:14:57 -0700
commitf17edf9829e88090445a7f8b3e74979ca08ecfa0 (patch)
treefd90dd7fc3cbba3c4aa6efd9cb64525bb359807c /src/comp/middle
parent0b7af403843d54c3200f8f9accbd2b279d6a7a0c (diff)
downloadrust-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.rs19
-rw-r--r--src/comp/middle/trans_common.rs1
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