@@ -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,15 @@ 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 ) {
720+ result .getAST ( ) = param
721+ }
722722
723+ abstract class TranslatedReadEffect extends TranslatedElement {
723724 override TranslatedElement getChild ( int id ) { none ( ) }
724725
725726 override Instruction getChildSuccessor ( TranslatedElement child ) { none ( ) }
@@ -732,27 +733,60 @@ class TranslatedReadEffect extends TranslatedElement, TTranslatedReadEffect {
732733
733734 override Instruction getFirstInstruction ( ) { result = getInstruction ( OnlyInstructionTag ( ) ) }
734735
735- override Function getFunction ( ) { result = param .getFunction ( ) }
736-
737736 override predicate hasInstruction ( Opcode opcode , InstructionTag tag , CppType resultType ) {
738737 opcode instanceof Opcode:: ReturnIndirection and
739738 tag = OnlyInstructionTag ( ) and
740739 resultType = getVoidType ( )
741740 }
742741
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-
749742 final override CppType getInstructionMemoryOperandType (
750743 InstructionTag tag , TypedOperandTag operandTag
751744 ) {
752745 tag = OnlyInstructionTag ( ) and
753746 operandTag = sideEffectOperand ( ) and
754747 result = getUnknownType ( )
755748 }
749+ }
750+
751+ class TranslatedThisReadEffect extends TranslatedReadEffect , TTranslatedThisReadEffect {
752+ Function func ;
753+
754+ TranslatedThisReadEffect ( ) { this = TTranslatedThisReadEffect ( func ) }
755+
756+ override Locatable getAST ( ) { result = func }
757+
758+ override Function getFunction ( ) { result = func }
759+
760+ override string toString ( ) { result = "read effect: this" }
761+
762+ final override Instruction getInstructionRegisterOperand ( InstructionTag tag , OperandTag operandTag ) {
763+ tag = OnlyInstructionTag ( ) and
764+ operandTag = addressOperand ( ) and
765+ result = getTranslatedThisParameter ( func ) .getInstruction ( InitializerIndirectAddressTag ( ) )
766+ }
767+
768+ final override IRVariable getInstructionVariable ( InstructionTag tag ) {
769+ tag = OnlyInstructionTag ( ) and
770+ result = getTranslatedFunction ( func ) .getThisVariable ( )
771+ }
772+ }
773+
774+ class TranslatedParameterReadEffect extends TranslatedReadEffect , TTranslatedParameterReadEffect {
775+ Parameter param ;
776+
777+ TranslatedParameterReadEffect ( ) { this = TTranslatedParameterReadEffect ( param ) }
778+
779+ override Locatable getAST ( ) { result = param }
780+
781+ override string toString ( ) { result = "read effect: " + param .toString ( ) }
782+
783+ override Function getFunction ( ) { result = param .getFunction ( ) }
784+
785+ final override Instruction getInstructionRegisterOperand ( InstructionTag tag , OperandTag operandTag ) {
786+ tag = OnlyInstructionTag ( ) and
787+ operandTag = addressOperand ( ) and
788+ result = getTranslatedParameter ( param ) .getInstruction ( InitializerIndirectAddressTag ( ) )
789+ }
756790
757791 final override IRVariable getInstructionVariable ( InstructionTag tag ) {
758792 tag = OnlyInstructionTag ( ) and
0 commit comments