#include <libyul/CompilabilityChecker.h>
#include <libyul/AsmAnalysis.h>
#include <libyul/AsmAnalysisInfo.h>
#include <libyul/backends/evm/EVMCodeTransform.h>
#include <libyul/backends/evm/NoOutputAssembly.h>
using namespace std;
using namespace solidity;
using namespace solidity::yul;
using namespace solidity::util;
CompilabilityChecker::CompilabilityChecker(
Dialect const& _dialect,
Object const& _object,
bool _optimizeStackAllocation
)
{
if (auto const* evmDialect = dynamic_cast<EVMDialect const*>(&_dialect))
{
NoOutputEVMDialect noOutputDialect(*evmDialect);
yul::AsmAnalysisInfo analysisInfo =
yul::AsmAnalyzer::analyzeStrictAssertCorrect(noOutputDialect, _object);
BuiltinContext builtinContext;
builtinContext.currentObject = &_object;
if (!_object.name.empty())
builtinContext.subIDs[_object.name] = 1;
for (auto const& subNode: _object.subObjects)
builtinContext.subIDs[subNode->name] = 1;
NoOutputAssembly assembly;
CodeTransform transform(
assembly,
analysisInfo,
*_object.code,
noOutputDialect,
builtinContext,
_optimizeStackAllocation
);
transform(*_object.code);
for (StackTooDeepError const& error: transform.stackErrors())
{
unreachableVariables[error.functionName].emplace(error.variable);
int& deficit = stackDeficit[error.functionName];
deficit = std::max(error.depth, deficit);
}
}
}