Ejemplo n.º 1
0
def createGraphs(program, basepath):
    import UDrawGraph, ICFGs, Trees, IPGs
    Debug.debugMessage("Creating data structures", 1)
    for cfg in program.getCFGs():
        functionName = cfg.getName()
        UDrawGraph.makeUdrawFile(cfg, basepath,
                                 "%s.%s" % (functionName, "cfg"))
        predomTree = Trees.Dominators(cfg, cfg.getEntryID())
        reverseg = cfg.getReverseCFG()
        postdomTree = Trees.Dominators(reverseg, reverseg.getEntryID())
        UDrawGraph.makeUdrawFile(predomTree, basepath,
                                 "%s.%s" % (functionName, "pre"))
        UDrawGraph.makeUdrawFile(postdomTree, basepath,
                                 "%s.%s" % (functionName, "post"))
        icfg = ICFGs.ICFG(cfg)
        icfg.setEntryID()
        icfg.setExitID()
        icfg.addExitEntryEdge()
        program.addICFG(icfg)
        UDrawGraph.makeUdrawFile(icfg, basepath,
                                 "%s.%s" % (functionName, "icfg"))
        lnt = Trees.LoopNests(icfg, icfg.getEntryID())
        program.addLNT(lnt)
        UDrawGraph.makeUdrawFile(lnt, basepath,
                                 "%s.%s" % (functionName, "lnt"))
        ipg = IPGs.IPG(icfg, lnt)
        program.addIPG(ipg)
        icfg.addBranchDivergenceEdges(lnt)
        ipg.updateWithBranchDivergentPaths()
        UDrawGraph.makeUdrawFile(icfg, basepath,
                                 "%s.%s" % (functionName, "icfg"))
        UDrawGraph.makeUdrawFile(ipg, basepath,
                                 "%s.%s" % (functionName, "ipg"))
Ejemplo n.º 2
0
    def __solveDFF(self, forwardBranches):
        # Initialise data structures needed
        vertexToReachable = {}
        for v in self:
            vertexToReachable[v] = set([])

        # Do a reverse post-order. Avoid the entry vertex
        dfs = Trees.DepthFirstSearch(self, self._entryID)
        postID = self.numOfVertices() - 1
        while postID >= 1:
            vertexID = dfs.getPostorderVertexID(postID)
            v = self.getVertex(vertexID)
            vertexToReachable[v].add(vertexID)
            for predID in v.getPredecessorIDs():
                predv = self.getVertex(predID)
                vertexToReachable[v].add(predID)
                vertexToReachable[v].update(vertexToReachable[predv])
            postID -= 1

        # Now analyse the immediate post-dominator
        reverseg = self.getReverseCFG()
        postdomTree = Trees.Dominators(reverseg, reverseg.getEntryID())
        for vertexID in forwardBranches:
            Debug.debugMessage("Vertex %d is a forward branch" % vertexID, 5)
            branchv = self.getVertex(vertexID)
            succSet = set(branchv.getSuccessorIDs())
            treev = postdomTree.getVertex(vertexID)
            parentID = treev.getParentID()
            mergev = self.getVertex(parentID)
            Debug.debugMessage(
                "Analysing region (%d, %d)" % (vertexID, parentID), 5)
            #            for succID in branchv.getSuccessorIDs():
            #                if succID != parentID:
            #                    self.addEdge(parentID, succID)
            #                    self.__branchDivergentEdges.append((parentID, succID))
            for predID in mergev.getPredecessorIDs():
                predv = self.getVertex(predID)
                newsuccs = set.difference(succSet, vertexToReachable[predv])
                for newsuccID in newsuccs:
                    if newsuccID not in predv.getSuccessorIDs(
                    ) and newsuccID != predID:
                        self.addEdge(predID, newsuccID)
                        self.__branchDivergentEdges.append((predID, newsuccID))