Merge pull request #9323 from ethereum/evm-dialect

Drop instructions() from AsmParser
This commit is contained in:
chriseth 2020-07-29 15:33:31 +02:00 committed by GitHub
commit f2fa5b5fe2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 17 additions and 47 deletions

View File

@ -61,27 +61,6 @@ unique_ptr<Block> Parser::parse(std::shared_ptr<Scanner> const& _scanner, bool _
return nullptr; return nullptr;
} }
std::map<string, evmasm::Instruction> const& Parser::instructions()
{
// Allowed instructions, lowercase names.
static map<string, evmasm::Instruction> s_instructions;
if (s_instructions.empty())
{
for (auto const& instruction: evmasm::c_instructions)
{
if (
instruction.second == evmasm::Instruction::JUMPDEST ||
evmasm::isPushInstruction(instruction.second)
)
continue;
string name = instruction.first;
transform(name.begin(), name.end(), name.begin(), [](unsigned char _c) { return tolower(_c); });
s_instructions[name] = instruction.second;
}
}
return s_instructions;
}
Block Parser::parseBlock() Block Parser::parseBlock()
{ {
RecursionGuard recursionGuard(*this); RecursionGuard recursionGuard(*this);

View File

@ -30,8 +30,6 @@
#include <liblangutil/Scanner.h> #include <liblangutil/Scanner.h>
#include <liblangutil/ParserBase.h> #include <liblangutil/ParserBase.h>
#include <libevmasm/Instruction.h>
#include <memory> #include <memory>
#include <variant> #include <variant>
#include <vector> #include <vector>
@ -62,9 +60,6 @@ public:
/// @returns an empty shared pointer on error. /// @returns an empty shared pointer on error.
std::unique_ptr<Block> parse(std::shared_ptr<langutil::Scanner> const& _scanner, bool _reuseScanner); std::unique_ptr<Block> parse(std::shared_ptr<langutil::Scanner> const& _scanner, bool _reuseScanner);
/// @returns a map of all EVM instructions available to assembly.
static std::map<std::string, evmasm::Instruction> const& instructions();
protected: protected:
using ElementaryOperation = std::variant<Literal, Identifier, FunctionCall>; using ElementaryOperation = std::variant<Literal, Identifier, FunctionCall>;

View File

@ -115,18 +115,23 @@ pair<YulString, BuiltinFunctionForEVM> createFunction(
map<YulString, BuiltinFunctionForEVM> createBuiltins(langutil::EVMVersion _evmVersion, bool _objectAccess) map<YulString, BuiltinFunctionForEVM> createBuiltins(langutil::EVMVersion _evmVersion, bool _objectAccess)
{ {
map<YulString, BuiltinFunctionForEVM> builtins; map<YulString, BuiltinFunctionForEVM> builtins;
// NOTE: Parser::instructions() will filter JUMPDEST and PUSHnn too for (auto const& instr: evmasm::c_instructions)
for (auto const& instr: Parser::instructions()) {
string name = instr.first;
transform(name.begin(), name.end(), name.begin(), [](unsigned char _c) { return tolower(_c); });
auto const opcode = instr.second;
if ( if (
!evmasm::isDupInstruction(instr.second) && !evmasm::isDupInstruction(opcode) &&
!evmasm::isSwapInstruction(instr.second) && !evmasm::isSwapInstruction(opcode) &&
!evmasm::isPushInstruction(instr.second) && !evmasm::isPushInstruction(opcode) &&
instr.second != evmasm::Instruction::JUMP && opcode != evmasm::Instruction::JUMP &&
instr.second != evmasm::Instruction::JUMPI && opcode != evmasm::Instruction::JUMPI &&
instr.second != evmasm::Instruction::JUMPDEST && opcode != evmasm::Instruction::JUMPDEST &&
_evmVersion.hasOpcode(instr.second) _evmVersion.hasOpcode(opcode)
) )
builtins.emplace(createEVMFunction(instr.first, instr.second)); builtins.emplace(createEVMFunction(name, opcode));
}
if (_objectAccess) if (_objectAccess)
{ {

View File

@ -22,8 +22,6 @@
#include <libyul/AsmData.h> #include <libyul/AsmData.h>
#include <libyul/optimiser/CallGraphGenerator.h> #include <libyul/optimiser/CallGraphGenerator.h>
#include <libevmasm/Instruction.h>
#include <stack> #include <stack>
using namespace std; using namespace std;

View File

@ -24,10 +24,8 @@
#include <libyul/optimiser/NameCollector.h> #include <libyul/optimiser/NameCollector.h>
#include <libyul/AsmData.h> #include <libyul/AsmData.h>
#include <libyul/Dialect.h> #include <libyul/Dialect.h>
#include <libyul/backends/evm/EVMDialect.h>
#include <libyul/AsmParser.h>
#include <libevmasm/Instruction.h> #include <libsolutil/CommonData.h>
using namespace std; using namespace std;
using namespace solidity; using namespace solidity;
@ -61,7 +59,5 @@ bool NameDispenser::illegalName(YulString _name)
{ {
if (_name.empty() || m_usedNames.count(_name) || m_dialect.builtin(_name)) if (_name.empty() || m_usedNames.count(_name) || m_dialect.builtin(_name))
return true; return true;
if (dynamic_cast<EVMDialect const*>(&m_dialect))
return Parser::instructions().count(_name.str());
return false; return false;
} }

View File

@ -19,8 +19,7 @@
#include <libyul/optimiser/VarNameCleaner.h> #include <libyul/optimiser/VarNameCleaner.h>
#include <libyul/AsmData.h> #include <libyul/AsmData.h>
#include <libyul/Dialect.h> #include <libyul/Dialect.h>
#include <libyul/AsmParser.h>
#include <libyul/backends/evm/EVMDialect.h>
#include <algorithm> #include <algorithm>
#include <cctype> #include <cctype>
#include <climits> #include <climits>
@ -113,8 +112,6 @@ bool VarNameCleaner::isUsedName(YulString const& _name) const
{ {
if (_name.empty() || m_dialect.builtin(_name) || m_usedNames.count(_name)) if (_name.empty() || m_dialect.builtin(_name) || m_usedNames.count(_name))
return true; return true;
if (dynamic_cast<EVMDialect const*>(&m_dialect))
return Parser::instructions().count(_name.str());
return false; return false;
} }