Skip to content

Commit e728cd7

Browse files
committed
Introduce typed named functions to dialect.
1 parent b9b36cd commit e728cd7

File tree

5 files changed

+54
-11
lines changed

5 files changed

+54
-11
lines changed

libyul/Dialect.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ struct Dialect: boost::noncopyable
5858
/// @returns the builtin function of the given name or a nullptr if it is not a builtin function.
5959
virtual BuiltinFunction const* builtin(YulString /*_name*/) const { return nullptr; }
6060

61-
virtual BuiltinFunction const* discardFunction() const { return nullptr; }
62-
virtual BuiltinFunction const* equalityFunction() const { return nullptr; }
61+
virtual BuiltinFunction const* discardFunction(YulString /* _type */) const { return nullptr; }
62+
virtual BuiltinFunction const* equalityFunction(YulString /* _type */) const { return nullptr; }
6363
virtual BuiltinFunction const* booleanNegationFunction() const { return nullptr; }
6464

6565
/// Check whether the given type is legal for the given literal value.

libyul/backends/evm/EVMDialect.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,28 @@ EVMDialectTyped::EVMDialectTyped(langutil::EVMVersion _evmVersion, bool _objectA
290290
m_functions["u256_to_bool"_yulstring].returns = {"bool"_yulstring};
291291
}
292292

293+
BuiltinFunctionForEVM const* EVMDialectTyped::discardFunction(YulString _type) const
294+
{
295+
if (_type == "bool"_yulstring)
296+
return builtin("popbool"_yulstring);
297+
else
298+
{
299+
yulAssert(_type == defaultType, "");
300+
return builtin("pop"_yulstring);
301+
}
302+
}
303+
304+
BuiltinFunctionForEVM const* EVMDialectTyped::equalityFunction(YulString _type) const
305+
{
306+
if (_type == "bool"_yulstring)
307+
return nullptr;
308+
else
309+
{
310+
yulAssert(_type == defaultType, "");
311+
return builtin("eq"_yulstring);
312+
}
313+
}
314+
293315
EVMDialectTyped const& EVMDialectTyped::instance(langutil::EVMVersion _version)
294316
{
295317
static map<langutil::EVMVersion, unique_ptr<EVMDialectTyped const>> dialects;

libyul/backends/evm/EVMDialect.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ struct EVMDialect: public Dialect
6868
/// @returns the builtin function of the given name or a nullptr if it is not a builtin function.
6969
BuiltinFunctionForEVM const* builtin(YulString _name) const override;
7070

71-
BuiltinFunctionForEVM const* discardFunction() const override { return builtin("pop"_yulstring); }
72-
BuiltinFunctionForEVM const* equalityFunction() const override { return builtin("eq"_yulstring); }
71+
BuiltinFunctionForEVM const* discardFunction(YulString /*_type*/) const override { return builtin("pop"_yulstring); }
72+
BuiltinFunctionForEVM const* equalityFunction(YulString /*_type*/) const override { return builtin("eq"_yulstring); }
7373
BuiltinFunctionForEVM const* booleanNegationFunction() const override { return builtin("iszero"_yulstring); }
7474

7575
static EVMDialect const& strictAssemblyForEVM(langutil::EVMVersion _version);
@@ -102,6 +102,10 @@ struct EVMDialectTyped: public EVMDialect
102102
/// Constructor, should only be used internally. Use the factory function below.
103103
EVMDialectTyped(langutil::EVMVersion _evmVersion, bool _objectAccess);
104104

105+
BuiltinFunctionForEVM const* discardFunction(YulString _type) const override;
106+
BuiltinFunctionForEVM const* equalityFunction(YulString _type) const override;
107+
BuiltinFunctionForEVM const* booleanNegationFunction() const override { return builtin("not"_yulstring); }
108+
105109
static EVMDialectTyped const& instance(langutil::EVMVersion _version);
106110
};
107111

libyul/backends/wasm/WasmDialect.cpp

+18-1
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,9 @@ WasmDialect::WasmDialect()
9191
m_functions["i64.load"_yulstring].sideEffects.sideEffectFreeIfNoMSize = true;
9292

9393
// Drop is actually overloaded for all types, but Yul does not support that.
94-
// We could introduce "i32.drop".
94+
// Because of that, we introduce "i32.drop".
9595
addFunction("drop", {i64}, {});
96+
addFunction("i32.drop", {i32}, {});
9697

9798
addFunction("nop", {}, {});
9899
addFunction("unreachable", {}, {}, false);
@@ -114,6 +115,22 @@ BuiltinFunction const* WasmDialect::builtin(YulString _name) const
114115
return nullptr;
115116
}
116117

118+
BuiltinFunction const* WasmDialect::discardFunction(YulString _type) const
119+
{
120+
if (_type == "i32"_yulstring)
121+
return builtin("i32.drop"_yulstring);
122+
yulAssert(_type == "i64"_yulstring, "");
123+
return builtin("drop"_yulstring);
124+
}
125+
126+
BuiltinFunction const* WasmDialect::equalityFunction(YulString _type) const
127+
{
128+
if (_type == "i32"_yulstring)
129+
return builtin("i32.eq"_yulstring);
130+
yulAssert(_type == "i64"_yulstring, "");
131+
return builtin("i64.eq"_yulstring);
132+
}
133+
117134
WasmDialect const& WasmDialect::instance()
118135
{
119136
static std::unique_ptr<WasmDialect> dialect;

libyul/backends/wasm/WasmDialect.h

+6-6
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,19 @@ struct Object;
3535
/**
3636
* Yul dialect for Wasm as a backend.
3737
*
38-
* Builtin functions are a subset of the wasm instructions, always implicitly assuming
39-
* unsigned 64 bit types.
38+
* Builtin functions are a subset of the wasm instructions.
39+
*
40+
* There is a builtin function `i32.drop` that takes an i32, while `drop` takes i64.
4041
*
41-
* !This is subject to changes!
4242
*/
4343
struct WasmDialect: public Dialect
4444
{
4545
WasmDialect();
4646

4747
BuiltinFunction const* builtin(YulString _name) const override;
48-
BuiltinFunction const* discardFunction() const override { return builtin("drop"_yulstring); }
49-
BuiltinFunction const* equalityFunction() const override { return builtin("i64.eq"_yulstring); }
50-
BuiltinFunction const* booleanNegationFunction() const override { return builtin("i64.eqz"_yulstring); }
48+
BuiltinFunction const* discardFunction(YulString _type) const override;
49+
BuiltinFunction const* equalityFunction(YulString _type) const override;
50+
BuiltinFunction const* booleanNegationFunction() const override { return builtin("i32.eqz"_yulstring); }
5151

5252
std::set<YulString> fixedFunctionNames() const override { return {"main"_yulstring}; }
5353

0 commit comments

Comments
 (0)