mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Add AssemblyStack.assembleEVM which returns both deploy and runtime assemblies
This commit is contained in:
parent
05e3e723f5
commit
6ae09ee0cc
@ -216,7 +216,41 @@ MachineAssemblyObject AssemblyStack::assemble(Machine _machine) const
|
|||||||
return MachineAssemblyObject();
|
return MachineAssemblyObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<MachineAssemblyObject, MachineAssemblyObject> AssemblyStack::assembleWithDeployed(optional<string_view> _deployName) const
|
std::pair<MachineAssemblyObject, MachineAssemblyObject>
|
||||||
|
AssemblyStack::assembleWithDeployed(optional<string_view> _deployName) const
|
||||||
|
{
|
||||||
|
auto [creationAssembly, deployedAssembly] = assembleEVMWithDeployed(_deployName);
|
||||||
|
yulAssert(creationAssembly, "");
|
||||||
|
|
||||||
|
MachineAssemblyObject creationObject;
|
||||||
|
creationObject.bytecode = make_shared<evmasm::LinkerObject>(creationAssembly->assemble());
|
||||||
|
yulAssert(creationObject.bytecode->immutableReferences.empty(), "Leftover immutables.");
|
||||||
|
creationObject.assembly = creationAssembly->assemblyString();
|
||||||
|
creationObject.sourceMappings = make_unique<string>(
|
||||||
|
evmasm::AssemblyItem::computeSourceMapping(
|
||||||
|
creationAssembly->items(),
|
||||||
|
{{scanner().charStream() ? scanner().charStream()->name() : "", 0}}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
MachineAssemblyObject deployedObject;
|
||||||
|
if (deployedAssembly)
|
||||||
|
{
|
||||||
|
deployedObject.bytecode = make_shared<evmasm::LinkerObject>(deployedAssembly->assemble());
|
||||||
|
deployedObject.assembly = deployedAssembly->assemblyString();
|
||||||
|
deployedObject.sourceMappings = make_unique<string>(
|
||||||
|
evmasm::AssemblyItem::computeSourceMapping(
|
||||||
|
deployedAssembly->items(),
|
||||||
|
{{scanner().charStream() ? scanner().charStream()->name() : "", 0}}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {std::move(creationObject), std::move(deployedObject)};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::pair<std::shared_ptr<evmasm::Assembly>, std::shared_ptr<evmasm::Assembly>>
|
||||||
|
AssemblyStack::assembleEVMWithDeployed(optional<string_view> _deployName) const
|
||||||
{
|
{
|
||||||
yulAssert(m_analysisSuccessful, "");
|
yulAssert(m_analysisSuccessful, "");
|
||||||
yulAssert(m_parserResult, "");
|
yulAssert(m_parserResult, "");
|
||||||
@ -227,18 +261,6 @@ std::pair<MachineAssemblyObject, MachineAssemblyObject> AssemblyStack::assembleW
|
|||||||
EthAssemblyAdapter adapter(assembly);
|
EthAssemblyAdapter adapter(assembly);
|
||||||
compileEVM(adapter, m_optimiserSettings.optimizeStackAllocation);
|
compileEVM(adapter, m_optimiserSettings.optimizeStackAllocation);
|
||||||
|
|
||||||
MachineAssemblyObject creationObject;
|
|
||||||
creationObject.bytecode = make_shared<evmasm::LinkerObject>(assembly.assemble());
|
|
||||||
yulAssert(creationObject.bytecode->immutableReferences.empty(), "Leftover immutables.");
|
|
||||||
creationObject.assembly = assembly.assemblyString();
|
|
||||||
creationObject.sourceMappings = make_unique<string>(
|
|
||||||
evmasm::AssemblyItem::computeSourceMapping(
|
|
||||||
assembly.items(),
|
|
||||||
{{scanner().charStream() ? scanner().charStream()->name() : "", 0}}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
MachineAssemblyObject deployedObject;
|
|
||||||
optional<size_t> subIndex;
|
optional<size_t> subIndex;
|
||||||
|
|
||||||
// Pick matching assembly if name was given
|
// Pick matching assembly if name was given
|
||||||
@ -260,17 +282,10 @@ std::pair<MachineAssemblyObject, MachineAssemblyObject> AssemblyStack::assembleW
|
|||||||
if (subIndex.has_value())
|
if (subIndex.has_value())
|
||||||
{
|
{
|
||||||
evmasm::Assembly& runtimeAssembly = assembly.sub(*subIndex);
|
evmasm::Assembly& runtimeAssembly = assembly.sub(*subIndex);
|
||||||
deployedObject.bytecode = make_shared<evmasm::LinkerObject>(runtimeAssembly.assemble());
|
return {make_shared<evmasm::Assembly>(assembly), make_shared<evmasm::Assembly>(runtimeAssembly)};
|
||||||
deployedObject.assembly = runtimeAssembly.assemblyString();
|
|
||||||
deployedObject.sourceMappings = make_unique<string>(
|
|
||||||
evmasm::AssemblyItem::computeSourceMapping(
|
|
||||||
runtimeAssembly.items(),
|
|
||||||
{{scanner().charStream() ? scanner().charStream()->name() : "", 0}}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return {std::move(creationObject), std::move(deployedObject)};
|
return {make_shared<evmasm::Assembly>(assembly), {}};
|
||||||
}
|
}
|
||||||
|
|
||||||
string AssemblyStack::print() const
|
string AssemblyStack::print() const
|
||||||
|
@ -35,6 +35,11 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
namespace solidity::evmasm
|
||||||
|
{
|
||||||
|
class Assembly;
|
||||||
|
}
|
||||||
|
|
||||||
namespace solidity::langutil
|
namespace solidity::langutil
|
||||||
{
|
{
|
||||||
class Scanner;
|
class Scanner;
|
||||||
@ -93,7 +98,18 @@ public:
|
|||||||
/// In addition to the value returned by @a assemble, returns
|
/// In addition to the value returned by @a assemble, returns
|
||||||
/// a second object that is the runtime code.
|
/// a second object that is the runtime code.
|
||||||
/// Only available for EVM.
|
/// Only available for EVM.
|
||||||
std::pair<MachineAssemblyObject, MachineAssemblyObject> assembleWithDeployed(std::optional<std::string_view> _deployeName = {}) const;
|
std::pair<MachineAssemblyObject, MachineAssemblyObject>
|
||||||
|
assembleWithDeployed(
|
||||||
|
std::optional<std::string_view> _deployName = {}
|
||||||
|
) const;
|
||||||
|
|
||||||
|
/// Run the assembly step (should only be called after parseAndAnalyze).
|
||||||
|
/// Similar to @a assemblyWithDeployed, but returns EVM assembly objects.
|
||||||
|
/// Only available for EVM.
|
||||||
|
std::pair<std::shared_ptr<evmasm::Assembly>, std::shared_ptr<evmasm::Assembly>>
|
||||||
|
assembleEVMWithDeployed(
|
||||||
|
std::optional<std::string_view> _deployName = {}
|
||||||
|
) const;
|
||||||
|
|
||||||
/// @returns the errors generated during parsing, analysis (and potentially assembly).
|
/// @returns the errors generated during parsing, analysis (and potentially assembly).
|
||||||
langutil::ErrorList const& errors() const { return m_errors; }
|
langutil::ErrorList const& errors() const { return m_errors; }
|
||||||
|
Loading…
Reference in New Issue
Block a user