Add function to FunctionReturnLabelSlot and assert that functions are identical in comparison operators.

This commit is contained in:
Daniel Kirchner 2021-08-09 12:49:02 +02:00
parent 9f46fff467
commit 6037c4f26c
3 changed files with 16 additions and 4 deletions

View File

@ -24,6 +24,7 @@
#include <libyul/AST.h>
#include <libyul/AsmAnalysisInfo.h>
#include <libyul/Dialect.h>
#include <libyul/Exceptions.h>
#include <libyul/Scope.h>
#include <functional>
@ -54,8 +55,19 @@ struct FunctionCallReturnLabelSlot
/// the function.
struct FunctionReturnLabelSlot
{
bool operator==(FunctionReturnLabelSlot const&) const { return true; }
bool operator<(FunctionReturnLabelSlot const&) const { return false; }
std::reference_wrapper<Scope::Function const> function;
bool operator==(FunctionReturnLabelSlot const& _rhs) const
{
// There can never be return label slots of different functions on stack simultaneously.
yulAssert(&function.get() == &_rhs.function.get(), "");
return true;
}
bool operator<(FunctionReturnLabelSlot const& _rhs) const
{
// There can never be return label slots of different functions on stack simultaneously.
yulAssert(&function.get() == &_rhs.function.get(), "");
return false;
}
static constexpr bool canBeFreelyGenerated = false;
};
/// A slot containing the current value of a particular variable.

View File

@ -323,7 +323,7 @@ optional<Stack> StackLayoutGenerator::getExitLayoutOrStageDependencies(
Stack stack = _functionReturn.info->returnVariables | ranges::views::transform([](auto const& _varSlot){
return StackSlot{_varSlot};
}) | ranges::to<Stack>;
stack.emplace_back(FunctionReturnLabelSlot{});
stack.emplace_back(FunctionReturnLabelSlot{_functionReturn.info->function});
return stack;
},
[&](CFG::BasicBlock::Terminated const&) -> std::optional<Stack>

View File

@ -117,7 +117,7 @@ public:
m_stream << joinHumanReadable(_info.returnVariables | ranges::views::transform(variableSlotToString));
}
m_stream << "\\l\\\n";
Stack functionEntryStack = {FunctionReturnLabelSlot{}};
Stack functionEntryStack = {FunctionReturnLabelSlot{_info.function}};
functionEntryStack += _info.parameters | ranges::views::reverse;
m_stream << stackToString(functionEntryStack) << "\"];\n";
m_stream << "FunctionEntry_" << _info.function.name.str() << " -> Block" << getBlockId(*_info.entry) << ";\n";