summaryrefslogtreecommitdiff
path: root/src/trans/codegen_c.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-12-04 11:48:57 +0800
committerJohn Hodge <tpg@mutabah.net>2016-12-04 11:48:57 +0800
commit1f9e3bef9c395d792db1ea5e54b2b57a6dae4510 (patch)
tree7a787790f6afd27741cefcfee633b6d76edc5689 /src/trans/codegen_c.cpp
parent4f33805f7e44c25b23675545d758f0aa82f13f5e (diff)
downloadmrust-1f9e3bef9c395d792db1ea5e54b2b57a6dae4510.tar.gz
Trans - Hacking along
Diffstat (limited to 'src/trans/codegen_c.cpp')
-rw-r--r--src/trans/codegen_c.cpp97
1 files changed, 95 insertions, 2 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
index c2998302..a0215a32 100644
--- a/src/trans/codegen_c.cpp
+++ b/src/trans/codegen_c.cpp
@@ -84,12 +84,54 @@ namespace {
}
else {
const auto& e = stmt.as_Assign();
+ DEBUG("- " << e.dst << " = " << e.src);
m_of << "\t"; emit_lvalue(e.dst); m_of << " = ";
TU_MATCHA( (e.src), (ve),
(Use,
emit_lvalue(ve);
),
(Constant,
+ TU_MATCHA( (ve), (c),
+ (Int,
+ m_of << c;
+ ),
+ (Uint,
+ m_of << ::std::hex << "0x" << c << ::std::dec;
+ ),
+ (Float,
+ m_of << c;
+ ),
+ (Bool,
+ m_of << (c ? "true" : "false");
+ ),
+ // TODO: These need to be arrays, not strings! (strings are NUL terminated)
+ (Bytes,
+ m_of << "\"" << ::std::oct;
+ for(const auto& v : c) {
+ if( ' ' <= v && v < 0x7F && v != '"' && v != '\\' )
+ m_of << v;
+ else
+ m_of << "\\" << (unsigned int)v;
+ }
+ m_of << "\"" << ::std::dec;
+ ),
+ (StaticString,
+ m_of << "\"" << ::std::oct;
+ for(const auto& v : c) {
+ if( ' ' <= v && v < 0x7F && v != '"' && v != '\\' )
+ m_of << v;
+ else
+ m_of << "\\" << (unsigned int)v;
+ }
+ m_of << "\"" << ::std::dec;
+ ),
+ (Const,
+ // TODO: This should have been eliminated?
+ ),
+ (ItemAddr,
+ m_of << "&" << Trans_Mangle(c);
+ )
+ )
),
(SizedArray,
m_of << "{";
@@ -210,8 +252,22 @@ namespace {
m_of << "\t}\n";
),
(CallValue,
+ m_of << "\t"; emit_lvalue(e.ret_val); m_of << " = ("; emit_lvalue(e.fcn_val); m_of << ")(";
+ for(unsigned int j = 0; j < e.args.size(); j ++) {
+ if(j != 0) m_of << ",";
+ m_of << " "; emit_lvalue(e.args[j]);
+ }
+ m_of << " )\n";
+ m_of << "\tgoto bb" << e.ret_block << ";\n";
),
(CallPath,
+ m_of << "\t"; emit_lvalue(e.ret_val); m_of << " = " << Trans_Mangle(e.fcn_path) << "(";
+ for(unsigned int j = 0; j < e.args.size(); j ++) {
+ if(j != 0) m_of << ",";
+ m_of << " "; emit_lvalue(e.args[j]);
+ }
+ m_of << " )\n";
+ m_of << "\tgoto bb" << e.ret_block << ";\n";
)
)
}
@@ -232,6 +288,43 @@ namespace {
m_of << ")";
}
void emit_lvalue(const ::MIR::LValue& val) {
+ TU_MATCHA( (val), (e),
+ (Variable,
+ m_of << "var" << e;
+ ),
+ (Temporary,
+ m_of << "tmp" << e.idx;
+ ),
+ (Argument,
+ m_of << "arg" << e.idx;
+ ),
+ (Return,
+ m_of << "rv";
+ ),
+ (Static,
+ m_of << Trans_Mangle(e);
+ ),
+ (Field,
+ // TODO: Also used for indexing
+ emit_lvalue(*e.val);
+ m_of << "._" << e.field_index;
+ ),
+ (Deref,
+ m_of << "*";
+ emit_lvalue(*e.val);
+ ),
+ (Index,
+ m_of << "(";
+ emit_lvalue(*e.val);
+ m_of << ")[";
+ emit_lvalue(*e.idx);
+ m_of << "]";
+ ),
+ (Downcast,
+ emit_lvalue(*e.val);
+ m_of << ".var_" << e.variant_index;
+ )
+ )
}
void emit_ctype(const ::HIR::TypeRef& ty) {
TU_MATCHA( (ty.m_data), (te),
@@ -270,10 +363,10 @@ namespace {
m_of << "struct s_" << Trans_Mangle(te.path);
),
(Union,
- m_of << "struct e_" << Trans_Mangle(te.path);
+ m_of << "union u_" << Trans_Mangle(te.path);
),
(Enum,
- m_of << "union u_" << Trans_Mangle(te.path);
+ m_of << "struct e_" << Trans_Mangle(te.path);
),
(Unbound,
BUG(Span(), "Unbound path in trans - " << ty);