1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-06 17:26:01 +02:00

- added cople more c stmt to cfg builder

This commit is contained in:
Alena Laskavaia 2010-04-17 02:28:32 +00:00
parent 5a5d22c50d
commit d540bb4801

View file

@ -39,10 +39,13 @@ import org.eclipse.cdt.core.dom.ast.IASTGotoStatement;
import org.eclipse.cdt.core.dom.ast.IASTIfStatement; import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
import org.eclipse.cdt.core.dom.ast.IASTLabelStatement; import org.eclipse.cdt.core.dom.ast.IASTLabelStatement;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTNullStatement;
import org.eclipse.cdt.core.dom.ast.IASTProblemStatement;
import org.eclipse.cdt.core.dom.ast.IASTReturnStatement; import org.eclipse.cdt.core.dom.ast.IASTReturnStatement;
import org.eclipse.cdt.core.dom.ast.IASTStatement; import org.eclipse.cdt.core.dom.ast.IASTStatement;
import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement; import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement;
import org.eclipse.cdt.core.dom.ast.IASTWhileStatement; import org.eclipse.cdt.core.dom.ast.IASTWhileStatement;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousStatement;
/** /**
* TODO: add description * TODO: add description
@ -91,7 +94,8 @@ public class ControlFlowGraphBuilder {
prev = last; prev = last;
} }
} else if (body instanceof IASTExpressionStatement } else if (body instanceof IASTExpressionStatement
|| body instanceof IASTDeclarationStatement) { || body instanceof IASTDeclarationStatement
|| body instanceof IASTNullStatement) {
CxxPlainNode node = factory.createPlainNode(body); CxxPlainNode node = factory.createPlainNode(body);
addOutgoing(prev, node); addOutgoing(prev, node);
return node; return node;
@ -134,19 +138,29 @@ public class ControlFlowGraphBuilder {
} }
return createSubGraph(conn, ast.getNestedStatement()); return createSubGraph(conn, ast.getNestedStatement());
} else if (body instanceof IASTGotoStatement) { } else if (body instanceof IASTGotoStatement) {
IASTGotoStatement ast = (IASTGotoStatement)body; IASTGotoStatement ast = (IASTGotoStatement) body;
String labelName = ast.getName().toString(); String labelName = ast.getName().toString();
IConnectorNode conn; IConnectorNode conn;
IBranchNode labNode = (IBranchNode) labels.get(labelName); IBranchNode labNode = (IBranchNode) labels.get(labelName);
if (labNode!=null) { if (labNode != null) {
conn = (IConnectorNode) labNode.getOutgoing(); conn = (IConnectorNode) labNode.getOutgoing();
} else { } else {
conn = createLabelNodes(null, labelName); conn = createLabelNodes(null, labelName);
} }
IJumpNode gotoNode = factory.createJumpNode(); IJumpNode gotoNode = factory.createJumpNode();
((JumpNode) gotoNode).setJump(conn, labNode!=null); ((JumpNode) gotoNode).setJump(conn, labNode != null);
addOutgoing(prev, gotoNode); addOutgoing(prev, gotoNode);
return gotoNode; return gotoNode;
} else if (body instanceof IASTProblemStatement) {
System.err.println("problem");
CxxPlainNode node = factory.createPlainNode(body);
addOutgoing(prev, node);
return node;
} else if (body instanceof IASTAmbiguousStatement) {
System.err.println("amb");
} else {
System.err.println("unknown statement for cfg: "+body);
} }
return prev; return prev;
} }
@ -158,7 +172,8 @@ public class ControlFlowGraphBuilder {
*/ */
protected IConnectorNode createLabelNodes(IBasicBlock prev, String labelName) { protected IConnectorNode createLabelNodes(IBasicBlock prev, String labelName) {
IBranchNode branch = factory.createBranchNode(labelName); IBranchNode branch = factory.createBranchNode(labelName);
if (prev!=null) addOutgoing(prev, branch); if (prev != null)
addOutgoing(prev, branch);
labels.put(labelName, branch); labels.put(labelName, branch);
IConnectorNode conn = factory.createConnectorNode(); IConnectorNode conn = factory.createConnectorNode();
addOutgoing(branch, conn); addOutgoing(branch, conn);
@ -221,8 +236,7 @@ public class ControlFlowGraphBuilder {
IASTCaseStatement caseSt = (IASTCaseStatement) elem; IASTCaseStatement caseSt = (IASTCaseStatement) elem;
} }
if (elem instanceof IASTDefaultStatement) { if (elem instanceof IASTDefaultStatement) {
IBranchNode lbl = factory IBranchNode lbl = factory.createBranchNode(IBranchNode.DEFAULT);
.createBranchNode(IBranchNode.DEFAULT);
if (!(prev instanceof IExitNode) && prev != switchNode) if (!(prev instanceof IExitNode) && prev != switchNode)
addOutgoing(prev, lbl); addOutgoing(prev, lbl);
addOutgoing(switchNode, lbl); addOutgoing(switchNode, lbl);