Skip to content

Commit fce849d

Browse files
committed
SSA CFG to dot: Replaces reserved dollar characters in function names
1 parent 32c546f commit fce849d

File tree

1 file changed

+25
-6
lines changed

1 file changed

+25
-6
lines changed

libyul/backends/evm/SSAControlFlowGraph.cpp

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,25 @@ class SSACFGPrinter
7777
);
7878
}
7979

80+
static std::string escape(std::string_view const str)
81+
{
82+
using namespace std::literals;
83+
static constexpr auto replacements = std::array{std::make_tuple('$', "_d_")};
84+
std::stringstream ss;
85+
for (auto const c: str)
86+
{
87+
auto const it = std::find_if(replacements.begin(), replacements.end(), [c](auto const& replacement)
88+
{
89+
return std::get<0>(replacement) == c;
90+
});
91+
if (it != replacements.end())
92+
ss << std::get<1>(*it);
93+
else
94+
ss << c;
95+
}
96+
return ss.str();
97+
}
98+
8099
std::string formatBlockHandle(SSACFG::BlockId const& _id) const
81100
{
82101
return fmt::format("Block{}_{}", m_functionIndex, _id.value);
@@ -157,7 +176,7 @@ class SSACFGPrinter
157176
);
158177
m_result << fmt::format(
159178
"{}({})\\l\\\n",
160-
label,
179+
escape(label),
161180
fmt::join(operation.inputs | ranges::views::transform(valueToString), ", ")
162181
);
163182
}
@@ -247,15 +266,15 @@ class SSACFGPrinter
247266

248267
void printFunction(Scope::Function const& _fun)
249268
{
250-
static auto constexpr returnsTransform = [](auto const& functionReturnValue) { return functionReturnValue.get().name.str(); };
269+
static auto constexpr returnsTransform = [](auto const& functionReturnValue) { return escape(functionReturnValue.get().name.str()); };
251270
static auto constexpr argsTransform = [](auto const& arg) { return fmt::format("v{}", std::get<1>(arg).value); };
252-
m_result << "FunctionEntry_" << _fun.name.str() << "_" << m_cfg.entry.value << " [label=\"";
271+
m_result << "FunctionEntry_" << escape(_fun.name.str()) << "_" << m_cfg.entry.value << " [label=\"";
253272
if (!m_cfg.returns.empty())
254-
m_result << fmt::format("function {0}:\n {1} := {0}({2})", _fun.name.str(), fmt::join(m_cfg.returns | ranges::views::transform(returnsTransform), ", "), fmt::join(m_cfg.arguments | ranges::views::transform(argsTransform), ", "));
273+
m_result << fmt::format("function {0}:\n {1} := {0}({2})", escape(_fun.name.str()), fmt::join(m_cfg.returns | ranges::views::transform(returnsTransform), ", "), fmt::join(m_cfg.arguments | ranges::views::transform(argsTransform), ", "));
255274
else
256-
m_result << fmt::format("function {0}:\n {0}({1})", _fun.name.str(), fmt::join(m_cfg.arguments | ranges::views::transform(argsTransform), ", "));
275+
m_result << fmt::format("function {0}:\n {0}({1})", escape(_fun.name.str()), fmt::join(m_cfg.arguments | ranges::views::transform(argsTransform), ", "));
257276
m_result << "\"];\n";
258-
m_result << "FunctionEntry_" << _fun.name.str() << "_" << m_cfg.entry.value << " -> Block" << m_functionIndex << "_" << m_cfg.entry.value << ";\n";
277+
m_result << "FunctionEntry_" << escape(_fun.name.str()) << "_" << m_cfg.entry.value << " -> Block" << m_functionIndex << "_" << m_cfg.entry.value << ";\n";
259278
printBlock(m_cfg.entry);
260279
}
261280

0 commit comments

Comments
 (0)