Skip to content

Commit 7b8c084

Browse files
committed
Make the mem2ssa variables local variables.
1 parent 750129d commit 7b8c084

1 file changed

Lines changed: 43 additions & 62 deletions

File tree

binary/ql/lib/semmle/code/binary/ast/ir/internal/Instruction1/Instruction1.qll

Lines changed: 43 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,23 @@ module InstructionInput implements Transform<Instruction0>::TransformInputSig {
3333
string toString() { result = "SingleTag" }
3434
}
3535

36-
class VariableTag = Void;
36+
class TempVariableTag = Void;
3737

38-
private newtype TLocalVariableTag = MemToSsaVarTag()
38+
private newtype TLocalVariableTag =
39+
MemToSsaVarTag(int offset) {
40+
offset = getLoadOffset(_)
41+
or
42+
offset = getStoreOffset(_)
43+
}
3944

4045
class LocalVariableTag extends TLocalVariableTag {
41-
string toString() { result = "mem2ssa" }
46+
string toString() {
47+
exists(int offset | this = MemToSsaVarTag(offset) |
48+
if offset < 0
49+
then result = "v_neg" + (-offset).toString()
50+
else result = "v" + offset.toString()
51+
)
52+
}
4253
}
4354

4455
private newtype TTranslatedElementTagPair =
@@ -81,21 +92,21 @@ module InstructionInput implements Transform<Instruction0>::TransformInputSig {
8192
}
8293

