Exemplo n.º 1
0
		private static void GetSuccessorsRecursive(BasicBlock startingBlock, BasicBlock block, List<BasicBlock> allSuccessors)
		{
			foreach (var successor in block.Successors)
				if (successor != startingBlock && !allSuccessors.Contains(successor))
				{
					allSuccessors.Add(successor);
					GetSuccessorsRecursive(startingBlock, successor, allSuccessors);
				}
		}
Exemplo n.º 2
0
		public BasicBlockViewModel(BasicBlock basicBlock)
		{
			if (basicBlock.Instructions.Count > 10)
				_instructions = basicBlock.Instructions.Take(5).Select(x => x.ToString().Truncate(40))
				    .Union(new[] { "..." })
					.Union(basicBlock.Instructions.Skip(basicBlock.Instructions.Count - 5).Take(5).Select(x => x.ToString().Truncate(40)))
				    .ToList();
			else
				_instructions = basicBlock.Instructions.Select(x => x.ToString().Truncate(40)).ToList();
		}
		public void CanComputePostDominators()
		{
			// Arrange.
			// A
			// |\
			// | \
			// B  C
			// |   \
			// |    \
			// D__>__E
			// |    /
			// |   /
			// |  /
			// | /
			// |/
			// F
			var blockA = new BasicBlock(0, null);
			var blockB = new BasicBlock(1, null);
			var blockC = new BasicBlock(2, null);
			var blockD = new BasicBlock(3, null);
			var blockE = new BasicBlock(4, null);
			var blockF = new BasicBlock(5, null);
			blockA.Successors.AddRange(new[] { blockB, blockC });
			blockB.Successors.AddRange(new[] { blockD });
			blockC.Successors.AddRange(new[] { blockE });
			blockD.Successors.AddRange(new[] { blockE, blockF });
			blockE.Successors.AddRange(new[] { blockF });
			var controlFlowGraph = new ControlFlowGraph(null)
			{
				BasicBlocks = { blockA, blockB, blockC, blockD, blockE, blockF }
			};

			// Act.
			controlFlowGraph.ComputePostDominators();

			// Assert.
			Assert.That(blockA.ImmediatePostDominator, Is.EqualTo(blockF));
			Assert.That(blockB.ImmediatePostDominator, Is.EqualTo(blockD));
			Assert.That(blockC.ImmediatePostDominator, Is.EqualTo(blockE));
			Assert.That(blockD.ImmediatePostDominator, Is.EqualTo(blockF));
			Assert.That(blockE.ImmediatePostDominator, Is.EqualTo(blockF));
			Assert.That(blockF.ImmediatePostDominator, Is.Null);
		}