#pragma once
#include <libyul/YulString.h>
#include <libyul/ControlFlowSideEffects.h>
#include <libyul/SideEffects.h>
#include <vector>
#include <set>
#include <optional>
namespace solidity::yul
{
class YulString;
using Type = YulString;
enum class LiteralKind;
struct Literal;
struct BuiltinFunction
{
YulString name;
std::vector<Type> parameters;
std::vector<Type> returns;
SideEffects sideEffects;
ControlFlowSideEffects controlFlowSideEffects;
bool isMSize = false;
std::vector<std::optional<LiteralKind>> literalArguments{};
std::optional<LiteralKind> literalArgument(size_t i) const
{
return literalArguments.empty() ? std::nullopt : literalArguments.at(i);
}
};
struct Dialect
{
Dialect(Dialect const&) = delete;
Dialect& operator=(Dialect const&) = delete;
YulString defaultType;
YulString boolType;
std::set<YulString> types = {{}};
virtual BuiltinFunction const* builtin(YulString ) const { return nullptr; }
virtual bool reservedIdentifier(YulString _name) const { return builtin(_name) != nullptr; }
virtual BuiltinFunction const* discardFunction(YulString ) const { return nullptr; }
virtual BuiltinFunction const* equalityFunction(YulString ) const { return nullptr; }
virtual BuiltinFunction const* booleanNegationFunction() const { return nullptr; }
virtual BuiltinFunction const* memoryStoreFunction(YulString ) const { return nullptr; }
virtual BuiltinFunction const* memoryLoadFunction(YulString ) const { return nullptr; }
virtual BuiltinFunction const* storageStoreFunction(YulString ) const { return nullptr; }
virtual BuiltinFunction const* storageLoadFunction(YulString ) const { return nullptr; }
virtual YulString hashFunction(YulString ) const { return YulString{}; }
virtual bool validTypeForLiteral(LiteralKind _kind, YulString _value, YulString _type) const;
virtual Literal zeroLiteralForType(YulString _type) const;
virtual Literal trueLiteral() const;
virtual std::set<YulString> fixedFunctionNames() const { return {}; }
Dialect() = default;
virtual ~Dialect() = default;
static Dialect const& yulDeprecated();
};
}