mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #5752 from ethereum/addDialect
[Yul] Refactor: Make the dialect available everywhere.
This commit is contained in:
+10
-2
@@ -41,6 +41,14 @@ using namespace langutil;
|
||||
using namespace yul;
|
||||
using namespace dev::solidity;
|
||||
|
||||
namespace
|
||||
{
|
||||
shared_ptr<Dialect> defaultDialect(bool _yul)
|
||||
{
|
||||
return _yul ? yul::Dialect::yul() : yul::EVMDialect::strictAssemblyForEVM();
|
||||
}
|
||||
}
|
||||
|
||||
void yul::test::printErrors(ErrorList const& _errors)
|
||||
{
|
||||
SourceReferenceFormatter formatter(cout);
|
||||
@@ -55,7 +63,7 @@ void yul::test::printErrors(ErrorList const& _errors)
|
||||
|
||||
pair<shared_ptr<Block>, shared_ptr<yul::AsmAnalysisInfo>> yul::test::parse(string const& _source, bool _yul)
|
||||
{
|
||||
shared_ptr<Dialect> dialect = _yul ? yul::Dialect::yul() : yul::EVMDialect::strictAssemblyForEVM();
|
||||
shared_ptr<Dialect> dialect = defaultDialect(_yul);
|
||||
ErrorList errors;
|
||||
ErrorReporter errorReporter(errors);
|
||||
auto scanner = make_shared<Scanner>(CharStream(_source, ""));
|
||||
@@ -87,7 +95,7 @@ pair<shared_ptr<Block>, shared_ptr<yul::AsmAnalysisInfo>> yul::test::parse(strin
|
||||
yul::Block yul::test::disambiguate(string const& _source, bool _yul)
|
||||
{
|
||||
auto result = parse(_source, _yul);
|
||||
return boost::get<Block>(Disambiguator(*result.second, {})(*result.first));
|
||||
return boost::get<Block>(Disambiguator(*defaultDialect(_yul), *result.second, {})(*result.first));
|
||||
}
|
||||
|
||||
string yul::test::format(string const& _source, bool _yul)
|
||||
|
||||
@@ -117,11 +117,11 @@ bool YulOptimizerTest::run(ostream& _stream, string const& _linePrefix, bool con
|
||||
else if (m_optimizerStep == "commonSubexpressionEliminator")
|
||||
{
|
||||
disambiguate();
|
||||
(CommonSubexpressionEliminator{})(*m_ast);
|
||||
(CommonSubexpressionEliminator{*m_dialect})(*m_ast);
|
||||
}
|
||||
else if (m_optimizerStep == "expressionSplitter")
|
||||
{
|
||||
NameDispenser nameDispenser(*m_ast);
|
||||
NameDispenser nameDispenser{*m_dialect, *m_ast};
|
||||
ExpressionSplitter{nameDispenser}(*m_ast);
|
||||
}
|
||||
else if (m_optimizerStep == "expressionJoiner")
|
||||
@@ -132,7 +132,7 @@ bool YulOptimizerTest::run(ostream& _stream, string const& _linePrefix, bool con
|
||||
else if (m_optimizerStep == "splitJoin")
|
||||
{
|
||||
disambiguate();
|
||||
NameDispenser nameDispenser(*m_ast);
|
||||
NameDispenser nameDispenser{*m_dialect, *m_ast};
|
||||
ExpressionSplitter{nameDispenser}(*m_ast);
|
||||
ExpressionJoiner::run(*m_ast);
|
||||
ExpressionJoiner::run(*m_ast);
|
||||
@@ -150,14 +150,14 @@ bool YulOptimizerTest::run(ostream& _stream, string const& _linePrefix, bool con
|
||||
else if (m_optimizerStep == "expressionInliner")
|
||||
{
|
||||
disambiguate();
|
||||
ExpressionInliner(*m_ast).run();
|
||||
ExpressionInliner(*m_dialect, *m_ast).run();
|
||||
}
|
||||
else if (m_optimizerStep == "fullInliner")
|
||||
{
|
||||
disambiguate();
|
||||
(FunctionHoister{})(*m_ast);
|
||||
(FunctionGrouper{})(*m_ast);
|
||||
NameDispenser nameDispenser(*m_ast);
|
||||
NameDispenser nameDispenser{*m_dialect, *m_ast};
|
||||
ExpressionSplitter{nameDispenser}(*m_ast);
|
||||
FullInliner(*m_ast, nameDispenser).run();
|
||||
ExpressionJoiner::run(*m_ast);
|
||||
@@ -171,54 +171,54 @@ bool YulOptimizerTest::run(ostream& _stream, string const& _linePrefix, bool con
|
||||
else if (m_optimizerStep == "rematerialiser")
|
||||
{
|
||||
disambiguate();
|
||||
Rematerialiser::run(*m_ast);
|
||||
Rematerialiser::run(*m_dialect, *m_ast);
|
||||
}
|
||||
else if (m_optimizerStep == "expressionSimplifier")
|
||||
{
|
||||
disambiguate();
|
||||
ExpressionSimplifier::run(*m_ast);
|
||||
ExpressionSimplifier::run(*m_dialect, *m_ast);
|
||||
}
|
||||
else if (m_optimizerStep == "fullSimplify")
|
||||
{
|
||||
disambiguate();
|
||||
NameDispenser nameDispenser(*m_ast);
|
||||
NameDispenser nameDispenser{*m_dialect, *m_ast};
|
||||
ExpressionSplitter{nameDispenser}(*m_ast);
|
||||
CommonSubexpressionEliminator{}(*m_ast);
|
||||
ExpressionSimplifier::run(*m_ast);
|
||||
UnusedPruner::runUntilStabilised(*m_ast);
|
||||
CommonSubexpressionEliminator{*m_dialect}(*m_ast);
|
||||
ExpressionSimplifier::run(*m_dialect, *m_ast);
|
||||
UnusedPruner::runUntilStabilised(*m_dialect, *m_ast);
|
||||
ExpressionJoiner::run(*m_ast);
|
||||
ExpressionJoiner::run(*m_ast);
|
||||
}
|
||||
else if (m_optimizerStep == "unusedPruner")
|
||||
{
|
||||
disambiguate();
|
||||
UnusedPruner::runUntilStabilised(*m_ast);
|
||||
UnusedPruner::runUntilStabilised(*m_dialect, *m_ast);
|
||||
}
|
||||
else if (m_optimizerStep == "ssaTransform")
|
||||
{
|
||||
disambiguate();
|
||||
NameDispenser nameDispenser(*m_ast);
|
||||
NameDispenser nameDispenser{*m_dialect, *m_ast};
|
||||
SSATransform::run(*m_ast, nameDispenser);
|
||||
}
|
||||
else if (m_optimizerStep == "redundantAssignEliminator")
|
||||
{
|
||||
disambiguate();
|
||||
RedundantAssignEliminator::run(*m_ast);
|
||||
RedundantAssignEliminator::run(*m_dialect, *m_ast);
|
||||
}
|
||||
else if (m_optimizerStep == "ssaPlusCleanup")
|
||||
{
|
||||
disambiguate();
|
||||
NameDispenser nameDispenser(*m_ast);
|
||||
NameDispenser nameDispenser{*m_dialect, *m_ast};
|
||||
SSATransform::run(*m_ast, nameDispenser);
|
||||
RedundantAssignEliminator::run(*m_ast);
|
||||
RedundantAssignEliminator::run(*m_dialect, *m_ast);
|
||||
}
|
||||
else if (m_optimizerStep == "structuralSimplifier")
|
||||
{
|
||||
disambiguate();
|
||||
StructuralSimplifier{}(*m_ast);
|
||||
StructuralSimplifier{*m_dialect}(*m_ast);
|
||||
}
|
||||
else if (m_optimizerStep == "fullSuite")
|
||||
OptimiserSuite::run(*m_ast, *m_analysisInfo);
|
||||
OptimiserSuite::run(*m_dialect, *m_ast, *m_analysisInfo);
|
||||
else
|
||||
{
|
||||
FormattedScope(_stream, _formatted, {formatting::BOLD, formatting::RED}) << _linePrefix << "Invalid optimizer step: " << m_optimizerStep << endl;
|
||||
@@ -260,11 +260,11 @@ void YulOptimizerTest::printIndented(ostream& _stream, string const& _output, st
|
||||
|
||||
bool YulOptimizerTest::parse(ostream& _stream, string const& _linePrefix, bool const _formatted)
|
||||
{
|
||||
shared_ptr<yul::Dialect> dialect = m_yul ? yul::Dialect::yul() : yul::EVMDialect::strictAssemblyForEVM();
|
||||
m_dialect = m_yul ? yul::Dialect::yul() : yul::EVMDialect::strictAssemblyForEVM();
|
||||
ErrorList errors;
|
||||
ErrorReporter errorReporter(errors);
|
||||
shared_ptr<Scanner> scanner = make_shared<Scanner>(CharStream(m_source, ""));
|
||||
m_ast = yul::Parser(errorReporter, dialect).parse(scanner, false);
|
||||
m_ast = yul::Parser(errorReporter, m_dialect).parse(scanner, false);
|
||||
if (!m_ast || !errorReporter.errors().empty())
|
||||
{
|
||||
FormattedScope(_stream, _formatted, {formatting::BOLD, formatting::RED}) << _linePrefix << "Error parsing source." << endl;
|
||||
@@ -277,7 +277,7 @@ bool YulOptimizerTest::parse(ostream& _stream, string const& _linePrefix, bool c
|
||||
errorReporter,
|
||||
dev::test::Options::get().evmVersion(),
|
||||
boost::none,
|
||||
dialect
|
||||
m_dialect
|
||||
);
|
||||
if (!analyzer.analyze(*m_ast) || !errorReporter.errors().empty())
|
||||
{
|
||||
@@ -290,7 +290,7 @@ bool YulOptimizerTest::parse(ostream& _stream, string const& _linePrefix, bool c
|
||||
|
||||
void YulOptimizerTest::disambiguate()
|
||||
{
|
||||
*m_ast = boost::get<Block>(Disambiguator(*m_analysisInfo)(*m_ast));
|
||||
*m_ast = boost::get<Block>(Disambiguator(*m_dialect, *m_analysisInfo)(*m_ast));
|
||||
m_analysisInfo.reset();
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ namespace yul
|
||||
{
|
||||
struct AsmAnalysisInfo;
|
||||
struct Block;
|
||||
struct Dialect;
|
||||
}
|
||||
|
||||
namespace yul
|
||||
@@ -64,6 +65,7 @@ private:
|
||||
std::string m_optimizerStep;
|
||||
std::string m_expectation;
|
||||
|
||||
std::shared_ptr<Dialect> m_dialect;
|
||||
std::shared_ptr<Block> m_ast;
|
||||
std::shared_ptr<AsmAnalysisInfo> m_analysisInfo;
|
||||
std::string m_obtainedResult;
|
||||
|
||||
+12
-11
@@ -85,7 +85,7 @@ public:
|
||||
{
|
||||
ErrorReporter errorReporter(m_errors);
|
||||
shared_ptr<Scanner> scanner = make_shared<Scanner>(CharStream(_input, ""));
|
||||
m_ast = yul::Parser(errorReporter, yul::EVMDialect::strictAssemblyForEVM()).parse(scanner, false);
|
||||
m_ast = yul::Parser(errorReporter, m_dialect).parse(scanner, false);
|
||||
if (!m_ast || !errorReporter.errors().empty())
|
||||
{
|
||||
cout << "Error parsing source." << endl;
|
||||
@@ -98,7 +98,7 @@ public:
|
||||
errorReporter,
|
||||
EVMVersion::byzantium(),
|
||||
langutil::Error::Type::SyntaxError,
|
||||
EVMDialect::strictAssemblyForEVM()
|
||||
m_dialect
|
||||
);
|
||||
if (!analyzer.analyze(*m_ast) || !errorReporter.errors().empty())
|
||||
{
|
||||
@@ -120,9 +120,9 @@ public:
|
||||
return;
|
||||
if (!disambiguated)
|
||||
{
|
||||
*m_ast = boost::get<yul::Block>(Disambiguator(*m_analysisInfo)(*m_ast));
|
||||
*m_ast = boost::get<yul::Block>(Disambiguator(*m_dialect, *m_analysisInfo)(*m_ast));
|
||||
m_analysisInfo.reset();
|
||||
m_nameDispenser = make_shared<NameDispenser>(*m_ast);
|
||||
m_nameDispenser = make_shared<NameDispenser>(*m_dialect, *m_ast);
|
||||
disambiguated = true;
|
||||
}
|
||||
cout << "(q)quit/(f)flatten/(c)se/initialize var(d)ecls/(x)plit/(j)oin/(g)rouper/(h)oister/" << endl;
|
||||
@@ -143,7 +143,7 @@ public:
|
||||
ForLoopInitRewriter{}(*m_ast);
|
||||
break;
|
||||
case 'c':
|
||||
(CommonSubexpressionEliminator{})(*m_ast);
|
||||
(CommonSubexpressionEliminator{*m_dialect})(*m_ast);
|
||||
break;
|
||||
case 'd':
|
||||
(VarDeclInitializer{})(*m_ast);
|
||||
@@ -161,28 +161,28 @@ public:
|
||||
(FunctionHoister{})(*m_ast);
|
||||
break;
|
||||
case 'e':
|
||||
ExpressionInliner{*m_ast}.run();
|
||||
ExpressionInliner{*m_dialect, *m_ast}.run();
|
||||
break;
|
||||
case 'i':
|
||||
FullInliner(*m_ast, *m_nameDispenser).run();
|
||||
break;
|
||||
case 's':
|
||||
ExpressionSimplifier::run(*m_ast);
|
||||
ExpressionSimplifier::run(*m_dialect, *m_ast);
|
||||
break;
|
||||
case 't':
|
||||
(StructuralSimplifier{})(*m_ast);
|
||||
(StructuralSimplifier{*m_dialect})(*m_ast);
|
||||
break;
|
||||
case 'u':
|
||||
UnusedPruner::runUntilStabilised(*m_ast);
|
||||
UnusedPruner::runUntilStabilised(*m_dialect, *m_ast);
|
||||
break;
|
||||
case 'a':
|
||||
SSATransform::run(*m_ast, *m_nameDispenser);
|
||||
break;
|
||||
case 'r':
|
||||
RedundantAssignEliminator::run(*m_ast);
|
||||
RedundantAssignEliminator::run(*m_dialect, *m_ast);
|
||||
break;
|
||||
case 'm':
|
||||
Rematerialiser::run(*m_ast);
|
||||
Rematerialiser::run(*m_dialect, *m_ast);
|
||||
break;
|
||||
default:
|
||||
cout << "Unknown option." << endl;
|
||||
@@ -194,6 +194,7 @@ public:
|
||||
private:
|
||||
ErrorList m_errors;
|
||||
shared_ptr<yul::Block> m_ast;
|
||||
shared_ptr<Dialect> m_dialect{EVMDialect::strictAssemblyForEVMObjects()};
|
||||
shared_ptr<AsmAnalysisInfo> m_analysisInfo;
|
||||
shared_ptr<NameDispenser> m_nameDispenser;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user