second-state / SOLL

SOLL is a new compiler for generate Ewasm from solidity and yul. See a demo here: https://asciinema.org/a/ezJqNLicn5fya02zwu4VXIo8a
https://www.secondstate.io/
377 stars 23 forks source link

implement setimmutable(offset, "name", value) and loadimmutable("name") for 0.8.6 #97

Open jacky860226 opened 3 years ago

jacky860226 commented 3 years ago

setimmutable(offset, "name", value) assumes that the runtime code of the contract containing the given named immutable was copied to memory at offset offset and will write value to all positions in memory (relative to offset) that contain the placeholder that was generated for calls to loadimmutable("name") in the runtime code.

CaptainVincent commented 3 years ago

For reference: The evm version will directly modify the immutable data on deployed bytecode in constructor.

Simple test case

object "a" {
    code {
        let memPtr := mload(64)
        codecopy(memPtr, dataoffset("Test_deployed"), datasize("Test_deployed"))
        setimmutable(
            0,
            "Name",
            address()
        )
        return(memPtr, datasize("Test_deployed"))
    }
    object "Test_deployed" {
        code {
            let addr := loadimmutable("Name")
            return(addr, 20)
            function fun() -> temp {
                temp := loadimmutable("Name")
            }
        }
    }
}
solc test_case.yul --strict-assembly

Binary representation:

604051605361001d8239306000818160010152602c0152605381f350fe7f0000000000000000000000000000000000000000000000000000000000000000601481f36051565b60007f000000000000000000000000000000000000000000000000000000000000000090505b90565b50
CaptainVincent commented 3 years ago

Consider to add immutable field as a string type placeholder on data section and embedded into deployed bytecode. All loadimmutable ops are corresponding to the convert data placeholder into value types. In the top layer setimmutable need calculate the offset of placeholder on deployed bytecode first, and generate replace the placeholder IR for setimmutable.