package ddg; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; import ast.ASTNode; import misc.MultiHashMap; import udg.useDefGraph.UseDefGraph; import udg.useDefGraph.UseOrDefRecord; import cfg.CFG; import cfg.CFGEdge; import cfg.nodes.ASTNodeContainer; import cfg.nodes.CFGNode; import ddg.DefUseCFG.DefUseCFG; public class CFGAndUDGToDefUseCFG { public DefUseCFG convert(CFG cfg, UseDefGraph udg) { DefUseCFG defUseCFG = new DefUseCFG(); initializeStatements(cfg, defUseCFG); initializeDefUses(udg, defUseCFG); LinkedList<String> parameters = new LinkedList<String>(); for (CFGNode parameterCFGNode : cfg.getParameters()) { ASTNode astNode = ((ASTNodeContainer) parameterCFGNode).getASTNode(); String symbol = astNode.getChild(1).getEscapedCodeStr(); parameters.add(symbol); } defUseCFG.setExitNode(cfg.getExitNode()); defUseCFG.setParameters(parameters); defUseCFG.addUsesForExitNode(); initializeParentsAndChildren(cfg, defUseCFG); return defUseCFG; } private void initializeStatements(CFG cfg, DefUseCFG defUseCFG) { for (Object statement : cfg.getVertices()) { if (statement instanceof ASTNodeContainer) statement = ((ASTNodeContainer) statement).getASTNode(); defUseCFG.addStatement(statement); } } private void initializeDefUses(UseDefGraph udg, DefUseCFG defUseCFG) { MultiHashMap<String, UseOrDefRecord> useDefDict = udg.getUseDefDict(); Iterator<Entry<String, List<UseOrDefRecord>>> it = useDefDict .getEntrySetIterator(); while (it.hasNext()) { Entry<String, List<UseOrDefRecord>> next = it.next(); String symbol = (String) next.getKey(); List<UseOrDefRecord> defUseRecords = next.getValue(); for (UseOrDefRecord record : defUseRecords) { if (!record.getAstNode().isInCFG()) continue; if (record.isDef()) defUseCFG.addSymbolDefined(record.getAstNode(), symbol); else defUseCFG.addSymbolUsed(record.getAstNode(), symbol); } } } private void initializeParentsAndChildren(CFG cfg, DefUseCFG defUseCFG) { // Edges edges = cfg.getEdges(); // Iterator<Entry<Object, List<Object>>> it = // edges.getEntrySetIterator(); // while(it.hasNext()){ // Entry<Object, List<Object>> next = it.next(); // CFGNode srcNode = (CFGNode) next.getKey(); // List<Object> dsts = next.getValue(); // // // // for(Object dst : dsts){ // CFGNode dstNode = (CFGNode) dst; // // Object srcId = (srcNode.astNode != null)? srcNode.astNode : srcNode; // Object dstId = (dstNode.astNode != null)? dstNode.astNode : dstNode; // // defUseCFG.addChildBlock(srcId, dstId); // defUseCFG.addParentBlock(dstId, srcId); // } // } Object src; Object dst; for (CFGEdge edge : cfg.getEdges()) { src = edge.getSource(); dst = edge.getDestination(); if (src instanceof ASTNodeContainer) src = ((ASTNodeContainer) src).getASTNode(); if (dst instanceof ASTNodeContainer) dst = ((ASTNodeContainer) dst).getASTNode(); defUseCFG.addChildBlock(src, dst); defUseCFG.addParentBlock(dst, src); } } }