mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Passing eofVersion down
This commit is contained in:
parent
bb997c4207
commit
4cca66447a
@ -37,10 +37,10 @@ namespace solidity::frontend
|
|||||||
class Compiler
|
class Compiler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Compiler(langutil::EVMVersion _evmVersion, RevertStrings _revertStrings, OptimiserSettings _optimiserSettings):
|
Compiler(langutil::EVMVersion _evmVersion, std::optional<uint8_t> _eofVersion, RevertStrings _revertStrings, OptimiserSettings _optimiserSettings):
|
||||||
m_optimiserSettings(std::move(_optimiserSettings)),
|
m_optimiserSettings(std::move(_optimiserSettings)),
|
||||||
m_runtimeContext(_evmVersion, _revertStrings),
|
m_runtimeContext(_evmVersion, _eofVersion, _revertStrings),
|
||||||
m_context(_evmVersion, _revertStrings, &m_runtimeContext)
|
m_context(_evmVersion, _eofVersion, _revertStrings, &m_runtimeContext)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
/// Compiles a contract.
|
/// Compiles a contract.
|
||||||
|
@ -62,10 +62,11 @@ class CompilerContext
|
|||||||
public:
|
public:
|
||||||
explicit CompilerContext(
|
explicit CompilerContext(
|
||||||
langutil::EVMVersion _evmVersion,
|
langutil::EVMVersion _evmVersion,
|
||||||
|
std::optional<uint8_t> _eofVersion,
|
||||||
RevertStrings _revertStrings,
|
RevertStrings _revertStrings,
|
||||||
CompilerContext* _runtimeContext = nullptr
|
CompilerContext* _runtimeContext = nullptr
|
||||||
):
|
):
|
||||||
m_asm(std::make_shared<evmasm::Assembly>(_runtimeContext != nullptr, std::string{})),
|
m_asm(std::make_shared<evmasm::Assembly>(_runtimeContext != nullptr, _eofVersion, std::string{})),
|
||||||
m_evmVersion(_evmVersion),
|
m_evmVersion(_evmVersion),
|
||||||
m_revertStrings(_revertStrings),
|
m_revertStrings(_revertStrings),
|
||||||
m_reservedMemory{0},
|
m_reservedMemory{0},
|
||||||
|
@ -1333,7 +1333,7 @@ void CompilerStack::compileContract(
|
|||||||
|
|
||||||
Contract& compiledContract = m_contracts.at(_contract.fullyQualifiedName());
|
Contract& compiledContract = m_contracts.at(_contract.fullyQualifiedName());
|
||||||
|
|
||||||
shared_ptr<Compiler> compiler = make_shared<Compiler>(m_evmVersion, m_revertStrings, m_optimiserSettings);
|
shared_ptr<Compiler> compiler = make_shared<Compiler>(m_evmVersion, m_eofVersion, m_revertStrings, m_optimiserSettings);
|
||||||
compiledContract.compiler = compiler;
|
compiledContract.compiler = compiler;
|
||||||
|
|
||||||
solAssert(!m_viaIR, "");
|
solAssert(!m_viaIR, "");
|
||||||
|
@ -264,7 +264,7 @@ YulStack::assembleEVMWithDeployed(optional<string_view> _deployName) const
|
|||||||
yulAssert(m_parserResult->code, "");
|
yulAssert(m_parserResult->code, "");
|
||||||
yulAssert(m_parserResult->analysisInfo, "");
|
yulAssert(m_parserResult->analysisInfo, "");
|
||||||
|
|
||||||
evmasm::Assembly assembly(true, {});
|
evmasm::Assembly assembly(true, m_eofVersion, {});
|
||||||
EthAssemblyAdapter adapter(assembly);
|
EthAssemblyAdapter adapter(assembly);
|
||||||
compileEVM(adapter, m_optimiserSettings.optimizeStackAllocation);
|
compileEVM(adapter, m_optimiserSettings.optimizeStackAllocation);
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ public:
|
|||||||
/// Append the assembled size as a constant.
|
/// Append the assembled size as a constant.
|
||||||
virtual void appendAssemblySize() = 0;
|
virtual void appendAssemblySize() = 0;
|
||||||
/// Creates a new sub-assembly, which can be referenced using dataSize and dataOffset.
|
/// Creates a new sub-assembly, which can be referenced using dataSize and dataOffset.
|
||||||
virtual std::pair<std::shared_ptr<AbstractAssembly>, SubID> createSubAssembly(bool _creation, std::string _name = "") = 0;
|
virtual std::pair<std::shared_ptr<AbstractAssembly>, SubID> createSubAssembly(bool _creation, std::optional<uint8_t> _eofVersion, std::string _name = "") = 0;
|
||||||
/// Appends the offset of the given sub-assembly or data.
|
/// Appends the offset of the given sub-assembly or data.
|
||||||
virtual void appendDataOffset(std::vector<SubID> const& _subPath) = 0;
|
virtual void appendDataOffset(std::vector<SubID> const& _subPath) = 0;
|
||||||
/// Appends the size of the given sub-assembly or data.
|
/// Appends the size of the given sub-assembly or data.
|
||||||
|
@ -57,7 +57,7 @@ void EVMObjectCompiler::run(Object& _object, bool _optimize)
|
|||||||
if (auto* subObject = dynamic_cast<Object*>(subNode.get()))
|
if (auto* subObject = dynamic_cast<Object*>(subNode.get()))
|
||||||
{
|
{
|
||||||
bool isCreation = !boost::ends_with(subObject->name.str(), "_deployed");
|
bool isCreation = !boost::ends_with(subObject->name.str(), "_deployed");
|
||||||
auto subAssemblyAndID = m_assembly.createSubAssembly(isCreation, subObject->name.str());
|
auto subAssemblyAndID = m_assembly.createSubAssembly(isCreation, m_eofVersion, subObject->name.str());
|
||||||
context.subIDs[subObject->name] = subAssemblyAndID.second;
|
context.subIDs[subObject->name] = subAssemblyAndID.second;
|
||||||
subObject->subId = subAssemblyAndID.second;
|
subObject->subId = subAssemblyAndID.second;
|
||||||
compile(*subObject, *subAssemblyAndID.first, m_dialect, _optimize, m_eofVersion);
|
compile(*subObject, *subAssemblyAndID.first, m_dialect, _optimize, m_eofVersion);
|
||||||
|
@ -122,9 +122,9 @@ void EthAssemblyAdapter::appendAssemblySize()
|
|||||||
m_assembly.appendProgramSize();
|
m_assembly.appendProgramSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
pair<shared_ptr<AbstractAssembly>, AbstractAssembly::SubID> EthAssemblyAdapter::createSubAssembly(bool _creation, string _name)
|
pair<shared_ptr<AbstractAssembly>, AbstractAssembly::SubID> EthAssemblyAdapter::createSubAssembly(bool _creation, std::optional<uint8_t> _eofVersion, string _name)
|
||||||
{
|
{
|
||||||
shared_ptr<evmasm::Assembly> assembly{make_shared<evmasm::Assembly>(_creation, std::move(_name))};
|
shared_ptr<evmasm::Assembly> assembly{make_shared<evmasm::Assembly>(_creation, _eofVersion, std::move(_name))};
|
||||||
auto sub = m_assembly.newSub(assembly);
|
auto sub = m_assembly.newSub(assembly);
|
||||||
return {make_shared<EthAssemblyAdapter>(*assembly), static_cast<size_t>(sub.data())};
|
return {make_shared<EthAssemblyAdapter>(*assembly), static_cast<size_t>(sub.data())};
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,7 @@ public:
|
|||||||
void appendJumpTo(LabelID _labelId, int _stackDiffAfter, JumpType _jumpType) override;
|
void appendJumpTo(LabelID _labelId, int _stackDiffAfter, JumpType _jumpType) override;
|
||||||
void appendJumpToIf(LabelID _labelId, JumpType _jumpType) override;
|
void appendJumpToIf(LabelID _labelId, JumpType _jumpType) override;
|
||||||
void appendAssemblySize() override;
|
void appendAssemblySize() override;
|
||||||
std::pair<std::shared_ptr<AbstractAssembly>, SubID> createSubAssembly(bool _creation, std::string _name = {}) override;
|
std::pair<std::shared_ptr<AbstractAssembly>, SubID> createSubAssembly(bool _creation, std::optional<uint8_t> _eofVersion, std::string _name = {}) override;
|
||||||
void appendDataOffset(std::vector<SubID> const& _subPath) override;
|
void appendDataOffset(std::vector<SubID> const& _subPath) override;
|
||||||
void appendDataSize(std::vector<SubID> const& _subPath) override;
|
void appendDataSize(std::vector<SubID> const& _subPath) override;
|
||||||
SubID appendData(bytes const& _data) override;
|
SubID appendData(bytes const& _data) override;
|
||||||
|
@ -98,7 +98,7 @@ void NoOutputAssembly::appendAssemblySize()
|
|||||||
appendInstruction(evmasm::Instruction::PUSH1);
|
appendInstruction(evmasm::Instruction::PUSH1);
|
||||||
}
|
}
|
||||||
|
|
||||||
pair<shared_ptr<AbstractAssembly>, AbstractAssembly::SubID> NoOutputAssembly::createSubAssembly(bool, std::string)
|
pair<shared_ptr<AbstractAssembly>, AbstractAssembly::SubID> NoOutputAssembly::createSubAssembly(bool, std::optional<uint8_t>, std::string)
|
||||||
{
|
{
|
||||||
yulAssert(false, "Sub assemblies not implemented.");
|
yulAssert(false, "Sub assemblies not implemented.");
|
||||||
return {};
|
return {};
|
||||||
|
@ -65,7 +65,7 @@ public:
|
|||||||
void appendJumpToIf(LabelID _labelId, JumpType _jumpType) override;
|
void appendJumpToIf(LabelID _labelId, JumpType _jumpType) override;
|
||||||
|
|
||||||
void appendAssemblySize() override;
|
void appendAssemblySize() override;
|
||||||
std::pair<std::shared_ptr<AbstractAssembly>, SubID> createSubAssembly(bool _creation, std::string _name = "") override;
|
std::pair<std::shared_ptr<AbstractAssembly>, SubID> createSubAssembly(bool _creation, std::optional<uint8_t> _eofVersion, std::string _name = "") override;
|
||||||
void appendDataOffset(std::vector<SubID> const& _subPath) override;
|
void appendDataOffset(std::vector<SubID> const& _subPath) override;
|
||||||
void appendDataSize(std::vector<SubID> const& _subPath) override;
|
void appendDataSize(std::vector<SubID> const& _subPath) override;
|
||||||
SubID appendData(bytes const& _data) override;
|
SubID appendData(bytes const& _data) override;
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include <libevmasm/Disassemble.h>
|
#include <libevmasm/Disassemble.h>
|
||||||
#include <libyul/Exceptions.h>
|
#include <libyul/Exceptions.h>
|
||||||
|
|
||||||
|
#include <test/Common.h>
|
||||||
#include <boost/test/unit_test.hpp>
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@ -59,15 +60,15 @@ BOOST_AUTO_TEST_CASE(all_assembly_items)
|
|||||||
{ "sub.asm", 1 },
|
{ "sub.asm", 1 },
|
||||||
{ "verbatim.asm", 2 }
|
{ "verbatim.asm", 2 }
|
||||||
};
|
};
|
||||||
Assembly _assembly{false, {}};
|
Assembly _assembly{false, solidity::test::CommonOptions::get().eofVersion(), {}};
|
||||||
auto root_asm = make_shared<string>("root.asm");
|
auto root_asm = make_shared<string>("root.asm");
|
||||||
_assembly.setSourceLocation({1, 3, root_asm});
|
_assembly.setSourceLocation({1, 3, root_asm});
|
||||||
|
|
||||||
Assembly _subAsm{false, {}};
|
Assembly _subAsm{false, solidity::test::CommonOptions::get().eofVersion(), {}};
|
||||||
auto sub_asm = make_shared<string>("sub.asm");
|
auto sub_asm = make_shared<string>("sub.asm");
|
||||||
_subAsm.setSourceLocation({6, 8, sub_asm});
|
_subAsm.setSourceLocation({6, 8, sub_asm});
|
||||||
|
|
||||||
Assembly _verbatimAsm(true, "");
|
Assembly _verbatimAsm(true, solidity::test::CommonOptions::get().eofVersion(), "");
|
||||||
auto verbatim_asm = make_shared<string>("verbatim.asm");
|
auto verbatim_asm = make_shared<string>("verbatim.asm");
|
||||||
_verbatimAsm.setSourceLocation({8, 18, verbatim_asm});
|
_verbatimAsm.setSourceLocation({8, 18, verbatim_asm});
|
||||||
|
|
||||||
@ -243,7 +244,7 @@ BOOST_AUTO_TEST_CASE(immutables_and_its_source_maps)
|
|||||||
{ *subName, 1 }
|
{ *subName, 1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
auto subAsm = make_shared<Assembly>(false, string{});
|
auto subAsm = make_shared<Assembly>(false, solidity::test::CommonOptions::get().eofVersion(), string{});
|
||||||
for (char i = 0; i < numImmutables; ++i)
|
for (char i = 0; i < numImmutables; ++i)
|
||||||
{
|
{
|
||||||
for (int r = 0; r < numActualRefs; ++r)
|
for (int r = 0; r < numActualRefs; ++r)
|
||||||
@ -253,7 +254,7 @@ BOOST_AUTO_TEST_CASE(immutables_and_its_source_maps)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Assembly assembly{true, {}};
|
Assembly assembly{true, solidity::test::CommonOptions::get().eofVersion(), {}};
|
||||||
for (char i = 1; i <= numImmutables; ++i)
|
for (char i = 1; i <= numImmutables; ++i)
|
||||||
{
|
{
|
||||||
assembly.setSourceLocation({10*i, 10*i + 3+i, assemblyName});
|
assembly.setSourceLocation({10*i, 10*i + 3+i, assemblyName});
|
||||||
@ -302,11 +303,11 @@ BOOST_AUTO_TEST_CASE(immutable)
|
|||||||
{ "root.asm", 0 },
|
{ "root.asm", 0 },
|
||||||
{ "sub.asm", 1 }
|
{ "sub.asm", 1 }
|
||||||
};
|
};
|
||||||
Assembly _assembly{true, {}};
|
Assembly _assembly{true, solidity::test::CommonOptions::get().eofVersion(), {}};
|
||||||
auto root_asm = make_shared<string>("root.asm");
|
auto root_asm = make_shared<string>("root.asm");
|
||||||
_assembly.setSourceLocation({1, 3, root_asm});
|
_assembly.setSourceLocation({1, 3, root_asm});
|
||||||
|
|
||||||
Assembly _subAsm{false, {}};
|
Assembly _subAsm{false, solidity::test::CommonOptions::get().eofVersion(), {}};
|
||||||
auto sub_asm = make_shared<string>("sub.asm");
|
auto sub_asm = make_shared<string>("sub.asm");
|
||||||
_subAsm.setSourceLocation({6, 8, sub_asm});
|
_subAsm.setSourceLocation({6, 8, sub_asm});
|
||||||
_subAsm.appendImmutable("someImmutable");
|
_subAsm.appendImmutable("someImmutable");
|
||||||
@ -395,10 +396,10 @@ BOOST_AUTO_TEST_CASE(immutable)
|
|||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(subobject_encode_decode)
|
BOOST_AUTO_TEST_CASE(subobject_encode_decode)
|
||||||
{
|
{
|
||||||
Assembly assembly{true, {}};
|
Assembly assembly{true, solidity::test::CommonOptions::get().eofVersion(), {}};
|
||||||
|
|
||||||
shared_ptr<Assembly> subAsmPtr = make_shared<Assembly>(false, string{});
|
shared_ptr<Assembly> subAsmPtr = make_shared<Assembly>(false, solidity::test::CommonOptions::get().eofVersion(), string{});
|
||||||
shared_ptr<Assembly> subSubAsmPtr = make_shared<Assembly>(false, string{});
|
shared_ptr<Assembly> subSubAsmPtr = make_shared<Assembly>(false, solidity::test::CommonOptions::get().eofVersion(), string{});
|
||||||
|
|
||||||
assembly.appendSubroutine(subAsmPtr);
|
assembly.appendSubroutine(subAsmPtr);
|
||||||
subAsmPtr->appendSubroutine(subSubAsmPtr);
|
subAsmPtr->appendSubroutine(subSubAsmPtr);
|
||||||
|
@ -1250,8 +1250,8 @@ BOOST_AUTO_TEST_CASE(jumpdest_removal_subassemblies)
|
|||||||
// tag unifications (due to block deduplication) is also
|
// tag unifications (due to block deduplication) is also
|
||||||
// visible at the super-assembly.
|
// visible at the super-assembly.
|
||||||
|
|
||||||
Assembly main{false, {}};
|
Assembly main{false, solidity::test::CommonOptions::get().eofVersion(), {}};
|
||||||
AssemblyPointer sub = make_shared<Assembly>(true, string{});
|
AssemblyPointer sub = make_shared<Assembly>(true, solidity::test::CommonOptions::get().eofVersion(), string{});
|
||||||
|
|
||||||
sub->append(u256(1));
|
sub->append(u256(1));
|
||||||
auto t1 = sub->newTag();
|
auto t1 = sub->newTag();
|
||||||
|
@ -87,6 +87,7 @@ evmasm::AssemblyItems compileContract(std::shared_ptr<CharStream> _sourceCode)
|
|||||||
{
|
{
|
||||||
Compiler compiler(
|
Compiler compiler(
|
||||||
solidity::test::CommonOptions::get().evmVersion(),
|
solidity::test::CommonOptions::get().evmVersion(),
|
||||||
|
solidity::test::CommonOptions::get().eofVersion(),
|
||||||
RevertStrings::Default,
|
RevertStrings::Default,
|
||||||
solidity::test::CommonOptions::get().optimize ? OptimiserSettings::standard() : OptimiserSettings::minimal()
|
solidity::test::CommonOptions::get().optimize ? OptimiserSettings::standard() : OptimiserSettings::minimal()
|
||||||
);
|
);
|
||||||
|
@ -144,6 +144,7 @@ bytes compileFirstExpression(
|
|||||||
|
|
||||||
CompilerContext context(
|
CompilerContext context(
|
||||||
solidity::test::CommonOptions::get().evmVersion(),
|
solidity::test::CommonOptions::get().evmVersion(),
|
||||||
|
solidity::test::CommonOptions::get().eofVersion(),
|
||||||
RevertStrings::Default
|
RevertStrings::Default
|
||||||
);
|
);
|
||||||
context.resetVisitedNodes(contract);
|
context.resetVisitedNodes(contract);
|
||||||
|
@ -66,7 +66,7 @@ TestCase::TestResult EVMCodeTransformTest::run(ostream& _stream, string const& _
|
|||||||
return TestResult::FatalError;
|
return TestResult::FatalError;
|
||||||
}
|
}
|
||||||
|
|
||||||
evmasm::Assembly assembly{false, {}};
|
evmasm::Assembly assembly{false, nullopt, {}};
|
||||||
EthAssemblyAdapter adapter(assembly);
|
EthAssemblyAdapter adapter(assembly);
|
||||||
EVMObjectCompiler::compile(
|
EVMObjectCompiler::compile(
|
||||||
*stack.parserResult(),
|
*stack.parserResult(),
|
||||||
|
@ -189,7 +189,7 @@ void FuzzerUtil::testConstantOptimizer(string const& _input, bool _quiet)
|
|||||||
|
|
||||||
for (bool isCreation: {false, true})
|
for (bool isCreation: {false, true})
|
||||||
{
|
{
|
||||||
Assembly assembly{isCreation, {}};
|
Assembly assembly{isCreation, nullopt, {}};
|
||||||
for (u256 const& n: numbers)
|
for (u256 const& n: numbers)
|
||||||
{
|
{
|
||||||
if (!_quiet)
|
if (!_quiet)
|
||||||
|
Loading…
Reference in New Issue
Block a user