Skip to content

Commit 7495053

Browse files
committed
C#: Rework DataFlowCallable-to-cfg relation in terms of basic blocks for performance.
1 parent 3931702 commit 7495053

File tree

2 files changed

+27
-24
lines changed

2 files changed

+27
-24
lines changed

csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -210,51 +210,45 @@ class DataFlowCallable extends TDataFlowCallable {
210210
}
211211

212212
pragma[nomagic]
213-
private ControlFlowNode getAMultiBodyEntryNode(BasicBlock bb, int i) {
213+
private BasicBlock getAMultiBodyEntryBlock() {
214214
this.isMultiBodied() and
215215
exists(ControlFlowElement body, Location l |
216216
body = this.asCallable(l).getBody() or
217217
objectInitEntry(this.asCallable(l), body)
218218
|
219219
NearestLocation<NearestBodyLocationInput>::nearestLocation(body, l, _) and
220-
result.isBefore(body)
221-
) and
222-
bb.getNode(i) = result
220+
result.getANode().isBefore(body)
221+
)
223222
}
224223

225224
pragma[nomagic]
226-
private ControlFlowNode getAMultiBodyControlFlowNodePred() {
227-
result = this.getAMultiBodyEntryNode(_, _).getAPredecessor()
225+
private BasicBlock getAMultiBodyControlFlowPred() {
226+
result = this.getAMultiBodyEntryBlock().getAPredecessor()
228227
or
229-
result = this.getAMultiBodyControlFlowNodePred().getAPredecessor()
230-
}
231-
232-
pragma[nomagic]
233-
private ControlFlowNode getAMultiBodyControlFlowNodeSuccSameBasicBlock() {
234-
exists(BasicBlock bb, int i, int j |
235-
exists(this.getAMultiBodyEntryNode(bb, i)) and
236-
result = bb.getNode(j) and
237-
j > i
238-
)
228+
result = this.getAMultiBodyControlFlowPred().getAPredecessor()
239229
}
240230

241231
pragma[nomagic]
242232
private BasicBlock getAMultiBodyBasicBlockSucc() {
243-
result = this.getAMultiBodyEntryNode(_, _).getBasicBlock().getASuccessor()
233+
result = this.getAMultiBodyEntryBlock().getASuccessor()
244234
or
245235
result = this.getAMultiBodyBasicBlockSucc().getASuccessor()
246236
}
247237

248-
pragma[inline]
249-
private ControlFlowNode getAMultiBodyControlFlowNode() {
238+
pragma[nomagic]
239+
private BasicBlock getAMultiBodyBasicBlock() {
250240
result =
251241
[
252-
this.getAMultiBodyEntryNode(_, _), this.getAMultiBodyControlFlowNodePred(),
253-
this.getAMultiBodyControlFlowNodeSuccSameBasicBlock(),
254-
this.getAMultiBodyBasicBlockSucc().getANode()
242+
this.getAMultiBodyEntryBlock(), this.getAMultiBodyControlFlowPred(),
243+
this.getAMultiBodyBasicBlockSucc()
255244
]
256245
}
257246

247+
pragma[inline]
248+
private ControlFlowNode getAMultiBodyControlFlowNode() {
249+
result = this.getAMultiBodyBasicBlock().getANode()
250+
}
251+
258252
/** Gets a control flow node belonging to this callable. */
259253
pragma[inline]
260254
ControlFlowNode getAControlFlowNode() {
@@ -264,6 +258,15 @@ class DataFlowCallable extends TDataFlowCallable {
264258
result.getEnclosingCallable() = this.asCallable(_)
265259
}
266260

261+
/** Gets a basic block belonging to this callable. */
262+
pragma[inline]
263+
BasicBlock getABasicBlock() {
264+
result = this.getAMultiBodyBasicBlock()
265+
or
266+
not this.isMultiBodied() and
267+
result.getEnclosingCallable() = this.asCallable(_)
268+
}
269+
267270
/** Gets the underlying summarized callable, if any. */
268271
FlowSummary::SummarizedCallable asSummarizedCallable() { this = TSummarizedCallable(result) }
269272

csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1212,7 +1212,7 @@ class SsaNode extends NodeImpl, TSsaNode {
12121212
SsaNode() { this = TSsaNode(node) }
12131213

12141214
override DataFlowCallable getEnclosingCallableImpl() {
1215-
result.getAControlFlowNode().getBasicBlock() = node.getBasicBlock()
1215+
result.getABasicBlock() = node.getBasicBlock()
12161216
}
12171217

12181218
override Type getTypeImpl() { result = node.getSourceVariable().getType() }
@@ -1903,7 +1903,7 @@ class CaptureNode extends NodeImpl, TCaptureNode {
19031903
VariableCapture::Flow::SynthesizedCaptureNode getSynthesizedCaptureNode() { result = cn }
19041904

19051905
override DataFlowCallable getEnclosingCallableImpl() {
1906-
result.getAControlFlowNode().getBasicBlock() = cn.getBasicBlock()
1906+
result.getABasicBlock() = cn.getBasicBlock()
19071907
}
19081908

19091909
override Type getTypeImpl() {

0 commit comments

Comments
 (0)