Beispiel #1
0
        private static void ForwardDFS(CFG cdfg,
                                       ControlGraphQueries <EnhancedBasicBlock <Instruction>, Instruction> cfgQueries,
                                       HashSet <EnhancedBasicBlock <Instruction> > currentPath,
                                       HashSet <EnhancedBasicBlock <Instruction> > visitedBlocks,
                                       Dictionary <EnhancedBasicBlock <Instruction>, List <EnhancedBasicBlock <Instruction> > > surroundingLoops,
                                       EnhancedBasicBlock <Instruction> block)
        {
            if (visitedBlocks.Contains(block))
            {
                return;
            }
            visitedBlocks.Add(block);
            currentPath.Add(block);
            var successors = cdfg.SuccessorsFor(block);

            //Console.WriteLine("{0:X}, Successors: {1}", block.Offset, Offsets(successors));
            foreach (var s in successors)
            {
                if (currentPath.Contains(s))
                {
                    // backedge from block to s
                    //WriteBlockOffset(s, 1);
                    if (!cfgQueries.Dominates(s, block))
                    {
                        throw new NotReducibleFlowGraph();
                    }
                    BackwardDFS(cdfg, cfgQueries, surroundingLoops, new HashSet <EnhancedBasicBlock <Instruction> >(), block, s);
                }
                else
                {
                    ForwardDFS(cdfg, cfgQueries, currentPath, visitedBlocks, surroundingLoops, s);
                }
            }
            currentPath.Remove(block);
        }
Beispiel #2
0
        private static void BackwardDFS(CFG cdfg,
                                        ControlGraphQueries <EnhancedBasicBlock <Instruction>, Instruction> cfgQueries,
                                        Dictionary <EnhancedBasicBlock <Instruction>, List <EnhancedBasicBlock <Instruction> > > surroundingLoops,
                                        HashSet <EnhancedBasicBlock <Instruction> > visitedBlocks,
                                        EnhancedBasicBlock <Instruction> block,
                                        EnhancedBasicBlock <Instruction> loopHead)
        {
            if (visitedBlocks.Contains(block))
            {
                return;
            }
            visitedBlocks.Add(block);
            List <EnhancedBasicBlock <Instruction> > loops;

            if (!surroundingLoops.TryGetValue(block, out loops))
            {
                loops = new List <EnhancedBasicBlock <Instruction> >();
                surroundingLoops.Add(block, loops);
            }
            surroundingLoops[block].Add(loopHead);
            if (block == loopHead)
            {
                return;
            }

            var predecessors = cfgQueries.PredeccessorsFor(block);

            //Console.WriteLine("{0:X}, Predecessors: {1}", block.Offset, Offsets(predecessors));
            foreach (var p in predecessors)
            {
                BackwardDFS(cdfg, cfgQueries, surroundingLoops, visitedBlocks, p, loopHead);
            }
        }
    private void InitializeOperandStack(EnhancedBasicBlock<Instruction> block) {
      Contract.Requires(block != null);

      this.operandStack.Clear();
      foreach (var pseudoInstruction in block.OperandStack) {
        Contract.Assume(pseudoInstruction != null);
        this.PushTempForSlotAndAssociateWithInstruction(pseudoInstruction);
      }
    }