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); } }
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; } }
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; } }
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); } }