1use super::{
2 MediumLevelExpressionIndex, MediumLevelILLiftedInstruction, MediumLevelInstructionIndex,
3};
4use crate::architecture::CoreIntrinsic;
5use crate::variable::{ConstantData, SSAVariable, Variable};
6use std::collections::BTreeMap;
7
8#[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#[derive(Copy, Clone, Debug, PartialEq)]
24pub struct FloatConst {
25 pub constant: f64,
26}
27
28#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
30pub struct Constant {
31 pub constant: u64,
32}
33
34#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
36pub struct ExternPtr {
37 pub constant: u64,
38 pub offset: u64,
39}
40
41#[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#[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#[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#[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#[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#[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#[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#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
138pub struct Goto {
139 pub dest: MediumLevelInstructionIndex,
140}
141
142#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
144pub struct FreeVarSlot {
145 pub dest: Variable,
146}
147
148#[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#[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#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
176pub struct FreeVarSlotSsa {
177 pub dest: SSAVariable,
178 pub prev: SSAVariable,
179}
180
181#[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#[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#[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#[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#[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#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
251pub struct VarSplit {
252 pub high: Variable,
253 pub low: Variable,
254}
255
256#[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#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
272pub struct VarSplitSsa {
273 pub high: SSAVariable,
274 pub low: SSAVariable,
275}
276
277#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
634pub struct Var {
635 pub src: Variable,
636}
637
638#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
640pub struct VarOutput {
641 pub dest: Variable,
642}
643
644#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
646pub struct VarOutputField {
647 pub dest: Variable,
648 pub offset: u64,
649}
650
651#[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#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
663pub struct Field {
664 pub src: Variable,
665 pub offset: u64,
666}
667
668#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
670pub struct VarSsa {
671 pub src: SSAVariable,
672}
673
674#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
676pub struct VarSsaField {
677 pub src: SSAVariable,
678 pub offset: u64,
679}
680
681#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
683pub struct VarOutputSsa {
684 pub dest: SSAVariable,
685}
686
687#[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#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
697pub struct VarOutputAliased {
698 pub dest: SSAVariable,
699 pub prev: SSAVariable,
700}
701
702#[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#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
712pub struct Trap {
713 pub vector: u64,
714}
715
716#[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}