Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlena Laskavaia2010-04-14 02:55:44 +0000
committerAlena Laskavaia2010-04-14 02:55:44 +0000
commitee3a2444d159e281356c6e0204c680dd3437b187 (patch)
treec20b50caece09c8640b51d6bf5b67094068fdbec /codan/org.eclipse.cdt.codan.core.cxx
parentd346fcd041f3a1e8ab65bfae3d48f2dcde2e21bc (diff)
downloadorg.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.java113
-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.java15
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;
+ }
}

Back to the top