diff --git a/libyul/AsmParser.cpp b/libyul/AsmParser.cpp index 5dd0d854e..2c7aa1f93 100644 --- a/libyul/AsmParser.cpp +++ b/libyul/AsmParser.cpp @@ -61,27 +61,6 @@ unique_ptr Parser::parse(std::shared_ptr const& _scanner, bool _ return nullptr; } -std::map const& Parser::instructions() -{ - // Allowed instructions, lowercase names. - static map 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() { RecursionGuard recursionGuard(*this); diff --git a/libyul/AsmParser.h b/libyul/AsmParser.h index ecd62228a..c48910064 100644 --- a/libyul/AsmParser.h +++ b/libyul/AsmParser.h @@ -30,8 +30,6 @@ #include #include -#include - #include #include #include @@ -62,9 +60,6 @@ public: /// @returns an empty shared pointer on error. std::unique_ptr parse(std::shared_ptr const& _scanner, bool _reuseScanner); - /// @returns a map of all EVM instructions available to assembly. - static std::map const& instructions(); - protected: using ElementaryOperation = std::variant; diff --git a/libyul/backends/evm/EVMDialect.cpp b/libyul/backends/evm/EVMDialect.cpp index c552b6e22..6e2409fe2 100644 --- a/libyul/backends/evm/EVMDialect.cpp +++ b/libyul/backends/evm/EVMDialect.cpp @@ -115,18 +115,23 @@ pair createFunction( map createBuiltins(langutil::EVMVersion _evmVersion, bool _objectAccess) { map builtins; - // NOTE: Parser::instructions() will filter JUMPDEST and PUSHnn too - for (auto const& instr: Parser::instructions()) + for (auto const& instr: evmasm::c_instructions) + { + string name = instr.first; + transform(name.begin(), name.end(), name.begin(), [](unsigned char _c) { return tolower(_c); }); + auto const opcode = instr.second; + if ( - !evmasm::isDupInstruction(instr.second) && - !evmasm::isSwapInstruction(instr.second) && - !evmasm::isPushInstruction(instr.second) && - instr.second != evmasm::Instruction::JUMP && - instr.second != evmasm::Instruction::JUMPI && - instr.second != evmasm::Instruction::JUMPDEST && - _evmVersion.hasOpcode(instr.second) + !evmasm::isDupInstruction(opcode) && + !evmasm::isSwapInstruction(opcode) && + !evmasm::isPushInstruction(opcode) && + opcode != evmasm::Instruction::JUMP && + opcode != evmasm::Instruction::JUMPI && + opcode != evmasm::Instruction::JUMPDEST && + _evmVersion.hasOpcode(opcode) ) - builtins.emplace(createEVMFunction(instr.first, instr.second)); + builtins.emplace(createEVMFunction(name, opcode)); + } if (_objectAccess) {