Merge pull request #38 from jbj/ir-Instruction-hasUse

Approved by dave-bartolomeo
This commit is contained in:
semmle-qlci
2018-08-10 12:03:26 +01:00
committed by GitHub
8 changed files with 32 additions and 35 deletions

View File

@@ -66,6 +66,13 @@ module InstructionSanity {
count(instr.getOperand(tag)) > 1 and
not tag instanceof UnmodeledUseOperand
}
query predicate operandAcrossFunctions(
Instruction op, Instruction operand, OperandTag tag
) {
operand = op.getOperand(tag) and
operand.getFunctionIR() != op.getFunctionIR()
}
}
/**
@@ -262,8 +269,8 @@ class Instruction extends Construction::TInstruction {
// Register results are always in SSA form.
not hasMemoryResult() or
// An unmodeled result will have a use on the `UnmodeledUse` instruction.
not exists(UnmodeledUseOperand useTag |
hasUse(_, useTag)
not exists(Instruction useInstr, UnmodeledUseOperand useTag |
this = useInstr.getOperand(useTag)
)
}
@@ -296,15 +303,6 @@ class Instruction extends Construction::TInstruction {
final Instruction getAPredecessor() {
result = getPredecessor(_)
}
/**
* Holds if the result of this instruction is consumed by `useInstruction` as
* an operand with tag `useTag`.
*/
final predicate hasUse(Instruction useInstruction, OperandTag useTag) {
useInstruction.getFunctionIR() = funcIR and
this = useInstruction.getOperand(useTag)
}
}
class VariableInstruction extends Instruction {

View File

@@ -160,7 +160,7 @@ predicate operandEscapes(Instruction instr, OperandTag tag) {
predicate resultEscapes(Instruction instr) {
// The result escapes if it has at least one use that escapes.
exists(Instruction useInstr, OperandTag useOperandTag |
instr.hasUse(useInstr, useOperandTag) and
useInstr.getOperand(useOperandTag) = instr and
operandEscapes(useInstr, useOperandTag)
)
}

View File

@@ -66,6 +66,13 @@ module InstructionSanity {
count(instr.getOperand(tag)) > 1 and
not tag instanceof UnmodeledUseOperand
}
query predicate operandAcrossFunctions(
Instruction op, Instruction operand, OperandTag tag
) {
operand = op.getOperand(tag) and
operand.getFunctionIR() != op.getFunctionIR()
}
}
/**
@@ -262,8 +269,8 @@ class Instruction extends Construction::TInstruction {
// Register results are always in SSA form.
not hasMemoryResult() or
// An unmodeled result will have a use on the `UnmodeledUse` instruction.
not exists(UnmodeledUseOperand useTag |
hasUse(_, useTag)
not exists(Instruction useInstr, UnmodeledUseOperand useTag |
this = useInstr.getOperand(useTag)
)
}
@@ -296,15 +303,6 @@ class Instruction extends Construction::TInstruction {
final Instruction getAPredecessor() {
result = getPredecessor(_)
}
/**
* Holds if the result of this instruction is consumed by `useInstruction` as
* an operand with tag `useTag`.
*/
final predicate hasUse(Instruction useInstruction, OperandTag useTag) {
useInstruction.getFunctionIR() = funcIR and
this = useInstruction.getOperand(useTag)
}
}
class VariableInstruction extends Instruction {

View File

@@ -160,7 +160,7 @@ predicate operandEscapes(Instruction instr, OperandTag tag) {
predicate resultEscapes(Instruction instr) {
// The result escapes if it has at least one use that escapes.
exists(Instruction useInstr, OperandTag useOperandTag |
instr.hasUse(useInstr, useOperandTag) and
useInstr.getOperand(useOperandTag) = instr and
operandEscapes(useInstr, useOperandTag)
)
}

View File

@@ -66,6 +66,13 @@ module InstructionSanity {
count(instr.getOperand(tag)) > 1 and
not tag instanceof UnmodeledUseOperand
}
query predicate operandAcrossFunctions(
Instruction op, Instruction operand, OperandTag tag
) {
operand = op.getOperand(tag) and
operand.getFunctionIR() != op.getFunctionIR()
}
}
/**
@@ -262,8 +269,8 @@ class Instruction extends Construction::TInstruction {
// Register results are always in SSA form.
not hasMemoryResult() or
// An unmodeled result will have a use on the `UnmodeledUse` instruction.
not exists(UnmodeledUseOperand useTag |
hasUse(_, useTag)
not exists(Instruction useInstr, UnmodeledUseOperand useTag |
this = useInstr.getOperand(useTag)
)
}
@@ -296,15 +303,6 @@ class Instruction extends Construction::TInstruction {
final Instruction getAPredecessor() {
result = getPredecessor(_)
}
/**
* Holds if the result of this instruction is consumed by `useInstruction` as
* an operand with tag `useTag`.
*/
final predicate hasUse(Instruction useInstruction, OperandTag useTag) {
useInstruction.getFunctionIR() = funcIR and
this = useInstruction.getOperand(useTag)
}
}
class VariableInstruction extends Instruction {

View File

@@ -1,3 +1,4 @@
missingOperand
unexpectedOperand
duplicateOperand
operandAcrossFunctions

View File

@@ -1,3 +1,4 @@
missingOperand
unexpectedOperand
duplicateOperand
operandAcrossFunctions

View File

@@ -1,3 +1,4 @@
missingOperand
unexpectedOperand
duplicateOperand
operandAcrossFunctions