Merge pull request #5008 from liangdzou/yul_stack_reuse

Reuse stack slots in Yul codegen
This commit is contained in:
chriseth
2018-12-10 16:14:33 +01:00
committed by GitHub
12 changed files with 666 additions and 54 deletions
+4 -1
View File
@@ -179,13 +179,16 @@ void CodeGenerator::assemble(
AsmAnalysisInfo& _analysisInfo,
eth::Assembly& _assembly,
ExternalIdentifierAccess const& _identifierAccess,
bool _useNamedLabelsForFunctions
bool _useNamedLabelsForFunctions,
bool _optimize
)
{
EthAssemblyAdapter assemblyAdapter(_assembly);
CodeTransform(
assemblyAdapter,
_analysisInfo,
_parsedData,
_optimize,
false,
false,
_identifierAccess,
+2 -1
View File
@@ -85,7 +85,8 @@ public:
yul::AsmAnalysisInfo& _analysisInfo,
dev::eth::Assembly& _assembly,
yul::ExternalIdentifierAccess const& _identifierAccess = yul::ExternalIdentifierAccess(),
bool _useNamedLabelsForFunctions = false
bool _useNamedLabelsForFunctions = false,
bool _optimize = false
);
};
+3 -3
View File
@@ -122,7 +122,7 @@ void AssemblyStack::optimize(yul::Object& _object)
yul::OptimiserSuite::run(*_object.code, *_object.analysisInfo);
}
MachineAssemblyObject AssemblyStack::assemble(Machine _machine) const
MachineAssemblyObject AssemblyStack::assemble(Machine _machine, bool _optimize) const
{
solAssert(m_analysisSuccessful, "");
solAssert(m_parserResult, "");
@@ -136,7 +136,7 @@ MachineAssemblyObject AssemblyStack::assemble(Machine _machine) const
MachineAssemblyObject object;
eth::Assembly assembly;
EthAssemblyAdapter adapter(assembly);
yul::EVMObjectCompiler::compile(*m_parserResult, adapter, m_language == Language::Yul, false);
yul::EVMObjectCompiler::compile(*m_parserResult, adapter, m_language == Language::Yul, false, _optimize);
object.bytecode = make_shared<eth::LinkerObject>(assembly.assemble());
object.assembly = assembly.assemblyString();
return object;
@@ -145,7 +145,7 @@ MachineAssemblyObject AssemblyStack::assemble(Machine _machine) const
{
MachineAssemblyObject object;
yul::EVMAssembly assembly(true);
yul::EVMObjectCompiler::compile(*m_parserResult, assembly, m_language == Language::Yul, true);
yul::EVMObjectCompiler::compile(*m_parserResult, assembly, m_language == Language::Yul, true, _optimize);
object.bytecode = make_shared<eth::LinkerObject>(assembly.finalize());
/// TODO: fill out text representation
return object;
+2 -1
View File
@@ -73,7 +73,8 @@ public:
void optimize();
/// Run the assembly step (should only be called after parseAndAnalyze).
MachineAssemblyObject assemble(Machine _machine) const;
/// @param _optimize does not run the optimizer but performs optimized code generation.
MachineAssemblyObject assemble(Machine _machine, bool _optimize = false) const;
/// @returns the errors generated during parsing, analysis (and potentially assembly).
langutil::ErrorList const& errors() const { return m_errors; }