diff options
| author | Brian Anderson <banderson@mozilla.com> | 2011-09-13 16:40:18 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-09-13 16:52:12 -0700 |
| commit | 6d3dd0e48cdb23c99be9d2d2b33dbfda08b35e30 (patch) | |
| tree | 30857ff754e6277207a3514a8bcbbd45ac23c842 /src | |
| parent | b8e31ac46917edcf5922f0b191c5e6c4505830d2 (diff) | |
| download | rust-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.rs | 20 |
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 { |
