From 28b9d27fae8a60e7ab5684f5cfef1c55dcedf72c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Mon, 26 Apr 2021 23:53:36 +0200 Subject: [PATCH 1/5] SoltestErrors: Qualify runtime_error with std:: to make it possible to use in in headers --- test/libsolidity/util/SoltestErrors.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/libsolidity/util/SoltestErrors.h b/test/libsolidity/util/SoltestErrors.h index 3291692a8..e223f714b 100644 --- a/test/libsolidity/util/SoltestErrors.h +++ b/test/libsolidity/util/SoltestErrors.h @@ -25,7 +25,7 @@ namespace solidity::frontend::test do \ { \ if (!(CONDITION)) \ - BOOST_THROW_EXCEPTION(runtime_error(DESCRIPTION)); \ + BOOST_THROW_EXCEPTION(std::runtime_error(DESCRIPTION)); \ } \ while (false) From 5023cef3821480651105c643a5f8fe4ed8e0411e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Mon, 26 Apr 2021 23:03:22 +0200 Subject: [PATCH 2/5] OptimiserSettings: Add preset() and OptimisationPreset enum --- libsolidity/interface/OptimiserSettings.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/libsolidity/interface/OptimiserSettings.h b/libsolidity/interface/OptimiserSettings.h index 3df99325e..0dea6c3d5 100644 --- a/libsolidity/interface/OptimiserSettings.h +++ b/libsolidity/interface/OptimiserSettings.h @@ -23,12 +23,22 @@ #pragma once +#include + #include #include namespace solidity::frontend { +enum class OptimisationPreset +{ + None, + Minimal, + Standard, + Full, +}; + struct OptimiserSettings { static char constexpr DefaultYulOptimiserSteps[] = @@ -84,6 +94,18 @@ struct OptimiserSettings return standard(); } + static OptimiserSettings preset(OptimisationPreset _preset) + { + switch (_preset) + { + case OptimisationPreset::None: return none(); + case OptimisationPreset::Minimal: return minimal(); + case OptimisationPreset::Standard: return standard(); + case OptimisationPreset::Full: return full(); + default: solAssert(false, ""); + } + } + bool operator==(OptimiserSettings const& _other) const { return From 9c6f8c011fabc2d1c341db5c019dfcc62c0fffdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Mon, 26 Apr 2021 22:13:41 +0200 Subject: [PATCH 3/5] TestCaseReader: Add enumSetting() --- test/TestCaseReader.cpp | 8 +------- test/TestCaseReader.h | 31 +++++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/test/TestCaseReader.cpp b/test/TestCaseReader.cpp index 26b625734..decfa3cbc 100644 --- a/test/TestCaseReader.cpp +++ b/test/TestCaseReader.cpp @@ -18,18 +18,12 @@ #include -#include -#include #include #include -#include #include -#include - using namespace std; -using namespace solidity::langutil; using namespace solidity::frontend::test; namespace fs = boost::filesystem; @@ -162,7 +156,7 @@ pair TestCaseReader::parseSourcesAndSettingsWithLineNumber(is else externalSourceName = externalSourceString; - solAssert(!externalSourceName.empty(), ""); + soltestAssert(!externalSourceName.empty(), ""); fs::path externalSourceTarget(externalSourceString); fs::path testCaseParentDir = m_fileName.parent_path(); if (!externalSourceTarget.is_relative()) diff --git a/test/TestCaseReader.h b/test/TestCaseReader.h index 2d0ffe3b0..d1ef95be3 100644 --- a/test/TestCaseReader.h +++ b/test/TestCaseReader.h @@ -16,13 +16,21 @@ */ // SPDX-License-Identifier: GPL-3.0 +#pragma once + +#include + +#include + +#include + #include +#include + #include #include #include -#pragma once - namespace solidity::frontend::test { @@ -58,6 +66,9 @@ public: size_t sizetSetting(std::string const& _name, size_t _defaultValue); std::string stringSetting(std::string const& _name, std::string const& _defaultValue); + template + E enumSetting(std::string const& _name, std::map const& _choices, std::string const& _defaultChoice); + void ensureAllSettingsRead() const; private: @@ -71,4 +82,20 @@ private: std::map m_settings; std::map m_unreadSettings; ///< tracks which settings are left unread }; + +template +E TestCaseReader::enumSetting(std::string const& _name, std::map const& _choices, std::string const& _defaultChoice) +{ + soltestAssert(_choices.count(_defaultChoice) > 0, ""); + + std::string value = stringSetting(_name, _defaultChoice); + + if (_choices.count(value) == 0) + BOOST_THROW_EXCEPTION(std::runtime_error( + "Invalid Enum value: " + value + ". Available choices: " + util::joinHumanReadable(_choices | ranges::views::keys) + "." + )); + + return _choices.at(value); +} + } From a51d72fb89453e6233c776e27bfe44dbb94f44b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Mon, 26 Apr 2021 22:18:52 +0200 Subject: [PATCH 4/5] ObjectCompilerTest: Replace 'optimize' setting with 'optimizationPreset' --- test/libyul/ObjectCompilerTest.cpp | 15 +++++++++++++-- test/libyul/ObjectCompilerTest.h | 4 +++- test/libyul/objectCompiler/long_object_name.yul | 2 +- test/libyul/objectCompiler/nested_optimizer.yul | 2 +- test/libyul/objectCompiler/simple_optimizer.yul | 2 +- 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/test/libyul/ObjectCompilerTest.cpp b/test/libyul/ObjectCompilerTest.cpp index 6d8cd313e..f4a1c296d 100644 --- a/test/libyul/ObjectCompilerTest.cpp +++ b/test/libyul/ObjectCompilerTest.cpp @@ -18,6 +18,8 @@ #include +#include + #include #include @@ -43,7 +45,16 @@ ObjectCompilerTest::ObjectCompilerTest(string const& _filename): TestCase(_filename) { m_source = m_reader.source(); - m_optimize = m_reader.boolSetting("optimize", false); + m_optimisationPreset = m_reader.enumSetting( + "optimizationPreset", + { + {"none", OptimisationPreset::None}, + {"minimal", OptimisationPreset::Minimal}, + {"standard", OptimisationPreset::Standard}, + {"full", OptimisationPreset::Full}, + }, + "minimal" + ); m_wasm = m_reader.boolSetting("wasm", false); m_expectation = m_reader.simpleExpectations(); } @@ -53,7 +64,7 @@ TestCase::TestResult ObjectCompilerTest::run(ostream& _stream, string const& _li AssemblyStack stack( EVMVersion(), m_wasm ? AssemblyStack::Language::Ewasm : AssemblyStack::Language::StrictAssembly, - m_optimize ? OptimiserSettings::full() : OptimiserSettings::minimal() + OptimiserSettings::preset(m_optimisationPreset) ); if (!stack.parseAndAnalyze("source", m_source)) { diff --git a/test/libyul/ObjectCompilerTest.h b/test/libyul/ObjectCompilerTest.h index 771942e59..e75f72fa9 100644 --- a/test/libyul/ObjectCompilerTest.h +++ b/test/libyul/ObjectCompilerTest.h @@ -20,6 +20,8 @@ #include +#include + namespace solidity::langutil { class Scanner; @@ -54,7 +56,7 @@ private: static void printErrors(std::ostream& _stream, langutil::ErrorList const& _errors); - bool m_optimize = false; + frontend::OptimisationPreset m_optimisationPreset; bool m_wasm = false; }; diff --git a/test/libyul/objectCompiler/long_object_name.yul b/test/libyul/objectCompiler/long_object_name.yul index 322079928..0aa8c4405 100644 --- a/test/libyul/objectCompiler/long_object_name.yul +++ b/test/libyul/objectCompiler/long_object_name.yul @@ -7,7 +7,7 @@ object "t" { } } // ==== -// optimize: true +// optimizationPreset: full // ---- // Assembly: // /* "source":23:147 */ diff --git a/test/libyul/objectCompiler/nested_optimizer.yul b/test/libyul/objectCompiler/nested_optimizer.yul index e4512f03d..01ecf5aff 100644 --- a/test/libyul/objectCompiler/nested_optimizer.yul +++ b/test/libyul/objectCompiler/nested_optimizer.yul @@ -15,7 +15,7 @@ object "a" { } } // ==== -// optimize: true +// optimizationPreset: full // ---- // Assembly: // /* "source":48:49 */ diff --git a/test/libyul/objectCompiler/simple_optimizer.yul b/test/libyul/objectCompiler/simple_optimizer.yul index 40234a1db..375fa6347 100644 --- a/test/libyul/objectCompiler/simple_optimizer.yul +++ b/test/libyul/objectCompiler/simple_optimizer.yul @@ -5,7 +5,7 @@ sstore(add(x, 0), z) } // ==== -// optimize: true +// optimizationPreset: full // ---- // Assembly: // /* "source":26:27 */ From 43de99dee568e8768accd25afd100be1356d288f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Mon, 26 Apr 2021 22:35:16 +0200 Subject: [PATCH 5/5] Use 'optimizationPreset: none' for objectCompiler tests that rely on things that could get optimized out --- test/libyul/objectCompiler/function_series.yul | 2 ++ test/libyul/objectCompiler/jump_tags.yul | 2 ++ 2 files changed, 4 insertions(+) diff --git a/test/libyul/objectCompiler/function_series.yul b/test/libyul/objectCompiler/function_series.yul index 34c66ec46..9efcf77af 100644 --- a/test/libyul/objectCompiler/function_series.yul +++ b/test/libyul/objectCompiler/function_series.yul @@ -6,6 +6,8 @@ object "Contract" { } } +// ==== +// optimizationPreset: none // ---- // Assembly: // /* "source":33:48 */ diff --git a/test/libyul/objectCompiler/jump_tags.yul b/test/libyul/objectCompiler/jump_tags.yul index 22c8b2495..bd3920900 100644 --- a/test/libyul/objectCompiler/jump_tags.yul +++ b/test/libyul/objectCompiler/jump_tags.yul @@ -6,6 +6,8 @@ object "Contract" { } } +// ==== +// optimizationPreset: none // ---- // Assembly: // /* "source":33:54 */