Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ tarpaulin-report.html
openspec/
AGENTS.md
CLAUDE.md
.codex
.claude/
.gemini/

Expand Down
5 changes: 3 additions & 2 deletions crates/codegen/src/sonatina/lower_runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1714,13 +1714,14 @@ impl<'ctx, 'db, 'a> FunctionLowerer<'ctx, 'db, 'a> {
));
zero_for_type(&mut self.fb, Type::Unit)
}
RuntimeBuiltin::CallDataSelector => {
RuntimeBuiltin::CallDataSelector { selector_size, .. } => {
let zero = self.fb.make_imm_value(I256::zero());
let word = self.fb.insert_inst(
EvmCalldataLoad::new(self.module.inst_set(), zero),
Type::I256,
);
let shift = self.fb.make_imm_value(I256::from(224u64));
let shift_bits = 8u64 * (32u64.saturating_sub(*selector_size));
let shift = self.fb.make_imm_value(I256::from(shift_bits));
self.fb
.insert_inst(Shr::new(self.module.inst_set(), shift, word), Type::I256)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
source: crates/codegen/tests/sonatina_ir.rs
assertion_line: 403
expression: output
input_file: crates/codegen/tests/fixtures/by_ref_trait_provider_storage_bug.fe
---
Expand Down Expand Up @@ -48,7 +49,7 @@ func private %abi_field_size(v0.i256) -> i256 {

block1:
v2.i256 = mload v1 i256;
v3.i256 = call %core__lib__abi__trait_AbiSize__payload_size__ge513_83d5_0 v2;
v3.i256 = call %core__lib__abi__trait_AbiSize__payload_size__ge513_d410_0 v2;
br 0.i1 block2 block3;

block2:
Expand Down Expand Up @@ -82,7 +83,17 @@ func private %abi_single_root_size(v0.i256) -> i256 {
return v3;
}

func private %base(v0.objref<@layout_0>) -> i256 {
func private %std__lib__abi__sol__impl_trait_SolEncoder_dd96__base__gf13e_1107(v0.objref<@layout_0>) -> i256 {
block0:
jump block1;

block1:
v3.objref<i256> = obj.proj v0 0.i256;
v4.i256 = obj.load v3;
return v4;
}

func private %std__lib__abi__sol__impl_trait_SolEncoder_dd96__base__gf13e_1107_0(v0.objref<@layout_0>) -> i256 {
block0:
jump block1;

Expand Down Expand Up @@ -195,15 +206,20 @@ func private %contract_runtime_root_ByRefTraitProviderStorageBug() {
jump block1;

block1:
v1.i256 = evm_calldata_load 0.i256;
v3.i256 = shr 224.i256 v1;
v4.i32 = trunc v3 i32;
br_table v4 block2 (1.i32 block3);
v1.i256 = evm_calldata_size;
v3.i1 = lt v1 4.i256;
br v3 block2 block3;

block2:
evm_revert 0.i256 0.i256;

block3:
v5.i256 = evm_calldata_load 0.i256;
v7.i256 = shr 224.i256 v5;
v8.i32 = trunc v7 i32;
br_table v8 block2 (1.i32 block4);

block4:
call %contract_recv_abi_ByRefTraitProviderStorageBug_1;
unreachable;
}
Expand All @@ -230,7 +246,7 @@ func private %encode(v0.i256, v1.objref<@layout_0>) {
jump block1;

block1:
call %std__lib__abi__sol__impl_trait_SolEncoder_19ce__write_word_e918 v1 v0;
call %std__lib__abi__sol__impl_trait_SolEncoder_dd96__write_word__gf13e_1fac v1 v0;
return;
}

Expand All @@ -242,8 +258,8 @@ func private %encode_field(v0.i256, v1.objref<@layout_0>, v2.i256) {
br 0.i1 block2 block3;

block2:
v5.i256 = call %base v1;
v8.i256 = call %core__lib__abi__trait_AbiSize__payload_size__ge513_83d5 v0;
v5.i256 = call %std__lib__abi__sol__impl_trait_SolEncoder_dd96__base__gf13e_1107 v1;
v8.i256 = call %core__lib__abi__trait_AbiSize__payload_size__ge513_d410 v0;
v9.i256 = mload v2 i256;
(v10.i256, v11.i1) = usubo v9 v5;
br v11 block5 block6;
Expand All @@ -261,7 +277,7 @@ func private %encode_field(v0.i256, v1.objref<@layout_0>, v2.i256) {
evm_revert 0.i256 36.i256;

block6:
call %std__lib__abi__sol__impl_trait_SolEncoder_19ce__write_word_7682 v1 v10;
call %std__lib__abi__sol__impl_trait_SolEncoder_dd96__write_word__gf13e_d8bf v1 v10;
v19.i256 = call %pos v1;
v21.i256 = mload v2 i256;
call %set_base v1 v21;
Expand All @@ -285,7 +301,7 @@ func private %encode_single_root(v0.i256, v1.objref<@layout_0>) {
jump block1;

block1:
v4.i256 = call %base v1;
v4.i256 = call %std__lib__abi__sol__impl_trait_SolEncoder_dd96__base__gf13e_1107 v1;
(v6.i256, v7.i1) = uaddo v4 32.i256;
br v7 block2 block3;

Expand Down Expand Up @@ -315,7 +331,7 @@ func private %encode_single_root_alloc(v0.i256) -> @layout_4 {
v9.objref<i256> = obj.proj v4 1.i256;
v10.i256 = extract_value v3 1.i256;
obj.store v9 v10;
v11.i256 = call %base v4;
v11.i256 = call %std__lib__abi__sol__impl_trait_SolEncoder_dd96__base__gf13e_1107_0 v4;
call %encode_single_root v0 v4;
v13.objref<@layout_4> = obj.alloc @layout_4;
v14.objref<i256> = obj.proj v13 0.i256;
Expand Down Expand Up @@ -413,7 +429,7 @@ func private %impl_SolEncoder__new(v0.i256) -> @layout_0 {
return v13;
}

func private %core__lib__abi__trait_AbiSize__payload_size__ge513_83d5(v0.i256) -> i256 {
func private %core__lib__abi__trait_AbiSize__payload_size__ge513_d410(v0.i256) -> i256 {
block0:
v1.*i256 = alloca i256;
mstore v1 v0 i256;
Expand All @@ -423,7 +439,7 @@ func private %core__lib__abi__trait_AbiSize__payload_size__ge513_83d5(v0.i256) -
return 32.i256;
}

func private %core__lib__abi__trait_AbiSize__payload_size__ge513_83d5_0(v0.i256) -> i256 {
func private %core__lib__abi__trait_AbiSize__payload_size__ge513_d410_0(v0.i256) -> i256 {
block0:
v1.*i256 = alloca i256;
mstore v1 v0 i256;
Expand Down Expand Up @@ -498,7 +514,7 @@ func private %use_ctx(v0.i256) -> i256 {
return v2;
}

func private %std__lib__abi__sol__impl_trait_SolEncoder_19ce__write_word_7682(v0.objref<@layout_0>, v1.i256) {
func private %std__lib__abi__sol__impl_trait_SolEncoder_dd96__write_word__gf13e_1fac(v0.objref<@layout_0>, v1.i256) {
block0:
v2.*i256 = alloca i256;
mstore v2 v1 i256;
Expand All @@ -515,7 +531,7 @@ func private %std__lib__abi__sol__impl_trait_SolEncoder_19ce__write_word_7682(v0
return;
}

func private %std__lib__abi__sol__impl_trait_SolEncoder_19ce__write_word_e918(v0.objref<@layout_0>, v1.i256) {
func private %std__lib__abi__sol__impl_trait_SolEncoder_dd96__write_word__gf13e_d8bf(v0.objref<@layout_0>, v1.i256) {
block0:
v2.*i256 = alloca i256;
mstore v2 v1 i256;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func private %init(v0.objref<@layout_1>) {
v3.*i8 = evm_malloc v1;
v4.i256 = ptr_to_int v3 i256;
call %codecopy v0 v4 v2 v1;
call %std__lib__evm__effects__impl_trait_Evm_0098__return_data_cf61 v4 v1;
call %std__lib__evm__effects__impl_trait_Evm_0098__return_data_cf61_0 v4 v1;
unreachable;
}

Expand Down Expand Up @@ -93,7 +93,7 @@ func private %runtime(v0.objref<@layout_1>) {
jump block1;

block1:
call %std__lib__evm__effects__impl_trait_Evm_0098__return_data_cf61_0 0.i256 0.i256;
call %std__lib__evm__effects__impl_trait_Evm_0098__return_data_cf61 0.i256 0.i256;
unreachable;
}

Expand Down
Loading
Loading