Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlena Laskavaia2010-03-30 03:04:48 +0000
committerAlena Laskavaia2010-03-30 03:04:48 +0000
commit2edd020c84fcf3f229c068c4cfb3755554c1701d (patch)
tree4af181a12f876af871fcc7fc57252a4d69731011 /codan/org.eclipse.cdt.codan.core.cxx
parent113c52b20c761c5de7334f6e6f35ee8492cd5154 (diff)
downloadorg.eclipse.cdt-2edd020c84fcf3f229c068c4cfb3755554c1701d.tar.gz
org.eclipse.cdt-2edd020c84fcf3f229c068c4cfb3755554c1701d.tar.xz
org.eclipse.cdt-2edd020c84fcf3f229c068c4cfb3755554c1701d.zip
- added support for while loop in cfg
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.java27
-rw-r--r--codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxDecisionNode.java61
-rw-r--r--codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxStartNode.java5
3 files changed, 88 insertions, 5 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 dbd1306a1cc..884c1a9a7cb 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
@@ -15,6 +15,7 @@ import java.util.Collection;
import org.eclipse.cdt.codan.internal.core.cfg.AbstractBasicBlock;
import org.eclipse.cdt.codan.internal.core.cfg.ConnectorNode;
import org.eclipse.cdt.codan.internal.core.cfg.DecisionNode;
+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.IExitNode;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
@@ -25,6 +26,7 @@ import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTReturnStatement;
import org.eclipse.cdt.core.dom.ast.IASTStatement;
+import org.eclipse.cdt.core.dom.ast.IASTWhileStatement;
/**
* TODO: add description
@@ -41,7 +43,7 @@ public class ControlFlowGraphBuilder {
*/
public CxxControlFlowGraph build(IASTFunctionDefinition def) {
IASTStatement body = def.getBody();
- start = new CxxStartNode(null);
+ start = new CxxStartNode();
exits = new ArrayList<IExitNode>();
dead = new ArrayList<IBasicBlock>();
IBasicBlock last = createSubGraph(start, body);
@@ -71,7 +73,8 @@ public class ControlFlowGraphBuilder {
addOutgoing(prev, node);
return node;
} else if (body instanceof IASTIfStatement) {
- DecisionNode node = new DecisionNode(prev);
+ DecisionNode node = new CxxDecisionNode(prev,
+ ((IASTIfStatement) body).getConditionExpression());
addOutgoing(prev, node);
ConnectorNode conn = new ConnectorNode();
node.setConnectorNode(conn);
@@ -84,6 +87,26 @@ public class ControlFlowGraphBuilder {
conn.addIncoming(then);
addOutgoing(then, conn);
return conn;
+ } else if (body instanceof IASTWhileStatement) {
+ // add continue connector
+ ConnectorNode nContinue = new ConnectorNode(prev);
+ addOutgoing(prev, nContinue);
+ // decision node
+ CxxDecisionNode decision = new CxxDecisionNode(nContinue,
+ ((IASTWhileStatement) body).getCondition());
+ addOutgoing(nContinue, decision);
+ // add break connector
+ ConnectorNode nBreak = new ConnectorNode(decision);
+ addOutgoing(decision, nBreak);
+ decision.setConnectorNode(nBreak);
+ // create body and jump to continue node
+ IBasicBlock nBody = createSubGraph(decision,
+ ((IASTWhileStatement) body).getBody());
+ JumpNode jumpContinue = new JumpNode(nBody, nContinue, true);
+ addOutgoing(nBody, jumpContinue);
+ // connect with backward link
+ nContinue.addIncoming(jumpContinue);
+ return nBreak;
} else if (body instanceof IASTReturnStatement) {
CxxExitNode node = new CxxExitNode(prev, start, body);
addOutgoing(prev, node);
diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxDecisionNode.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxDecisionNode.java
new file mode 100644
index 00000000000..d6aafa304e0
--- /dev/null
+++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxDecisionNode.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Alena Laskavaia
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Alena Laskavaia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.codan.core.cxx.internal.model.cfg;
+
+import org.eclipse.cdt.codan.internal.core.cfg.DecisionNode;
+import org.eclipse.cdt.codan.provisional.core.model.cfg.IBasicBlock;
+import org.eclipse.cdt.core.dom.ast.IASTNode;
+
+/**
+ * TODO: add description
+ */
+public class CxxDecisionNode extends DecisionNode {
+
+
+ /**
+ * @param prev
+ * @param expression
+ */
+ public CxxDecisionNode(IBasicBlock prev, IASTNode expression) {
+ super(prev);
+ this.setNode(expression);
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return getNode().getRawSignature();
+ }
+
+ /**
+ * @param node the node to set
+ */
+ public void setNode(IASTNode node) {
+ setData(node);
+ }
+
+ /**
+ * @return the node
+ */
+ public IASTNode getNode() {
+ return (IASTNode) getData();
+ }
+ /**
+ * @return
+ */
+ public String toStringData() {
+ if (getNode() == null)
+ return "";
+ return getNode().getRawSignature();
+ }
+}
diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxStartNode.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxStartNode.java
index 012fc825008..29b01b4ea7b 100644
--- a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxStartNode.java
+++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxStartNode.java
@@ -12,7 +12,6 @@
package org.eclipse.cdt.codan.core.cxx.internal.model.cfg;
import org.eclipse.cdt.codan.internal.core.cfg.StartNode;
-import org.eclipse.cdt.codan.provisional.core.model.cfg.IBasicBlock;
/**
* TODO: add description
@@ -22,8 +21,8 @@ public class CxxStartNode extends StartNode {
/**
* @param next
*/
- public CxxStartNode(IBasicBlock next) {
- super(next);
+ public CxxStartNode() {
+ super();
}
/* (non-Javadoc)

Back to the top