示例#1
0
        public void FindBasicBlocks_WithNoBranches_IdentifiesSingleBasicBlock()
        {
            var method = BuildMethod(new List <Instruction>()
            {
                new Instruction(OpCodes.Ldc_I4_0),
                new Instruction(OpCodes.Ldc_I4_S, 1234),
            });
            var basicBlockAnalyser = new BasicBlockAnalyser(method);
            var offsetToIndexMap   = new Dictionary <int, int>();

            var basicBlocks = basicBlockAnalyser.FindBasicBlocks(offsetToIndexMap);

            Assert.AreEqual(1, basicBlocks.Count(x => x != null));
            Assert.IsNotNull(basicBlocks[0]);
        }
示例#2
0
        public void FindBasicBlocks_WithUnconditionalBranch_IdentifiesBlockAtTargetOfBranch()
        {
            var code         = new List <Instruction>();
            var branchTarget = OpCodes.Nop.ToInstruction();

            code.Add(OpCodes.Nop.ToInstruction());
            code.Add(branchTarget);
            code.Add(OpCodes.Br.ToInstruction(branchTarget));
            var method             = BuildMethod(code);
            var basicBlockAnalyser = new BasicBlockAnalyser(method);
            var offsetToIndexMap   = new Dictionary <int, int>();

            var basicBlocks = basicBlockAnalyser.FindBasicBlocks(offsetToIndexMap);

            Assert.AreEqual(2, basicBlocks.Count(x => x != null));
            Assert.IsNotNull(basicBlocks[branchTarget.Offset]);
        }
示例#3
0
        public void FindBasicBlocks_WithConditionalBranches_IdentifiesBlockFollowingBranch()
        {
            var code         = new List <Instruction>();
            var branchTarget = OpCodes.Nop.ToInstruction();

            code.Add(OpCodes.Nop.ToInstruction());
            code.Add(OpCodes.Brfalse.ToInstruction(branchTarget));
            var instructionAfterBranch = OpCodes.Nop.ToInstruction();

            code.Add(instructionAfterBranch);
            code.Add(branchTarget);
            var method             = BuildMethod(code);
            var basicBlockAnalyser = new BasicBlockAnalyser(method);
            var offsetToIndexMap   = new Dictionary <int, int>();

            var basicBlocks = basicBlockAnalyser.FindBasicBlocks(offsetToIndexMap);

            Assert.AreEqual(3, basicBlocks.Count(x => x != null));
            Assert.IsNotNull(basicBlocks[instructionAfterBranch.Offset]);
        }