@@ -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