From b8bf8da514c684629ca305f660eab41a9bd96697 Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Tue, 10 Aug 2021 12:13:39 +0200 Subject: [PATCH] Enable the new code generator for "system" inline assembly routines. --- libyul/backends/evm/AsmCodeGen.cpp | 54 ++++++++++++++++++++---------- libyul/backends/evm/AsmCodeGen.h | 2 +- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/libyul/backends/evm/AsmCodeGen.cpp b/libyul/backends/evm/AsmCodeGen.cpp index 5c7865c01..b18d49936 100644 --- a/libyul/backends/evm/AsmCodeGen.cpp +++ b/libyul/backends/evm/AsmCodeGen.cpp @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -38,28 +39,45 @@ void CodeGenerator::assemble( evmasm::Assembly& _assembly, langutil::EVMVersion _evmVersion, ExternalIdentifierAccess::CodeGenerator _identifierAccessCodeGen, - bool _useNamedLabelsForFunctions, + bool _system, bool _optimizeStackAllocation ) { EthAssemblyAdapter assemblyAdapter(_assembly); BuiltinContext builtinContext; - CodeTransform transform( - assemblyAdapter, - _analysisInfo, - _parsedData, - EVMDialect::strictAssemblyForEVM(_evmVersion), - builtinContext, - _optimizeStackAllocation, - _identifierAccessCodeGen, - _useNamedLabelsForFunctions - ); - transform(_parsedData); - if (!transform.stackErrors().empty()) - assertThrow( - false, - langutil::StackTooDeepError, - "Stack too deep when compiling inline assembly" + - (transform.stackErrors().front().comment() ? ": " + *transform.stackErrors().front().comment() : ".") + if (_system && _optimizeStackAllocation && _evmVersion > EVMVersion::homestead()) + { + int oldStackHeight = assemblyAdapter.stackHeight(); + assemblyAdapter.setStackHeight(0); + auto stackErrors = OptimizedEVMCodeTransform::run(assemblyAdapter, _analysisInfo, _parsedData, EVMDialect::strictAssemblyForEVM(_evmVersion), builtinContext, _system); + assemblyAdapter.setStackHeight(oldStackHeight); + if (!stackErrors.empty()) + assertThrow( + false, + langutil::StackTooDeepError, + "Stack too deep when compiling inline assembly" + + (stackErrors.front().comment() ? ": " + *stackErrors.front().comment() : ".") + ); + } + else + { + CodeTransform transform( + assemblyAdapter, + _analysisInfo, + _parsedData, + EVMDialect::strictAssemblyForEVM(_evmVersion), + builtinContext, + _optimizeStackAllocation, + _identifierAccessCodeGen, + _system ); + transform(_parsedData); + if (!transform.stackErrors().empty()) + assertThrow( + false, + langutil::StackTooDeepError, + "Stack too deep when compiling inline assembly" + + (transform.stackErrors().front().comment() ? ": " + *transform.stackErrors().front().comment() : ".") + ); + } } diff --git a/libyul/backends/evm/AsmCodeGen.h b/libyul/backends/evm/AsmCodeGen.h index b79338074..215435b50 100644 --- a/libyul/backends/evm/AsmCodeGen.h +++ b/libyul/backends/evm/AsmCodeGen.h @@ -45,7 +45,7 @@ public: evmasm::Assembly& _assembly, langutil::EVMVersion _evmVersion, ExternalIdentifierAccess::CodeGenerator _identifierAccess = {}, - bool _useNamedLabelsForFunctions = false, + bool _system = false, bool _optimizeStackAllocation = false ); };