mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-21 20:26:41 +00:00
Fix case where JUMPI is the last instruction
This commit is contained in:
parent
d77864071d
commit
3725432bef
4 changed files with 46 additions and 8 deletions
1
evmcc/test/jump/jumpi_at_the_end.evm
Normal file
1
evmcc/test/jump/jumpi_at_the_end.evm
Normal file
|
|
@ -0,0 +1 @@
|
|||
600a6000545d6000536001900380600054600659
|
||||
1
evmcc/test/jump/jumpi_at_the_end.lll
Normal file
1
evmcc/test/jump/jumpi_at_the_end.lll
Normal file
|
|
@ -0,0 +1 @@
|
|||
(asm 10 0 MSTORE JUMPDEST 0 MLOAD 1 SWAP1 SUB DUP1 0 MSTORE 6 JUMPI)
|
||||
41
evmcc/test/vmtests/vm_jump.json
Normal file
41
evmcc/test/vmtests/vm_jump.json
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
{
|
||||
"jumpi_at_the_end" : {
|
||||
"callcreates" : [ ],
|
||||
"env" : {
|
||||
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
|
||||
"currentDifficulty" : "256",
|
||||
"currentGasLimit" : "10000000",
|
||||
"currentNumber" : "0",
|
||||
"currentTimestamp" : "1",
|
||||
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
|
||||
},
|
||||
"exec" : {
|
||||
"address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
|
||||
"caller" : "cd1722f3947def4cf144679da39c4c32bdc35681",
|
||||
"code" : "(asm 10 0 MSTORE JUMPDEST 0 MLOAD 1 SWAP1 SUB DUP1 0 MSTORE 6 JUMPI)",
|
||||
"data" : "0x",
|
||||
"gas" : "1000",
|
||||
"gasPrice" : "100000000000000",
|
||||
"origin" : "cd1722f3947def4cf144679da39c4c32bdc35681",
|
||||
"value" : "1000000000000000000"
|
||||
},
|
||||
"gas" : "895",
|
||||
"out" : "0x0",
|
||||
"pre" : {
|
||||
"0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
|
||||
"balance" : "1000000000000000000",
|
||||
"code" : "(asm 10 0 MSTORE JUMPDEST 0 MLOAD 1 SWAP1 SUB DUP1 0 MSTORE 6 JUMPI)",
|
||||
"nonce" : "0",
|
||||
"storage" : {}
|
||||
}
|
||||
},
|
||||
"post" : {
|
||||
"0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
|
||||
"balance" : "1000000000000000000",
|
||||
"code" : "(asm 10 0 MSTORE JUMPDEST 0 MLOAD 1 SWAP1 SUB DUP1 0 MSTORE 6 JUMPI)",
|
||||
"nonce" : "0",
|
||||
"storage" : {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -609,9 +609,7 @@ void Compiler::compileBasicBlock(BasicBlock& basicBlock, bytesConstRef bytecode,
|
|||
{
|
||||
auto pairIter = m_directJumpTargets.find(currentPC);
|
||||
if (pairIter != m_directJumpTargets.end())
|
||||
{
|
||||
targetBlock = pairIter->second;
|
||||
}
|
||||
}
|
||||
|
||||
if (inst == Instruction::JUMP)
|
||||
|
|
@ -624,9 +622,7 @@ void Compiler::compileBasicBlock(BasicBlock& basicBlock, bytesConstRef bytecode,
|
|||
m_builder.CreateBr(targetBlock);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_builder.CreateBr(m_jumpTableBlock->llvm());
|
||||
}
|
||||
}
|
||||
else // JUMPI
|
||||
{
|
||||
|
|
@ -635,8 +631,9 @@ void Compiler::compileBasicBlock(BasicBlock& basicBlock, bytesConstRef bytecode,
|
|||
auto zero = Constant::get(0);
|
||||
auto cond = m_builder.CreateICmpNE(val, zero, "nonzero");
|
||||
|
||||
// Assume the basic blocks are properly ordered:
|
||||
assert(nextBasicBlock); // FIXME: JUMPI can be last instruction
|
||||
|
||||
if (!nextBasicBlock) // In case JUMPI is the last instruction
|
||||
nextBasicBlock = m_stopBB;
|
||||
|
||||
if (targetBlock)
|
||||
{
|
||||
|
|
@ -644,9 +641,7 @@ void Compiler::compileBasicBlock(BasicBlock& basicBlock, bytesConstRef bytecode,
|
|||
m_builder.CreateCondBr(cond, targetBlock, nextBasicBlock);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_builder.CreateCondBr(cond, m_jumpTableBlock->llvm(), nextBasicBlock);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
|
|
|||
Loading…
Reference in a new issue