mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
wasm/BinaryTransform: Put code for enumerating globals/functions/types in separate functions
This commit is contained in:
parent
bec9b24c5b
commit
4b1ea93b41
@ -24,6 +24,7 @@
|
|||||||
#include <libsolutil/CommonData.h>
|
#include <libsolutil/CommonData.h>
|
||||||
|
|
||||||
#include <boost/range/adaptor/reversed.hpp>
|
#include <boost/range/adaptor/reversed.hpp>
|
||||||
|
#include <boost/range/adaptor/map.hpp>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace solidity;
|
using namespace solidity;
|
||||||
@ -254,19 +255,21 @@ bytes BinaryTransform::run(Module const& _module)
|
|||||||
{
|
{
|
||||||
BinaryTransform bt;
|
BinaryTransform bt;
|
||||||
|
|
||||||
for (size_t i = 0; i < _module.globals.size(); ++i)
|
map<Type, vector<string>> const types = typeToFunctionMap(_module.imports, _module.functions);
|
||||||
bt.m_globals[_module.globals[i].variableName] = i;
|
|
||||||
|
|
||||||
size_t funID = 0;
|
bt.m_globals = enumerateGlobals(_module);
|
||||||
for (FunctionImport const& fun: _module.imports)
|
bt.m_functions = enumerateFunctions(_module);
|
||||||
bt.m_functions[fun.internalName] = funID++;
|
bt.m_functionTypes = enumerateFunctionTypes(types);
|
||||||
for (FunctionDefinition const& fun: _module.functions)
|
|
||||||
bt.m_functions[fun.name] = funID++;
|
yulAssert(bt.m_globals.size() == _module.globals.size(), "");
|
||||||
|
yulAssert(bt.m_functions.size() == _module.imports.size() + _module.functions.size(), "");
|
||||||
|
yulAssert(bt.m_functionTypes.size() == bt.m_functions.size(), "");
|
||||||
|
yulAssert(bt.m_functionTypes.size() >= types.size(), "");
|
||||||
|
|
||||||
bytes ret{0, 'a', 's', 'm'};
|
bytes ret{0, 'a', 's', 'm'};
|
||||||
// version
|
// version
|
||||||
ret += bytes{1, 0, 0, 0};
|
ret += bytes{1, 0, 0, 0};
|
||||||
ret += bt.typeSection(_module.imports, _module.functions);
|
ret += bt.typeSection(types);
|
||||||
ret += bt.importSection(_module.imports);
|
ret += bt.importSection(_module.imports);
|
||||||
ret += bt.functionSection(_module.functions);
|
ret += bt.functionSection(_module.functions);
|
||||||
ret += bt.memorySection();
|
ret += bt.memorySection();
|
||||||
@ -496,9 +499,9 @@ vector<uint8_t> BinaryTransform::encodeTypes(vector<string> const& _typeNames)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bytes BinaryTransform::typeSection(
|
map<BinaryTransform::Type, vector<string>> BinaryTransform::typeToFunctionMap(
|
||||||
vector<FunctionImport> const& _imports,
|
vector<wasm::FunctionImport> const& _imports,
|
||||||
vector<FunctionDefinition> const& _functions
|
vector<wasm::FunctionDefinition> const& _functions
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
map<Type, vector<string>> types;
|
map<Type, vector<string>> types;
|
||||||
@ -507,12 +510,50 @@ bytes BinaryTransform::typeSection(
|
|||||||
for (auto const& fun: _functions)
|
for (auto const& fun: _functions)
|
||||||
types[typeOf(fun)].emplace_back(fun.name);
|
types[typeOf(fun)].emplace_back(fun.name);
|
||||||
|
|
||||||
bytes result;
|
return types;
|
||||||
size_t index = 0;
|
}
|
||||||
for (auto const& [type, funNames]: types)
|
|
||||||
|
map<string, size_t> BinaryTransform::enumerateGlobals(Module const& _module)
|
||||||
|
{
|
||||||
|
map<string, size_t> globals;
|
||||||
|
for (size_t i = 0; i < _module.globals.size(); ++i)
|
||||||
|
globals[_module.globals[i].variableName] = i;
|
||||||
|
|
||||||
|
return globals;
|
||||||
|
}
|
||||||
|
|
||||||
|
map<string, size_t> BinaryTransform::enumerateFunctions(Module const& _module)
|
||||||
|
{
|
||||||
|
map<string, size_t> functions;
|
||||||
|
size_t funID = 0;
|
||||||
|
for (FunctionImport const& fun: _module.imports)
|
||||||
|
functions[fun.internalName] = funID++;
|
||||||
|
for (FunctionDefinition const& fun: _module.functions)
|
||||||
|
functions[fun.name] = funID++;
|
||||||
|
|
||||||
|
return functions;
|
||||||
|
}
|
||||||
|
|
||||||
|
map<string, size_t> BinaryTransform::enumerateFunctionTypes(map<Type, vector<string>> const& _typeToFunctionMap)
|
||||||
|
{
|
||||||
|
map<string, size_t> functionTypes;
|
||||||
|
size_t typeID = 0;
|
||||||
|
for (vector<string> const& funNames: _typeToFunctionMap | boost::adaptors::map_values)
|
||||||
{
|
{
|
||||||
for (string const& name: funNames)
|
for (string const& name: funNames)
|
||||||
m_functionTypes[name] = index;
|
functionTypes[name] = typeID;
|
||||||
|
++typeID;
|
||||||
|
}
|
||||||
|
|
||||||
|
return functionTypes;
|
||||||
|
}
|
||||||
|
|
||||||
|
bytes BinaryTransform::typeSection(map<BinaryTransform::Type, vector<string>> const& _typeToFunctionMap)
|
||||||
|
{
|
||||||
|
bytes result;
|
||||||
|
size_t index = 0;
|
||||||
|
for (Type const& type: _typeToFunctionMap | boost::adaptors::map_keys)
|
||||||
|
{
|
||||||
result += toBytes(ValueType::Function);
|
result += toBytes(ValueType::Function);
|
||||||
result += lebEncode(type.first.size()) + type.first;
|
result += lebEncode(type.first.size()) + type.first;
|
||||||
result += lebEncode(type.second.size()) + type.second;
|
result += lebEncode(type.second.size()) + type.second;
|
||||||
|
@ -61,11 +61,19 @@ private:
|
|||||||
|
|
||||||
static uint8_t encodeType(std::string const& _typeName);
|
static uint8_t encodeType(std::string const& _typeName);
|
||||||
static std::vector<uint8_t> encodeTypes(std::vector<std::string> const& _typeNames);
|
static std::vector<uint8_t> encodeTypes(std::vector<std::string> const& _typeNames);
|
||||||
bytes typeSection(
|
|
||||||
|
static std::map<Type, std::vector<std::string>> typeToFunctionMap(
|
||||||
std::vector<wasm::FunctionImport> const& _imports,
|
std::vector<wasm::FunctionImport> const& _imports,
|
||||||
std::vector<wasm::FunctionDefinition> const& _functions
|
std::vector<wasm::FunctionDefinition> const& _functions
|
||||||
);
|
);
|
||||||
|
|
||||||
|
static std::map<std::string, size_t> enumerateGlobals(Module const& _module);
|
||||||
|
static std::map<std::string, size_t> enumerateFunctions(Module const& _module);
|
||||||
|
static std::map<std::string, size_t> enumerateFunctionTypes(
|
||||||
|
std::map<Type, std::vector<std::string>> const& _typeToFunctionMap
|
||||||
|
);
|
||||||
|
|
||||||
|
bytes typeSection(std::map<Type, std::vector<std::string>> const& _typeToFunctionMap);
|
||||||
bytes importSection(std::vector<wasm::FunctionImport> const& _imports);
|
bytes importSection(std::vector<wasm::FunctionImport> const& _imports);
|
||||||
bytes functionSection(std::vector<wasm::FunctionDefinition> const& _functions);
|
bytes functionSection(std::vector<wasm::FunctionDefinition> const& _functions);
|
||||||
bytes memorySection();
|
bytes memorySection();
|
||||||
|
Loading…
Reference in New Issue
Block a user