@@ -219,14 +219,11 @@ abstract class TranslatedSideEffects extends TranslatedElement {
219
219
220
220
override TranslatedElement getChild ( int i ) {
221
221
result =
222
- rank [ i + 1 ] ( TranslatedSideEffect tse , int isWrite , int index |
223
- (
224
- tse .getCall ( ) = getExpr ( ) and
225
- tse .getArgumentIndex ( ) = index and
226
- if tse .isWrite ( ) then isWrite = 1 else isWrite = 0
227
- )
222
+ rank [ i + 1 ] ( TranslatedSideEffect tse , int group , int indexInGroup |
223
+ tse .getPrimaryExpr ( ) = getExpr ( ) and
224
+ tse .sortOrder ( group , indexInGroup )
228
225
|
229
- tse order by isWrite , index
226
+ tse order by group , indexInGroup
230
227
)
231
228
}
232
229
@@ -445,23 +442,86 @@ class TranslatedStructorCallSideEffects extends TranslatedCallSideEffects {
445
442
}
446
443
}
447
444
448
- class TranslatedSideEffect extends TranslatedElement , TTranslatedArgumentSideEffect {
445
+ /** Returns the sort group index for argument read side effects. */
446
+ private int argumentReadGroup ( ) { result = 1 }
447
+
448
+ /** Returns the sort group index for conservative call side effects. */
449
+ private int callSideEffectGroup ( ) {
450
+ result = 0 // Make this group first for now to preserve the existing ordering
451
+ }
452
+
453
+ /** Returns the sort group index for argument write side effects. */
454
+ private int argumentWriteGroup ( ) { result = 2 }
455
+
456
+ /** Returns the sort group index for dynamic allocation side effects. */
457
+ private int initializeAllocationGroup ( ) { result = 3 }
458
+
459
+ /**
460
+ * The IR translation of a single side effect of a call.
461
+ */
462
+ abstract class TranslatedSideEffect extends TranslatedElement {
463
+ final override TranslatedElement getChild ( int n ) { none ( ) }
464
+
465
+ final override Instruction getChildSuccessor ( TranslatedElement child ) { none ( ) }
466
+
467
+ final override Instruction getFirstInstruction ( ) { result = getInstruction ( OnlyInstructionTag ( ) ) }
468
+
469
+ final override predicate hasInstruction ( Opcode opcode , InstructionTag tag , CppType type ) {
470
+ tag = OnlyInstructionTag ( ) and
471
+ sideEffectInstruction ( opcode , type )
472
+ }
473
+
474
+ final override Instruction getInstructionSuccessor ( InstructionTag tag , EdgeKind kind ) {
475
+ result = getParent ( ) .getChildSuccessor ( this ) and
476
+ tag = OnlyInstructionTag ( ) and
477
+ kind instanceof GotoEdge
478
+ }
479
+
480
+ /**
481
+ * Gets the expression that caused this side effect.
482
+ *
483
+ * All side effects with the same `getPrimaryExpr()` will appear in the same contiguous sequence
484
+ * in the IR.
485
+ */
486
+ abstract Expr getPrimaryExpr ( ) ;
487
+
488
+ /**
489
+ * Gets the order in which this side effect should be sorted with respect to other side effects
490
+ * for the same expression.
491
+ *
492
+ * Side effects are sorted first by `group`, and then by `indexInGroup`.
493
+ */
494
+ abstract predicate sortOrder ( int group , int indexInGroup ) ;
495
+
496
+ /**
497
+ * Gets the opcode and result type for the side effect instruction.
498
+ */
499
+ abstract predicate sideEffectInstruction ( Opcode opcode , CppType type ) ;
500
+ }
501
+
502
+ /**
503
+ * The IR translation of a single argument side effect for a call.
504
+ */
505
+ class TranslatedArgumentSideEffect extends TranslatedSideEffect , TTranslatedArgumentSideEffect {
449
506
Call call ;
450
507
Expr arg ;
451
508
int index ;
452
509
SideEffectOpcode sideEffectOpcode ;
453
510
454
- TranslatedSideEffect ( ) {
511
+ TranslatedArgumentSideEffect ( ) {
455
512
this = TTranslatedArgumentSideEffect ( call , arg , index , sideEffectOpcode )
456
513
}
457
514
458
515
override Locatable getAST ( ) { result = arg }
459
516
460
517
Expr getExpr ( ) { result = arg }
461
518
462
- Call getCall ( ) { result = call }
519
+ override Call getPrimaryExpr ( ) { result = call }
463
520
464
- int getArgumentIndex ( ) { result = index }
521
+ override predicate sortOrder ( int group , int indexInGroup ) {
522
+ indexInGroup = index and
523
+ if isWrite ( ) then group = argumentWriteGroup ( ) else group = argumentReadGroup ( )
524
+ }
465
525
466
526
predicate isWrite ( ) { sideEffectOpcode instanceof WriteSideEffectOpcode }
467
527
@@ -473,14 +533,7 @@ class TranslatedSideEffect extends TranslatedElement, TTranslatedArgumentSideEff
473
533
result = "(read side effect for " + arg .toString ( ) + ")"
474
534
}
475
535
476
- override TranslatedElement getChild ( int n ) { none ( ) }
477
-
478
- override Instruction getChildSuccessor ( TranslatedElement child ) { none ( ) }
479
-
480
- override Instruction getFirstInstruction ( ) { result = getInstruction ( OnlyInstructionTag ( ) ) }
481
-
482
- override predicate hasInstruction ( Opcode opcode , InstructionTag tag , CppType type ) {
483
- tag = OnlyInstructionTag ( ) and
536
+ override predicate sideEffectInstruction ( Opcode opcode , CppType type ) {
484
537
opcode = sideEffectOpcode and
485
538
(
486
539
isWrite ( ) and
@@ -505,12 +558,6 @@ class TranslatedSideEffect extends TranslatedElement, TTranslatedArgumentSideEff
505
558
)
506
559
}
507
560
508
- override Instruction getInstructionSuccessor ( InstructionTag tag , EdgeKind kind ) {
509
- result = getParent ( ) .getChildSuccessor ( this ) and
510
- tag = OnlyInstructionTag ( ) and
511
- kind instanceof GotoEdge
512
- }
513
-
514
561
override Instruction getInstructionRegisterOperand ( InstructionTag tag , OperandTag operandTag ) {
515
562
tag instanceof OnlyInstructionTag and
516
563
operandTag instanceof AddressOperandTag and
0 commit comments