@@ -77,6 +77,25 @@ class SSACFGPrinter
77
77
);
78
78
}
79
79
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
+
80
99
std::string formatBlockHandle (SSACFG::BlockId const & _id) const
81
100
{
82
101
return fmt::format (" Block{}_{}" , m_functionIndex, _id.value );
@@ -157,7 +176,7 @@ class SSACFGPrinter
157
176
);
158
177
m_result << fmt::format (
159
178
" {}({})\\ l\\\n " ,
160
- label,
179
+ escape ( label) ,
161
180
fmt::join (operation.inputs | ranges::views::transform (valueToString), " , " )
162
181
);
163
182
}
@@ -247,15 +266,15 @@ class SSACFGPrinter
247
266
248
267
void printFunction (Scope::Function const & _fun)
249
268
{
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 () ); };
251
270
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=\" " ;
253
272
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), " , " ));
255
274
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), " , " ));
257
276
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 " ;
259
278
printBlock (m_cfg.entry );
260
279
}
261
280
0 commit comments