8394
private newtype TTranslatedElementVariablePair =
84-
MkTranslatedElementVariablePair(TranslatedElement te, VariableTag tag) {
95+
MkTranslatedElementVariablePair(TranslatedElement te, TempVariableTag tag) {
8596
te.hasTempVariable(tag)
8697
}
8798

8899
class TranslatedElementVariablePair extends TTranslatedElementVariablePair {
89100
TranslatedElement te;
90-
VariableTag tag;
101+
TempVariableTag tag;
91102

92103
TranslatedElementVariablePair() { this = MkTranslatedElementVariablePair(te, tag) }
93104

94105
string toString() { none() }
95106

96107
TranslatedElement getTranslatedElement() { result = te }
97108

98-
VariableTag getVariableTag() { result = tag }
109+
TempVariableTag getVariableTag() { result = tag }
99110
}
100111

101112
// ------------------------------------------------
@@ -265,15 +276,12 @@ module InstructionInput implements Transform<Instruction0>::TransformInputSig {
265276
}
266277

267278
EitherVariableOrTranslatedElementVariablePair getOperandVariable(Instruction0::Operand op) {
268-
exists(
269-
Ssa::Definition def, Instruction0::LoadInstruction load, Instruction0::Function f, int offset
270-
|
279+
exists(Ssa::Definition def, Instruction0::LoadInstruction load, Instruction0::Function f |
271280
def.getInstruction() = load and
272281
def.getARead() = op and
273282
f = load.getEnclosingFunction() and
274-
offset = getLoadOffset(load) and
275283
result.asRight().asRight().getFunction() = f and
276-
result.asRight().asRight().getLocalVariableTag() = MemToSsaVarTag()
284+
result.asRight().asRight().getLocalVariableTag() = MemToSsaVarTag(getLoadOffset(load))
277285
)
278286
}
279287

@@ -308,7 +316,7 @@ module InstructionInput implements Transform<Instruction0>::TransformInputSig {
308316
none()
309317
}
310318

311-
Instruction0::Function getEnclosingFunction() { none() }
319+
abstract Instruction0::Function getEnclosingFunction();
312320

313321
predicate hasJumpCondition(InstructionTag tag, ConditionKind kind) { none() }
314322

@@ -331,53 +339,6 @@ module InstructionInput implements Transform<Instruction0>::TransformInputSig {
331339
abstract Either<Instruction0::Instruction, Instruction0::Operand>::Either getRawElement();
332340
}
333341

334-
private class TranslatedVariable extends TranslatedElement {
335-
Instruction0::Function f;
336-
int offset;
337-
338-
TranslatedVariable() { this = TTranslatedVariable(f, offset) }
339-
340-
override EitherInstructionTranslatedElementTagPair getSuccessor(
341-
InstructionTag tag, SuccessorType succType
342-
) {
343-
none()
344-
}
345-
346-
override EitherInstructionTranslatedElementTagPair getInstructionSuccessor(
347-
Instruction0::Instruction i, SuccessorType succType
348-
) {
349-
none()
350-
}
351-
352-
override predicate producesResult() { none() }
353-
354-
override EitherVariableOrTranslatedElementVariablePair getVariableOperand(
355-
InstructionTag tag, OperandTag operandTag
356-
) {
357-
none()
358-
}
359-
360-
override predicate hasLocalVariable(LocalVariableTag tag) { tag = MemToSsaVarTag() }
361-
362-
override predicate hasInstruction(
363-
Opcode opcode, InstructionTag tag, OptionEitherVariableOrTranslatedElementPair v
364-
) {
365-
none()
366-
}
367-
368-
override string toString() { result = "TranslatedVariable at offset " + offset.toString() }
369-
370-
override Either<Instruction0::Instruction, Instruction0::Operand>::Either getRawElement() {
371-
none()
372-
}
373-
374-
final override string getDumpId() {
375-
if offset < 0
376-
then result = "v_neg" + (-offset).toString()
377-
else result = "v" + offset.toString()
378-
}
379-
}
380-
381342
abstract class TranslatedInstruction extends TranslatedElement {
382343
Instruction0::Instruction instr;
383344

@@ -386,8 +347,6 @@ module InstructionInput implements Transform<Instruction0>::TransformInputSig {
386347
}
387348

388349
abstract EitherInstructionTranslatedElementTagPair getEntry();
389-
390-
final override string getDumpId() { none() }
391350
}
392351

393352
private class TranslatedLoadInstruction extends TranslatedInstruction {
@@ -424,7 +383,17 @@ module InstructionInput implements Transform<Instruction0>::TransformInputSig {
424383

425384
override string toString() { result = "TranslatedLoadInstruction" }
426385

386+
final override predicate hasLocalVariable(LocalVariableTag tag) {
387+
tag = MemToSsaVarTag(getLoadOffset(instr))
388+
}
389+
390+
final override Instruction0::Function getEnclosingFunction() {
391+
result = instr.getEnclosingFunction()
392+
}
393+
427394
final override EitherInstructionTranslatedElementTagPair getEntry() { none() }
395+
396+
final override string getDumpId() { result = instr.getResultVariable().toString() } // TODO: Don't use toString
428397
}
429398

430399
private class TranslatedStoreInstruction extends TranslatedInstruction {
@@ -459,18 +428,30 @@ module InstructionInput implements Transform<Instruction0>::TransformInputSig {
459428
result.asLeft() = instr.getValueOperand().getVariable()
460429
}
461430

431+
final override Instruction0::Function getEnclosingFunction() {
432+
result = instr.getEnclosingFunction()
433+
}
434+
435+
final override predicate hasLocalVariable(LocalVariableTag tag) {
436+
tag = MemToSsaVarTag(getStoreOffset(instr))
437+
}
438+
462439
override predicate hasInstruction(
463440
Opcode opcode, InstructionTag tag, OptionEitherVariableOrTranslatedElementPair v
464441
) {
465442
opcode instanceof Copy and
466443
tag = SingleTag() and
467444
v.asSome().asRight().asRight().getFunction() = instr.getEnclosingFunction() and
468-
v.asSome().asRight().asRight().getLocalVariableTag() = MemToSsaVarTag()
445+
v.asSome().asRight().asRight().getLocalVariableTag() = MemToSsaVarTag(getStoreOffset(instr))
469446
}
470447

471448
override string toString() { result = "TranslatedStoreInstruction" }
472449

473450
final override EitherInstructionTranslatedElementTagPair getEntry() { none() }
451+
452+
final override string getDumpId() {
453+
result = instr.getAddressOperand().getVariable().toString()
454+
} // TODO: Don't use toString
474455
}
475456

476457
abstract class TranslatedOperand extends TranslatedElement {

0 commit comments

Comments
 (0)