diff options
author | Alena Laskavaia | 2010-04-14 02:55:44 +0000 |
---|---|---|
committer | Alena Laskavaia | 2010-04-14 02:55:44 +0000 |
commit | ee3a2444d159e281356c6e0204c680dd3437b187 (patch) | |
tree | c20b50caece09c8640b51d6bf5b67094068fdbec /codan/org.eclipse.cdt.codan.core.cxx | |
parent | d346fcd041f3a1e8ab65bfae3d48f2dcde2e21bc (diff) | |
download | org.eclipse.cdt-ee3a2444d159e281356c6e0204c680dd3437b187.tar.gz org.eclipse.cdt-ee3a2444d159e281356c6e0204c680dd3437b187.tar.xz org.eclipse.cdt-ee3a2444d159e281356c6e0204c680dd3437b187.zip |
- re-wrote to use labeled node instead of decisionArc
Diffstat (limited to 'codan/org.eclipse.cdt.codan.core.cxx')
-rw-r--r-- | codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java | 113 | ||||
-rw-r--r-- | codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxLabeledNode.java (renamed from codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxDecisionArc.java) | 23 | ||||
-rw-r--r-- | codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxNodeFactory.java | 15 |
3 files changed, 98 insertions, 53 deletions
diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java index b9c7608133e..1c2318c87d5 100644 --- a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java +++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java @@ -20,6 +20,8 @@ import org.eclipse.cdt.codan.internal.core.cfg.JumpNode; import org.eclipse.cdt.codan.provisional.core.model.cfg.IBasicBlock; import org.eclipse.cdt.codan.provisional.core.model.cfg.IConnectorNode; import org.eclipse.cdt.codan.provisional.core.model.cfg.IExitNode; +import org.eclipse.cdt.codan.provisional.core.model.cfg.IJumpNode; +import org.eclipse.cdt.codan.provisional.core.model.cfg.ILabeledNode; import org.eclipse.cdt.codan.provisional.core.model.cfg.IPlainNode; import org.eclipse.cdt.codan.provisional.core.model.cfg.IStartNode; import org.eclipse.cdt.core.dom.ast.IASTBreakStatement; @@ -27,6 +29,7 @@ import org.eclipse.cdt.core.dom.ast.IASTCaseStatement; import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; import org.eclipse.cdt.core.dom.ast.IASTDeclarationStatement; import org.eclipse.cdt.core.dom.ast.IASTDefaultStatement; +import org.eclipse.cdt.core.dom.ast.IASTDoStatement; import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement; import org.eclipse.cdt.core.dom.ast.IASTForStatement; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; @@ -89,6 +92,8 @@ public class ControlFlowGraphBuilder { return createWhile(prev, (IASTWhileStatement) body); } else if (body instanceof IASTForStatement) { return createFor(prev, (IASTForStatement) body); + } else if (body instanceof IASTDoStatement) { + return createDoWhile(prev, (IASTDoStatement) body); } else if (body instanceof IASTReturnStatement) { CxxExitNode node = factory.createExitNode(body); node.setStartNode(start); @@ -106,18 +111,20 @@ public class ControlFlowGraphBuilder { * @return */ protected IBasicBlock createIf(IBasicBlock prev, IASTIfStatement body) { - DecisionNode node = factory.createDecisionNode(body + DecisionNode ifNode = factory.createDecisionNode(body .getConditionExpression()); - addOutgoing(prev, node); - ConnectorNode conn = new ConnectorNode(); - node.setConnectorNode(conn); - IBasicBlock els = createSubGraph(node, body.getElseClause()); - conn.addIncoming(els); - addOutgoing(els, conn); - IBasicBlock then = createSubGraph(node, body.getThenClause()); - conn.addIncoming(then); - addOutgoing(then, conn); - return conn; + addOutgoing(prev, ifNode); + IConnectorNode mergeNode = factory.createConnectorNode(); + ifNode.setMergeNode(mergeNode); + ILabeledNode thenNode = factory.createLabeledNode(ILabeledNode.THEN); + addOutgoing(ifNode, thenNode); + IBasicBlock then = createSubGraph(thenNode, body.getThenClause()); + addOutgoing(then, mergeNode); + ILabeledNode elseNode = factory.createLabeledNode(ILabeledNode.ELSE); + addOutgoing(ifNode, elseNode); + IBasicBlock els = createSubGraph(elseNode, body.getElseClause()); + addOutgoing(els, mergeNode); + return mergeNode; } /** @@ -130,7 +137,7 @@ public class ControlFlowGraphBuilder { .getControllerExpression()); addOutgoing(prev, node); ConnectorNode conn = new ConnectorNode(); - node.setConnectorNode(conn); + node.setMergeNode(conn); createSwitchBody(node, conn, body.getBody()); return conn; } @@ -148,20 +155,15 @@ public class ControlFlowGraphBuilder { IASTCompoundStatement comp = (IASTCompoundStatement) body; IASTNode[] children = comp.getChildren(); IBasicBlock prev = switchNode; - int labelNum = 1; for (int i = 0; i < children.length; i++) { IASTNode elem = children[i]; if (elem instanceof IASTCaseStatement) { IASTCaseStatement caseSt = (IASTCaseStatement) elem; - IPlainNode nextSt = factory - .createPlainNode(); + ILabeledNode lbl = factory.createLabeledNode(caseSt); if (!(prev instanceof IExitNode) && prev != switchNode) - addOutgoing(prev, nextSt); - switchNode.addOutgoing(new CxxDecisionArc(switchNode, labelNum, - nextSt, caseSt)); - labelNum++; - ((AbstractBasicBlock)nextSt).addIncoming(switchNode); - prev = nextSt; + addOutgoing(prev, lbl); + addOutgoing(switchNode, lbl); + prev = lbl; continue; } if (elem instanceof IASTBreakStatement) { @@ -173,15 +175,12 @@ public class ControlFlowGraphBuilder { continue; } if (elem instanceof IASTDefaultStatement) { - IASTDefaultStatement caseSt = (IASTDefaultStatement) elem; - IPlainNode nextSt = factory - .createPlainNode(); + ILabeledNode lbl = factory + .createLabeledNode(ILabeledNode.DEFAULT); if (!(prev instanceof IExitNode) && prev != switchNode) - addOutgoing(prev, nextSt); - switchNode.addOutgoing(new CxxDecisionArc(switchNode, 0, - nextSt, caseSt)); - ((AbstractBasicBlock)nextSt).addIncoming(switchNode); - prev = nextSt; + addOutgoing(prev, lbl); + addOutgoing(switchNode, lbl); + prev = lbl; continue; } IBasicBlock last = createSubGraph(prev, elem); @@ -209,19 +208,24 @@ public class ControlFlowGraphBuilder { addOutgoing(nContinue2, decision); // add break connector IConnectorNode nBreak = factory.createConnectorNode(); - addOutgoing(decision, nBreak); - decision.setConnectorNode(nBreak); + decision.setMergeNode(nBreak); // create body and jump to continue node - IBasicBlock nBody = createSubGraph(decision, forNode.getBody()); + ILabeledNode loopStart = factory.createLabeledNode(ILabeledNode.THEN); + addOutgoing(decision, loopStart); + IBasicBlock endBody = createSubGraph(loopStart, forNode.getBody()); // inc IPlainNode inc = factory.createPlainNode(forNode .getIterationExpression()); - addOutgoing(nBody, inc); + addOutgoing(endBody, inc); JumpNode jumpContinue = new JumpNode(); addOutgoing(inc, jumpContinue); jumpContinue.setJump(nContinue2, true); // connect with backward link addOutgoing(jumpContinue, nContinue2); + // add "else" branch + ILabeledNode loopEnd = factory.createLabeledNode(ILabeledNode.ELSE); + addOutgoing(decision, loopEnd); + addOutgoing(loopEnd, nBreak); return nBreak; } @@ -240,15 +244,50 @@ public class ControlFlowGraphBuilder { addOutgoing(nContinue, decision); // add break connector IConnectorNode nBreak = factory.createConnectorNode(); - addOutgoing(decision, nBreak); - decision.setConnectorNode(nBreak); + decision.setMergeNode(nBreak); // create body and jump to continue node - IBasicBlock nBody = createSubGraph(decision, body.getBody()); + ILabeledNode loopStart = factory.createLabeledNode(ILabeledNode.THEN); + addOutgoing(decision, loopStart); + IBasicBlock endBody = createSubGraph(loopStart, body.getBody()); JumpNode jumpContinue = new JumpNode(); - addOutgoing(nBody, jumpContinue); + addOutgoing(endBody, jumpContinue); jumpContinue.setJump(nContinue, true); // connect with backward link addOutgoing(jumpContinue, nContinue); + // connect with else branch + ILabeledNode loopEnd = factory.createLabeledNode(ILabeledNode.ELSE); + addOutgoing(decision, loopEnd); + addOutgoing(loopEnd, nBreak); + return nBreak; + } + + protected IBasicBlock createDoWhile(IBasicBlock prev, IASTDoStatement body) { + // create body and jump to continue node + IConnectorNode loopStart = factory.createConnectorNode(); + addOutgoing(prev, loopStart); + IBasicBlock endBody = createSubGraph(loopStart, body.getBody()); + // add continue connector + IConnectorNode nContinue = factory.createLabeledNode("continue"); + addOutgoing(endBody, nContinue); + // decision node + CxxDecisionNode decision = factory.createDecisionNode(body + .getCondition()); + addOutgoing(nContinue, decision); + // then branch + ILabeledNode thenNode = factory.createLabeledNode(ILabeledNode.THEN); + addOutgoing(decision, thenNode); + IJumpNode jumpToStart = factory.createJumpNode(); + addOutgoing(thenNode, jumpToStart); + ((JumpNode)jumpToStart).setBackward(true); + // connect with backward link + addOutgoing(jumpToStart, loopStart); + // connect with else branch + ILabeledNode loopEnd = factory.createLabeledNode(ILabeledNode.ELSE); + addOutgoing(decision, loopEnd); + // add break connector + IConnectorNode nBreak = factory.createConnectorNode(); + decision.setMergeNode(nBreak); + addOutgoing(loopEnd, nBreak); return nBreak; } diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxDecisionArc.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxLabeledNode.java index d15a94e4dd3..b2237cbd7d2 100644 --- a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxDecisionArc.java +++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxLabeledNode.java @@ -10,26 +10,19 @@ *******************************************************************************/ package org.eclipse.cdt.codan.core.cxx.internal.model.cfg; -import org.eclipse.cdt.codan.internal.core.cfg.DecisionArc; -import org.eclipse.cdt.codan.internal.core.cfg.DecisionNode; -import org.eclipse.cdt.codan.provisional.core.model.cfg.IBasicBlock; +import org.eclipse.cdt.codan.internal.core.cfg.LabeledNode; import org.eclipse.cdt.core.dom.ast.IASTNode; /** * TODO: add description */ -public class CxxDecisionArc extends DecisionArc { - private IASTNode label; +public class CxxLabeledNode extends LabeledNode { + private IASTNode labelData; - /** - * @param decisionNode - * @param i - * @param node - */ - public CxxDecisionArc(DecisionNode decisionNode, int i, IBasicBlock node, - IASTNode label) { - super(decisionNode, i, node); - this.label = label; + + CxxLabeledNode(IASTNode label) { + super(label.getRawSignature()); + this.labelData = label; } /* @@ -39,6 +32,6 @@ public class CxxDecisionArc extends DecisionArc { */ @Override public String toString() { - return label.getRawSignature(); + return labelData.getRawSignature()+":"; } } diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxNodeFactory.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxNodeFactory.java index 44d26be2e1b..1bea3e1059c 100644 --- a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxNodeFactory.java +++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxNodeFactory.java @@ -13,6 +13,7 @@ package org.eclipse.cdt.codan.core.cxx.internal.model.cfg; import org.eclipse.cdt.codan.internal.core.cfg.AbstractBasicBlock; import org.eclipse.cdt.codan.provisional.core.model.cfg.IDecisionNode; import org.eclipse.cdt.codan.provisional.core.model.cfg.IExitNode; +import org.eclipse.cdt.codan.provisional.core.model.cfg.ILabeledNode; import org.eclipse.cdt.codan.provisional.core.model.cfg.INodeFactory; import org.eclipse.cdt.codan.provisional.core.model.cfg.IPlainNode; import org.eclipse.cdt.codan.provisional.core.model.cfg.NodeFactory; @@ -37,6 +38,7 @@ public class CxxNodeFactory extends NodeFactory implements INodeFactory { public IExitNode createExitNode() { return new CxxExitNode(); } + public CxxPlainNode createPlainNode(IASTNode ast) { IPlainNode node = createPlainNode(); ((AbstractBasicBlock) node).setData(ast); @@ -48,9 +50,20 @@ public class CxxNodeFactory extends NodeFactory implements INodeFactory { ((AbstractBasicBlock) node).setData(ast); return (CxxDecisionNode) node; } + public CxxExitNode createExitNode(IASTNode ast) { IExitNode node = createExitNode(); ((AbstractBasicBlock) node).setData(ast); return (CxxExitNode) node; - } + } + + /** + * @param caseSt + * @return + */ + public ILabeledNode createLabeledNode(IASTNode caseSt) { + ILabeledNode node = createLabeledNode(caseSt.getRawSignature()); + ((AbstractBasicBlock) node).setData(caseSt); + return node; + } } |