Inline and simplify init_cpad
This commit is contained in:
parent
4c7041ea7d
commit
2bda3b7acb
2 changed files with 20 additions and 35 deletions
|
@ -863,32 +863,6 @@ impl<'a, 'tcx> MirContext<'a, 'tcx> {
|
||||||
bcx.llbb()
|
bcx.llbb()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn init_cpad(&mut self, bb: mir::BasicBlock,
|
|
||||||
funclets: &mut IndexVec<mir::BasicBlock, Option<Funclet>>) {
|
|
||||||
let bcx = self.build_block(bb);
|
|
||||||
let data = &self.mir[bb];
|
|
||||||
debug!("init_cpad({:?})", data);
|
|
||||||
|
|
||||||
match self.cleanup_kinds[bb] {
|
|
||||||
CleanupKind::NotCleanup => {
|
|
||||||
funclets[bb] = None;
|
|
||||||
}
|
|
||||||
_ if !base::wants_msvc_seh(bcx.sess()) => {
|
|
||||||
funclets[bb] = Funclet::gnu();
|
|
||||||
}
|
|
||||||
CleanupKind::Internal { funclet: _ } => {
|
|
||||||
// FIXME: is this needed?
|
|
||||||
bcx.set_personality_fn(self.fcx.eh_personality());
|
|
||||||
funclets[bb] = None;
|
|
||||||
}
|
|
||||||
CleanupKind::Funclet => {
|
|
||||||
bcx.set_personality_fn(self.fcx.eh_personality());
|
|
||||||
let cleanup_pad = bcx.cleanup_pad(None, &[]);
|
|
||||||
funclets[bb] = Funclet::msvc(cleanup_pad);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
fn unreachable_block(&mut self) -> BasicBlockRef {
|
fn unreachable_block(&mut self) -> BasicBlockRef {
|
||||||
self.unreachable_block.unwrap_or_else(|| {
|
self.unreachable_block.unwrap_or_else(|| {
|
||||||
let bl = self.fcx.build_new_block("unreachable");
|
let bl = self.fcx.build_new_block("unreachable");
|
||||||
|
@ -898,7 +872,7 @@ impl<'a, 'tcx> MirContext<'a, 'tcx> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn build_block(&self, bb: mir::BasicBlock) -> BlockAndBuilder<'a, 'tcx> {
|
pub fn build_block(&self, bb: mir::BasicBlock) -> BlockAndBuilder<'a, 'tcx> {
|
||||||
BlockAndBuilder::new(self.blocks[bb], self.fcx)
|
BlockAndBuilder::new(self.blocks[bb], self.fcx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@ use rustc_data_structures::indexed_vec::{IndexVec, Idx};
|
||||||
|
|
||||||
pub use self::constant::trans_static_initializer;
|
pub use self::constant::trans_static_initializer;
|
||||||
|
|
||||||
|
use self::analyze::CleanupKind;
|
||||||
use self::lvalue::{LvalueRef};
|
use self::lvalue::{LvalueRef};
|
||||||
use rustc::mir::traversal;
|
use rustc::mir::traversal;
|
||||||
|
|
||||||
|
@ -315,18 +316,28 @@ pub fn trans_mir<'a, 'tcx: 'a>(
|
||||||
// emitting should be enabled.
|
// emitting should be enabled.
|
||||||
debuginfo::start_emitting_source_locations(&mircx);
|
debuginfo::start_emitting_source_locations(&mircx);
|
||||||
|
|
||||||
let mut visited = BitVector::new(mir.basic_blocks().len());
|
|
||||||
|
|
||||||
let mut rpo = traversal::reverse_postorder(&mir);
|
|
||||||
|
|
||||||
let mut funclets: IndexVec<mir::BasicBlock, Option<Funclet>> =
|
let mut funclets: IndexVec<mir::BasicBlock, Option<Funclet>> =
|
||||||
IndexVec::from_elem(None, mir.basic_blocks());
|
IndexVec::from_elem(None, mir.basic_blocks());
|
||||||
|
|
||||||
// Prepare each block for translation.
|
// If false, all funclets should be None (which is the default)
|
||||||
for (bb, _) in rpo.by_ref() {
|
if base::wants_msvc_seh(fcx.ccx.sess()) {
|
||||||
mircx.init_cpad(bb, &mut funclets);
|
for (bb, cleanup_kind) in mircx.cleanup_kinds.iter_enumerated() {
|
||||||
|
let bcx = mircx.build_block(bb);
|
||||||
|
match *cleanup_kind {
|
||||||
|
CleanupKind::Internal { .. } => {
|
||||||
|
bcx.set_personality_fn(fcx.eh_personality());
|
||||||
|
}
|
||||||
|
CleanupKind::Funclet => {
|
||||||
|
bcx.set_personality_fn(fcx.eh_personality());
|
||||||
|
funclets[bb] = Funclet::msvc(bcx.cleanup_pad(None, &[]));
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
rpo.reset();
|
|
||||||
|
let rpo = traversal::reverse_postorder(&mir);
|
||||||
|
let mut visited = BitVector::new(mir.basic_blocks().len());
|
||||||
|
|
||||||
// Translate the body of each block using reverse postorder
|
// Translate the body of each block using reverse postorder
|
||||||
for (bb, _) in rpo {
|
for (bb, _) in rpo {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue