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<Variable>,
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<Variable>,
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<SSAVariable>,
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<SSAVariable>,
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<SSAVariable>,
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<SSAVariable>,
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 output: MediumLevelExpressionIndex,
523    pub dest: MediumLevelExpressionIndex,
524    pub params: MediumLevelExpressionIndex,
525    pub stack: MediumLevelExpressionIndex,
526}
527#[derive(Clone, Debug, PartialEq)]
528pub struct LiftedCallUntyped {
529    pub output: Vec<Variable>,
530    pub dest: Box<MediumLevelILLiftedInstruction>,
531    pub params: Vec<MediumLevelILLiftedInstruction>,
532    pub stack: Box<MediumLevelILLiftedInstruction>,
533}
534
535// SYSCALL_UNTYPED
536#[derive(Debug, Copy, Clone)]
537pub struct SyscallUntyped {
538    pub output: MediumLevelExpressionIndex,
539    pub params: MediumLevelExpressionIndex,
540    pub stack: MediumLevelExpressionIndex,
541}
542#[derive(Clone, Debug, PartialEq)]
543pub struct LiftedSyscallUntyped {
544    pub output: Vec<Variable>,
545    pub params: Vec<MediumLevelILLiftedInstruction>,
546    pub stack: Box<MediumLevelILLiftedInstruction>,
547}
548
549// 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
550#[derive(Debug, Copy, Clone)]
551pub struct UnaryOp {
552    pub src: MediumLevelExpressionIndex,
553}
554#[derive(Clone, Debug, PartialEq)]
555pub struct LiftedUnaryOp {
556    pub src: Box<MediumLevelILLiftedInstruction>,
557}
558
559// LOAD_STRUCT
560#[derive(Debug, Copy, Clone)]
561pub struct LoadStruct {
562    pub src: MediumLevelExpressionIndex,
563    pub offset: u64,
564}
565#[derive(Clone, Debug, PartialEq)]
566pub struct LiftedLoadStruct {
567    pub src: Box<MediumLevelILLiftedInstruction>,
568    pub offset: u64,
569}
570
571// LOAD_STRUCT_SSA
572#[derive(Debug, Copy, Clone)]
573pub struct LoadStructSsa {
574    pub src: MediumLevelExpressionIndex,
575    pub offset: u64,
576    pub src_memory: u64,
577}
578#[derive(Clone, Debug, PartialEq)]
579pub struct LiftedLoadStructSsa {
580    pub src: Box<MediumLevelILLiftedInstruction>,
581    pub offset: u64,
582    pub src_memory: u64,
583}
584
585// LOAD_SSA
586#[derive(Debug, Copy, Clone)]
587pub struct LoadSsa {
588    pub src: MediumLevelExpressionIndex,
589    pub src_memory: u64,
590}
591#[derive(Clone, Debug, PartialEq)]
592pub struct LiftedLoadSsa {
593    pub src: Box<MediumLevelILLiftedInstruction>,
594    pub src_memory: u64,
595}
596
597// RET
598#[derive(Debug, Copy, Clone)]
599pub struct Ret {
600    pub first_operand: usize,
601    pub num_operands: usize,
602}
603#[derive(Clone, Debug, PartialEq)]
604pub struct LiftedRet {
605    pub src: Vec<MediumLevelILLiftedInstruction>,
606}
607
608// SEPARATE_PARAM_LIST
609#[derive(Debug, Copy, Clone)]
610pub struct SeparateParamList {
611    pub first_param: usize,
612    pub num_params: usize,
613}
614#[derive(Clone, Debug, PartialEq)]
615pub struct LiftedSeparateParamList {
616    pub params: Vec<MediumLevelILLiftedInstruction>,
617}
618
619// SHARED_PARAM_SLOT
620#[derive(Debug, Copy, Clone)]
621pub struct SharedParamSlot {
622    pub first_param: usize,
623    pub num_params: usize,
624}
625#[derive(Clone, Debug, PartialEq)]
626pub struct LiftedSharedParamSlot {
627    pub params: Vec<MediumLevelILLiftedInstruction>,
628}
629
630// VAR, ADDRESS_OF
631#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
632pub struct Var {
633    pub src: Variable,
634}
635
636// VAR_FIELD, ADDRESS_OF_FIELD
637#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
638pub struct Field {
639    pub src: Variable,
640    pub offset: u64,
641}
642
643// VAR_SSA, VAR_ALIASED
644#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
645pub struct VarSsa {
646    pub src: SSAVariable,
647}
648
649// VAR_SSA_FIELD, VAR_ALIASED_FIELD
650#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
651pub struct VarSsaField {
652    pub src: SSAVariable,
653    pub offset: u64,
654}
655
656// TRAP
657#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
658pub struct Trap {
659    pub vector: u64,
660}