@@ -333,40 +333,66 @@ class TranslatedX86Jmp extends TranslatedX86Instruction, TTranslatedX86Jmp {
333333 final override predicate hasInstruction (
334334 Opcode opcode , InstructionTag tag , Option< Variable > :: Option v
335335 ) {
336- tag = SingleTag ( ) and
336+ tag = X86JumpTag ( ) and
337337 opcode instanceof Opcode:: Jump and
338338 v .isNone ( ) // A jump has no result
339+ or
340+ exists ( instr .getTarget ( ) ) and
341+ tag = X86JumpInstrRefTag ( ) and
342+ opcode instanceof Opcode:: InstrRef and
343+ v .asSome ( ) = this .getVariable ( X86JumpInstrRefVarTag ( ) )
339344 }
340345
341346 override predicate producesResult ( ) { any ( ) }
342347
348+ override predicate hasTempVariable ( VariableTag tag ) {
349+ exists ( instr .getTarget ( ) ) and
350+ tag = X86JumpInstrRefVarTag ( )
351+ }
352+
353+ override Instruction getReferencedInstruction ( InstructionTag tag ) {
354+ tag = X86JumpInstrRefTag ( ) and
355+ result = getTranslatedInstruction ( instr .getTarget ( ) ) .getEntry ( )
356+ }
357+
343358 override Variable getVariableOperand ( InstructionTag tag , OperandTag operandTag ) {
344- tag = SingleTag ( ) and
359+ tag = X86JumpTag ( ) and
345360 operandTag = JumpTargetTag ( ) and
346- result = this .getTranslatedOperand ( ) .getResultVariable ( )
361+ if exists ( instr .getTarget ( ) )
362+ then result = this .getInstruction ( X86JumpInstrRefTag ( ) ) .getResultVariable ( )
363+ else result = this .getTranslatedOperand ( ) .getResultVariable ( )
347364 }
348365
349366 TranslatedOperand getTranslatedOperand ( ) { result = getTranslatedOperand ( instr .getOperand ( 0 ) ) }
350367
351368 override Instruction getChildSuccessor ( TranslatedElement child , SuccessorType succType ) {
369+ not exists ( instr .getTarget ( ) ) and
352370 child = this .getTranslatedOperand ( ) and
353371 succType instanceof DirectSuccessor and
354- result = this .getInstruction ( SingleTag ( ) )
372+ result = this .getInstruction ( X86JumpTag ( ) )
355373 }
356374
357375 override Instruction getSuccessor ( InstructionTag tag , SuccessorType succType ) {
358- tag = SingleTag ( ) and
376+ exists ( instr .getTarget ( ) ) and
377+ tag = X86JumpInstrRefTag ( ) and
378+ succType instanceof DirectSuccessor and
379+ result = this .getInstruction ( X86JumpTag ( ) )
380+ or
381+ tag = X86JumpTag ( ) and
359382 succType instanceof DirectSuccessor and
360383 result = getTranslatedInstruction ( instr .getTarget ( ) ) .getEntry ( )
361384 }
362385
363386 override Instruction getEntry ( ) {
364- exists ( Option< Instruction > :: Option op | op = this .getTranslatedOperand ( ) .getEntry ( ) |
365- result = op .asSome ( )
366- or
367- op .isNone ( ) and
368- result = this .getInstruction ( SingleTag ( ) )
369- )
387+ if exists ( instr .getTarget ( ) )
388+ then result = this .getInstruction ( X86JumpInstrRefTag ( ) )
389+ else
390+ exists ( Option< Instruction > :: Option op | op = this .getTranslatedOperand ( ) .getEntry ( ) |
391+ result = op .asSome ( )
392+ or
393+ op .isNone ( ) and
394+ result = this .getInstruction ( X86JumpTag ( ) )
395+ )
370396 }
371397
372398 override Variable getResultVariable ( ) { none ( ) }
@@ -728,13 +754,18 @@ class TranslatedX86ConditionalJump extends TranslatedX86Instruction, TTranslated
728754 final override predicate hasInstruction (
729755 Opcode opcode , InstructionTag tag , Option< Variable > :: Option v
730756 ) {
757+ exists ( instr .getTarget ( ) ) and
758+ tag = X86CJumpInstrRefTag ( ) and
759+ opcode instanceof Opcode:: InstrRef and
760+ v .asSome ( ) = this .getVariable ( X86CJumpInstrRefVarTag ( ) )
761+ or
731762 opcode instanceof Opcode:: CJump and
732- tag = SingleTag ( ) and
763+ tag = X86CJumpTag ( ) and
733764 v .isNone ( ) // A jump has no result
734765 }
735766
736767 override predicate hasJumpCondition ( InstructionTag tag , Opcode:: ConditionKind kind ) {
737- tag = SingleTag ( ) and
768+ tag = X86CJumpTag ( ) and
738769 (
739770 instr instanceof Raw:: X86Jb and kind = Opcode:: LT ( )
740771 or
@@ -762,15 +793,29 @@ class TranslatedX86ConditionalJump extends TranslatedX86Instruction, TTranslated
762793 )
763794 }
764795
796+ override predicate hasTempVariable ( VariableTag tag ) {
797+ exists ( instr .getTarget ( ) ) and
798+ tag = X86CJumpInstrRefVarTag ( )
799+ }
800+
801+ override Instruction getReferencedInstruction ( InstructionTag tag ) {
802+ tag = X86CJumpInstrRefTag ( ) and
803+ result = getTranslatedInstruction ( instr .getTarget ( ) ) .getEntry ( )
804+ }
805+
765806 override predicate hasSynthVariable ( SynthRegisterTag tag ) { tag = CmpRegisterTag ( ) }
766807
767808 override predicate producesResult ( ) { any ( ) }
768809
769810 override Variable getVariableOperand ( InstructionTag tag , OperandTag operandTag ) {
770- tag = SingleTag ( ) and
811+ tag = X86CJumpTag ( ) and
771812 (
772813 operandTag = CondJumpTargetTag ( ) and
773- result = this .getTranslatedOperand ( ) .getResultVariable ( )
814+ (
815+ if exists ( instr .getTarget ( ) )
816+ then result = this .getInstruction ( X86CJumpInstrRefTag ( ) ) .getResultVariable ( )
817+ else result = this .getTranslatedOperand ( ) .getResultVariable ( )
818+ )
774819 or
775820 operandTag = CondTag ( ) and
776821 result = getTranslatedVariableSynth ( CmpRegisterTag ( ) )
@@ -780,13 +825,19 @@ class TranslatedX86ConditionalJump extends TranslatedX86Instruction, TTranslated
780825 TranslatedOperand getTranslatedOperand ( ) { result = getTranslatedOperand ( instr .getOperand ( 0 ) ) }
781826
782827 override Instruction getChildSuccessor ( TranslatedElement child , SuccessorType succType ) {
828+ not exists ( instr .getTarget ( ) ) and
783829 child = this .getTranslatedOperand ( ) and
784830 succType instanceof DirectSuccessor and
785- result = this .getInstruction ( SingleTag ( ) )
831+ result = this .getInstruction ( X86CJumpTag ( ) )
786832 }
787833
788834 override Instruction getSuccessor ( InstructionTag tag , SuccessorType succType ) {
789- tag = SingleTag ( ) and
835+ exists ( instr .getTarget ( ) ) and
836+ tag = X86CJumpInstrRefTag ( ) and
837+ succType instanceof DirectSuccessor and
838+ result = this .getInstruction ( X86CJumpTag ( ) )
839+ or
840+ tag = X86CJumpTag ( ) and
790841 (
791842 succType .( BooleanSuccessor ) .getValue ( ) = true and
792843 result = getTranslatedInstruction ( instr .getTarget ( ) ) .getEntry ( )
@@ -797,12 +848,15 @@ class TranslatedX86ConditionalJump extends TranslatedX86Instruction, TTranslated
797848 }
798849
799850 override Instruction getEntry ( ) {
800- exists ( Option< Instruction > :: Option op | op = this .getTranslatedOperand ( ) .getEntry ( ) |
801- result = op .asSome ( )
802- or
803- op .isNone ( ) and
804- result = this .getInstruction ( SingleTag ( ) )
805- )
851+ if exists ( instr .getTarget ( ) )
852+ then result = this .getInstruction ( X86CJumpInstrRefTag ( ) )
853+ else
854+ exists ( Option< Instruction > :: Option op | op = this .getTranslatedOperand ( ) .getEntry ( ) |
855+ result = op .asSome ( )
856+ or
857+ op .isNone ( ) and
858+ result = this .getInstruction ( X86CJumpTag ( ) )
859+ )
806860 }
807861
808862 override Variable getResultVariable ( ) { none ( ) }
@@ -941,8 +995,6 @@ class TranslatedX86Lea extends TranslatedX86Instruction, TTranslatedX86Lea {
941995 override Variable getResultVariable ( ) {
942996 result = this .getTranslatedDestOperand ( ) .getResultVariable ( )
943997 }
944-
945- override string toString ( ) { result = TranslatedX86Instruction .super .toString ( ) }
946998}
947999
9481000class TranslatedX86Pop extends TranslatedX86Instruction , TTranslatedX86Pop {
0 commit comments