diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/common.hpp | 22 | ||||
-rw-r--r-- | src/mir/dump.cpp | 5 | ||||
-rw-r--r-- | src/trans/codegen_c.cpp | 18 |
3 files changed, 38 insertions, 7 deletions
diff --git a/src/common.hpp b/src/common.hpp index d421e368..0b0fad14 100644 --- a/src/common.hpp +++ b/src/common.hpp @@ -289,7 +289,27 @@ inline ::std::ostream& operator<<(::std::ostream& os, const ::std::multimap<T,U, return os; } -} +} // namespace std + +struct FmtEscaped { + const char* s; + FmtEscaped(const ::std::string& s): + s(s.c_str()) + {} + friend ::std::ostream& operator<<(::std::ostream& os, const FmtEscaped& x) { + for(auto s = x.s; *s != '\0'; s ++) + { + switch(*s) + { + case '\n': os << "\\n"; break; + case '\\': os << "\\\\"; break; + case '"': os << "\\\""; break; + default: os << *s; break; + } + } + return os; + } +}; // ------------------------------------------------------------------- // --- Reversed iterable diff --git a/src/mir/dump.cpp b/src/mir/dump.cpp index e10856bf..9669b962 100644 --- a/src/mir/dump.cpp +++ b/src/mir/dump.cpp @@ -168,8 +168,9 @@ namespace { m_os << "("; for(const auto& v : e.outputs) m_os << FMT_M(v.second) << ","; - m_os << ") = asm!"; - m_os << "("; + m_os << ") = asm! \""; + m_os << ::FmtEscaped(e.tpl); + m_os << "\"("; for(const auto& v : e.inputs) m_os << FMT_M(v.second) << ","; m_os << " : "; diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index e6262dd6..a42d25d4 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -694,9 +694,10 @@ namespace { for(const auto& stmt : code->blocks[i].statements) { mir_res.set_cur_stmt(i, (&stmt - &code->blocks[i].statements.front())); - assert( stmt.is_Drop() || stmt.is_Assign() ); - if( stmt.is_Drop() ) + switch( stmt.tag() ) { + case ::MIR::Statement::TAGDEAD: throw ""; + case ::MIR::Statement::TAG_Drop: { const auto& e = stmt.as_Drop(); ::HIR::TypeRef tmp; const auto& ty = mir_res.get_lvalue_type(tmp, e.slot); @@ -721,8 +722,16 @@ namespace { emit_destructor_call(e.slot, ty, false); break; } - } - else { + break; } + case ::MIR::Statement::TAG_Asm: { + const auto& e = stmt.as_Asm(); + //DEBUG("- (" + MIR_TODO(mir_res, "asm! \"" << FmtEscaped(e.tpl) << "\""); + m_of << "\t__asm__ "; + m_of << "(\"" << e.tpl << "\""; + m_of << ");\n"; + break; } + case ::MIR::Statement::TAG_Assign: { const auto& e = stmt.as_Assign(); DEBUG("- " << e.dst << " = " << e.src); m_of << "\t"; @@ -1012,6 +1021,7 @@ namespace { m_of << ";"; m_of << "\t// " << e.dst << " = " << e.src; m_of << "\n"; + break; } } } |