@@ -676,14 +676,17 @@ class TranslatedReadEffects extends TranslatedElement, TTranslatedReadEffects {
676676 override string toString ( ) { result = "read effects: " + func .toString ( ) }
677677
678678 override TranslatedElement getChild ( int id ) {
679- result = getTranslatedReadEffect ( func .getParameter ( id ) )
679+ result = getTranslatedThisReadEffect ( func ) and
680+ id = - 1
681+ or
682+ result = getTranslatedParameterReadEffect ( func .getParameter ( id ) )
680683 }
681684
682685 override Instruction getFirstInstruction ( ) {
683686 if exists ( getAChild ( ) )
684687 then
685688 result =
686- min ( TranslatedReadEffect child , int id | child = getChild ( id ) | child order by id )
689+ min ( TranslatedElement child , int id | child = getChild ( id ) | child order by id )
687690 .getFirstInstruction ( )
688691 else result = getParent ( ) .getChildSuccessor ( this )
689692 }
@@ -709,17 +712,13 @@ class TranslatedReadEffects extends TranslatedElement, TTranslatedReadEffects {
709712 override Instruction getInstructionSuccessor ( InstructionTag tag , EdgeKind kind ) { none ( ) }
710713}
711714
712- private TranslatedReadEffect getTranslatedReadEffect ( Parameter param ) { result .getAST ( ) = param }
713-
714- class TranslatedReadEffect extends TranslatedElement , TTranslatedReadEffect {
715- Parameter param ;
716-
717- TranslatedReadEffect ( ) { this = TTranslatedReadEffect ( param ) }
718-
719- override Locatable getAST ( ) { result = param }
715+ private TranslatedThisReadEffect getTranslatedThisReadEffect ( Function func ) {
716+ result .getAST ( ) = func
717+ }
720718
721- override string toString ( ) { result = "read effect: " + param . toString ( ) }
719+ private TranslatedParameterReadEffect getTranslatedParameterReadEffect ( Parameter param ) { result . getAST ( ) = param }
722720
721+ abstract class TranslatedReadEffect extends TranslatedElement {
723722 override TranslatedElement getChild ( int id ) { none ( ) }
724723
725724 override Instruction getChildSuccessor ( TranslatedElement child ) { none ( ) }
@@ -732,27 +731,60 @@ class TranslatedReadEffect extends TranslatedElement, TTranslatedReadEffect {
732731
733732 override Instruction getFirstInstruction ( ) { result = getInstruction ( OnlyInstructionTag ( ) ) }
734733
735- override Function getFunction ( ) { result = param .getFunction ( ) }
736-
737734 override predicate hasInstruction ( Opcode opcode , InstructionTag tag , CppType resultType ) {
738735 opcode instanceof Opcode:: ReturnIndirection and
739736 tag = OnlyInstructionTag ( ) and
740737 resultType = getVoidType ( )
741738 }
742739
743- final override Instruction getInstructionRegisterOperand ( InstructionTag tag , OperandTag operandTag ) {
744- tag = OnlyInstructionTag ( ) and
745- operandTag = addressOperand ( ) and
746- result = getTranslatedParameter ( param ) .getInstruction ( InitializerIndirectAddressTag ( ) )
747- }
748-
749740 final override CppType getInstructionMemoryOperandType (
750741 InstructionTag tag , TypedOperandTag operandTag
751742 ) {
752743 tag = OnlyInstructionTag ( ) and
753744 operandTag = sideEffectOperand ( ) and
754745 result = getUnknownType ( )
755746 }
747+ }
748+
749+
750+ class TranslatedThisReadEffect extends TranslatedReadEffect , TTranslatedThisReadEffect {
751+ Function func ;
752+
753+ TranslatedThisReadEffect ( ) { this = TTranslatedThisReadEffect ( func ) }
754+
755+ override Locatable getAST ( ) { result = func }
756+
757+ override Function getFunction ( ) { result = func }
758+
759+ override string toString ( ) { result = "read effect: this" }
760+
761+ final override Instruction getInstructionRegisterOperand ( InstructionTag tag , OperandTag operandTag ) {
762+ tag = OnlyInstructionTag ( ) and
763+ operandTag = addressOperand ( ) and
764+ result = getTranslatedThisParameter ( func ) .getInstruction ( InitializerIndirectAddressTag ( ) )
765+ }
766+
767+ final override IRVariable getInstructionVariable ( InstructionTag tag ) {
768+ tag = OnlyInstructionTag ( ) and
769+ result = getTranslatedFunction ( func ) .getThisVariable ( )
770+ }
771+ }
772+ class TranslatedParameterReadEffect extends TranslatedReadEffect , TTranslatedParameterReadEffect {
773+ Parameter param ;
774+
775+ TranslatedParameterReadEffect ( ) { this = TTranslatedParameterReadEffect ( param ) }
776+
777+ override Locatable getAST ( ) { result = param }
778+
779+ override string toString ( ) { result = "read effect: " + param .toString ( ) }
780+
781+ override Function getFunction ( ) { result = param .getFunction ( ) }
782+
783+ final override Instruction getInstructionRegisterOperand ( InstructionTag tag , OperandTag operandTag ) {
784+ tag = OnlyInstructionTag ( ) and
785+ operandTag = addressOperand ( ) and
786+ result = getTranslatedParameter ( param ) .getInstruction ( InitializerIndirectAddressTag ( ) )
787+ }
756788
757789 final override IRVariable getInstructionVariable ( InstructionTag tag ) {
758790 tag = OnlyInstructionTag ( ) and
0 commit comments