use crate::codegen;
use crate::lir::expressions::{Expression, Operand};
use crate::lir::lir_type::InternalCallTy;
use crate::sema::ast::{CallTy, ExternalCallAccounts};
use solang_parser::pt::Loc;
use super::lir_type::PhiInput;
#[derive(Debug)]
pub enum Instruction {
Nop,
ReturnData {
loc: Loc,
data: Operand,
data_len: Operand,
},
ReturnCode {
loc: Loc,
code: codegen::cfg::ReturnCode,
},
Set {
loc: Loc,
res: usize,
expr: Expression,
},
Store {
loc: Loc,
dest: Operand,
data: Operand,
},
PushMemory {
loc: Loc,
res: usize,
array: usize,
value: Operand,
},
PopMemory {
loc: Loc,
res: usize,
array: usize,
},
Constructor {
loc: Loc,
success: Option<usize>,
res: usize,
contract_no: usize,
constructor_no: Option<usize>,
encoded_args: Operand,
value: Option<Operand>,
gas: Operand,
salt: Option<Operand>,
address: Option<Operand>,
seeds: Option<Operand>,
accounts: ExternalCallAccounts<Operand>,
},
LoadStorage {
loc: Loc,
res: usize,
storage: Operand,
},
ClearStorage {
loc: Loc,
storage: Operand,
},
SetStorage {
loc: Loc,
value: Operand,
storage: Operand,
},
SetStorageBytes {
loc: Loc,
value: Operand,
storage: Operand,
offset: Operand,
},
PushStorage {
loc: Loc,
res: usize,
value: Option<Operand>,
storage: Operand,
},
PopStorage {
loc: Loc,
res: Option<usize>,
storage: Operand,
},
Call {
loc: Loc,
res: Vec<usize>,
call: InternalCallTy,
args: Vec<Operand>,
},
Print {
loc: Loc,
operand: Operand,
},
MemCopy {
loc: Loc,
src: Operand,
dest: Operand,
bytes: Operand,
},
ExternalCall {
loc: Loc,
success: Option<usize>,
address: Option<Operand>,
accounts: ExternalCallAccounts<Operand>,
seeds: Option<Operand>,
payload: Operand,
value: Operand,
gas: Operand,
callty: CallTy,
contract_function_no: Option<(usize, usize)>,
flags: Option<Operand>,
},
ValueTransfer {
loc: Loc,
success: Option<usize>,
address: Operand,
value: Operand,
},
SelfDestruct {
loc: Loc,
recipient: Operand,
},
EmitEvent {
loc: Loc,
event_no: usize,
data: Operand,
topics: Vec<Operand>,
},
WriteBuffer {
loc: Loc,
buf: Operand,
offset: Operand,
value: Operand,
},
Branch {
loc: Loc,
block: usize,
},
BranchCond {
loc: Loc,
cond: Operand,
true_block: usize,
false_block: usize,
},
Switch {
loc: Loc,
cond: Operand,
cases: Vec<(Operand, usize)>,
default: usize,
},
Return {
loc: Loc,
value: Vec<Operand>,
},
AssertFailure {
loc: Loc,
encoded_args: Option<Operand>,
},
Phi {
loc: Loc,
res: usize,
vars: Vec<PhiInput>,
},
}