Skip to content

Commit c8a3bbc

Browse files
committed
C++: Sync files.
1 parent 0c382eb commit c8a3bbc

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Instruction
77
private import internal.IRBlockImports as Imports
88
import Imports::EdgeKind
99
private import Cached
10+
private import codeql.controlflow.BasicBlock as BB
1011

1112
/**
1213
* Holds if `block` is a block in `func` and `sortOverride`, `sortKey1`, and `sortKey2` are the
@@ -263,6 +264,45 @@ private predicate isEntryBlock(TIRBlock block) {
263264
block = MkIRBlock(any(EnterFunctionInstruction enter))
264265
}
265266

267+
module IRCfg implements BB::CfgSig<Language::Location> {
268+
class ControlFlowNode = Instruction;
269+
270+
class SuccessorType = EdgeKind;
271+
272+
class BasicBlock extends IRBlock {
273+
ControlFlowNode getNode(int i) { result = this.getInstruction(i) }
274+
275+
ControlFlowNode getLastNode() { result = super.getLastInstruction() }
276+
277+
int length() { result = this.getInstructionCount() }
278+
279+
BasicBlock getASuccessor() { result = super.getASuccessor() }
280+
281+
BasicBlock getASuccessor(SuccessorType t) { result = super.getSuccessor(t) }
282+
283+
predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) }
284+
285+
predicate dominates(BasicBlock bb) { super.dominates(bb) }
286+
287+
BasicBlock getImmediateDominator() { result.immediatelyDominates(this) }
288+
289+
predicate inDominanceFrontier(BasicBlock df) { super.dominanceFrontier() = df }
290+
291+
predicate strictlyPostDominates(BasicBlock bb) { super.strictlyPostDominates(bb) }
292+
293+
predicate postDominates(BasicBlock bb) { super.postDominates(bb) }
294+
}
295+
296+
pragma[nomagic]
297+
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
298+
bb1.getASuccessor() = bb2 and
299+
bb1 = bb2.getImmediateDominator() and
300+
forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
301+
}
302+
303+
predicate entryBlock(BasicBlock bb) { isEntryBlock(bb) }
304+
}
305+
266306
cached
267307
private module Cached {
268308
cached

cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Instruction
77
private import internal.IRBlockImports as Imports
88
import Imports::EdgeKind
99
private import Cached
10+
private import codeql.controlflow.BasicBlock as BB
1011

1112
/**
1213
* Holds if `block` is a block in `func` and `sortOverride`, `sortKey1`, and `sortKey2` are the
@@ -263,6 +264,45 @@ private predicate isEntryBlock(TIRBlock block) {
263264
block = MkIRBlock(any(EnterFunctionInstruction enter))
264265
}
265266

267+
module IRCfg implements BB::CfgSig<Language::Location> {
268+
class ControlFlowNode = Instruction;
269+
270+
class SuccessorType = EdgeKind;
271+
272+
class BasicBlock extends IRBlock {
273+
ControlFlowNode getNode(int i) { result = this.getInstruction(i) }
274+
275+
ControlFlowNode getLastNode() { result = super.getLastInstruction() }
276+
277+
int length() { result = this.getInstructionCount() }
278+
279+
BasicBlock getASuccessor() { result = super.getASuccessor() }
280+
281+
BasicBlock getASuccessor(SuccessorType t) { result = super.getSuccessor(t) }
282+
283+
predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) }
284+
285+
predicate dominates(BasicBlock bb) { super.dominates(bb) }
286+
287+
BasicBlock getImmediateDominator() { result.immediatelyDominates(this) }
288+
289+
predicate inDominanceFrontier(BasicBlock df) { super.dominanceFrontier() = df }
290+
291+
predicate strictlyPostDominates(BasicBlock bb) { super.strictlyPostDominates(bb) }
292+
293+
predicate postDominates(BasicBlock bb) { super.postDominates(bb) }
294+
}
295+
296+
pragma[nomagic]
297+
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
298+
bb1.getASuccessor() = bb2 and
299+
bb1 = bb2.getImmediateDominator() and
300+
forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
301+
}
302+
303+
predicate entryBlock(BasicBlock bb) { isEntryBlock(bb) }
304+
}
305+
266306
cached
267307
private module Cached {
268308
cached

0 commit comments

Comments
 (0)