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<Variable>,
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<Variable>,
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<SSAVariable>,
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<SSAVariable>,
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<SSAVariable>,
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<SSAVariable>,
515 pub params: Vec<MediumLevelILLiftedInstruction>,
516 pub stack: Box<MediumLevelILLiftedInstruction>,
517}
518
519#[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#[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#[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#[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#[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#[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#[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#[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#[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#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
632pub struct Var {
633 pub src: Variable,
634}
635
636#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
638pub struct Field {
639 pub src: Variable,
640 pub offset: u64,
641}
642
643#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
645pub struct VarSsa {
646 pub src: SSAVariable,
647}
648
649#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
651pub struct VarSsaField {
652 pub src: SSAVariable,
653 pub offset: u64,
654}
655
656#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
658pub struct Trap {
659 pub vector: u64,
660}