Add a Cursor::ins() method which constructs a Builder.

Rewrite Builder uses in test cases to use this method and construct a
new builder for each instruction. This pattern allows us to change the
InstBuilder trait to a one-shot implementation that can only create a
single instruction.

Don't re-export the Builder struct, it is less important than the
InstBuilder trait, and we may get more implementations.
This commit is contained in:
Jakob Stoklund Olesen
2016-10-19 18:50:11 -07:00
parent 4cd33b210e
commit 78312c6c46
4 changed files with 29 additions and 22 deletions

View File

@@ -139,7 +139,7 @@ impl ControlFlowGraph {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use ir::{Function, Builder, InstBuilder, Cursor, VariableArgs, types}; use ir::{Function, InstBuilder, Cursor, VariableArgs, types};
#[test] #[test]
fn empty() { fn empty() {
@@ -184,18 +184,18 @@ mod tests {
let jmp_ebb1_ebb2; let jmp_ebb1_ebb2;
{ {
let mut cursor = Cursor::new(&mut func.layout); let mut cur = Cursor::new(&mut func.layout);
let mut b = Builder::new(&mut func.dfg, &mut cursor); let dfg = &mut func.dfg;
b.insert_ebb(ebb0); cur.insert_ebb(ebb0);
br_ebb0_ebb2 = b.brnz(cond, ebb2, VariableArgs::new()); br_ebb0_ebb2 = cur.ins(dfg).brnz(cond, ebb2, VariableArgs::new());
jmp_ebb0_ebb1 = b.jump(ebb1, VariableArgs::new()); jmp_ebb0_ebb1 = cur.ins(dfg).jump(ebb1, VariableArgs::new());
b.insert_ebb(ebb1); cur.insert_ebb(ebb1);
br_ebb1_ebb1 = b.brnz(cond, ebb1, VariableArgs::new()); br_ebb1_ebb1 = cur.ins(dfg).brnz(cond, ebb1, VariableArgs::new());
jmp_ebb1_ebb2 = b.jump(ebb2, VariableArgs::new()); jmp_ebb1_ebb2 = cur.ins(dfg).jump(ebb2, VariableArgs::new());
b.insert_ebb(ebb2); cur.insert_ebb(ebb2);
} }
let cfg = ControlFlowGraph::new(&func); let cfg = ControlFlowGraph::new(&func);

View File

@@ -116,7 +116,7 @@ impl DominatorTree {
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use super::*; use super::*;
use ir::{Function, Builder, InstBuilder, Cursor, VariableArgs, types}; use ir::{Function, InstBuilder, Cursor, VariableArgs, types};
use ir::entities::NO_INST; use ir::entities::NO_INST;
use cfg::ControlFlowGraph; use cfg::ControlFlowGraph;
@@ -142,20 +142,20 @@ mod test {
let jmp_ebb1_ebb2; let jmp_ebb1_ebb2;
{ {
let mut cursor = Cursor::new(&mut func.layout); let mut cur = Cursor::new(&mut func.layout);
let mut b = Builder::new(&mut func.dfg, &mut cursor); let dfg = &mut func.dfg;
b.insert_ebb(ebb3); cur.insert_ebb(ebb3);
jmp_ebb3_ebb1 = b.jump(ebb1, VariableArgs::new()); jmp_ebb3_ebb1 = cur.ins(dfg).jump(ebb1, VariableArgs::new());
b.insert_ebb(ebb1); cur.insert_ebb(ebb1);
br_ebb1_ebb0 = b.brnz(cond, ebb0, VariableArgs::new()); br_ebb1_ebb0 = cur.ins(dfg).brnz(cond, ebb0, VariableArgs::new());
jmp_ebb1_ebb2 = b.jump(ebb2, VariableArgs::new()); jmp_ebb1_ebb2 = cur.ins(dfg).jump(ebb2, VariableArgs::new());
b.insert_ebb(ebb2); cur.insert_ebb(ebb2);
b.jump(ebb0, VariableArgs::new()); cur.ins(dfg).jump(ebb0, VariableArgs::new());
b.insert_ebb(ebb0); cur.insert_ebb(ebb0);
} }
let cfg = ControlFlowGraph::new(&func); let cfg = ControlFlowGraph::new(&func);

View File

@@ -6,6 +6,8 @@
use std::iter::{Iterator, IntoIterator}; use std::iter::{Iterator, IntoIterator};
use entity_map::{EntityMap, EntityRef}; use entity_map::{EntityMap, EntityRef};
use ir::entities::{Ebb, NO_EBB, Inst, NO_INST}; use ir::entities::{Ebb, NO_EBB, Inst, NO_INST};
use ir::dfg::DataFlowGraph;
use ir::builder::Builder;
/// The `Layout` struct determines the layout of EBBs and instructions in a function. It does not /// The `Layout` struct determines the layout of EBBs and instructions in a function. It does not
/// contain definitions of instructions or EBBs, but depends on `Inst` and `Ebb` entity references /// contain definitions of instructions or EBBs, but depends on `Inst` and `Ebb` entity references
@@ -615,6 +617,11 @@ impl<'f> Cursor<'f> {
} }
} }
/// Create a builder for inserting an instruction at the current position.
pub fn ins<'c, 'fd>(&'c mut self, dfg: &'fd mut DataFlowGraph) -> Builder<'c, 'f, 'fd> {
Builder::new(dfg, self)
}
/// Insert an EBB at the current position and switch to it. /// Insert an EBB at the current position and switch to it.
/// ///
/// As far as possible, this method behaves as if the EBB header were an instruction inserted /// As far as possible, this method behaves as if the EBB header were an instruction inserted

View File

@@ -24,4 +24,4 @@ pub use ir::jumptable::JumpTableData;
pub use ir::dfg::{DataFlowGraph, ValueDef}; pub use ir::dfg::{DataFlowGraph, ValueDef};
pub use ir::layout::{Layout, Cursor}; pub use ir::layout::{Layout, Cursor};
pub use ir::function::Function; pub use ir::function::Function;
pub use ir::builder::{Builder, InstBuilder}; pub use ir::builder::InstBuilder;