Rename Builder to InsertBuilder.

This instruction builder inserts an instruction at the cursor position.
We'll add other kinds of builders shortly.
This commit is contained in:
Jakob Stoklund Olesen
2016-10-20 11:16:58 -07:00
parent 5f140eddf7
commit d763bedeaa
2 changed files with 16 additions and 26 deletions

View File

@@ -48,40 +48,30 @@ include!(concat!(env!("OUT_DIR"), "/builder.rs"));
/// Any type implementing `InstBuilderBase` gets all the `InstBuilder` methods for free. /// Any type implementing `InstBuilderBase` gets all the `InstBuilder` methods for free.
impl<'f, T: InstBuilderBase<'f>> InstBuilder<'f> for T {} impl<'f, T: InstBuilderBase<'f>> InstBuilder<'f> for T {}
/// Instruction builder. /// Builder that inserts an instruction at the current cursor position.
/// ///
/// A `Builder` holds mutable references to a data flow graph and a layout cursor. It provides /// An `InsertBuilder` holds mutable references to a data flow graph and a layout cursor. It
/// convenience method for creating and inserting instructions at the current cursor position. /// provides convenience methods for creating and inserting instructions at the current cursor
pub struct Builder<'c, 'fc: 'c, 'fd> { /// position.
pub pos: &'c mut Cursor<'fc>, pub struct InsertBuilder<'c, 'fc: 'c, 'fd> {
pub dfg: &'fd mut DataFlowGraph, pos: &'c mut Cursor<'fc>,
dfg: &'fd mut DataFlowGraph,
} }
impl<'c, 'fc, 'fd> Builder<'c, 'fc, 'fd> { impl<'c, 'fc, 'fd> InsertBuilder<'c, 'fc, 'fd> {
/// Create a new builder which inserts instructions at `pos`. /// Create a new builder which inserts instructions at `pos`.
/// The `dfg` and `pos.layout` references should be from the same `Function`. /// The `dfg` and `pos.layout` references should be from the same `Function`.
pub fn new(dfg: &'fd mut DataFlowGraph, pos: &'c mut Cursor<'fc>) -> Builder<'c, 'fc, 'fd> { pub fn new(dfg: &'fd mut DataFlowGraph,
Builder { pos: &'c mut Cursor<'fc>)
-> InsertBuilder<'c, 'fc, 'fd> {
InsertBuilder {
dfg: dfg, dfg: dfg,
pos: pos, pos: pos,
} }
} }
/// Create and insert an EBB. Further instructions will be inserted into the new EBB.
pub fn ebb(&mut self) -> Ebb {
let ebb = self.dfg.make_ebb();
self.insert_ebb(ebb);
ebb
}
/// Insert an existing EBB at the current position. Further instructions will be inserted into
/// the new EBB.
pub fn insert_ebb(&mut self, ebb: Ebb) {
self.pos.insert_ebb(ebb);
}
} }
impl<'c, 'fc, 'fd> InstBuilderBase<'fd> for Builder<'c, 'fc, 'fd> { impl<'c, 'fc, 'fd> InstBuilderBase<'fd> for InsertBuilder<'c, 'fc, 'fd> {
fn data_flow_graph(&self) -> &DataFlowGraph { fn data_flow_graph(&self) -> &DataFlowGraph {
self.dfg self.dfg
} }

View File

@@ -7,7 +7,7 @@ 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::dfg::DataFlowGraph;
use ir::builder::Builder; use ir::builder::InsertBuilder;
/// 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
@@ -618,8 +618,8 @@ impl<'f> Cursor<'f> {
} }
/// Create a builder for inserting an instruction at the current position. /// 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> { pub fn ins<'c, 'fd>(&'c mut self, dfg: &'fd mut DataFlowGraph) -> InsertBuilder<'c, 'f, 'fd> {
Builder::new(dfg, self) InsertBuilder::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.