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#[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#[derive(Copy, Clone, Debug, PartialEq)]
26pub struct FloatConst {
27 pub constant: f64,
28}
29
30#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
32pub struct Constant {
33 pub constant: u64,
34}
35
36#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
38pub struct ExternPtr {
39 pub constant: u64,
40 pub offset: u64,
41}
42
43#[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#[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#[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#[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#[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#[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#[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#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
140pub struct Goto {
141 pub dest: MediumLevelInstructionIndex,
142}
143
144#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
146pub struct FreeVarSlot {
147 pub dest: Variable,
148}
149
150#[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#[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#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
178pub struct FreeVarSlotSsa {
179 pub dest: SSAVariable,
180 pub prev: SSAVariable,
181}
182
183#[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#[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#[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#[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#[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#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
253pub struct VarSplit {
254 pub high: Variable,
255 pub low: Variable,
256}
257
258#[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#[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#[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#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
294pub struct VarSplitSsa {
295 pub high: SSAVariable,
296 pub low: SSAVariable,
297}
298
299#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
665pub struct Var {
666 pub src: Variable,
667}
668
669#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
671pub struct VarOutput {
672 pub dest: Variable,
673}
674
675#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
677pub struct VarOutputField {
678 pub dest: Variable,
679 pub offset: u64,
680}
681
682#[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#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
694pub struct Field {
695 pub src: Variable,
696 pub offset: u64,
697}
698
699#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
701pub struct VarSsa {
702 pub src: SSAVariable,
703}
704
705#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
707pub struct VarSsaField {
708 pub src: SSAVariable,
709 pub offset: u64,
710}
711
712#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
714pub struct VarOutputSsa {
715 pub dest: SSAVariable,
716}
717
718#[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#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
728pub struct VarOutputAliased {
729 pub dest: SSAVariable,
730 pub prev: SSAVariable,
731}
732
733#[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#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
743pub struct Trap {
744 pub vector: u64,
745}
746
747#[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}