mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
BasicBlock: Replace entryBlock predicate with subclass.
This commit is contained in:
@@ -295,14 +295,16 @@ module IRCfg implements BB::CfgSig<Language::Location> {
|
||||
predicate postDominates(BasicBlock bb) { super.postDominates(bb) }
|
||||
}
|
||||
|
||||
class EntryBasicBlock extends BasicBlock {
|
||||
EntryBasicBlock() { isEntryBlock(this) }
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
|
||||
bb1.getASuccessor() = bb2 and
|
||||
bb1 = bb2.getImmediateDominator() and
|
||||
forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
|
||||
}
|
||||
|
||||
predicate entryBlock(BasicBlock bb) { isEntryBlock(bb) }
|
||||
}
|
||||
|
||||
cached
|
||||
|
||||
@@ -295,14 +295,16 @@ module IRCfg implements BB::CfgSig<Language::Location> {
|
||||
predicate postDominates(BasicBlock bb) { super.postDominates(bb) }
|
||||
}
|
||||
|
||||
class EntryBasicBlock extends BasicBlock {
|
||||
EntryBasicBlock() { isEntryBlock(this) }
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
|
||||
bb1.getASuccessor() = bb2 and
|
||||
bb1 = bb2.getImmediateDominator() and
|
||||
forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
|
||||
}
|
||||
|
||||
predicate entryBlock(BasicBlock bb) { isEntryBlock(bb) }
|
||||
}
|
||||
|
||||
cached
|
||||
|
||||
@@ -295,14 +295,16 @@ module IRCfg implements BB::CfgSig<Language::Location> {
|
||||
predicate postDominates(BasicBlock bb) { super.postDominates(bb) }
|
||||
}
|
||||
|
||||
class EntryBasicBlock extends BasicBlock {
|
||||
EntryBasicBlock() { isEntryBlock(this) }
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
|
||||
bb1.getASuccessor() = bb2 and
|
||||
bb1 = bb2.getImmediateDominator() and
|
||||
forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
|
||||
}
|
||||
|
||||
predicate entryBlock(BasicBlock bb) { isEntryBlock(bb) }
|
||||
}
|
||||
|
||||
cached
|
||||
|
||||
@@ -341,6 +341,8 @@ final class ConditionBlock extends BasicBlock, BasicBlocksImpl::ConditionBasicBl
|
||||
|
||||
private class BasicBlockAlias = BasicBlock;
|
||||
|
||||
private class EntryBasicBlockAlias = EntryBasicBlock;
|
||||
|
||||
module Cfg implements BB::CfgSig<Location> {
|
||||
class ControlFlowNode = ControlFlow::Node;
|
||||
|
||||
@@ -348,9 +350,9 @@ module Cfg implements BB::CfgSig<Location> {
|
||||
|
||||
class BasicBlock = BasicBlockAlias;
|
||||
|
||||
class EntryBasicBlock = EntryBasicBlockAlias;
|
||||
|
||||
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
|
||||
BasicBlocksImpl::dominatingEdge(bb1, bb2)
|
||||
}
|
||||
|
||||
predicate entryBlock(BasicBlock bb) { bb instanceof EntryBasicBlock }
|
||||
}
|
||||
|
||||
@@ -167,9 +167,11 @@ module PreCfg implements BB::CfgSig<Location> {
|
||||
|
||||
class BasicBlock = PreBasicBlock;
|
||||
|
||||
class EntryBasicBlock extends BasicBlock {
|
||||
EntryBasicBlock() { entryBB(this) }
|
||||
}
|
||||
|
||||
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
|
||||
conditionBlockImmediatelyControls(bb1, bb2, _)
|
||||
}
|
||||
|
||||
predicate entryBlock(BasicBlock bb) { entryBB(bb) }
|
||||
}
|
||||
|
||||
@@ -165,7 +165,7 @@ module Cfg implements BB::CfgSig<Location> {
|
||||
|
||||
class BasicBlock = BasicBlockAlias;
|
||||
|
||||
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { BbImpl::dominatingEdge(bb1, bb2) }
|
||||
class EntryBasicBlock extends BasicBlock instanceof BbImpl::EntryBasicBlock { }
|
||||
|
||||
predicate entryBlock(BasicBlock bb) { BbImpl::entryBlock(bb) }
|
||||
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { BbImpl::dominatingEdge(bb1, bb2) }
|
||||
}
|
||||
|
||||
@@ -402,13 +402,15 @@ module Public {
|
||||
predicate postDominates(BasicBlock bb) { this.(ReachableBasicBlock).postDominates(bb) }
|
||||
}
|
||||
|
||||
class EntryBasicBlock extends BasicBlock {
|
||||
EntryBasicBlock() { entryBB(this) }
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
|
||||
bb1.getASuccessor() = bb2 and
|
||||
bb1 = bb2.getImmediateDominator() and
|
||||
forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
|
||||
}
|
||||
|
||||
predicate entryBlock(BasicBlock bb) { entryBB(bb) }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1295,12 +1295,14 @@ module Cfg implements BB::CfgSig<Location> {
|
||||
}
|
||||
}
|
||||
|
||||
class EntryBasicBlock extends BasicBlock {
|
||||
EntryBasicBlock() { this.getNode(0).isEntryNode() }
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
|
||||
bb1.getASuccessor() = bb2 and
|
||||
bb1 = bb2.getImmediateDominator() and
|
||||
forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
|
||||
}
|
||||
|
||||
predicate entryBlock(BasicBlock bb) { bb.getNode(0).isEntryNode() }
|
||||
}
|
||||
|
||||
@@ -300,6 +300,8 @@ final class ConditionBlock extends BasicBlock, BasicBlocksImpl::ConditionBasicBl
|
||||
|
||||
private class BasicBlockAlias = BasicBlock;
|
||||
|
||||
private class EntryBasicBlockAlias = EntryBasicBlock;
|
||||
|
||||
private class SuccessorTypeAlias = SuccessorType;
|
||||
|
||||
module Cfg implements BB::CfgSig<Location> {
|
||||
@@ -309,9 +311,9 @@ module Cfg implements BB::CfgSig<Location> {
|
||||
|
||||
class BasicBlock = BasicBlockAlias;
|
||||
|
||||
class EntryBasicBlock = EntryBasicBlockAlias;
|
||||
|
||||
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
|
||||
BasicBlocksImpl::dominatingEdge(bb1, bb2)
|
||||
}
|
||||
|
||||
predicate entryBlock(BasicBlock bb) { bb instanceof EntryBasicBlock }
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ module Cfg implements BB::CfgSig<Location> {
|
||||
|
||||
class BasicBlock = BasicBlocksImpl::BasicBlock;
|
||||
|
||||
predicate dominatingEdge = BasicBlocksImpl::dominatingEdge/2;
|
||||
class EntryBasicBlock = BasicBlocksImpl::EntryBasicBlock;
|
||||
|
||||
predicate entryBlock(BasicBlock bb) { bb instanceof EntryBasicBlock }
|
||||
predicate dominatingEdge = BasicBlocksImpl::dominatingEdge/2;
|
||||
}
|
||||
|
||||
@@ -150,6 +150,12 @@ signature module CfgSig<LocationSig Location> {
|
||||
predicate postDominates(BasicBlock bb);
|
||||
}
|
||||
|
||||
/**
|
||||
* An entry basic block, that is, a basic block whose first node is
|
||||
* an entry node.
|
||||
*/
|
||||
class EntryBasicBlock extends BasicBlock;
|
||||
|
||||
/**
|
||||
* Holds if `bb1` has `bb2` as a direct successor and the edge between `bb1`
|
||||
* and `bb2` is a dominating edge.
|
||||
@@ -164,9 +170,6 @@ signature module CfgSig<LocationSig Location> {
|
||||
* means that the edge `(bb1, bb2)` dominates `bb3`.
|
||||
*/
|
||||
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2);
|
||||
|
||||
/** Holds if `bb` is an entry basic block. */
|
||||
predicate entryBlock(BasicBlock bb);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -365,6 +368,10 @@ module Make<LocationSig Location, InputSig<Location> Input> implements CfgSig<Lo
|
||||
string toString() { result = this.getFirstNode().toString() }
|
||||
}
|
||||
|
||||
class EntryBasicBlock extends BasicBlock {
|
||||
EntryBasicBlock() { nodeIsDominanceEntry(this.getFirstNode()) }
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `bb1` has `bb2` as a direct successor and the edge between `bb1`
|
||||
* and `bb2` is a dominating edge.
|
||||
@@ -401,9 +408,6 @@ module Make<LocationSig Location, InputSig<Location> Input> implements CfgSig<Lo
|
||||
forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
|
||||
}
|
||||
|
||||
/** Holds if `bb` is an entry basic block. */
|
||||
predicate entryBlock(BasicBlock bb) { nodeIsDominanceEntry(bb.getFirstNode()) }
|
||||
|
||||
cached
|
||||
private module Cached {
|
||||
private Node nodeGetAPredecessor(Node node, SuccessorType s) {
|
||||
@@ -477,6 +481,9 @@ module Make<LocationSig Location, InputSig<Location> Input> implements CfgSig<Lo
|
||||
bb2.getFirstNode() = nodeGetASuccessor(bb1.getLastNode(), t)
|
||||
}
|
||||
|
||||
/** Holds if `bb` is an entry basic block. */
|
||||
private predicate entryBlock(EntryBasicBlock bb) { any() }
|
||||
|
||||
/**
|
||||
* Holds if the first node of basic block `succ` is a control flow
|
||||
* successor of the last node of basic block `pred`.
|
||||
|
||||
@@ -628,7 +628,7 @@ module Flow<
|
||||
/** Holds if `cc` needs a definition at the entry of its callable scope. */
|
||||
private predicate entryDef(CaptureContainer cc, BasicBlock bb, int i) {
|
||||
exists(Callable c |
|
||||
Cfg::entryBlock(bb) and
|
||||
bb instanceof Cfg::EntryBasicBlock and
|
||||
pragma[only_bind_out](bb.getEnclosingCallable()) = c and
|
||||
i =
|
||||
min(int j |
|
||||
|
||||
@@ -116,6 +116,8 @@ final class ConditionBlock extends BasicBlock, BasicBlocksImpl::ConditionBasicBl
|
||||
|
||||
private class BasicBlockAlias = BasicBlock;
|
||||
|
||||
private class EntryBasicBlockAlias = EntryBasicBlock;
|
||||
|
||||
private class ControlFlowNodeAlias = ControlFlowNode;
|
||||
|
||||
private class SuccessorTypeAlias = SuccessorType;
|
||||
@@ -127,9 +129,9 @@ module Cfg implements BB::CfgSig<Location> {
|
||||
|
||||
class BasicBlock = BasicBlockAlias;
|
||||
|
||||
class EntryBasicBlock = EntryBasicBlockAlias;
|
||||
|
||||
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
|
||||
BasicBlocksImpl::dominatingEdge(bb1, bb2)
|
||||
}
|
||||
|
||||
predicate entryBlock(BasicBlock bb) { bb instanceof EntryBasicBlock }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user