about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-09-13 16:40:18 -0700
committerBrian Anderson <banderson@mozilla.com>2011-09-13 16:52:12 -0700
commit6d3dd0e48cdb23c99be9d2d2b33dbfda08b35e30 (patch)
tree30857ff754e6277207a3514a8bcbbd45ac23c842 /src
parentb8e31ac46917edcf5922f0b191c5e6c4505830d2 (diff)
downloadrust-6d3dd0e48cdb23c99be9d2d2b33dbfda08b35e30.tar.gz
rust-6d3dd0e48cdb23c99be9d2d2b33dbfda08b35e30.zip
Try harder still to generate fewer landing pads
Scopes that don't have cleanups don't need their own landing pads

This takes the optimized rustc bin from 4.7MB to 4.4
Diffstat (limited to 'src')
-rw-r--r--src/comp/middle/trans.rs20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 09967f9034a..a579b8fbefa 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -3738,7 +3738,7 @@ fn invoke_(bcx: @block_ctxt, llfn: ValueRef,
 }
 
 fn get_landing_pad(bcx: @block_ctxt) -> BasicBlockRef {
-    let scope_bcx = find_scope_cx(bcx);
+    let scope_bcx = find_scope_for_lpad(bcx);
     if scope_bcx.need_new_lpad {
         let unwind_bcx = new_sub_block_ctxt(bcx, "unwind");
         let lpadbb = trans_landing_pad(unwind_bcx);
@@ -3747,6 +3747,24 @@ fn get_landing_pad(bcx: @block_ctxt) -> BasicBlockRef {
     }
     assert option::is_some(scope_bcx.lpad);
     ret option::get(scope_bcx.lpad);
+
+    fn find_scope_for_lpad(bcx: @block_ctxt) -> @block_ctxt {
+        let scope_bcx = bcx;
+        while true {
+            scope_bcx = find_scope_cx(scope_bcx);
+            if vec::is_not_empty(scope_bcx.cleanups) {
+                ret scope_bcx;
+            } else {
+                scope_bcx = alt scope_bcx.parent {
+                  parent_some(b) { b }
+                  parent_none. {
+                    ret scope_bcx;
+                  }
+                }
+            }
+        }
+        fail;
+    }
 }
 
 fn trans_landing_pad(bcx: @block_ctxt) -> BasicBlockRef {