Separate DebugData fields for Solidity and Yul source locations

This commit is contained in:
Kamil Śliwak
2021-09-22 13:11:39 +02:00
parent 9c1d40debf
commit ce4420f857
21 changed files with 281 additions and 242 deletions
+27 -27
View File
@@ -145,13 +145,13 @@ void CodeTransform::operator()(VariableDeclaration const& _varDecl)
}
else
{
m_assembly.setSourceLocation(locationOf(_varDecl));
m_assembly.setSourceLocation(originLocationOf(_varDecl));
size_t variablesLeft = numVariables;
while (variablesLeft--)
m_assembly.appendConstant(u256(0));
}
m_assembly.setSourceLocation(locationOf(_varDecl));
m_assembly.setSourceLocation(originLocationOf(_varDecl));
bool atTopOfStack = true;
for (size_t varIndex = 0; varIndex < numVariables; ++varIndex)
{
@@ -213,13 +213,13 @@ void CodeTransform::operator()(Assignment const& _assignment)
std::visit(*this, *_assignment.value);
expectDeposit(static_cast<int>(_assignment.variableNames.size()), height);
m_assembly.setSourceLocation(locationOf(_assignment));
m_assembly.setSourceLocation(originLocationOf(_assignment));
generateMultiAssignment(_assignment.variableNames);
}
void CodeTransform::operator()(ExpressionStatement const& _statement)
{
m_assembly.setSourceLocation(locationOf(_statement));
m_assembly.setSourceLocation(originLocationOf(_statement));
std::visit(*this, _statement.expression);
}
@@ -227,13 +227,13 @@ void CodeTransform::operator()(FunctionCall const& _call)
{
yulAssert(m_scope, "");
m_assembly.setSourceLocation(locationOf(_call));
m_assembly.setSourceLocation(originLocationOf(_call));
if (BuiltinFunctionForEVM const* builtin = m_dialect.builtin(_call.functionName.name))
{
for (auto&& [i, arg]: _call.arguments | ranges::views::enumerate | ranges::views::reverse)
if (!builtin->literalArgument(i))
visitExpression(arg);
m_assembly.setSourceLocation(locationOf(_call));
m_assembly.setSourceLocation(originLocationOf(_call));
builtin->generateCode(_call, m_assembly, m_builtinContext);
}
else
@@ -250,7 +250,7 @@ void CodeTransform::operator()(FunctionCall const& _call)
yulAssert(function->arguments.size() == _call.arguments.size(), "");
for (auto const& arg: _call.arguments | ranges::views::reverse)
visitExpression(arg);
m_assembly.setSourceLocation(locationOf(_call));
m_assembly.setSourceLocation(originLocationOf(_call));
m_assembly.appendJumpTo(
functionEntryID(*function),
static_cast<int>(function->returns.size() - function->arguments.size()) - 1,
@@ -262,7 +262,7 @@ void CodeTransform::operator()(FunctionCall const& _call)
void CodeTransform::operator()(Identifier const& _identifier)
{
m_assembly.setSourceLocation(locationOf(_identifier));
m_assembly.setSourceLocation(originLocationOf(_identifier));
// First search internals, then externals.
yulAssert(m_scope, "");
if (m_scope->lookup(_identifier.name, GenericVisitor{
@@ -294,19 +294,19 @@ void CodeTransform::operator()(Identifier const& _identifier)
void CodeTransform::operator()(Literal const& _literal)
{
m_assembly.setSourceLocation(locationOf(_literal));
m_assembly.setSourceLocation(originLocationOf(_literal));
m_assembly.appendConstant(valueOfLiteral(_literal));
}
void CodeTransform::operator()(If const& _if)
{
visitExpression(*_if.condition);
m_assembly.setSourceLocation(locationOf(_if));
m_assembly.setSourceLocation(originLocationOf(_if));
m_assembly.appendInstruction(evmasm::Instruction::ISZERO);
AbstractAssembly::LabelID end = m_assembly.newLabelId();
m_assembly.appendJumpToIf(end);
(*this)(_if.body);
m_assembly.setSourceLocation(locationOf(_if));
m_assembly.setSourceLocation(originLocationOf(_if));
m_assembly.appendLabel(end);
}
@@ -321,7 +321,7 @@ void CodeTransform::operator()(Switch const& _switch)
if (c.value)
{
(*this)(*c.value);
m_assembly.setSourceLocation(locationOf(c));
m_assembly.setSourceLocation(originLocationOf(c));
AbstractAssembly::LabelID bodyLabel = m_assembly.newLabelId();
caseBodies[&c] = bodyLabel;
yulAssert(m_assembly.stackHeight() == expressionHeight + 1, "");
@@ -333,24 +333,24 @@ void CodeTransform::operator()(Switch const& _switch)
// default case
(*this)(c.body);
}
m_assembly.setSourceLocation(locationOf(_switch));
m_assembly.setSourceLocation(originLocationOf(_switch));
m_assembly.appendJumpTo(end);
size_t numCases = caseBodies.size();
for (auto const& c: caseBodies)
{
m_assembly.setSourceLocation(locationOf(*c.first));
m_assembly.setSourceLocation(originLocationOf(*c.first));
m_assembly.appendLabel(c.second);
(*this)(c.first->body);
// Avoid useless "jump to next" for the last case.
if (--numCases > 0)
{
m_assembly.setSourceLocation(locationOf(*c.first));
m_assembly.setSourceLocation(originLocationOf(*c.first));
m_assembly.appendJumpTo(end);
}
}
m_assembly.setSourceLocation(locationOf(_switch));
m_assembly.setSourceLocation(originLocationOf(_switch));
m_assembly.appendLabel(end);
m_assembly.appendInstruction(evmasm::Instruction::POP);
}
@@ -371,7 +371,7 @@ void CodeTransform::operator()(FunctionDefinition const& _function)
m_context->variableStackHeights[&var] = height++;
}
m_assembly.setSourceLocation(locationOf(_function));
m_assembly.setSourceLocation(originLocationOf(_function));
int const stackHeightBefore = m_assembly.stackHeight();
m_assembly.appendLabel(functionEntryID(function));
@@ -407,7 +407,7 @@ void CodeTransform::operator()(FunctionDefinition const& _function)
subTransform(_function.body);
m_assembly.setSourceLocation(locationOf(_function));
m_assembly.setSourceLocation(originLocationOf(_function));
if (!subTransform.m_stackErrors.empty())
{
m_assembly.markAsInvalid();
@@ -498,11 +498,11 @@ void CodeTransform::operator()(ForLoop const& _forLoop)
AbstractAssembly::LabelID postPart = m_assembly.newLabelId();
AbstractAssembly::LabelID loopEnd = m_assembly.newLabelId();
m_assembly.setSourceLocation(locationOf(_forLoop));
m_assembly.setSourceLocation(originLocationOf(_forLoop));
m_assembly.appendLabel(loopStart);
visitExpression(*_forLoop.condition);
m_assembly.setSourceLocation(locationOf(_forLoop));
m_assembly.setSourceLocation(originLocationOf(_forLoop));
m_assembly.appendInstruction(evmasm::Instruction::ISZERO);
m_assembly.appendJumpToIf(loopEnd);
@@ -510,12 +510,12 @@ void CodeTransform::operator()(ForLoop const& _forLoop)
m_context->forLoopStack.emplace(Context::ForLoopLabels{ {postPart, stackHeightBody}, {loopEnd, stackHeightBody} });
(*this)(_forLoop.body);
m_assembly.setSourceLocation(locationOf(_forLoop));
m_assembly.setSourceLocation(originLocationOf(_forLoop));
m_assembly.appendLabel(postPart);
(*this)(_forLoop.post);
m_assembly.setSourceLocation(locationOf(_forLoop));
m_assembly.setSourceLocation(originLocationOf(_forLoop));
m_assembly.appendJumpTo(loopStart);
m_assembly.appendLabel(loopEnd);
@@ -535,7 +535,7 @@ int CodeTransform::appendPopUntil(int _targetDepth)
void CodeTransform::operator()(Break const& _break)
{
yulAssert(!m_context->forLoopStack.empty(), "Invalid break-statement. Requires surrounding for-loop in code generation.");
m_assembly.setSourceLocation(locationOf(_break));
m_assembly.setSourceLocation(originLocationOf(_break));
Context::JumpInfo const& jump = m_context->forLoopStack.top().done;
m_assembly.appendJumpTo(jump.label, appendPopUntil(jump.targetStackHeight));
@@ -544,7 +544,7 @@ void CodeTransform::operator()(Break const& _break)
void CodeTransform::operator()(Continue const& _continue)
{
yulAssert(!m_context->forLoopStack.empty(), "Invalid continue-statement. Requires surrounding for-loop in code generation.");
m_assembly.setSourceLocation(locationOf(_continue));
m_assembly.setSourceLocation(originLocationOf(_continue));
Context::JumpInfo const& jump = m_context->forLoopStack.top().post;
m_assembly.appendJumpTo(jump.label, appendPopUntil(jump.targetStackHeight));
@@ -554,7 +554,7 @@ void CodeTransform::operator()(Leave const& _leaveStatement)
{
yulAssert(m_functionExitLabel, "Invalid leave-statement. Requires surrounding function in code generation.");
yulAssert(m_functionExitStackHeight, "");
m_assembly.setSourceLocation(locationOf(_leaveStatement));
m_assembly.setSourceLocation(originLocationOf(_leaveStatement));
m_assembly.appendJumpTo(*m_functionExitLabel, appendPopUntil(*m_functionExitStackHeight));
}
@@ -683,7 +683,7 @@ void CodeTransform::visitStatements(vector<Statement> const& _statements)
auto const* functionDefinition = std::get_if<FunctionDefinition>(&statement);
if (functionDefinition && !jumpTarget)
{
m_assembly.setSourceLocation(locationOf(*functionDefinition));
m_assembly.setSourceLocation(originLocationOf(*functionDefinition));
jumpTarget = m_assembly.newLabelId();
m_assembly.appendJumpTo(*jumpTarget, 0);
}
@@ -704,7 +704,7 @@ void CodeTransform::visitStatements(vector<Statement> const& _statements)
void CodeTransform::finalizeBlock(Block const& _block, optional<int> blockStartStackHeight)
{
m_assembly.setSourceLocation(locationOf(_block));
m_assembly.setSourceLocation(originLocationOf(_block));
freeUnusedVariables();