diff --git a/libsolidity/codegen/ir/IRGeneratorForStatements.cpp b/libsolidity/codegen/ir/IRGeneratorForStatements.cpp index c716c43a6070..5902cfef68b6 100644 --- a/libsolidity/codegen/ir/IRGeneratorForStatements.cpp +++ b/libsolidity/codegen/ir/IRGeneratorForStatements.cpp @@ -63,8 +63,8 @@ struct CopyTranslate: public yul::ASTCopier { using ExternalRefsMap = std::map; - CopyTranslate(yul::Dialect const& _dialect, IRGenerationContext& _context, ExternalRefsMap const& _references): - m_dialect(_dialect), m_context(_context), m_references(_references) {} + CopyTranslate(IRGenerationContext& _context, ExternalRefsMap const& _references): + m_context(_context), m_references(_references) {} using ASTCopier::operator(); @@ -80,14 +80,11 @@ struct CopyTranslate: public yul::ASTCopier yul::YulName translateIdentifier(yul::YulName _name) override { - // Strictly, the dialect used by inline assembly (m_dialect) could be different - // from the Yul dialect we are compiling to. So we are assuming here that the builtin - // functions are identical. This should not be a problem for now since everything - // is EVM anyway. - if (m_dialect.findBuiltin(_name.str())) - return _name; - else - return yul::YulName{"usr$" + _name.str()}; + // Strictly, the dialect used by inline assembly could be different + // from the Yul dialect we are compiling to. By only translating `YulName`s which correspond to Identifiers, + // we are implicitly excluding builtins together with the assumption, that numerical builtin handles + // stay identical. Special care has to be taken, that these numerical handles stay consistent. + return yul::YulName{"usr$" + _name.str()}; } yul::Identifier translate(yul::Identifier const& _identifier) override @@ -209,8 +206,6 @@ struct CopyTranslate: public yul::ASTCopier return yul::Identifier{_identifier.debugData, yul::YulName{value}}; } - - yul::Dialect const& m_dialect; IRGenerationContext& m_context; ExternalRefsMap const& m_references; }; @@ -2294,7 +2289,7 @@ bool IRGeneratorForStatements::visit(InlineAssembly const& _inlineAsm) setLocation(_inlineAsm); if (*_inlineAsm.annotation().hasMemoryEffects && !_inlineAsm.annotation().markedMemorySafe) m_context.setMemoryUnsafeInlineAssemblySeen(); - CopyTranslate bodyCopier{_inlineAsm.dialect(), m_context, _inlineAsm.annotation().externalReferences}; + CopyTranslate bodyCopier{m_context, _inlineAsm.annotation().externalReferences}; yul::Statement modified = bodyCopier(_inlineAsm.operations().root()); diff --git a/libsolidity/experimental/codegen/IRGeneratorForStatements.cpp b/libsolidity/experimental/codegen/IRGeneratorForStatements.cpp index 80c442b88146..14aef1107dd3 100644 --- a/libsolidity/experimental/codegen/IRGeneratorForStatements.cpp +++ b/libsolidity/experimental/codegen/IRGeneratorForStatements.cpp @@ -54,9 +54,8 @@ struct CopyTranslate: public yul::ASTCopier { CopyTranslate( IRGenerationContext const& _context, - yul::Dialect const& _dialect, std::map _references - ): m_context(_context), m_dialect(_dialect), m_references(std::move(_references)) {} + ): m_context(_context), m_references(std::move(_references)) {} using ASTCopier::operator(); @@ -72,10 +71,7 @@ struct CopyTranslate: public yul::ASTCopier yul::YulName translateIdentifier(yul::YulName _name) override { - if (m_dialect.findBuiltin(_name.str())) - return _name; - else - return yul::YulName{"usr$" + _name.str()}; + return yul::YulName{"usr$" + _name.str()}; } yul::Identifier translate(yul::Identifier const& _identifier) override @@ -106,7 +102,6 @@ struct CopyTranslate: public yul::ASTCopier } IRGenerationContext const& m_context; - yul::Dialect const& m_dialect; std::map m_references; }; @@ -129,7 +124,7 @@ bool IRGeneratorForStatements::visit(TupleExpression const& _tupleExpression) bool IRGeneratorForStatements::visit(InlineAssembly const& _assembly) { - CopyTranslate bodyCopier{m_context, _assembly.dialect(), _assembly.annotation().externalReferences}; + CopyTranslate bodyCopier{m_context, _assembly.annotation().externalReferences}; yul::Statement modified = bodyCopier(_assembly.operations().root()); solAssert(std::holds_alternative(modified)); m_code << yul::AsmPrinter(_assembly.dialect())(std::get(modified)) << "\n";