public Block SplitBlock(Block blockToSplit, Address addr)
{
var graph = blockToSplit.Procedure.ControlGraph;
var blockNew = AddBlock(addr, blockToSplit.Procedure, Block.GenerateName(addr));
foreach (var succ in graph.Successors(blockToSplit))
{
graph.AddEdge(blockNew, succ);
}
foreach (var succ in graph.Successors(blockNew))
{
graph.RemoveEdge(blockToSplit, succ);
}
var linAddr = addr.ToLinear();
var stmsToMove = blockToSplit.Statements.FindAll(s => s.LinearAddress >= linAddr).ToArray();
if (blockToSplit.Statements.Count > 0 && blockToSplit.Statements.Last.LinearAddress >= linAddr)
{
graph.AddEdge(blockToSplit, blockNew);
blockToSplit.Statements.RemoveAll(s => s.LinearAddress >= linAddr);
}
blockNew.Statements.AddRange(stmsToMove);
foreach (var stm in stmsToMove)
{
stm.Block = blockNew;
}
blocks[blockStarts[blockToSplit]].End = linAddr;
return blockNew;
}