Skip to content

Commit 8c1db38

Browse files
authored
Merge pull request #94 from ethereum-optimism/sc/stack-too-deep-fix
fixes stack too deep error when compiling with the optimizer off
2 parents 54e90a2 + c38cc21 commit 8c1db38

File tree

1 file changed

+19
-12
lines changed

1 file changed

+19
-12
lines changed

rvsol/src/RISCV.sol

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ contract RISCV is IBigStepper {
1414
IPreimageOracle public oracle;
1515

1616
/// @notice The version of the contract.
17-
/// @custom:semver 1.1.0-rc.1
18-
string public constant version = "1.1.0-rc.1";
17+
/// @custom:semver 1.1.0-rc.2
18+
string public constant version = "1.1.0-rc.2";
1919

2020
/// @param _oracle The preimage oracle contract.
2121
constructor(IPreimageOracle _oracle) {
@@ -644,16 +644,18 @@ contract RISCV is IBigStepper {
644644
rightShamt := sub64(sub64(toU64(64), alignment), size)
645645
}
646646

647+
let addr_ := addr
648+
let size_ := size
647649
// left: prepare for byte-taking by right-aligning
648650
left := shr(u64ToU256(shl64(toU64(3), leftShamt)), left)
649651
// right: right-align for byte-taking by right-aligning
650652
right := shr(u64ToU256(shl64(toU64(3), rightShamt)), right)
651653
// loop:
652-
for { let i := 0 } lt(i, size) { i := add(i, 1) } {
654+
for { let i := 0 } lt(i, size_) { i := add(i, 1) } {
653655
// translate to reverse byte lookup, since we are reading little-endian memory, and need the highest
654656
// byte first.
655657
// effAddr := (addr + size - 1 - i) &^ 31
656-
let effAddr := and64(sub64(sub64(add64(addr, size), toU64(1)), toU64(i)), not64(toU64(31)))
658+
let effAddr := and64(sub64(sub64(add64(addr_, size_), toU64(1)), toU64(i)), not64(toU64(31)))
657659
// take a byte from either left or right, depending on the effective address
658660
let b := toU256(0)
659661
switch eq64(effAddr, leftAddr)
@@ -670,7 +672,7 @@ contract RISCV is IBigStepper {
670672
}
671673

672674
if signed {
673-
let signBitShift := sub64(shl64(toU64(3), size), toU64(1))
675+
let signBitShift := sub64(shl64(toU64(3), size_), toU64(1))
674676
out := signExtend64(out, signBitShift)
675677
}
676678
}
@@ -822,21 +824,24 @@ contract RISCV is IBigStepper {
822824
count := pdatlen
823825
}
824826

825-
let bits := shl64(toU64(3), sub64(toU64(32), count)) // 32-count, in bits
827+
let addr_ := addr
828+
let count_ := count
829+
let bits := shl64(toU64(3), sub64(toU64(32), count_)) // 32-count, in bits
826830
let mask := not(sub(shl(u64ToU256(bits), toU256(1)), toU256(1))) // left-aligned mask for count bytes
827831
let alignmentBits := u64ToU256(shl64(toU64(3), alignment))
828832
mask := shr(alignmentBits, mask) // mask of count bytes, shifted by alignment
829833
let pdat := shr(alignmentBits, b32asBEWord(pdatB32)) // pdat, shifted by alignment
830834

831835
// update pre-image reader with updated offset
832-
let newOffset := add64(offset, count)
836+
let newOffset := add64(offset, count_)
833837
setPreimageOffset(newOffset)
834838

835-
let node := getMemoryB32(sub64(addr, alignment), 1)
839+
out := count_
840+
841+
let node := getMemoryB32(sub64(addr_, alignment), 1)
836842
let dat := and(b32asBEWord(node), not(mask)) // keep old bytes outside of mask
837843
dat := or(dat, and(pdat, mask)) // fill with bytes from pdat
838-
setMemoryB32(sub64(addr, alignment), beWordAsB32(dat), 1)
839-
out := count
844+
setMemoryB32(sub64(addr_, alignment), beWordAsB32(dat), 1)
840845
}
841846

842847
//
@@ -1139,6 +1144,7 @@ contract RISCV is IBigStepper {
11391144

11401145
switch opcode
11411146
case 0x03 {
1147+
let pc_ := _pc
11421148
// 000_0011: memory loading
11431149
// LB, LH, LW, LD, LBU, LHU, LWU
11441150
let imm := parseImmTypeI(instr)
@@ -1148,9 +1154,10 @@ contract RISCV is IBigStepper {
11481154
let memIndex := add64(rs1Value, signExtend64(imm, toU64(11)))
11491155
let rdValue := loadMem(memIndex, size, signed, 1, 2)
11501156
setRegister(rd, rdValue)
1151-
setPC(add64(_pc, toU64(4)))
1157+
setPC(add64(pc_, toU64(4)))
11521158
}
11531159
case 0x23 {
1160+
let pc_ := _pc
11541161
// 010_0011: memory storing
11551162
// SB, SH, SW, SD
11561163
let imm := parseImmTypeS(instr)
@@ -1159,7 +1166,7 @@ contract RISCV is IBigStepper {
11591166
let rs1Value := getRegister(rs1)
11601167
let memIndex := add64(rs1Value, signExtend64(imm, toU64(11)))
11611168
storeMem(memIndex, size, value, 1, 2)
1162-
setPC(add64(_pc, toU64(4)))
1169+
setPC(add64(pc_, toU64(4)))
11631170
}
11641171
case 0x63 {
11651172
// 110_0011: branching

0 commit comments

Comments
 (0)