diff options
author | John Hodge <tpg@mutabah.net> | 2016-12-04 16:13:52 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-12-04 16:13:52 +0800 |
commit | 30f37248ed90edd2a8102f4d7365d785ba4fd587 (patch) | |
tree | ba73b0c29be46f2aa0f232a9fea5f4c5117ba377 | |
parent | bb2dfa78922acb5e1b8a2510412a8384acb99669 (diff) | |
download | mrust-30f37248ed90edd2a8102f4d7365d785ba4fd587.tar.gz |
Trans C - Handle literals cleaner
-rw-r--r-- | src/trans/codegen_c.cpp | 100 |
1 files changed, 74 insertions, 26 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index d3c14ef5..05d4105a 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -203,6 +203,7 @@ namespace { static Span sp; TRACE_FUNCTION_F(p); + m_of << "// " << p << "\n"; emit_function_header(p, item, params); m_of << "\n"; m_of << "{\n"; @@ -231,27 +232,39 @@ namespace { else { const auto& e = stmt.as_Assign(); DEBUG("- " << e.dst << " = " << e.src); - m_of << "\t"; emit_lvalue(e.dst); m_of << " = "; + m_of << "\t"; TU_MATCHA( (e.src), (ve), (Use, + emit_lvalue(e.dst); + m_of << " = "; emit_lvalue(ve); ), (Constant, TU_MATCHA( (ve), (c), (Int, + emit_lvalue(e.dst); + m_of << " = "; m_of << c; ), (Uint, + emit_lvalue(e.dst); + m_of << " = "; m_of << ::std::hex << "0x" << c << ::std::dec; ), (Float, + emit_lvalue(e.dst); + m_of << " = "; m_of << c; ), (Bool, + emit_lvalue(e.dst); + m_of << " = "; m_of << (c ? "true" : "false"); ), // TODO: These need to be arrays, not strings! (strings are NUL terminated) (Bytes, + emit_lvalue(e.dst); + m_of << ".PTR = "; m_of << "\"" << ::std::oct; for(const auto& v : c) { if( ' ' <= v && v < 0x7F && v != '"' && v != '\\' ) @@ -260,8 +273,13 @@ namespace { m_of << "\\" << (unsigned int)v; } m_of << "\"" << ::std::dec; + m_of << ";\n\t"; + emit_lvalue(e.dst); + m_of << ".META = " << c.size(); ), (StaticString, + emit_lvalue(e.dst); + m_of << ".PTR = "; m_of << "\"" << ::std::oct; for(const auto& v : c) { if( ' ' <= v && v < 0x7F && v != '"' && v != '\\' ) @@ -270,16 +288,26 @@ namespace { m_of << "\\" << (unsigned int)v; } m_of << "\"" << ::std::dec; + + m_of << ";\n\t"; + emit_lvalue(e.dst); + m_of << ".META = " << c.size(); ), (Const, // TODO: This should have been eliminated? + emit_lvalue(e.dst); + m_of << " = /*CONST*/"; ), (ItemAddr, + emit_lvalue(e.dst); + m_of << " = "; m_of << "&" << Trans_Mangle(c); ) ) ), (SizedArray, + emit_lvalue(e.dst); + m_of << " = "; m_of << "{"; for(unsigned int j = ve.count; j --;) { emit_lvalue(ve.val); @@ -288,32 +316,38 @@ namespace { m_of << "}"; ), (Borrow, + emit_lvalue(e.dst); + m_of << " = "; m_of << "& "; emit_lvalue(ve.val); ), (Cast, + emit_lvalue(e.dst); + m_of << " = "; m_of << "("; emit_ctype(ve.type); m_of << ")"; emit_lvalue(ve.val); ), (BinOp, + emit_lvalue(e.dst); + m_of << " = "; emit_lvalue(ve.val_l); switch(ve.op) { - case ::MIR::eBinOp::ADD: m_of << "+"; break; - case ::MIR::eBinOp::SUB: m_of << "-"; break; - case ::MIR::eBinOp::MUL: m_of << "*"; break; - case ::MIR::eBinOp::DIV: m_of << "/"; break; - case ::MIR::eBinOp::MOD: m_of << "%"; break; + case ::MIR::eBinOp::ADD: m_of << " + "; break; + case ::MIR::eBinOp::SUB: m_of << " - "; break; + case ::MIR::eBinOp::MUL: m_of << " * "; break; + case ::MIR::eBinOp::DIV: m_of << " / "; break; + case ::MIR::eBinOp::MOD: m_of << " % "; break; - case ::MIR::eBinOp::BIT_OR: m_of << "|"; break; - case ::MIR::eBinOp::BIT_AND: m_of << "&"; break; - case ::MIR::eBinOp::BIT_XOR: m_of << "^"; break; - case ::MIR::eBinOp::BIT_SHR: m_of << ">>"; break; - case ::MIR::eBinOp::BIT_SHL: m_of << "<<"; break; - case ::MIR::eBinOp::EQ: m_of << "=="; break; - case ::MIR::eBinOp::NE: m_of << "!="; break; - case ::MIR::eBinOp::GT: m_of << ">" ; break; - case ::MIR::eBinOp::GE: m_of << ">="; break; - case ::MIR::eBinOp::LT: m_of << "<" ; break; - case ::MIR::eBinOp::LE: m_of << "<="; break; + case ::MIR::eBinOp::BIT_OR: m_of << " | "; break; + case ::MIR::eBinOp::BIT_AND: m_of << " & "; break; + case ::MIR::eBinOp::BIT_XOR: m_of << " ^ "; break; + case ::MIR::eBinOp::BIT_SHR: m_of << " >> "; break; + case ::MIR::eBinOp::BIT_SHL: m_of << " << "; break; + case ::MIR::eBinOp::EQ: m_of << " == "; break; + case ::MIR::eBinOp::NE: m_of << " != "; break; + case ::MIR::eBinOp::GT: m_of << " > " ; break; + case ::MIR::eBinOp::GE: m_of << " >= "; break; + case ::MIR::eBinOp::LT: m_of << " < " ; break; + case ::MIR::eBinOp::LE: m_of << " <= "; break; case ::MIR::eBinOp::ADD_OV: case ::MIR::eBinOp::SUB_OV: @@ -325,29 +359,43 @@ namespace { emit_lvalue(ve.val_r); ), (UniOp, + emit_lvalue(e.dst); + m_of << " = "; + switch(ve.op) + { + case ::MIR::eUniOp::NEG: m_of << "-"; break; + case ::MIR::eUniOp::INV: m_of << "~"; break; + } + emit_lvalue(ve.val); ), (DstMeta, + emit_lvalue(e.dst); + m_of << " = "; emit_lvalue(ve.val); m_of << ".META"; ), (DstPtr, + emit_lvalue(e.dst); + m_of << " = "; emit_lvalue(ve.val); m_of << ".PTR"; ), (MakeDst, - m_of << "{"; + emit_lvalue(e.dst); + m_of << ".PTR = "; emit_lvalue(ve.ptr_val); - m_of << ","; + m_of << ";\n\t"; + emit_lvalue(e.dst); + m_of << ".META = "; emit_lvalue(ve.meta_val); - m_of << "}"; ), (Tuple, - m_of << "{"; for(unsigned int j = 0; j < ve.vals.size(); j ++) { - if( j != 0 ) m_of << ","; + if( j != 0 ) m_of << ";\n\t"; + emit_lvalue(e.dst); + m_of << "._" << j << " = "; emit_lvalue(ve.vals[j]); } - m_of << "}"; ), (Array, m_of << "{"; @@ -361,12 +409,12 @@ namespace { TODO(sp, "Handle constructing variants"); ), (Struct, - m_of << "{"; for(unsigned int j = 0; j < ve.vals.size(); j ++) { - if( j != 0 ) m_of << ","; + if( j != 0 ) m_of << ";\n\t"; + emit_lvalue(e.dst); + m_of << "._" << j << " = "; emit_lvalue(ve.vals[j]); } - m_of << "}"; ) ) m_of << ";\n"; |