Provide meta-information about eWasm builtins.

This commit is contained in:
chriseth 2019-06-27 13:25:40 +02:00
parent 2ee272acf3
commit d9db193249
2 changed files with 28 additions and 12 deletions

View File

@ -47,14 +47,24 @@ WasmDialect::WasmDialect():
addFunction(name, 2, 1); addFunction(name, 2, 1);
addFunction("i64.eqz", 1, 1); addFunction("i64.eqz", 1, 1);
addFunction("i64.store", 2, 0);
addFunction("i64.load", 1, 1); addFunction("i64.store", 2, 0, false);
m_functions["i64.store"_yulstring].invalidatesStorage = false;
addFunction("i64.load", 1, 1, false);
m_functions["i64.load"_yulstring].invalidatesStorage = false;
m_functions["i64.load"_yulstring].invalidatesMemory = false;
m_functions["i64.load"_yulstring].sideEffectFree = true;
m_functions["i64.load"_yulstring].sideEffectFreeIfNoMSize = true;
addFunction("drop", 1, 0); addFunction("drop", 1, 0);
addFunction("unreachable", 0, 0);
addFunction("datasize", 1, 4, true); addFunction("unreachable", 0, 0, false);
addFunction("dataoffset", 1, 4, true); m_functions["unreachable"_yulstring].invalidatesStorage = false;
m_functions["unreachable"_yulstring].invalidatesMemory = false;
addFunction("datasize", 1, 4, true, true);
addFunction("dataoffset", 1, 4, true, true);
} }
BuiltinFunction const* WasmDialect::builtin(YulString _name) const BuiltinFunction const* WasmDialect::builtin(YulString _name) const
@ -75,18 +85,24 @@ WasmDialect const& WasmDialect::instance()
return *dialect; return *dialect;
} }
void WasmDialect::addFunction(string _name, size_t _params, size_t _returns, bool _literalArguments) void WasmDialect::addFunction(
string _name,
size_t _params,
size_t _returns,
bool _movable,
bool _literalArguments
)
{ {
YulString name{move(_name)}; YulString name{move(_name)};
BuiltinFunction& f = m_functions[name]; BuiltinFunction& f = m_functions[name];
f.name = name; f.name = name;
f.parameters.resize(_params); f.parameters.resize(_params);
f.returns.resize(_returns); f.returns.resize(_returns);
f.movable = false; f.movable = _movable;
f.sideEffectFree = false; f.sideEffectFree = _movable;
f.sideEffectFreeIfNoMSize = false; f.sideEffectFreeIfNoMSize = _movable;
f.isMSize = false; f.isMSize = false;
f.invalidatesStorage = true; f.invalidatesStorage = !_movable;
f.invalidatesMemory = true; f.invalidatesMemory = !_movable;
f.literalArguments = _literalArguments; f.literalArguments = _literalArguments;
} }

View File

@ -53,7 +53,7 @@ struct WasmDialect: public Dialect
static WasmDialect const& instance(); static WasmDialect const& instance();
private: private:
void addFunction(std::string _name, size_t _params, size_t _returns, bool _literalArguments = false); void addFunction(std::string _name, size_t _params, size_t _returns, bool _movable = true, bool _literalArguments = false);
std::map<YulString, BuiltinFunction> m_functions; std::map<YulString, BuiltinFunction> m_functions;
}; };