1 // Copyright 2015 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 //! This pass removes the unwind branch of all the terminators when the no-landing-pads option is
14 use rustc
::ty
::TyCtxt
;
16 use rustc
::mir
::visit
::MutVisitor
;
17 use rustc
::mir
::transform
::{MirPass, MirSource}
;
19 pub struct NoLandingPads
;
21 impl MirPass
for NoLandingPads
{
22 fn run_pass
<'a
, 'tcx
>(&self,
23 tcx
: TyCtxt
<'a
, 'tcx
, 'tcx
>,
25 mir
: &mut Mir
<'tcx
>) {
26 no_landing_pads(tcx
, mir
)
30 pub fn no_landing_pads
<'a
, 'tcx
>(tcx
: TyCtxt
<'a
, 'tcx
, 'tcx
>, mir
: &mut Mir
<'tcx
>) {
31 if tcx
.sess
.no_landing_pads() {
32 NoLandingPads
.visit_mir(mir
);
36 impl<'tcx
> MutVisitor
<'tcx
> for NoLandingPads
{
37 fn visit_terminator(&mut self,
39 terminator
: &mut Terminator
<'tcx
>,
41 match terminator
.kind
{
42 TerminatorKind
::Goto { .. }
|
43 TerminatorKind
::Resume
|
44 TerminatorKind
::Return
|
45 TerminatorKind
::Unreachable
|
46 TerminatorKind
::SwitchInt { .. }
=> {
49 TerminatorKind
::Call { cleanup: ref mut unwind, .. }
|
50 TerminatorKind
::Assert { cleanup: ref mut unwind, .. }
|
51 TerminatorKind
::DropAndReplace { ref mut unwind, .. }
|
52 TerminatorKind
::Drop { ref mut unwind, .. }
=> {
56 self.super_terminator(bb
, terminator
, location
);