@@ -35,6 +35,8 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
3535 final override Function getFunction ( ) { result = func }
3636
3737 final override TranslatedElement getChild ( int id ) {
38+ id = - 4 and result = getReadEffects ( )
39+ or
3840 id = - 3 and result = getConstructorInitList ( )
3941 or
4042 id = - 2 and result = getBody ( )
@@ -54,6 +56,8 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
5456
5557 final private TranslatedStmt getBody ( ) { result = getTranslatedStmt ( func .getEntryPoint ( ) ) }
5658
59+ final private TranslatedReadEffects getReadEffects ( ) { result = getTranslatedReadEffects ( func ) }
60+
5761 final private TranslatedParameter getParameter ( int index ) {
5862 result = getTranslatedParameter ( func .getParameter ( index ) )
5963 }
@@ -117,12 +121,13 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
117121 child = getBody ( ) and
118122 result = getReturnSuccessorInstruction ( )
119123 or
120- (
121- child = getDestructorDestructionList ( ) and
122- if hasReturnValue ( )
123- then result = getInstruction ( ReturnValueAddressTag ( ) )
124- else result = getInstruction ( ReturnTag ( ) )
125- )
124+ child = getDestructorDestructionList ( ) and
125+ result = getReadEffects ( ) .getFirstInstruction ( )
126+ or
127+ child = getReadEffects ( ) and
128+ if hasReturnValue ( )
129+ then result = getInstruction ( ReturnValueAddressTag ( ) )
130+ else result = getInstruction ( ReturnTag ( ) )
126131 }
127132
128133 final override predicate hasInstruction ( Opcode opcode , InstructionTag tag , CppType resultType ) {
@@ -339,6 +344,14 @@ class TranslatedParameter extends TranslatedElement, TTranslatedParameter {
339344 result = getInstruction ( InitializerStoreTag ( ) )
340345 or
341346 tag = InitializerStoreTag ( ) and
347+ if hasIndirection ( )
348+ then result = getInstruction ( InitializerIndirectAddressTag ( ) )
349+ else result = getParent ( ) .getChildSuccessor ( this )
350+ or
351+ tag = InitializerIndirectAddressTag ( ) and
352+ result = getInstruction ( InitializerIndirectStoreTag ( ) )
353+ or
354+ tag = InitializerIndirectStoreTag ( ) and
342355 result = getParent ( ) .getChildSuccessor ( this )
343356 )
344357 }
@@ -353,12 +366,23 @@ class TranslatedParameter extends TranslatedElement, TTranslatedParameter {
353366 tag = InitializerStoreTag ( ) and
354367 opcode instanceof Opcode:: InitializeParameter and
355368 resultType = getTypeForPRValue ( getVariableType ( param ) )
369+ or
370+ hasIndirection ( ) and
371+ tag = InitializerIndirectAddressTag ( ) and
372+ opcode instanceof Opcode:: Load and
373+ resultType = getTypeForPRValue ( getVariableType ( param ) )
374+ or
375+ hasIndirection ( ) and
376+ tag = InitializerIndirectStoreTag ( ) and
377+ opcode instanceof Opcode:: InitializeIndirection and
378+ resultType = getUnknownType ( )
356379 }
357380
358381 final override IRVariable getInstructionVariable ( InstructionTag tag ) {
359382 (
360383 tag = InitializerStoreTag ( ) or
361- tag = InitializerVariableAddressTag ( )
384+ tag = InitializerVariableAddressTag ( ) or
385+ tag = InitializerIndirectStoreTag ( )
362386 ) and
363387 result = getIRUserVariable ( getFunction ( ) , param )
364388 }
@@ -369,6 +393,28 @@ class TranslatedParameter extends TranslatedElement, TTranslatedParameter {
369393 operandTag instanceof AddressOperandTag and
370394 result = getInstruction ( InitializerVariableAddressTag ( ) )
371395 )
396+ or
397+ // this feels a little strange, but I think it's the best we can do
398+ tag = InitializerIndirectAddressTag ( ) and
399+ (
400+ operandTag instanceof AddressOperandTag and
401+ result = getInstruction ( InitializerVariableAddressTag ( ) )
402+ or
403+ operandTag instanceof LoadOperandTag and
404+ result = getInstruction ( InitializerStoreTag ( ) )
405+ )
406+ or
407+ tag = InitializerIndirectStoreTag ( ) and
408+ operandTag instanceof AddressOperandTag and
409+ result = getInstruction ( InitializerIndirectAddressTag ( ) )
410+ }
411+
412+ predicate hasIndirection ( ) {
413+ exists ( Type t | t = param .getUnspecifiedType ( ) |
414+ t instanceof ArrayType or
415+ t instanceof PointerType or
416+ t instanceof ReferenceType
417+ )
372418 }
373419}
374420
@@ -490,3 +536,96 @@ class TranslatedDestructorDestructionList extends TranslatedElement,
490536 )
491537 }
492538}
539+
540+ TranslatedReadEffects getTranslatedReadEffects ( Function func ) { result .getAST ( ) = func }
541+
542+ class TranslatedReadEffects extends TranslatedElement , TTranslatedReadEffects {
543+ Function func ;
544+
545+ TranslatedReadEffects ( ) { this = TTranslatedReadEffects ( func ) }
546+
547+ override Locatable getAST ( ) { result = func }
548+
549+ override Function getFunction ( ) { result = func }
550+
551+ override string toString ( ) { result = "read effects: " + func .toString ( ) }
552+
553+ override TranslatedElement getChild ( int id ) {
554+ result = getTranslatedReadEffect ( func .getParameter ( id ) )
555+ }
556+
557+ override Instruction getFirstInstruction ( ) {
558+ if exists ( getAChild ( ) )
559+ then
560+ result = min ( TranslatedReadEffect child , int id | child = getChild ( id ) | child order by id )
561+ .getFirstInstruction ( )
562+ else result = getParent ( ) .getChildSuccessor ( this )
563+ }
564+
565+ override Instruction getChildSuccessor ( TranslatedElement child ) {
566+ exists ( int id | child = getChild ( id ) |
567+ if exists ( TranslatedReadEffect child2 , int id2 | id2 > id and child2 = getChild ( id2 ) )
568+ then
569+ result = min ( TranslatedReadEffect child2 , int id2 |
570+ child2 = getChild ( id2 ) and id2 > id
571+ |
572+ child2 order by id2
573+ ) .getFirstInstruction ( )
574+ else result = getParent ( ) .getChildSuccessor ( this )
575+ )
576+ }
577+
578+ override predicate hasInstruction ( Opcode opcode , InstructionTag tag , CppType resultType ) {
579+ none ( )
580+ }
581+
582+ override Instruction getInstructionSuccessor ( InstructionTag tag , EdgeKind kind ) { none ( ) }
583+ }
584+
585+ private TranslatedReadEffect getTranslatedReadEffect ( Parameter param ) { result .getAST ( ) = param }
586+
587+ class TranslatedReadEffect extends TranslatedElement , TTranslatedReadEffect {
588+ Parameter param ;
589+
590+ TranslatedReadEffect ( ) { this = TTranslatedReadEffect ( param ) }
591+
592+ override Locatable getAST ( ) { result = param }
593+
594+ override string toString ( ) { result = "read effect: " + param .toString ( ) }
595+
596+ override TranslatedElement getChild ( int id ) { none ( ) }
597+
598+ override Instruction getChildSuccessor ( TranslatedElement child ) { none ( ) }
599+
600+ override Instruction getInstructionSuccessor ( InstructionTag tag , EdgeKind edge ) {
601+ tag = OnlyInstructionTag ( ) and
602+ edge = gotoEdge ( ) and
603+ result = getParent ( ) .getChildSuccessor ( this )
604+ }
605+
606+ override Instruction getFirstInstruction ( ) { result = getInstruction ( OnlyInstructionTag ( ) ) }
607+
608+ override Function getFunction ( ) { result = param .getFunction ( ) }
609+
610+ override predicate hasInstruction ( Opcode opcode , InstructionTag tag , CppType resultType ) {
611+ opcode instanceof Opcode:: ReturnIndirection and
612+ tag = OnlyInstructionTag ( ) and
613+ resultType = getVoidType ( )
614+ }
615+
616+ final override Instruction getInstructionOperand ( InstructionTag tag , OperandTag operandTag ) {
617+ tag = OnlyInstructionTag ( ) and
618+ operandTag = sideEffectOperand ( ) and
619+ result = getTranslatedFunction ( getFunction ( ) ) .getUnmodeledDefinitionInstruction ( )
620+ or
621+ tag = OnlyInstructionTag ( ) and
622+ operandTag = addressOperand ( ) and
623+ result = getTranslatedParameter ( param ) .getInstruction ( InitializerIndirectAddressTag ( ) )
624+ }
625+
626+ final override CppType getInstructionOperandType ( InstructionTag tag , TypedOperandTag operandTag ) {
627+ tag = OnlyInstructionTag ( ) and
628+ operandTag = sideEffectOperand ( ) and
629+ result = getUnknownType ( )
630+ }
631+ }
0 commit comments