mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #11306 from ethereum/toevminstruction
Add toEVMInstruction helper
This commit is contained in:
		
						commit
						2cb525f607
					
				| @ -19,11 +19,11 @@ | ||||
| */ | ||||
| 
 | ||||
| #include <libyul/optimiser/Metrics.h> | ||||
| #include <libyul/optimiser/OptimizerUtilities.h> | ||||
| 
 | ||||
| #include <libyul/AST.h> | ||||
| #include <libyul/Exceptions.h> | ||||
| #include <libyul/Utilities.h> | ||||
| #include <libyul/backends/evm/EVMDialect.h> | ||||
| 
 | ||||
| #include <libevmasm/Instruction.h> | ||||
| #include <libevmasm/GasMeter.h> | ||||
| @ -139,13 +139,11 @@ void CodeCost::operator()(FunctionCall const& _funCall) | ||||
| { | ||||
| 	ASTWalker::operator()(_funCall); | ||||
| 
 | ||||
| 	if (EVMDialect const* dialect = dynamic_cast<EVMDialect const*>(&m_dialect)) | ||||
| 		if (BuiltinFunctionForEVM const* f = dialect->builtin(_funCall.functionName.name)) | ||||
| 			if (f->instruction) | ||||
| 			{ | ||||
| 				addInstructionCost(*f->instruction); | ||||
| 				return; | ||||
| 			} | ||||
| 	if (auto instruction = toEVMInstruction(m_dialect, _funCall.functionName.name)) | ||||
| 	{ | ||||
| 		addInstructionCost(*instruction); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	m_cost += 49; | ||||
| } | ||||
|  | ||||
| @ -21,6 +21,8 @@ | ||||
| 
 | ||||
| #include <libyul/optimiser/OptimizerUtilities.h> | ||||
| 
 | ||||
| #include <libyul/backends/evm/EVMDialect.h> | ||||
| 
 | ||||
| #include <libyul/Dialect.h> | ||||
| #include <libyul/AST.h> | ||||
| 
 | ||||
| @ -47,3 +49,11 @@ bool yul::isRestrictedIdentifier(Dialect const& _dialect, YulString const& _iden | ||||
| { | ||||
| 	return _identifier.empty() || TokenTraits::isYulKeyword(_identifier.str()) || _dialect.reservedIdentifier(_identifier); | ||||
| } | ||||
| 
 | ||||
| optional<evmasm::Instruction> yul::toEVMInstruction(Dialect const& _dialect, YulString const& _name) | ||||
| { | ||||
| 	if (auto const* dialect = dynamic_cast<EVMDialect const*>(&_dialect)) | ||||
| 		if (BuiltinFunctionForEVM const* builtin = dialect->builtin(_name)) | ||||
| 			return builtin->instruction; | ||||
| 	return nullopt; | ||||
| } | ||||
|  | ||||
| @ -26,6 +26,13 @@ | ||||
| #include <libyul/Dialect.h> | ||||
| #include <libyul/YulString.h> | ||||
| 
 | ||||
| #include <optional> | ||||
| 
 | ||||
| namespace solidity::evmasm | ||||
| { | ||||
| enum class Instruction: uint8_t; | ||||
| } | ||||
| 
 | ||||
| namespace solidity::yul | ||||
| { | ||||
| 
 | ||||
| @ -36,4 +43,7 @@ void removeEmptyBlocks(Block& _block); | ||||
| /// This includes Yul keywords and builtins of the given dialect.
 | ||||
| bool isRestrictedIdentifier(Dialect const& _dialect, YulString const& _identifier); | ||||
| 
 | ||||
| /// Helper function that returns the instruction, if the `_name` is a BuiltinFunction
 | ||||
| std::optional<evmasm::Instruction> toEVMInstruction(Dialect const& _dialect, YulString const& _name); | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -17,14 +17,13 @@ | ||||
| 
 | ||||
| #include <libyul/optimiser/ReasoningBasedSimplifier.h> | ||||
| 
 | ||||
| #include <libyul/optimiser/OptimizerUtilities.h> | ||||
| #include <libyul/optimiser/SSAValueTracker.h> | ||||
| #include <libyul/optimiser/Semantics.h> | ||||
| #include <libyul/AST.h> | ||||
| #include <libyul/Utilities.h> | ||||
| #include <libyul/Dialect.h> | ||||
| 
 | ||||
| #include <libyul/backends/evm/EVMDialect.h> | ||||
| 
 | ||||
| #include <libsmtutil/SMTPortfolio.h> | ||||
| #include <libsmtutil/Helpers.h> | ||||
| 
 | ||||
| @ -123,10 +122,8 @@ smtutil::Expression ReasoningBasedSimplifier::encodeExpression(yul::Expression c | ||||
| 	return std::visit(GenericVisitor{ | ||||
| 		[&](FunctionCall const& _functionCall) | ||||
| 		{ | ||||
| 			if (auto const* dialect = dynamic_cast<EVMDialect const*>(&m_dialect)) | ||||
| 				if (auto const* builtin = dialect->builtin(_functionCall.functionName.name)) | ||||
| 					if (builtin->instruction) | ||||
| 						return encodeEVMBuiltin(*builtin->instruction, _functionCall.arguments); | ||||
| 			if (auto instruction = toEVMInstruction(m_dialect, _functionCall.functionName.name)) | ||||
| 				return encodeEVMBuiltin(*instruction, _functionCall.arguments); | ||||
| 			return newRestrictedVariable(); | ||||
| 		}, | ||||
| 		[&](Identifier const& _identifier) | ||||
|  | ||||
| @ -21,10 +21,10 @@ | ||||
| 
 | ||||
| #include <libyul/optimiser/Semantics.h> | ||||
| 
 | ||||
| #include <libyul/optimiser/OptimizerUtilities.h> | ||||
| #include <libyul/Exceptions.h> | ||||
| #include <libyul/AST.h> | ||||
| #include <libyul/Dialect.h> | ||||
| #include <libyul/backends/evm/EVMDialect.h> | ||||
| 
 | ||||
| #include <libevmasm/SemanticInformation.h> | ||||
| 
 | ||||
| @ -197,9 +197,7 @@ TerminationFinder::ControlFlow TerminationFinder::controlFlowKind(Statement cons | ||||
| bool TerminationFinder::isTerminatingBuiltin(ExpressionStatement const& _exprStmnt) | ||||
| { | ||||
| 	if (holds_alternative<FunctionCall>(_exprStmnt.expression)) | ||||
| 		if (auto const* dialect = dynamic_cast<EVMDialect const*>(&m_dialect)) | ||||
| 			if (auto const* builtin = dialect->builtin(std::get<FunctionCall>(_exprStmnt.expression).functionName.name)) | ||||
| 				if (builtin->instruction) | ||||
| 					return evmasm::SemanticInformation::terminatesControlFlow(*builtin->instruction); | ||||
| 		if (auto instruction = toEVMInstruction(m_dialect, std::get<FunctionCall>(_exprStmnt.expression).functionName.name)) | ||||
| 			return evmasm::SemanticInformation::terminatesControlFlow(*instruction); | ||||
| 	return false; | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user