Skip to content

Commit 4378da4

Browse files
committed
Binary: Add IR for 'dup' instructions.
1 parent cc4bbc2 commit 4378da4

3 files changed

Lines changed: 51 additions & 2 deletions

File tree

binary/ql/lib/semmle/code/binary/ast/ir/internal/Instruction0/TempVariableTag.qll

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ newtype TTempVariableTag =
3131
CilLoadArgVarTag() or
3232
CilLdindVarTag() or
3333
CilNewObjInitVarTag() or
34-
CilNewObjCallExternalVarTag()
34+
CilNewObjCallExternalVarTag() or
35+
CilDupVarTag()
3536

3637
class TempVariableTag extends TTempVariableTag {
3738
string toString() {
@@ -133,5 +134,8 @@ class TempVariableTag extends TTempVariableTag {
133134
or
134135
this = CilNewObjCallExternalVarTag() and
135136
result = "newobj_ext"
137+
or
138+
this = CilDupVarTag() and
139+
result = "dup"
136140
}
137141
}

binary/ql/lib/semmle/code/binary/ast/ir/internal/Instruction0/TranslatedElement.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,8 @@ newtype TTranslatedElement =
133133
shouldTranslateCilInstr(stind)
134134
} or
135135
TTranslatedCilType(Raw::CilType type) { shouldTranslatedCilType(type) } or
136-
TTranslatedNewObject(Raw::CilNewobj newObj) { shouldTranslateCilInstr(newObj) }
136+
TTranslatedNewObject(Raw::CilNewobj newObj) { shouldTranslateCilInstr(newObj) } or
137+
TTranslatedDup(Raw::CilDup dup) { shouldTranslateCilInstr(dup) }
137138

138139
TranslatedElement getTranslatedElement(Raw::Element raw) {
139140
result.getRawElement() = raw and

binary/ql/lib/semmle/code/binary/ast/ir/internal/Instruction0/TranslatedInstruction.qll

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2505,3 +2505,47 @@ class TranslatedNewObject extends TranslatedCilInstruction, TTranslatedNewObject
25052505
.getStackElement(i + instr.getNumberOfArguments())
25062506
}
25072507
}
2508+
2509+
class TranslatedDup extends TranslatedCilInstruction, TTranslatedDup {
2510+
override Raw::CilDup instr;
2511+
2512+
TranslatedDup() { this = TTranslatedDup(instr) }
2513+
2514+
final override predicate hasInstruction(
2515+
Opcode opcode, InstructionTag tag, Option<Variable>::Option v
2516+
) {
2517+
opcode instanceof Opcode::Copy and
2518+
tag = SingleTag() and
2519+
v.asSome() = this.getTempVariable(CilDupVarTag())
2520+
}
2521+
2522+
override predicate hasTempVariable(TempVariableTag tag) { tag = CilDupVarTag() }
2523+
2524+
override predicate producesResult() { any() }
2525+
2526+
override Variable getVariableOperand(InstructionTag tag, OperandTag operandTag) {
2527+
tag = SingleTag() and
2528+
operandTag instanceof UnaryTag and
2529+
result = getTranslatedCilInstruction(instr.getABackwardPredecessor()).getStackElement(0)
2530+
}
2531+
2532+
override Instruction getChildSuccessor(TranslatedElement child, SuccessorType succType) { none() }
2533+
2534+
override Instruction getSuccessor(InstructionTag tag, SuccessorType succType) {
2535+
tag = SingleTag() and
2536+
succType instanceof DirectSuccessor and
2537+
result = getTranslatedInstruction(instr.getASuccessor()).getEntry()
2538+
}
2539+
2540+
override Instruction getEntry() { result = this.getInstruction(SingleTag()) }
2541+
2542+
override Variable getResultVariable() { result = this.getTempVariable(CilDupVarTag()) }
2543+
2544+
final override Variable getStackElement(int i) {
2545+
i = 0 and
2546+
result = this.getInstruction(SingleTag()).getResultVariable()
2547+
or
2548+
i > 0 and
2549+
result = getTranslatedCilInstruction(instr.getABackwardPredecessor()).getStackElement(i - 1)
2550+
}
2551+
}

0 commit comments

Comments
 (0)