mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
SSA: Remove the need for ExitBasicBlock in SSA.
This commit is contained in:
@@ -769,8 +769,4 @@ module InputSigCommon {
|
|||||||
BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { result.immediatelyDominates(bb) }
|
BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { result.immediatelyDominates(bb) }
|
||||||
|
|
||||||
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
|
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
|
||||||
|
|
||||||
class ExitBasicBlock extends BasicBlock {
|
|
||||||
ExitBasicBlock() { this.getLastInstruction() instanceof ExitFunctionInstruction }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ module PreSsa {
|
|||||||
|
|
||||||
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
|
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
|
||||||
|
|
||||||
class ExitBasicBlock extends BasicBlock {
|
private class ExitBasicBlock extends BasicBlock {
|
||||||
ExitBasicBlock() { scopeLast(_, this.getLastElement(), _) }
|
ExitBasicBlock() { scopeLast(_, this.getLastElement(), _) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,8 +55,6 @@ module BaseSsa {
|
|||||||
|
|
||||||
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
|
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
|
||||||
|
|
||||||
class ExitBasicBlock extends BasicBlock, ControlFlow::BasicBlocks::ExitBlock { }
|
|
||||||
|
|
||||||
class SourceVariable = PreSsa::SimpleLocalScopeVariable;
|
class SourceVariable = PreSsa::SimpleLocalScopeVariable;
|
||||||
|
|
||||||
predicate variableWrite(BasicBlock bb, int i, SourceVariable v, boolean certain) {
|
predicate variableWrite(BasicBlock bb, int i, SourceVariable v, boolean certain) {
|
||||||
|
|||||||
@@ -17,8 +17,6 @@ private module SsaInput implements SsaImplCommon::InputSig<Location> {
|
|||||||
|
|
||||||
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
|
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
|
||||||
|
|
||||||
class ExitBasicBlock extends BasicBlock, ControlFlow::BasicBlocks::ExitBlock { }
|
|
||||||
|
|
||||||
class SourceVariable = Ssa::SourceVariable;
|
class SourceVariable = Ssa::SourceVariable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -240,8 +240,6 @@ module VariableCaptureConfig implements InputSig<js::DbLocation> {
|
|||||||
BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { result = bb.getImmediateDominator() }
|
BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { result = bb.getImmediateDominator() }
|
||||||
|
|
||||||
predicate entryBlock(BasicBlock bb) { bb instanceof js::EntryBasicBlock }
|
predicate entryBlock(BasicBlock bb) { bb instanceof js::EntryBasicBlock }
|
||||||
|
|
||||||
predicate exitBlock(BasicBlock bb) { bb.getLastNode() instanceof js::ControlFlowExitNode }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module VariableCaptureOutput = Flow<js::DbLocation, VariableCaptureConfig>;
|
module VariableCaptureOutput = Flow<js::DbLocation, VariableCaptureConfig>;
|
||||||
|
|||||||
@@ -14,10 +14,6 @@ module SsaConfig implements InputSig<js::DbLocation> {
|
|||||||
|
|
||||||
class BasicBlock = js::BasicBlock;
|
class BasicBlock = js::BasicBlock;
|
||||||
|
|
||||||
class ExitBasicBlock extends BasicBlock {
|
|
||||||
ExitBasicBlock() { this.isExitBlock() }
|
|
||||||
}
|
|
||||||
|
|
||||||
class SourceVariable extends LocalVariableOrThis {
|
class SourceVariable extends LocalVariableOrThis {
|
||||||
SourceVariable() { not this.isCaptured() }
|
SourceVariable() { not this.isCaptured() }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,8 +18,6 @@ module SsaInput implements SsaImplCommon::InputSig<Location> {
|
|||||||
|
|
||||||
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
|
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
|
||||||
|
|
||||||
class ExitBasicBlock extends BasicBlock, BasicBlocks::ExitBasicBlock { }
|
|
||||||
|
|
||||||
class SourceVariable = LocalVariable;
|
class SourceVariable = LocalVariable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -47,8 +47,6 @@ module SsaInput implements SsaImplCommon::InputSig<Location> {
|
|||||||
|
|
||||||
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
|
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
|
||||||
|
|
||||||
class ExitBasicBlock = BasicBlocks::ExitBasicBlock;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A variable amenable to SSA construction.
|
* A variable amenable to SSA construction.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -67,9 +67,6 @@ signature module InputSig<LocationSig Location> {
|
|||||||
/** Holds if `bb` is a control-flow entry point. */
|
/** Holds if `bb` is a control-flow entry point. */
|
||||||
default predicate entryBlock(BasicBlock bb) { not exists(getImmediateBasicBlockDominator(bb)) }
|
default predicate entryBlock(BasicBlock bb) { not exists(getImmediateBasicBlockDominator(bb)) }
|
||||||
|
|
||||||
/** Holds if `bb` is a control-flow exit point. */
|
|
||||||
default predicate exitBlock(BasicBlock bb) { not exists(getABasicBlockSuccessor(bb)) }
|
|
||||||
|
|
||||||
/** A variable that is captured in a closure. */
|
/** A variable that is captured in a closure. */
|
||||||
class CapturedVariable {
|
class CapturedVariable {
|
||||||
/** Gets a textual representation of this variable. */
|
/** Gets a textual representation of this variable. */
|
||||||
@@ -699,10 +696,6 @@ module Flow<LocationSig Location, InputSig<Location> Input> implements OutputSig
|
|||||||
result = Input::getABasicBlockSuccessor(bb)
|
result = Input::getABasicBlockSuccessor(bb)
|
||||||
}
|
}
|
||||||
|
|
||||||
class ExitBasicBlock extends BasicBlock {
|
|
||||||
ExitBasicBlock() { exitBlock(this) }
|
|
||||||
}
|
|
||||||
|
|
||||||
class SourceVariable = CaptureContainer;
|
class SourceVariable = CaptureContainer;
|
||||||
|
|
||||||
predicate variableWrite(BasicBlock bb, int i, SourceVariable cc, boolean certain) {
|
predicate variableWrite(BasicBlock bb, int i, SourceVariable cc, boolean certain) {
|
||||||
|
|||||||
@@ -60,12 +60,6 @@ signature module InputSig<LocationSig Location> {
|
|||||||
/** Gets an immediate successor of basic block `bb`, if any. */
|
/** Gets an immediate successor of basic block `bb`, if any. */
|
||||||
BasicBlock getABasicBlockSuccessor(BasicBlock bb);
|
BasicBlock getABasicBlockSuccessor(BasicBlock bb);
|
||||||
|
|
||||||
/**
|
|
||||||
* An exit basic block, that is, a basic block whose last node is
|
|
||||||
* an exit node.
|
|
||||||
*/
|
|
||||||
class ExitBasicBlock extends BasicBlock;
|
|
||||||
|
|
||||||
/** A variable that can be SSA converted. */
|
/** A variable that can be SSA converted. */
|
||||||
class SourceVariable {
|
class SourceVariable {
|
||||||
/** Gets a textual representation of this variable. */
|
/** Gets a textual representation of this variable. */
|
||||||
@@ -855,6 +849,9 @@ module Make<LocationSig Location, InputSig<Location> Input> {
|
|||||||
lastRefRedef(inp, _, _, def)
|
lastRefRedef(inp, _, _, def)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Holds if `bb` is a control-flow exit point. */
|
||||||
|
private predicate exitBlock(BasicBlock bb) { not exists(getABasicBlockSuccessor(bb)) }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NB: If this predicate is exposed, it should be cached.
|
* NB: If this predicate is exposed, it should be cached.
|
||||||
*
|
*
|
||||||
@@ -873,7 +870,7 @@ module Make<LocationSig Location, InputSig<Location> Input> {
|
|||||||
lastSsaRefExt(def, _, bb, i) and
|
lastSsaRefExt(def, _, bb, i) and
|
||||||
(
|
(
|
||||||
// Can reach exit directly
|
// Can reach exit directly
|
||||||
bb instanceof ExitBasicBlock
|
exitBlock(bb)
|
||||||
or
|
or
|
||||||
// Can reach a block using one or more steps, where `def` is no longer live
|
// Can reach a block using one or more steps, where `def` is no longer live
|
||||||
varBlockReachesExitExt(def, bb)
|
varBlockReachesExitExt(def, bb)
|
||||||
@@ -893,7 +890,7 @@ module Make<LocationSig Location, InputSig<Location> Input> {
|
|||||||
lastSsaRef(def, _, bb, i) and
|
lastSsaRef(def, _, bb, i) and
|
||||||
(
|
(
|
||||||
// Can reach exit directly
|
// Can reach exit directly
|
||||||
bb instanceof ExitBasicBlock
|
exitBlock(bb)
|
||||||
or
|
or
|
||||||
// Can reach a block using one or more steps, where `def` is no longer live
|
// Can reach a block using one or more steps, where `def` is no longer live
|
||||||
varBlockReachesExit(def, bb)
|
varBlockReachesExit(def, bb)
|
||||||
|
|||||||
@@ -21,8 +21,6 @@ module Ssa {
|
|||||||
|
|
||||||
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
|
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
|
||||||
|
|
||||||
class ExitBasicBlock = BasicBlocks::ExitBasicBlock;
|
|
||||||
|
|
||||||
private newtype TSourceVariable =
|
private newtype TSourceVariable =
|
||||||
TNormalSourceVariable(VarDecl v) or
|
TNormalSourceVariable(VarDecl v) or
|
||||||
TKeyPathSourceVariable(EntryNode entry) { entry.getScope() instanceof KeyPathExpr }
|
TKeyPathSourceVariable(EntryNode entry) { entry.getScope() instanceof KeyPathExpr }
|
||||||
|
|||||||
Reference in New Issue
Block a user