@@ -3,6 +3,7 @@ private import semmle.code.binary.ast.ir.internal.Opcode
33
44newtype TInstructionTag =
55 SingleTag ( ) or
6+ FunEntryTag ( ) or
67 X86JumpInstrRefTag ( ) or
78 X86JumpTag ( ) or
89 X86CJumpInstrRefTag ( ) or
@@ -62,6 +63,9 @@ class InstructionTag extends TInstructionTag {
6263 this = SingleTag ( ) and
6364 result = "Single"
6465 or
66+ this = FunEntryTag ( ) and
67+ result = "FunEntry"
68+ or
6569 this = X86JumpInstrRefTag ( ) and
6670 result = "X86JumpInstrRef"
6771 or
@@ -209,3 +213,105 @@ class InstructionTag extends TInstructionTag {
209213 result = "CilUnconditionalBranchRef"
210214 }
211215}
216+
217+ private newtype TOperandTag =
218+ TLeftTag ( ) or
219+ TRightTag ( ) or
220+ TUnaryTag ( ) or
221+ TStoreValueTag ( ) or
222+ TLoadAddressTag ( ) or
223+ TStoreAddressTag ( ) or
224+ TCallTargetTag ( ) or
225+ TCondTag ( ) or
226+ TCondJumpTargetTag ( ) or
227+ TJumpTargetTag ( )
228+
229+ abstract class OperandTag extends TOperandTag {
230+ abstract int getIndex ( ) ;
231+
232+ abstract OperandTag getSuccessorTag ( ) ;
233+
234+ final OperandTag getPredecessorTag ( ) { result .getSuccessorTag ( ) = this }
235+
236+ abstract string toString ( ) ;
237+ }
238+
239+ class LeftTag extends OperandTag , TLeftTag {
240+ final override int getIndex ( ) { result = 0 }
241+
242+ final override OperandTag getSuccessorTag ( ) { result instanceof RightTag }
243+
244+ final override string toString ( ) { result = "Left" }
245+ }
246+
247+ class RightTag extends OperandTag , TRightTag {
248+ final override int getIndex ( ) { result = 1 }
249+
250+ final override OperandTag getSuccessorTag ( ) { none ( ) }
251+
252+ final override string toString ( ) { result = "Right" }
253+ }
254+
255+ class UnaryTag extends OperandTag , TUnaryTag {
256+ final override int getIndex ( ) { result = 0 }
257+
258+ final override OperandTag getSuccessorTag ( ) { none ( ) }
259+
260+ final override string toString ( ) { result = "Unary" }
261+ }
262+
263+ class StoreValueTag extends OperandTag , TStoreValueTag {
264+ final override int getIndex ( ) { result = 1 }
265+
266+ final override OperandTag getSuccessorTag ( ) { none ( ) }
267+
268+ final override string toString ( ) { result = "StoreValue" }
269+ }
270+
271+ class LoadAddressTag extends OperandTag , TLoadAddressTag {
272+ final override int getIndex ( ) { result = 0 }
273+
274+ final override OperandTag getSuccessorTag ( ) { none ( ) }
275+
276+ final override string toString ( ) { result = "LoadAddr" }
277+ }
278+
279+ class StoreAddressTag extends OperandTag , TStoreAddressTag {
280+ final override int getIndex ( ) { result = 0 }
281+
282+ final override OperandTag getSuccessorTag ( ) { result instanceof StoreValueTag }
283+
284+ final override string toString ( ) { result = "StoreDest" }
285+ }
286+
287+ class CallTargetTag extends OperandTag , TCallTargetTag {
288+ final override int getIndex ( ) { result = 0 }
289+
290+ final override OperandTag getSuccessorTag ( ) { none ( ) }
291+
292+ final override string toString ( ) { result = "CallTarget" }
293+ }
294+
295+ class CondTag extends OperandTag , TCondTag {
296+ final override int getIndex ( ) { result = 1 }
297+
298+ final override OperandTag getSuccessorTag ( ) { none ( ) }
299+
300+ final override string toString ( ) { result = "CondJump" }
301+ }
302+
303+ class CondJumpTargetTag extends OperandTag , TCondJumpTargetTag {
304+ final override int getIndex ( ) { result = 0 }
305+
306+ final override OperandTag getSuccessorTag ( ) { result instanceof CondTag }
307+
308+ final override string toString ( ) { result = "CondJumpTarget" }
309+ }
310+
311+ class JumpTargetTag extends OperandTag , TJumpTargetTag {
312+ final override int getIndex ( ) { result = 0 }
313+
314+ final override OperandTag getSuccessorTag ( ) { none ( ) }
315+
316+ final override string toString ( ) { result = "JumpTarget" }
317+ }
0 commit comments