diff --git a/libyul/AsmAnalysis.cpp b/libyul/AsmAnalysis.cpp index a117f8cd9..32b06b08d 100644 --- a/libyul/AsmAnalysis.cpp +++ b/libyul/AsmAnalysis.cpp @@ -101,7 +101,6 @@ bool AsmAnalyzer::operator()(Literal const& _literal) } else if (_literal.kind == LiteralKind::Boolean) yulAssert(_literal.value == "true"_yulstring || _literal.value == "false"_yulstring, ""); - m_info.stackHeightInfo[&_literal] = m_stackHeight; return true; } @@ -151,7 +150,6 @@ bool AsmAnalyzer::operator()(Identifier const& _identifier) } m_stackHeight += stackSize == size_t(-1) ? 1 : stackSize; } - m_info.stackHeightInfo[&_identifier] = m_stackHeight; return success; } @@ -170,7 +168,6 @@ bool AsmAnalyzer::operator()(ExpressionStatement const& _statement) m_errorReporter.error(Error::Type::TypeError, _statement.location, msg); success = false; } - m_info.stackHeightInfo[&_statement] = m_stackHeight; return success; } @@ -196,7 +193,6 @@ bool AsmAnalyzer::operator()(Assignment const& _assignment) for (auto const& variableName: _assignment.variableNames) if (!checkAssignment(variableName, 1)) success = false; - m_info.stackHeightInfo[&_assignment] = m_stackHeight; return success; } @@ -239,7 +235,6 @@ bool AsmAnalyzer::operator()(VariableDeclaration const& _varDecl) expectValidType(variable.type, variable.location); m_activeVariables.insert(&std::get(m_currentScope->identifiers.at(variable.name))); } - m_info.stackHeightInfo[&_varDecl] = m_stackHeight; return success; } @@ -261,7 +256,6 @@ bool AsmAnalyzer::operator()(FunctionDefinition const& _funDef) bool success = (*this)(_funDef.body); m_stackHeight = stackHeight; - m_info.stackHeightInfo[&_funDef] = m_stackHeight; return success; } @@ -334,7 +328,6 @@ bool AsmAnalyzer::operator()(FunctionCall const& _funCall) } // Use argument size instead of parameter count to avoid misleading errors. m_stackHeight += int(returns) - int(_funCall.arguments.size()); - m_info.stackHeightInfo[&_funCall] = m_stackHeight; return success; } @@ -351,8 +344,6 @@ bool AsmAnalyzer::operator()(If const& _if) if (!(*this)(_if.body)) success = false; - m_info.stackHeightInfo[&_if] = m_stackHeight; - return success; } @@ -421,7 +412,6 @@ bool AsmAnalyzer::operator()(Switch const& _switch) } m_stackHeight = initialHeight; - m_info.stackHeightInfo[&_switch] = m_stackHeight; return success; } @@ -458,31 +448,12 @@ bool AsmAnalyzer::operator()(ForLoop const& _for) success = false; m_stackHeight = initialHeight; - m_info.stackHeightInfo[&_for] = m_stackHeight; m_currentScope = outerScope; m_currentForLoop = outerForLoop; return success; } -bool AsmAnalyzer::operator()(Break const& _break) -{ - m_info.stackHeightInfo[&_break] = m_stackHeight; - return true; -} - -bool AsmAnalyzer::operator()(Continue const& _continue) -{ - m_info.stackHeightInfo[&_continue] = m_stackHeight; - return true; -} - -bool AsmAnalyzer::operator()(Leave const& _leaveStatement) -{ - m_info.stackHeightInfo[&_leaveStatement] = m_stackHeight; - return true; -} - bool AsmAnalyzer::operator()(Block const& _block) { bool success = true; @@ -512,7 +483,6 @@ bool AsmAnalyzer::operator()(Block const& _block) success = false; } - m_info.stackHeightInfo[&_block] = m_stackHeight; m_currentScope = previousScope; return success; } diff --git a/libyul/AsmAnalysis.h b/libyul/AsmAnalysis.h index 0bc1884df..bd99b50c2 100644 --- a/libyul/AsmAnalysis.h +++ b/libyul/AsmAnalysis.h @@ -87,9 +87,9 @@ public: bool operator()(If const& _if); bool operator()(Switch const& _switch); bool operator()(ForLoop const& _forLoop); - bool operator()(Break const&); - bool operator()(Continue const&); - bool operator()(Leave const&); + bool operator()(Break const&) { return true; } + bool operator()(Continue const&) { return true; } + bool operator()(Leave const&) { return true; } bool operator()(Block const& _block); private: diff --git a/libyul/AsmAnalysisInfo.h b/libyul/AsmAnalysisInfo.h index 8110608f9..d094ee510 100644 --- a/libyul/AsmAnalysisInfo.h +++ b/libyul/AsmAnalysisInfo.h @@ -36,7 +36,6 @@ struct AsmAnalysisInfo using StackHeightInfo = std::map; using Scopes = std::map>; Scopes scopes; - StackHeightInfo stackHeightInfo; /// Virtual blocks which will be used for scopes for function arguments and return values. std::map> virtualBlocks; }; diff --git a/libyul/backends/evm/EVMCodeTransform.cpp b/libyul/backends/evm/EVMCodeTransform.cpp index f8ce12017..cd24db738 100644 --- a/libyul/backends/evm/EVMCodeTransform.cpp +++ b/libyul/backends/evm/EVMCodeTransform.cpp @@ -102,7 +102,6 @@ CodeTransform::CodeTransform( bool _evm15, ExternalIdentifierAccess const& _identifierAccess, bool _useNamedLabelsForFunctions, - int _stackAdjustment, shared_ptr _context ): m_assembly(_assembly), @@ -113,7 +112,6 @@ CodeTransform::CodeTransform( m_evm15(_evm15), m_useNamedLabelsForFunctions(_useNamedLabelsForFunctions), m_identifierAccess(_identifierAccess), - m_stackAdjustment(_stackAdjustment), m_context(_context) { if (!m_context) @@ -159,7 +157,6 @@ void CodeTransform::freeUnusedVariables() { yulAssert(m_unusedStackSlots.erase(m_assembly.stackHeight() - 1), ""); m_assembly.appendInstruction(evmasm::Instruction::POP); - --m_stackAdjustment; } } @@ -178,11 +175,11 @@ void CodeTransform::operator()(VariableDeclaration const& _varDecl) yulAssert(m_scope, ""); int const numVariables = _varDecl.variables.size(); - int height = m_assembly.stackHeight(); + int heightAtStart = m_assembly.stackHeight(); if (_varDecl.value) { std::visit(*this, *_varDecl.value); - expectDeposit(numVariables, height); + expectDeposit(numVariables, heightAtStart); } else { @@ -196,7 +193,7 @@ void CodeTransform::operator()(VariableDeclaration const& _varDecl) { YulString varName = _varDecl.variables[varIndex].name; auto& var = std::get(m_scope->identifiers.at(varName)); - m_context->variableStackHeights[&var] = height + varIndex; + m_context->variableStackHeights[&var] = heightAtStart + varIndex; if (!m_allowStackOpt) continue; @@ -207,7 +204,6 @@ void CodeTransform::operator()(VariableDeclaration const& _varDecl) m_context->variableStackHeights.erase(&var); m_assembly.setSourceLocation(_varDecl.location); m_assembly.appendInstruction(evmasm::Instruction::POP); - --m_stackAdjustment; } else m_variablesScheduledForDeletion.insert(&var); @@ -223,10 +219,8 @@ void CodeTransform::operator()(VariableDeclaration const& _varDecl) if (int heightDiff = variableHeightDiff(var, varName, true)) m_assembly.appendInstruction(evmasm::swapInstruction(heightDiff - 1)); m_assembly.appendInstruction(evmasm::Instruction::POP); - --m_stackAdjustment; } } - checkStackHeight(&_varDecl); } void CodeTransform::stackError(StackTooDeepError _error, int _targetStackHeight) @@ -249,14 +243,12 @@ void CodeTransform::operator()(Assignment const& _assignment) m_assembly.setSourceLocation(_assignment.location); generateMultiAssignment(_assignment.variableNames); - checkStackHeight(&_assignment); } void CodeTransform::operator()(ExpressionStatement const& _statement) { m_assembly.setSourceLocation(_statement.location); std::visit(*this, _statement.expression); - checkStackHeight(&_statement); } void CodeTransform::operator()(FunctionCall const& _call) @@ -279,7 +271,6 @@ void CodeTransform::operator()(FunctionCall const& _call) { returnLabel = m_assembly.newLabelId(); m_assembly.appendLabelReference(returnLabel); - m_stackAdjustment++; } Scope::Function* function = nullptr; @@ -298,9 +289,7 @@ void CodeTransform::operator()(FunctionCall const& _call) { m_assembly.appendJumpTo(functionEntryID(_call.functionName.name, *function), function->returns.size() - function->arguments.size() - 1); m_assembly.appendLabel(returnLabel); - m_stackAdjustment--; } - checkStackHeight(&_call); } } @@ -334,15 +323,12 @@ void CodeTransform::operator()(Identifier const& _identifier) "Identifier not found and no external access available." ); m_identifierAccess.generateCode(_identifier, IdentifierContext::RValue, m_assembly); - checkStackHeight(&_identifier); } void CodeTransform::operator()(Literal const& _literal) { m_assembly.setSourceLocation(_literal.location); m_assembly.appendConstant(valueOfLiteral(_literal)); - - checkStackHeight(&_literal); } void CodeTransform::operator()(If const& _if) @@ -355,7 +341,6 @@ void CodeTransform::operator()(If const& _if) (*this)(_if.body); m_assembly.setSourceLocation(_if.location); m_assembly.appendLabel(end); - checkStackHeight(&_if); } void CodeTransform::operator()(Switch const& _switch) @@ -403,7 +388,6 @@ void CodeTransform::operator()(Switch const& _switch) m_assembly.setSourceLocation(_switch.location); m_assembly.appendLabel(end); m_assembly.appendInstruction(evmasm::Instruction::POP); - checkStackHeight(&_switch); } void CodeTransform::operator()(FunctionDefinition const& _function) @@ -412,8 +396,7 @@ void CodeTransform::operator()(FunctionDefinition const& _function) yulAssert(m_scope->identifiers.count(_function.name), ""); Scope::Function& function = std::get(m_scope->identifiers.at(_function.name)); - int const localStackAdjustment = m_evm15 ? 0 : 1; - int height = localStackAdjustment; + int height = m_evm15 ? 0 : 1; yulAssert(m_info.scopes.at(&_function.body), ""); Scope* varScope = m_info.scopes.at(m_info.virtualBlocks.at(&_function).get()).get(); yulAssert(varScope, ""); @@ -433,8 +416,6 @@ void CodeTransform::operator()(FunctionDefinition const& _function) m_assembly.setStackHeight(height); - m_stackAdjustment += localStackAdjustment; - for (auto const& v: _function.returnVariables) { auto& var = std::get(varScope->identifiers.at(v.name)); @@ -458,7 +439,6 @@ void CodeTransform::operator()(FunctionDefinition const& _function) m_evm15, m_identifierAccess, m_useNamedLabelsForFunctions, - localStackAdjustment, m_context )(_function.body); } @@ -527,8 +507,6 @@ void CodeTransform::operator()(FunctionDefinition const& _function) m_assembly.appendReturnsub(_function.returnVariables.size(), stackHeightBefore); else m_assembly.appendJump(stackHeightBefore - _function.returnVariables.size()); - m_stackAdjustment -= localStackAdjustment; - checkStackHeight(&_function); m_assembly.setStackHeight(stackHeightBefore); } @@ -569,7 +547,6 @@ void CodeTransform::operator()(ForLoop const& _forLoop) finalizeBlock(_forLoop.pre, stackStartHeight); m_context->forLoopStack.pop(); m_scope = originalScope; - checkStackHeight(&_forLoop); } int CodeTransform::appendPopUntil(int _targetDepth) @@ -587,8 +564,6 @@ void CodeTransform::operator()(Break const& _break) Context::JumpInfo const& jump = m_context->forLoopStack.top().done; m_assembly.appendJumpTo(jump.label, appendPopUntil(jump.targetStackHeight)); - - checkStackHeight(&_break); } void CodeTransform::operator()(Continue const& _continue) @@ -598,8 +573,6 @@ void CodeTransform::operator()(Continue const& _continue) Context::JumpInfo const& jump = m_context->forLoopStack.top().post; m_assembly.appendJumpTo(jump.label, appendPopUntil(jump.targetStackHeight)); - - checkStackHeight(&_continue); } void CodeTransform::operator()(Leave const& _leaveStatement) @@ -609,8 +582,6 @@ void CodeTransform::operator()(Leave const& _leaveStatement) Context::JumpInfo const& jump = m_context->functionExitPoints.top(); m_assembly.appendJumpTo(jump.label, appendPopUntil(jump.targetStackHeight)); - - checkStackHeight(&_leaveStatement); } void CodeTransform::operator()(Block const& _block) @@ -693,7 +664,6 @@ void CodeTransform::finalizeBlock(Block const& _block, int blockStartStackHeight { yulAssert(!m_context->variableStackHeights.count(&var), ""); yulAssert(!m_context->variableReferences.count(&var), ""); - m_stackAdjustment++; } else m_assembly.appendInstruction(evmasm::Instruction::POP); @@ -701,7 +671,6 @@ void CodeTransform::finalizeBlock(Block const& _block, int blockStartStackHeight int deposit = m_assembly.stackHeight() - blockStartStackHeight; yulAssert(deposit == 0, "Invalid stack height at end of block: " + to_string(deposit)); - checkStackHeight(&_block); } void CodeTransform::generateMultiAssignment(vector const& _variableNames) @@ -758,16 +727,3 @@ void CodeTransform::expectDeposit(int _deposit, int _oldHeight) const yulAssert(m_assembly.stackHeight() == _oldHeight + _deposit, "Invalid stack deposit."); } -void CodeTransform::checkStackHeight(void const* _astElement) const -{ - yulAssert(m_info.stackHeightInfo.count(_astElement), "Stack height for AST element not found."); - int stackHeightInAnalysis = m_info.stackHeightInfo.at(_astElement); - int stackHeightInCodegen = m_assembly.stackHeight() - m_stackAdjustment; - yulAssert( - stackHeightInAnalysis == stackHeightInCodegen, - "Stack height mismatch between analysis and code generation phase: Analysis: " + - to_string(stackHeightInAnalysis) + - " code gen: " + - to_string(stackHeightInCodegen) - ); -} diff --git a/libyul/backends/evm/EVMCodeTransform.h b/libyul/backends/evm/EVMCodeTransform.h index fb50be95f..fb4bc38e1 100644 --- a/libyul/backends/evm/EVMCodeTransform.h +++ b/libyul/backends/evm/EVMCodeTransform.h @@ -134,7 +134,6 @@ public: _evm15, _identifierAccess, _useNamedLabelsForFunctions, - _assembly.stackHeight(), nullptr ) { @@ -155,7 +154,6 @@ protected: bool _evm15, ExternalIdentifierAccess const& _identifierAccess, bool _useNamedLabelsForFunctions, - int _stackAdjustment, std::shared_ptr _context ); @@ -206,8 +204,6 @@ private: void expectDeposit(int _deposit, int _oldHeight) const; - void checkStackHeight(void const* _astElement) const; - /// Stores the stack error in the list of errors, appends an invalid opcode /// and corrects the stack height to the target stack height. void stackError(StackTooDeepError _error, int _targetStackSize); @@ -225,11 +221,6 @@ private: bool const m_evm15 = false; bool const m_useNamedLabelsForFunctions = false; ExternalIdentifierAccess m_identifierAccess; - /// Adjustment between the stack height as determined during the analysis phase - /// and the stack height in the assembly. This is caused by an initial stack being present - /// for inline assembly and different stack heights depending on the EVM backend used - /// (EVM 1.0 or 1.5). - int m_stackAdjustment = 0; std::shared_ptr m_context; /// Set of variables whose reference counter has reached zero,