about summary refs log tree commit diff
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
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
-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 {