Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/abi/polkadot.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ use semver::Version;
use solang_parser::pt;

use crate::{
codegen::polkadot::SCRATCH_SIZE,
codegen::revert::{SolidityError, ERROR_SELECTOR, PANIC_SELECTOR},
codegen::targets::polkadot::return_code::SCRATCH_SIZE,
sema::{
ast::{self, ArrayLength, EventDecl, Function},
tags::render,
Expand Down
24 changes: 20 additions & 4 deletions src/codegen/cfg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use super::{
vartable::{Vars, Vartable},
vector_to_slice, Options,
};
use crate::codegen::interface::TargetCodegen;
use crate::codegen::subexpression_elimination::common_sub_expression_elimination;
use crate::codegen::{undefined_variable, Expression, LLVMName};
use crate::sema::ast::{
Expand Down Expand Up @@ -1483,19 +1484,20 @@ fn is_there_virtual_function(

/// Generate the CFG for a function. If function_no is None, generate the implicit default
/// constructor
pub fn generate_cfg(
pub(crate) fn generate_cfg(
contract_no: usize,
function_no: Option<usize>,
cfg_no: usize,
all_cfgs: &mut Vec<ControlFlowGraph>,
ns: &mut Namespace,
opt: &Options,
target: &dyn TargetCodegen,
) {
if is_there_virtual_function(ns, contract_no, function_no) {
return;
}

let mut cfg = function_cfg(contract_no, function_no, ns, opt);
let mut cfg = function_cfg(contract_no, function_no, ns, opt, target);
let ast_fn = function_no
.map(ASTFunction::SolidityFunction)
.unwrap_or(ASTFunction::None);
Expand Down Expand Up @@ -1524,6 +1526,7 @@ pub fn generate_cfg(
chain_no,
ns,
opt,
target,
);
optimize_and_check_cfg(&mut cfg, ns, ast_fn, opt);
}
Expand Down Expand Up @@ -1609,6 +1612,7 @@ fn function_cfg(
function_no: Option<usize>,
ns: &mut Namespace,
opt: &Options,
target: &dyn TargetCodegen,
) -> ControlFlowGraph {
let mut vartab = match function_no {
Some(function_no) => {
Expand Down Expand Up @@ -1727,8 +1731,16 @@ fn function_cfg(
.iter()
.enumerate()
.map(|(i, a)| {
let expr =
expression(a, &mut cfg, contract_no, Some(func), ns, &mut vartab, opt);
let expr = expression(
a,
&mut cfg,
contract_no,
Some(func),
ns,
&mut vartab,
opt,
target,
);

if let Some(id) = &func.symtable.arguments[i] {
let ty = expr.ty();
Expand Down Expand Up @@ -1806,6 +1818,7 @@ fn function_cfg(
None,
None,
opt,
target,
);

if !stmt.reachable() {
Expand Down Expand Up @@ -1920,6 +1933,7 @@ fn generate_modifier_dispatch(
chain_no: usize,
ns: &mut Namespace,
opt: &Options,
target: &dyn TargetCodegen,
) -> ControlFlowGraph {
let (modifier_no, args) = resolve_modifier_call(
&ns.functions[func_no].modifiers[chain_no],
Expand Down Expand Up @@ -1976,6 +1990,7 @@ fn generate_modifier_dispatch(
ns,
&mut vartab,
opt,
target,
);
cfg.add(
&mut vartab,
Expand Down Expand Up @@ -2033,6 +2048,7 @@ fn generate_modifier_dispatch(
Some(&placeholder),
Some(&return_instr),
opt,
target,
);
}

Expand Down
22 changes: 12 additions & 10 deletions src/codegen/constructor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

use crate::codegen::cfg::{ControlFlowGraph, Instr};
use crate::codegen::expression::{default_gas, expression};
use crate::codegen::interface::TargetCodegen;
use crate::codegen::vartable::Vartable;
use crate::codegen::{Expression, Options};
use crate::sema::{
Expand All @@ -12,10 +13,9 @@ use crate::Target;
use num_bigint::{BigInt, Sign};
use solang_parser::pt::Loc;

use super::encoding::abi_encode;

/// This function encodes the constructor arguments and place an instruction in the CFG to
/// call the constructor of a contract.
#[allow(clippy::too_many_arguments)]
pub(super) fn call_constructor(
loc: &Loc,
contract_no: usize,
Expand All @@ -30,22 +30,23 @@ pub(super) fn call_constructor(
vartab: &mut Vartable,
cfg: &mut ControlFlowGraph,
opt: &Options,
target: &dyn TargetCodegen,
) {
let value = call_args
.value
.as_ref()
.map(|v| expression(v, cfg, callee_contract_no, func, ns, vartab, opt));
.map(|v| expression(v, cfg, callee_contract_no, func, ns, vartab, opt, target));

let gas = if let Some(gas) = &call_args.gas {
expression(gas, cfg, callee_contract_no, func, ns, vartab, opt)
expression(gas, cfg, callee_contract_no, func, ns, vartab, opt, target)
} else {
default_gas(ns)
default_gas(ns, target)
};

let salt = call_args
.salt
.as_ref()
.map(|e| expression(e, cfg, callee_contract_no, func, ns, vartab, opt));
.map(|e| expression(e, cfg, callee_contract_no, func, ns, vartab, opt, target));
let address = if ns.target == Target::Solana {
if let Some(literal_id) = &ns.contracts[contract_no].program_id {
Some(Expression::NumberLiteral {
Expand All @@ -62,6 +63,7 @@ pub(super) fn call_constructor(
ns,
vartab,
opt,
target,
);
Some(address)
}
Expand All @@ -71,14 +73,14 @@ pub(super) fn call_constructor(
let seeds = call_args
.seeds
.as_ref()
.map(|e| expression(e, cfg, callee_contract_no, func, ns, vartab, opt));
.map(|e| expression(e, cfg, callee_contract_no, func, ns, vartab, opt, target));
let accounts = call_args
.accounts
.map(|expr| expression(expr, cfg, contract_no, func, ns, vartab, opt));
.map(|expr| expression(expr, cfg, contract_no, func, ns, vartab, opt, target));

let mut constructor_args = constructor_args
.iter()
.map(|e| expression(e, cfg, callee_contract_no, func, ns, vartab, opt))
.map(|e| expression(e, cfg, callee_contract_no, func, ns, vartab, opt, target))
.collect::<Vec<Expression>>();

let selector = match constructor_no {
Expand All @@ -99,7 +101,7 @@ pub(super) fn call_constructor(

args.append(&mut constructor_args);

let (encoded_args, _) = abi_encode(loc, args, ns, vartab, cfg, false);
let (encoded_args, _) = target.abi_encode(loc, args, ns, vartab, cfg, false);
cfg.add(
vartab,
Instr::Constructor {
Expand Down
23 changes: 0 additions & 23 deletions src/codegen/dispatch/mod.rs

This file was deleted.

58 changes: 0 additions & 58 deletions src/codegen/events/mod.rs

This file was deleted.

Loading
Loading