diff options
author | Alena Laskavaia | 2010-03-30 03:04:48 +0000 |
---|---|---|
committer | Alena Laskavaia | 2010-03-30 03:04:48 +0000 |
commit | 2edd020c84fcf3f229c068c4cfb3755554c1701d (patch) | |
tree | 4af181a12f876af871fcc7fc57252a4d69731011 /codan/org.eclipse.cdt.codan.core.cxx | |
parent | 113c52b20c761c5de7334f6e6f35ee8492cd5154 (diff) | |
download | org.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')
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) |