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:
parent
5a5d22c50d
commit
d540bb4801
1 changed files with 21 additions and 7 deletions
|
@ -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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue