binaryninja/medium_level_il/
operation.rs

1use super::{
2    MediumLevelExpressionIndex, MediumLevelILLiftedInstruction, MediumLevelInstructionIndex,
3};
4use crate::architecture::CoreIntrinsic;
5use crate::variable::{ConstantData, SSAVariable, Variable};
6use std::collections::BTreeMap;
7
8// IF
9#[derive(Debug, Copy, Clone)]
10pub struct MediumLevelILOperationIf {
11    pub condition: MediumLevelExpressionIndex,
12    pub dest_true: MediumLevelInstructionIndex,
13    pub dest_false: MediumLevelInstructionIndex,
14}
15#[derive(Clone, Debug, PartialEq)]
16pub struct LiftedIf {
17    pub condition: Box<MediumLevelILLiftedInstruction>,
18    pub dest_true: MediumLevelInstructionIndex,
19    pub dest_false: MediumLevelInstructionIndex,
20}
21
22// FLOAT_CONST
23#[derive(Copy, Clone, Debug, PartialEq)]
24pub struct FloatConst {
25    pub constant: f64,
26}
27
28// CONST, CONST_PTR, IMPORT
29#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
30pub struct Constant {
31    pub constant: u64,
32}
33
34// EXTERN_PTR
35#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
36pub struct ExternPtr {
37    pub constant: u64,
38    pub offset: u64,
39}
40
41// CONST_DATA
42#[derive(Debug, Copy, Clone)]
43pub struct ConstData {
44    pub constant_data_kind: u32,
45    pub constant_data_value: i64,
46    pub size: usize,
47}
48#[derive(Clone, Debug, Hash, PartialEq)]
49pub struct LiftedConstData {
50    pub constant_data: ConstantData,
51}
52
53// JUMP, RET_HINT
54#[derive(Debug, Copy, Clone)]
55pub struct Jump {
56    pub dest: MediumLevelExpressionIndex,
57}
58#[derive(Clone, Debug, PartialEq)]
59pub struct LiftedJump {
60    pub dest: Box<MediumLevelILLiftedInstruction>,
61}
62
63// STORE_SSA
64#[derive(Debug, Copy, Clone)]
65pub struct StoreSsa {
66    pub dest: MediumLevelExpressionIndex,
67    pub dest_memory: u64,
68    pub src_memory: u64,
69    pub src: MediumLevelExpressionIndex,
70}
71#[derive(Clone, Debug, PartialEq)]
72pub struct LiftedStoreSsa {
73    pub dest: Box<MediumLevelILLiftedInstruction>,
74    pub dest_memory: u64,
75    pub src_memory: u64,
76    pub src: Box<MediumLevelILLiftedInstruction>,
77}
78
79// STORE_STRUCT_SSA
80#[derive(Debug, Copy, Clone)]
81pub struct StoreStructSsa {
82    pub dest: MediumLevelExpressionIndex,
83    pub offset: u64,
84    pub dest_memory: u64,
85    pub src_memory: u64,
86    pub src: MediumLevelExpressionIndex,
87}
88#[derive(Clone, Debug, PartialEq)]
89pub struct LiftedStoreStructSsa {
90    pub dest: Box<MediumLevelILLiftedInstruction>,
91    pub offset: u64,
92    pub dest_memory: u64,
93    pub src_memory: u64,
94    pub src: Box<MediumLevelILLiftedInstruction>,
95}
96
97// STORE_STRUCT
98#[derive(Debug, Copy, Clone)]
99pub struct StoreStruct {
100    pub dest: MediumLevelExpressionIndex,
101    pub offset: u64,
102    pub src: MediumLevelExpressionIndex,
103}
104#[derive(Clone, Debug, PartialEq)]
105pub struct LiftedStoreStruct {
106    pub dest: Box<MediumLevelILLiftedInstruction>,
107    pub offset: u64,
108    pub src: Box<MediumLevelILLiftedInstruction>,
109}
110
111// STORE
112#[derive(Debug, Copy, Clone)]
113pub struct Store {
114    pub dest: MediumLevelExpressionIndex,
115    pub src: MediumLevelExpressionIndex,
116}
117#[derive(Clone, Debug, PartialEq)]
118pub struct LiftedStore {
119    pub dest: Box<MediumLevelILLiftedInstruction>,
120    pub src: Box<MediumLevelILLiftedInstruction>,
121}
122
123// JUMP_TO
124#[derive(Debug, Copy, Clone)]
125pub struct JumpTo {
126    pub dest: MediumLevelExpressionIndex,
127    pub first_operand: usize,
128    pub num_operands: usize,
129}
130#[derive(Clone, Debug, PartialEq)]
131pub struct LiftedJumpTo {
132    pub dest: Box<MediumLevelILLiftedInstruction>,
133    pub targets: BTreeMap<u64, MediumLevelInstructionIndex>,
134}
135
136// GOTO
137#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
138pub struct Goto {
139    pub dest: MediumLevelInstructionIndex,
140}
141
142// FREE_VAR_SLOT
143#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
144pub struct FreeVarSlot {
145    pub dest: Variable,
146}
147
148// SET_VAR_FIELD
149#[derive(Debug, Copy, Clone)]
150pub struct SetVarField {
151    pub dest: Variable,
152    pub offset: u64,
153    pub src: MediumLevelExpressionIndex,
154}
155#[derive(Clone, Debug, PartialEq)]
156pub struct LiftedSetVarField {
157    pub dest: Variable,
158    pub offset: u64,
159    pub src: Box<MediumLevelILLiftedInstruction>,
160}
161
162// SET_VAR
163#[derive(Debug, Copy, Clone)]
164pub struct SetVar {
165    pub dest: Variable,
166    pub src: MediumLevelExpressionIndex,
167}
168#[derive(Clone, Debug, PartialEq)]
169pub struct LiftedSetVar {
170    pub dest: Variable,
171    pub src: Box<MediumLevelILLiftedInstruction>,
172}
173
174// FREE_VAR_SLOT_SSA
175#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
176pub struct FreeVarSlotSsa {
177    pub dest: SSAVariable,
178    pub prev: SSAVariable,
179}
180
181// SET_VAR_SSA_FIELD, SET_VAR_ALIASED_FIELD
182#[derive(Debug, Copy, Clone)]
183pub struct SetVarSsaField {
184    pub dest: SSAVariable,
185    pub prev: SSAVariable,
186    pub offset: u64,
187    pub src: MediumLevelExpressionIndex,
188}
189#[derive(Clone, Debug, PartialEq)]
190pub struct LiftedSetVarSsaField {
191    pub dest: SSAVariable,
192    pub prev: SSAVariable,
193    pub offset: u64,
194    pub src: Box<MediumLevelILLiftedInstruction>,
195}
196
197// SET_VAR_ALIASED
198#[derive(Debug, Copy, Clone)]
199pub struct SetVarAliased {
200    pub dest: SSAVariable,
201    pub prev: SSAVariable,
202    pub src: MediumLevelExpressionIndex,
203}
204#[derive(Clone, Debug, PartialEq)]
205pub struct LiftedSetVarAliased {
206    pub dest: SSAVariable,
207    pub prev: SSAVariable,
208    pub src: Box<MediumLevelILLiftedInstruction>,
209}
210
211// SET_VAR_SSA
212#[derive(Debug, Copy, Clone)]
213pub struct SetVarSsa {
214    pub dest: SSAVariable,
215    pub src: MediumLevelExpressionIndex,
216}
217#[derive(Clone, Debug, PartialEq)]
218pub struct LiftedSetVarSsa {
219    pub dest: SSAVariable,
220    pub src: Box<MediumLevelILLiftedInstruction>,
221}
222
223// VAR_PHI
224#[derive(Debug, Copy, Clone)]
225pub struct VarPhi {
226    pub dest: SSAVariable,
227    pub first_operand: usize,
228    pub num_operands: usize,
229}
230#[derive(Clone, Debug, Hash, PartialEq, Eq)]
231pub struct LiftedVarPhi {
232    pub dest: SSAVariable,
233    pub src: Vec<SSAVariable>,
234}
235
236// MEM_PHI
237#[derive(Debug, Copy, Clone)]
238pub struct MemPhi {
239    pub dest_memory: u64,
240    pub first_operand: usize,
241    pub num_operands: usize,
242}
243#[derive(Clone, Debug, Hash, PartialEq, Eq)]
244pub struct LiftedMemPhi {
245    pub dest_memory: u64,
246    pub src_memory: Vec<u64>,
247}
248
249// VAR_SPLIT
250#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
251pub struct VarSplit {
252    pub high: Variable,
253    pub low: Variable,
254}
255
256// SET_VAR_SPLIT
257#[derive(Debug, Copy, Clone)]
258pub struct SetVarSplit {
259    pub high: Variable,
260    pub low: Variable,
261    pub src: MediumLevelExpressionIndex,
262}
263#[derive(Clone, Debug, PartialEq)]
264pub struct LiftedSetVarSplit {
265    pub high: Variable,
266    pub low: Variable,
267    pub src: Box<MediumLevelILLiftedInstruction>,
268}
269
270// VAR_SPLIT_SSA
271#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
272pub struct VarSplitSsa {
273    pub high: SSAVariable,
274    pub low: SSAVariable,
275}
276
277// SET_VAR_SPLIT_SSA
278#[derive(Debug, Copy, Clone)]
279pub struct SetVarSplitSsa {
280    pub high: SSAVariable,
281    pub low: SSAVariable,
282    pub src: MediumLevelExpressionIndex,
283}
284#[derive(Clone, Debug, PartialEq)]
285pub struct LiftedSetVarSplitSsa {
286    pub high: SSAVariable,
287    pub low: SSAVariable,
288    pub src: Box<MediumLevelILLiftedInstruction>,
289}
290
291// ADD, SUB, AND, OR, XOR, LSL, LSR, ASR, ROL, ROR, MUL, MULU_DP, MULS_DP, DIVU, DIVU_DP, DIVS, DIVS_DP, MODU, MODU_DP, MODS, MODS_DP, CMP_E, CMP_NE, CMP_SLT, CMP_ULT, CMP_SLE, CMP_ULE, CMP_SGE, CMP_UGE, CMP_SGT, CMP_UGT, TEST_BIT, ADD_OVERFLOW, FCMP_E, FCMP_NE, FCMP_LT, FCMP_LE, FCMP_GE, FCMP_GT, FCMP_O, FCMP_UO, FADD, FSUB, FMUL, FDIV
292#[derive(Debug, Copy, Clone)]
293pub struct BinaryOp {
294    pub left: MediumLevelExpressionIndex,
295    pub right: MediumLevelExpressionIndex,
296}
297#[derive(Clone, Debug, PartialEq)]
298pub struct LiftedBinaryOp {
299    pub left: Box<MediumLevelILLiftedInstruction>,
300    pub right: Box<MediumLevelILLiftedInstruction>,
301}
302
303// ADC, SBB, RLC, RRC
304#[derive(Debug, Copy, Clone)]
305pub struct BinaryOpCarry {
306    pub left: MediumLevelExpressionIndex,
307    pub right: MediumLevelExpressionIndex,
308    pub carry: MediumLevelExpressionIndex,
309}
310#[derive(Clone, Debug, PartialEq)]
311pub struct LiftedBinaryOpCarry {
312    pub left: Box<MediumLevelILLiftedInstruction>,
313    pub right: Box<MediumLevelILLiftedInstruction>,
314    pub carry: Box<MediumLevelILLiftedInstruction>,
315}
316
317// CALL, TAILCALL
318#[derive(Debug, Copy, Clone)]
319pub struct Call {
320    pub first_output: usize,
321    pub num_outputs: usize,
322    pub dest: MediumLevelExpressionIndex,
323    pub first_param: usize,
324    pub num_params: usize,
325}
326#[derive(Clone, Debug, PartialEq)]
327pub struct LiftedCall {
328    pub output: Vec<MediumLevelILLiftedInstruction>,
329    pub dest: Box<MediumLevelILLiftedInstruction>,
330    pub params: Vec<MediumLevelILLiftedInstruction>,
331}
332
333// CALL_OUTPUT
334#[derive(Debug, Copy, Clone)]
335pub struct CallOutput {
336    pub first_output: usize,
337    pub num_outputs: usize,
338}
339#[derive(Clone, Debug, PartialEq)]
340pub struct LiftedCallOutput {
341    pub output: Vec<Variable>,
342}
343
344// CALL_PARAM_SSA
345#[derive(Debug, Copy, Clone)]
346pub struct CallParam {
347    pub first_param: usize,
348    pub num_params: usize,
349}
350#[derive(Clone, Debug, PartialEq)]
351pub struct LiftedCallParam {
352    pub params: Vec<MediumLevelILLiftedInstruction>,
353}
354
355// CALL_OUTPUT_SSA
356#[derive(Debug, Copy, Clone)]
357pub struct CallOutputSsa {
358    pub dest_memory: u64,
359    pub first_output: usize,
360    pub num_outputs: usize,
361}
362#[derive(Clone, Debug, PartialEq)]
363pub struct LiftedCallOutputSsa {
364    pub dest_memory: u64,
365    pub output: Vec<SSAVariable>,
366}
367
368// CALL_PARAM_SSA
369#[derive(Debug, Copy, Clone)]
370pub struct CallParamSsa {
371    pub src_memory: u64,
372    pub first_param: usize,
373    pub num_params: usize,
374}
375#[derive(Clone, Debug, PartialEq)]
376pub struct LiftedCallParamSsa {
377    pub src_memory: u64,
378    pub params: Vec<MediumLevelILLiftedInstruction>,
379}
380
381// SYSCALL
382#[derive(Debug, Copy, Clone)]
383pub struct Syscall {
384    pub first_output: usize,
385    pub num_outputs: usize,
386    pub first_param: usize,
387    pub num_params: usize,
388}
389#[derive(Clone, Debug, PartialEq)]
390pub struct LiftedSyscallCall {
391    pub output: Vec<MediumLevelILLiftedInstruction>,
392    pub params: Vec<MediumLevelILLiftedInstruction>,
393}
394
395// INTRINSIC
396#[derive(Debug, Copy, Clone)]
397pub struct Intrinsic {
398    pub first_output: usize,
399    pub num_outputs: usize,
400    pub intrinsic: u32,
401    pub first_param: usize,
402    pub num_params: usize,
403}
404#[derive(Clone, Debug, PartialEq)]
405pub struct LiftedIntrinsic {
406    pub output: Vec<Variable>,
407    pub intrinsic: CoreIntrinsic,
408    pub params: Vec<MediumLevelILLiftedInstruction>,
409}
410
411// INTRINSIC_SSA
412#[derive(Debug, Copy, Clone)]
413pub struct IntrinsicSsa {
414    pub first_output: usize,
415    pub num_outputs: usize,
416    pub intrinsic: u32,
417    pub first_param: usize,
418    pub num_params: usize,
419}
420#[derive(Clone, Debug, PartialEq)]
421pub struct LiftedIntrinsicSsa {
422    pub output: Vec<SSAVariable>,
423    pub intrinsic: CoreIntrinsic,
424    pub params: Vec<MediumLevelILLiftedInstruction>,
425}
426
427// MEMORY_INTRINSIC_SSA
428#[derive(Debug, Copy, Clone)]
429pub struct MemoryIntrinsicSsa {
430    pub output: MediumLevelExpressionIndex,
431    pub intrinsic: u32,
432    pub first_param: usize,
433    pub num_params: usize,
434    pub src_memory: u64,
435}
436#[derive(Clone, Debug, PartialEq)]
437pub struct LiftedMemoryIntrinsicSsa {
438    pub output: Box<MediumLevelILLiftedInstruction>,
439    pub intrinsic: CoreIntrinsic,
440    pub params: Vec<MediumLevelILLiftedInstruction>,
441    pub src_memory: u64,
442}
443
444// MEMORY_INTRINSIC_OUTPUT_SSA
445#[derive(Debug, Copy, Clone)]
446pub struct MemoryIntrinsicOutputSsa {
447    pub dest_memory: u64,
448    pub first_output: usize,
449    pub num_outputs: usize,
450}
451#[derive(Clone, Debug, PartialEq)]
452pub struct LiftedMemoryIntrinsicOutputSsa {
453    pub dest_memory: u64,
454    pub output: Vec<SSAVariable>,
455}
456
457// CALL_SSA, TAILCALL_SSA
458#[derive(Debug, Copy, Clone)]
459pub struct CallSsa {
460    pub output: MediumLevelExpressionIndex,
461    pub dest: MediumLevelExpressionIndex,
462    pub first_param: usize,
463    pub num_params: usize,
464    pub src_memory: u64,
465}
466#[derive(Clone, Debug, PartialEq)]
467pub struct LiftedCallSsa {
468    pub output: Vec<MediumLevelILLiftedInstruction>,
469    pub dest: Box<MediumLevelILLiftedInstruction>,
470    pub params: Vec<MediumLevelILLiftedInstruction>,
471    pub src_memory: u64,
472}
473
474// CALL_UNTYPED_SSA, TAILCALL_UNTYPED_SSA
475#[derive(Debug, Copy, Clone)]
476pub struct CallUntypedSsa {
477    pub output: MediumLevelExpressionIndex,
478    pub dest: MediumLevelExpressionIndex,
479    pub params: MediumLevelExpressionIndex,
480    pub stack: MediumLevelExpressionIndex,
481}
482#[derive(Clone, Debug, PartialEq)]
483pub struct LiftedCallUntypedSsa {
484    pub output: Vec<MediumLevelILLiftedInstruction>,
485    pub dest: Box<MediumLevelILLiftedInstruction>,
486    pub params: Vec<MediumLevelILLiftedInstruction>,
487    pub stack: Box<MediumLevelILLiftedInstruction>,
488}
489
490// SYSCALL_SSA
491#[derive(Debug, Copy, Clone)]
492pub struct SyscallSsa {
493    pub output: MediumLevelExpressionIndex,
494    pub first_param: usize,
495    pub num_params: usize,
496    pub src_memory: u64,
497}
498#[derive(Clone, Debug, PartialEq)]
499pub struct LiftedSyscallSsa {
500    pub output: Vec<MediumLevelILLiftedInstruction>,
501    pub params: Vec<MediumLevelILLiftedInstruction>,
502    pub src_memory: u64,
503}
504
505// SYSCALL_UNTYPED_SSA
506#[derive(Debug, Copy, Clone)]
507pub struct SyscallUntypedSsa {
508    pub output: MediumLevelExpressionIndex,
509    pub params: MediumLevelExpressionIndex,
510    pub stack: MediumLevelExpressionIndex,
511}
512#[derive(Clone, Debug, PartialEq)]
513pub struct LiftedSyscallUntypedSsa {
514    pub output: Vec<MediumLevelILLiftedInstruction>,
515    pub params: Vec<MediumLevelILLiftedInstruction>,
516    pub stack: Box<MediumLevelILLiftedInstruction>,
517}
518
519// CALL_UNTYPED, TAILCALL_UNTYPED
520#[derive(Debug, Copy, Clone)]
521pub struct CallUntyped {
522    pub first_output: usize,
523    pub num_outputs: usize,
524    pub dest: MediumLevelExpressionIndex,
525    pub params: MediumLevelExpressionIndex,
526    pub stack: MediumLevelExpressionIndex,
527}
528#[derive(Clone, Debug, PartialEq)]
529pub struct LiftedCallUntyped {
530    pub output: Vec<MediumLevelILLiftedInstruction>,
531    pub dest: Box<MediumLevelILLiftedInstruction>,
532    pub params: Vec<MediumLevelILLiftedInstruction>,
533    pub stack: Box<MediumLevelILLiftedInstruction>,
534}
535
536// SYSCALL_UNTYPED
537#[derive(Debug, Copy, Clone)]
538pub struct SyscallUntyped {
539    pub first_output: usize,
540    pub num_outputs: usize,
541    pub params: MediumLevelExpressionIndex,
542    pub stack: MediumLevelExpressionIndex,
543}
544#[derive(Clone, Debug, PartialEq)]
545pub struct LiftedSyscallUntyped {
546    pub output: Vec<MediumLevelILLiftedInstruction>,
547    pub params: Vec<MediumLevelILLiftedInstruction>,
548    pub stack: Box<MediumLevelILLiftedInstruction>,
549}
550
551// NEG, NOT, SX, ZX, LOW_PART, BOOL_TO_INT, UNIMPL_MEM, FSQRT, FNEG, FABS, FLOAT_TO_INT, INT_TO_FLOAT, FLOAT_CONV, ROUND_TO_INT, FLOOR, CEIL, FTRUNC, LOAD
552#[derive(Debug, Copy, Clone)]
553pub struct UnaryOp {
554    pub src: MediumLevelExpressionIndex,
555}
556#[derive(Clone, Debug, PartialEq)]
557pub struct LiftedUnaryOp {
558    pub src: Box<MediumLevelILLiftedInstruction>,
559}
560
561// LOAD_STRUCT
562#[derive(Debug, Copy, Clone)]
563pub struct LoadStruct {
564    pub src: MediumLevelExpressionIndex,
565    pub offset: u64,
566}
567#[derive(Clone, Debug, PartialEq)]
568pub struct LiftedLoadStruct {
569    pub src: Box<MediumLevelILLiftedInstruction>,
570    pub offset: u64,
571}
572
573// LOAD_STRUCT_SSA
574#[derive(Debug, Copy, Clone)]
575pub struct LoadStructSsa {
576    pub src: MediumLevelExpressionIndex,
577    pub offset: u64,
578    pub src_memory: u64,
579}
580#[derive(Clone, Debug, PartialEq)]
581pub struct LiftedLoadStructSsa {
582    pub src: Box<MediumLevelILLiftedInstruction>,
583    pub offset: u64,
584    pub src_memory: u64,
585}
586
587// LOAD_SSA
588#[derive(Debug, Copy, Clone)]
589pub struct LoadSsa {
590    pub src: MediumLevelExpressionIndex,
591    pub src_memory: u64,
592}
593#[derive(Clone, Debug, PartialEq)]
594pub struct LiftedLoadSsa {
595    pub src: Box<MediumLevelILLiftedInstruction>,
596    pub src_memory: u64,
597}
598
599// RET
600#[derive(Debug, Copy, Clone)]
601pub struct Ret {
602    pub first_operand: usize,
603    pub num_operands: usize,
604}
605#[derive(Clone, Debug, PartialEq)]
606pub struct LiftedRet {
607    pub src: Vec<MediumLevelILLiftedInstruction>,
608}
609
610// SEPARATE_PARAM_LIST
611#[derive(Debug, Copy, Clone)]
612pub struct SeparateParamList {
613    pub first_param: usize,
614    pub num_params: usize,
615}
616#[derive(Clone, Debug, PartialEq)]
617pub struct LiftedSeparateParamList {
618    pub params: Vec<MediumLevelILLiftedInstruction>,
619}
620
621// SHARED_PARAM_SLOT
622#[derive(Debug, Copy, Clone)]
623pub struct SharedParamSlot {
624    pub first_param: usize,
625    pub num_params: usize,
626}
627#[derive(Clone, Debug, PartialEq)]
628pub struct LiftedSharedParamSlot {
629    pub params: Vec<MediumLevelILLiftedInstruction>,
630}
631
632// VAR, ADDRESS_OF
633#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
634pub struct Var {
635    pub src: Variable,
636}
637
638// VAR_OUTPUT
639#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
640pub struct VarOutput {
641    pub dest: Variable,
642}
643
644// VAR_OUTPUT_FIELD
645#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
646pub struct VarOutputField {
647    pub dest: Variable,
648    pub offset: u64,
649}
650
651// STORE_OUTPUT
652#[derive(Debug, Copy, Clone)]
653pub struct StoreOutput {
654    pub dest: MediumLevelExpressionIndex,
655}
656#[derive(Clone, Debug, PartialEq)]
657pub struct LiftedStoreOutput {
658    pub dest: Box<MediumLevelILLiftedInstruction>,
659}
660
661// VAR_FIELD, ADDRESS_OF_FIELD
662#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
663pub struct Field {
664    pub src: Variable,
665    pub offset: u64,
666}
667
668// VAR_SSA, VAR_ALIASED
669#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
670pub struct VarSsa {
671    pub src: SSAVariable,
672}
673
674// VAR_SSA_FIELD, VAR_ALIASED_FIELD
675#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
676pub struct VarSsaField {
677    pub src: SSAVariable,
678    pub offset: u64,
679}
680
681// VAR_OUTPUT_SSA
682#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
683pub struct VarOutputSsa {
684    pub dest: SSAVariable,
685}
686
687// VAR_OUTPUT_SSA_FIELD
688#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
689pub struct VarOutputSsaField {
690    pub dest: SSAVariable,
691    pub prev: SSAVariable,
692    pub offset: u64,
693}
694
695// VAR_OUTPUT_ALIASED
696#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
697pub struct VarOutputAliased {
698    pub dest: SSAVariable,
699    pub prev: SSAVariable,
700}
701
702// VAR_OUTPUT_ALIASED_FIELD
703#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
704pub struct VarOutputAliasedField {
705    pub dest: SSAVariable,
706    pub prev: SSAVariable,
707    pub offset: u64,
708}
709
710// TRAP
711#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
712pub struct Trap {
713    pub vector: u64,
714}
715
716// BLOCK_TO_EXPAND
717#[derive(Debug, Copy, Clone)]
718pub struct BlockToExpand {
719    pub first_operand: usize,
720    pub num_operands: usize,
721}
722#[derive(Clone, Debug, PartialEq)]
723pub struct LiftedBlockToExpand {
724    pub exprs: Vec<MediumLevelILLiftedInstruction>,
725}