@@ -2616,3 +2616,66 @@ class TranslatedCilStoreField extends TranslatedCilInstruction, TTranslatedCilSt
26162616 result = getTranslatedCilInstruction ( instr .getABackwardPredecessor ( ) ) .getStackElement ( i + 2 )
26172617 }
26182618}
2619+
2620+ class TranslatedCilLoadField extends TranslatedCilInstruction , TTranslatedCilLoadField {
2621+ override Raw:: CilLdfld instr ;
2622+
2623+ TranslatedCilLoadField ( ) { this = TTranslatedCilLoadField ( instr ) }
2624+
2625+ final override predicate hasInstruction (
2626+ Opcode opcode , InstructionTag tag , Option< Variable > :: Option v
2627+ ) {
2628+ opcode instanceof Opcode:: FieldAddress and
2629+ tag = CilLoadFieldAddressTag ( ) and
2630+ v .asSome ( ) = this .getTempVariable ( CilLoadFieldAddressVarTag ( ) )
2631+ or
2632+ opcode instanceof Opcode:: Load and
2633+ tag = CilLoadFieldLoadTag ( ) and
2634+ v .asSome ( ) = this .getTempVariable ( CilLoadFieldLoadVarTag ( ) )
2635+ }
2636+
2637+ override predicate hasTempVariable ( TempVariableTag tag ) {
2638+ tag = CilLoadFieldAddressVarTag ( ) or tag = CilLoadFieldLoadVarTag ( )
2639+ }
2640+
2641+ override predicate producesResult ( ) { any ( ) }
2642+
2643+ override Variable getVariableOperand ( InstructionTag tag , OperandTag operandTag ) {
2644+ tag = CilLoadFieldAddressTag ( ) and
2645+ operandTag instanceof UnaryTag and
2646+ result = getTranslatedCilInstruction ( instr .getABackwardPredecessor ( ) ) .getStackElement ( 0 )
2647+ or
2648+ tag = CilLoadFieldLoadTag ( ) and
2649+ operandTag instanceof LoadAddressTag and
2650+ result = this .getInstruction ( CilLoadFieldAddressTag ( ) ) .getResultVariable ( )
2651+ }
2652+
2653+ final override string getFieldName ( InstructionTag tag ) {
2654+ tag = CilLoadFieldAddressTag ( ) and
2655+ result = instr .getField ( ) .getName ( )
2656+ }
2657+
2658+ override Instruction getChildSuccessor ( TranslatedElement child , SuccessorType succType ) { none ( ) }
2659+
2660+ override Instruction getSuccessor ( InstructionTag tag , SuccessorType succType ) {
2661+ tag = CilLoadFieldAddressTag ( ) and
2662+ succType instanceof DirectSuccessor and
2663+ result = this .getInstruction ( CilLoadFieldLoadTag ( ) )
2664+ or
2665+ tag = CilLoadFieldLoadTag ( ) and
2666+ succType instanceof DirectSuccessor and
2667+ result = getTranslatedInstruction ( instr .getASuccessor ( ) ) .getEntry ( )
2668+ }
2669+
2670+ override Instruction getEntry ( ) { result = this .getInstruction ( CilLoadFieldAddressTag ( ) ) }
2671+
2672+ override Variable getResultVariable ( ) { result = this .getTempVariable ( CilLoadFieldLoadVarTag ( ) ) }
2673+
2674+ final override Variable getStackElement ( int i ) {
2675+ i = 0 and
2676+ result = this .getInstruction ( CilLoadFieldLoadTag ( ) ) .getResultVariable ( )
2677+ or
2678+ i > 0 and
2679+ result = getTranslatedCilInstruction ( instr .getABackwardPredecessor ( ) ) .getStackElement ( i )
2680+ }
2681+ }
0 commit comments