Open jacky860226 opened 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
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.
It's could reference to emitNestedBytecodeFunction in SOLL.
setimmutable(offset, "name", value)
assumes that the runtime code of the contract containing the given named immutable was copied to memory at offsetoffset
and will writevalue
to all positions in memory (relative tooffset
) that contain the placeholder that was generated for calls toloadimmutable("name")
in the runtime code.