示例#1
0
        void createUnconditionalBranch(BasicBlock deadCodeBasicBlock, ITransformationMetadata basicBlockMetadata)
        {
            // Branch to some other basic block in our method (or to a newly created dead code block).
            var exitBranch = new UnconditionalBranchTarget();

            exitBranch.sourceBasicBlock   = deadCodeBasicBlock;
            deadCodeBasicBlock.exitBranch = exitBranch;

            deadCodeBasicBlock.operations.Add(createNewOperation(OperationCode.Br, 0));

            // TODO: Decrease possibility for dead code to be added?
            if (prng.Next(2) == 0)
            {
                // Random BB as dead code block target.
                var targetBlock = randomTargetBlock();

                targetBlock.entryBranches.Add(exitBranch);
                exitBranch.takenTarget = targetBlock;
            }
            else
            {
                // New dead code BB as dead code block target.
                var targetBlock = new BasicBlock();
                targetBlock.startIdx = targetBlock.endIdx = 0;

                targetBlock.entryBranches.Add(exitBranch);
                exitBranch.takenTarget = targetBlock;

                generateDeadCode(targetBlock, basicBlockMetadata);
            }
        }
示例#2
0
        public void generateDeadCode(BasicBlock deadCodeBasicBlock, ITransformationMetadata basicBlockMetadata)
        {
            // Add the dead code to the basic block.
            var result = generateDeadCode();

            foreach (var operation in result)
            {
                deadCodeBasicBlock.operations.Add(operation);
            }

            // Add metadata, if necessary (TODO: Use a set for metadata handling?)
            if (basicBlockMetadata != null && !deadCodeBasicBlock.transformationMetadata.Contains(basicBlockMetadata))
            {
                deadCodeBasicBlock.transformationMetadata.Add(basicBlockMetadata);
            }

            // Choose epilogue of dead code block.
            int target = 1;

            if (!debugging)
            {
                target = prng.Next(3);
                if (prng.Next(1) == 0)
                {
                    target = 0;
                }
            }

            switch (target)
            {
            case 0: createUnconditionalBranch(deadCodeBasicBlock, basicBlockMetadata); break;

            case 1: createExitBranch(deadCodeBasicBlock); break;

            case 2: createNoBranch(deadCodeBasicBlock); break;
            }
        }
示例#3
0
        public void generateDeadCode(BasicBlock deadCodeBasicBlock, ITransformationMetadata basicBlockMetadata)
        {
            // Add the dead code to the basic block.
            var result = generateDeadCode();
            foreach(var operation in result) {
                deadCodeBasicBlock.operations.Add(operation);
            }

            // Add metadata, if necessary (TODO: Use a set for metadata handling?)
            if(basicBlockMetadata != null && !deadCodeBasicBlock.transformationMetadata.Contains(basicBlockMetadata)) {
                deadCodeBasicBlock.transformationMetadata.Add(basicBlockMetadata);
            }

            // Choose epilogue of dead code block.
            int target = 1;
            if(!debugging) {
                target = prng.Next(3);
                if(prng.Next(1) == 0) {
                    target = 0;
                }
            }

            switch(target) {
                case 0: createUnconditionalBranch(deadCodeBasicBlock, basicBlockMetadata); break;
                case 1: createExitBranch(deadCodeBasicBlock); break;
                case 2: createNoBranch(deadCodeBasicBlock); break;
            }
        }
示例#4
0
        void createUnconditionalBranch(BasicBlock deadCodeBasicBlock, ITransformationMetadata basicBlockMetadata)
        {
            // Branch to some other basic block in our method (or to a newly created dead code block).
            var exitBranch = new UnconditionalBranchTarget();
            exitBranch.sourceBasicBlock = deadCodeBasicBlock;
            deadCodeBasicBlock.exitBranch = exitBranch;

            deadCodeBasicBlock.operations.Add(createNewOperation(OperationCode.Br, 0));

            // TODO: Decrease possibility for dead code to be added?
            if(prng.Next(2) == 0) { 
                // Random BB as dead code block target.
                var targetBlock = randomTargetBlock();

                targetBlock.entryBranches.Add(exitBranch);
                exitBranch.takenTarget = targetBlock;
            }
            else {
                // New dead code BB as dead code block target.
                var targetBlock = new BasicBlock();
                targetBlock.startIdx = targetBlock.endIdx = 0;

                targetBlock.entryBranches.Add(exitBranch);
                exitBranch.takenTarget = targetBlock;

                generateDeadCode(targetBlock, basicBlockMetadata);
            }
        }