Skip to main content

binaryninja/medium_level_il/
operation.rs

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