@@ -193,86 +193,89 @@ private class SingleUseOperandNode0 extends OperandNode0, TSingleUseOperandNode0
193
193
SingleUseOperandNode0 ( ) { this = TSingleUseOperandNode0 ( op ) }
194
194
}
195
195
196
- /**
197
- * INTERNAL: Do not use.
198
- *
199
- * A node that represents the indirect value of an operand in the IR
200
- * after `index` number of loads.
201
- *
202
- * Note: Unlike `RawIndirectOperand`, a value of type `IndirectOperand` may
203
- * be an `OperandNode`.
204
- */
205
- class IndirectOperand extends Node {
206
- Operand operand ;
207
- int indirectionIndex ;
196
+ private module IndirectOperands {
197
+ /**
198
+ * INTERNAL: Do not use.
199
+ *
200
+ * A node that represents the indirect value of an operand in the IR
201
+ * after `index` number of loads.
202
+ *
203
+ * Note: Unlike `RawIndirectOperand`, a value of type `IndirectOperand` may
204
+ * be an `OperandNode`.
205
+ */
206
+ abstract class IndirectOperand extends Node {
207
+ /** Gets the underlying operand. */
208
+ abstract predicate hasOperandAndIndirectionIndex ( Operand operand , int indirectionIndex ) ;
209
+ }
208
210
209
- IndirectOperand ( ) {
210
- this .( RawIndirectOperand ) .getOperand ( ) = operand and
211
- this .( RawIndirectOperand ) .getIndirectionIndex ( ) = indirectionIndex
212
- or
213
- nodeHasOperand ( this , Ssa:: getIRRepresentationOfIndirectOperand ( operand , indirectionIndex ) ,
214
- indirectionIndex - 1 )
211
+ private class IndirectOperandFromRaw extends IndirectOperand instanceof RawIndirectOperand {
212
+ override predicate hasOperandAndIndirectionIndex ( Operand operand , int indirectionIndex ) {
213
+ operand = RawIndirectOperand .super .getOperand ( ) and
214
+ indirectionIndex = RawIndirectOperand .super .getIndirectionIndex ( )
215
+ }
215
216
}
216
217
217
- /** Gets the underlying operand. */
218
- Operand getOperand ( ) { result = operand }
218
+ private class IndirectOperandFromIRRepr extends IndirectOperand {
219
+ Operand operand ;
220
+ int indirectionIndex ;
219
221
220
- /** Gets the underlying indirection index. */
221
- int getIndirectionIndex ( ) { result = indirectionIndex }
222
+ IndirectOperandFromIRRepr ( ) {
223
+ exists ( Operand repr |
224
+ repr = Ssa:: getIRRepresentationOfIndirectOperand ( operand , indirectionIndex ) and
225
+ nodeHasOperand ( this , repr , indirectionIndex - 1 )
226
+ )
227
+ }
222
228
223
- /**
224
- * Holds if this `IndirectOperand` is represented directly in the IR instead of
225
- * a `RawIndirectionOperand` with operand `op` and indirection index `index`.
226
- */
227
- predicate isIRRepresentationOf ( Operand op , int index ) {
228
- this instanceof OperandNode and
229
- (
230
- op = operand and
231
- index = indirectionIndex
232
- )
229
+ override predicate hasOperandAndIndirectionIndex ( Operand op , int index ) {
230
+ op = operand and index = indirectionIndex
231
+ }
233
232
}
234
233
}
235
234
236
- /**
237
- * INTERNAL: Do not use.
238
- *
239
- * A node that represents the indirect value of an instruction in the IR
240
- * after `index` number of loads.
241
- *
242
- * Note: Unlike `RawIndirectInstruction`, a value of type `IndirectInstruction` may
243
- * be an `InstructionNode`.
244
- */
245
- class IndirectInstruction extends Node {
246
- Instruction instr ;
247
- int indirectionIndex ;
235
+ import IndirectOperands
248
236
249
- IndirectInstruction ( ) {
250
- this .( RawIndirectInstruction ) .getInstruction ( ) = instr and
251
- this .( RawIndirectInstruction ) .getIndirectionIndex ( ) = indirectionIndex
252
- or
253
- nodeHasInstruction ( this , Ssa:: getIRRepresentationOfIndirectInstruction ( instr , indirectionIndex ) ,
254
- indirectionIndex - 1 )
237
+ private module IndirectInstructions {
238
+ /**
239
+ * INTERNAL: Do not use.
240
+ *
241
+ * A node that represents the indirect value of an instruction in the IR
242
+ * after `index` number of loads.
243
+ *
244
+ * Note: Unlike `RawIndirectInstruction`, a value of type `IndirectInstruction` may
245
+ * be an `InstructionNode`.
246
+ */
247
+ abstract class IndirectInstruction extends Node {
248
+ /** Gets the underlying instruction. */
249
+ abstract predicate hasInstructionAndIndirectionIndex ( Instruction instr , int index ) ;
255
250
}
256
251
257
- /** Gets the underlying instruction. */
258
- Instruction getInstruction ( ) { result = instr }
252
+ private class IndirectInstructionFromRaw extends IndirectInstruction instanceof RawIndirectInstruction
253
+ {
254
+ override predicate hasInstructionAndIndirectionIndex ( Instruction instr , int index ) {
255
+ instr = RawIndirectInstruction .super .getInstruction ( ) and
256
+ index = RawIndirectInstruction .super .getIndirectionIndex ( )
257
+ }
258
+ }
259
259
260
- /** Gets the underlying indirection index. */
261
- int getIndirectionIndex ( ) { result = indirectionIndex }
260
+ private class IndirectInstructionFromIRRepr extends IndirectInstruction {
261
+ Instruction instr ;
262
+ int indirectionIndex ;
262
263
263
- /**
264
- * Holds if this `IndirectInstruction` is represented directly in the IR instead of
265
- * a `RawIndirectionInstruction` with instruction `i` and indirection index `index`.
266
- */
267
- predicate isIRRepresentationOf ( Instruction i , int index ) {
268
- this instanceof InstructionNode and
269
- (
270
- i = instr and
271
- index = indirectionIndex
272
- )
264
+ IndirectInstructionFromIRRepr ( ) {
265
+ exists ( Instruction repr |
266
+ repr = Ssa :: getIRRepresentationOfIndirectInstruction ( instr , indirectionIndex ) and
267
+ nodeHasInstruction ( this , repr , indirectionIndex - 1 )
268
+ )
269
+ }
270
+
271
+ override predicate hasInstructionAndIndirectionIndex ( Instruction i , int index ) {
272
+ i = instr and index = indirectionIndex
273
+ }
273
274
}
274
275
}
275
276
277
+ import IndirectInstructions
278
+
276
279
/** Gets the callable in which this node occurs. */
277
280
DataFlowCallable nodeGetEnclosingCallable ( Node n ) { result = n .getEnclosingCallable ( ) }
278
281
0 commit comments