mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Reverse the order of the memory offsets assigned to variables.
This commit is contained in:
@@ -132,7 +132,7 @@ void StackLimitEvader::run(
|
||||
MemoryOffsetAllocator memoryOffsetAllocator{_unreachableVariables, callGraph.functionCalls};
|
||||
uint64_t requiredSlots = memoryOffsetAllocator.run();
|
||||
|
||||
StackToMemoryMover::run(_context, reservedMemory, memoryOffsetAllocator.slotAllocations, *_object.code);
|
||||
StackToMemoryMover::run(_context, reservedMemory, memoryOffsetAllocator.slotAllocations, requiredSlots, *_object.code);
|
||||
|
||||
yulAssert(requiredSlots < std::numeric_limits<uint64_t>::max() / 32, "");
|
||||
reservedMemory += 32 * requiredSlots;
|
||||
|
||||
@@ -52,18 +52,24 @@ void StackToMemoryMover::run(
|
||||
OptimiserStepContext& _context,
|
||||
u256 _reservedMemory,
|
||||
map<YulString, map<YulString, uint64_t>> const& _memorySlots,
|
||||
uint64_t _numRequiredSlots,
|
||||
Block& _block
|
||||
)
|
||||
{
|
||||
StackToMemoryMover stackToMemoryMover(_context, _reservedMemory, _memorySlots);
|
||||
StackToMemoryMover stackToMemoryMover(_context, _reservedMemory, _memorySlots, _numRequiredSlots);
|
||||
stackToMemoryMover(_block);
|
||||
}
|
||||
|
||||
StackToMemoryMover::StackToMemoryMover(
|
||||
OptimiserStepContext& _context,
|
||||
u256 _reservedMemory,
|
||||
map<YulString, map<YulString, uint64_t>> const& _memorySlots
|
||||
): m_reservedMemory(std::move(_reservedMemory)), m_memorySlots(_memorySlots), m_nameDispenser(_context.dispenser)
|
||||
map<YulString, map<YulString, uint64_t>> const& _memorySlots,
|
||||
uint64_t _numRequiredSlots
|
||||
):
|
||||
m_reservedMemory(std::move(_reservedMemory)),
|
||||
m_memorySlots(_memorySlots),
|
||||
m_numRequiredSlots(_numRequiredSlots),
|
||||
m_nameDispenser(_context.dispenser)
|
||||
{
|
||||
auto const* evmDialect = dynamic_cast<EVMDialect const*>(&_context.dialect);
|
||||
yulAssert(
|
||||
@@ -210,6 +216,8 @@ void StackToMemoryMover::visit(Expression& _expression)
|
||||
YulString StackToMemoryMover::memoryOffset(YulString _variable)
|
||||
{
|
||||
yulAssert(m_currentFunctionMemorySlots, "");
|
||||
return YulString{util::toCompactHexWithPrefix(m_reservedMemory + 32 * m_currentFunctionMemorySlots->at(_variable))};
|
||||
uint64_t slot = m_currentFunctionMemorySlots->at(_variable);
|
||||
yulAssert(slot < m_numRequiredSlots, "");
|
||||
return YulString{util::toCompactHexWithPrefix(m_reservedMemory + 32 * (m_numRequiredSlots - slot - 1))};
|
||||
}
|
||||
|
||||
|
||||
@@ -82,13 +82,16 @@ public:
|
||||
* Runs the stack to memory mover.
|
||||
* @param _reservedMemory Is the amount of previously reserved memory,
|
||||
* i.e. the lowest memory offset to which variables can be moved.
|
||||
* @param _memorySlots A map from variables to a slot in memory. The offset to which a variables will be moved
|
||||
* is given by _reservedMemory plus 32 times its entry in @a _memorySlots.
|
||||
* @param _memorySlots A map from variables to a slot in memory. Based on the slot a unique offset in the memory range
|
||||
* between _reservedMemory and _reservedMemory + 32 * _numRequiredSlots is calculated for each
|
||||
* variable.
|
||||
* @param _numRequiredSlots The number of slots required in total. The maximum value that may occur in @a _memorySlots.
|
||||
*/
|
||||
static void run(
|
||||
OptimiserStepContext& _context,
|
||||
u256 _reservedMemory,
|
||||
std::map<YulString, std::map<YulString, uint64_t>> const& _memorySlots,
|
||||
uint64_t _numRequiredSlots,
|
||||
Block& _block
|
||||
);
|
||||
using ASTModifier::operator();
|
||||
@@ -100,13 +103,15 @@ private:
|
||||
StackToMemoryMover(
|
||||
OptimiserStepContext& _context,
|
||||
u256 _reservedMemory,
|
||||
std::map<YulString, std::map<YulString, uint64_t>> const& _memorySlots
|
||||
std::map<YulString, std::map<YulString, uint64_t>> const& _memorySlots,
|
||||
uint64_t _numRequiredSlots
|
||||
);
|
||||
|
||||
/// @returns a YulString containing the memory offset to be assigned to @a _variable as number literal.
|
||||
YulString memoryOffset(YulString _variable);
|
||||
u256 m_reservedMemory;
|
||||
std::map<YulString, std::map<YulString, uint64_t>> const& m_memorySlots;
|
||||
uint64_t m_numRequiredSlots = 0;
|
||||
NameDispenser& m_nameDispenser;
|
||||
std::map<YulString, uint64_t> const* m_currentFunctionMemorySlots = nullptr;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user