summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common.hpp22
-rw-r--r--src/mir/dump.cpp5
-rw-r--r--src/trans/codegen_c.cpp18
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; }
}
}