package ddg.DefUseCFG; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import misc.MultiHashMap; /** * A CFG decorated with USE and DEFs suitable to determine reaching definitions. * This contains the same information as a UseDefGraph (UDG) but in a format * better suited for DDG creation. * */ public class DefUseCFG { private LinkedList<Object> statements = new LinkedList<Object>(); private MultiHashMap<Object, Object> symbolsUsed = new MultiHashMap<Object, Object>(); private MultiHashMap<Object, Object> symbolsDefined = new MultiHashMap<Object, Object>(); private MultiHashMap<Object, Object> parentBlocks = new MultiHashMap<Object, Object>(); private MultiHashMap<Object, Object> childBlocks = new MultiHashMap<Object, Object>(); private Map<String, Object> symbolIds = new HashMap<String, Object>(); private Object exitNode; private List<String> parameters = new LinkedList<String>(); private static final List<Object> EMPTY_LIST = new LinkedList<Object>(); public void addStatement(Object statementId) { statements.add(statementId); } public void addSymbolUsed(Object key, String symbol) { symbolsUsed.add(key, symbol); } public void addSymbolDefined(Object key, String symbol) { symbolsDefined.add(key, symbol); } public Collection<Object> getSymbolsDefinedBy(Object blockId) { List<Object> listForKey = symbolsDefined.get(blockId); if (listForKey == null) return EMPTY_LIST; return listForKey; } public void addParentBlock(Object thisBlockId, Object parentId) { parentBlocks.add(thisBlockId, parentId); } public void addChildBlock(Object thisBlockId, Object childId) { childBlocks.add(thisBlockId, childId); } public LinkedList<Object> getStatements() { return statements; } public MultiHashMap<Object, Object> getSymbolsUsed() { return symbolsUsed; } public MultiHashMap<Object, Object> getSymbolsDefined() { return symbolsDefined; } public MultiHashMap<Object, Object> getParentBlocks() { return parentBlocks; } public MultiHashMap<Object, Object> getChildBlocks() { return childBlocks; } public Object getIdForSymbol(String symbol) { return symbolIds.get(symbol); } public void setSetSymbolId(String symbolCode, Object symbolId) { symbolIds.put(symbolCode, symbolId); } public void addUsesForExitNode() { for (String symbol : parameters) { // this.addSymbolUsed(exitNode, symbol); this.addSymbolUsed(exitNode, "* " + symbol); } } public void setExitNode(Object exitNode) { this.exitNode = exitNode; } public void setParameters(LinkedList<String> params) { parameters = params; } public void addParameter(String str) { parameters.add(str); } }