#pragma once
#include <libsolidity/interface/OptimiserSettings.h>
#include <libsolidity/ast/ASTForward.h>
#include <libsolidity/ast/CallGraph.h>
#include <libsolidity/codegen/ir/IRGenerationContext.h>
#include <libsolidity/codegen/YulUtilFunctions.h>
#include <liblangutil/CharStreamProvider.h>
#include <liblangutil/EVMVersion.h>
#include <string>
namespace solidity::frontend
{
class SourceUnit;
class IRGenerator
{
public:
using ExecutionContext = IRGenerationContext::ExecutionContext;
IRGenerator(
langutil::EVMVersion _evmVersion,
RevertStrings _revertStrings,
OptimiserSettings _optimiserSettings,
std::map<std::string, unsigned> _sourceIndices,
langutil::DebugInfoSelection const& _debugInfoSelection,
langutil::CharStreamProvider const* _soliditySourceProvider
):
m_evmVersion(_evmVersion),
m_optimiserSettings(_optimiserSettings),
m_context(
_evmVersion,
ExecutionContext::Creation,
_revertStrings,
std::move(_optimiserSettings),
std::move(_sourceIndices),
_debugInfoSelection,
_soliditySourceProvider
),
m_utils(_evmVersion, m_context.revertStrings(), m_context.functionCollector())
{}
std::pair<std::string, std::string> run(
ContractDefinition const& _contract,
bytes const& _cborMetadata,
std::map<ContractDefinition const*, std::string_view const> const& _otherYulSources
);
private:
std::string generate(
ContractDefinition const& _contract,
bytes const& _cborMetadata,
std::map<ContractDefinition const*, std::string_view const> const& _otherYulSources
);
std::string generate(Block const& _block);
std::set<FunctionDefinition const*> generateQueuedFunctions();
InternalDispatchMap generateInternalDispatchFunctions(ContractDefinition const& _contract);
std::string generateFunction(FunctionDefinition const& _function);
std::string generateModifier(
ModifierInvocation const& _modifierInvocation,
FunctionDefinition const& _function,
std::string const& _nextFunction
);
std::string generateFunctionWithModifierInner(FunctionDefinition const& _function);
std::string generateGetter(VariableDeclaration const& _varDecl);
std::string generateExternalFunction(ContractDefinition const& _contract, FunctionType const& _functionType);
std::string generateInitialAssignment(VariableDeclaration const& _varDecl);
void generateConstructors(ContractDefinition const& _contract);
std::pair<std::string, std::map<ContractDefinition const*, std::vector<std::string>>>
evaluateConstructorArguments(ContractDefinition const& _contract);
std::string initStateVariables(ContractDefinition const& _contract);
std::string deployCode(ContractDefinition const& _contract);
std::string callValueCheck();
std::string dispatchRoutine(ContractDefinition const& _contract);
std::string memoryInit(bool _useMemoryGuard);
void resetContext(ContractDefinition const& _contract, ExecutionContext _context);
std::string dispenseLocationComment(ASTNode const& _node);
langutil::EVMVersion const m_evmVersion;
OptimiserSettings const m_optimiserSettings;
IRGenerationContext m_context;
YulUtilFunctions m_utils;
};
}