summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2018-02-25 20:33:14 +0800
committerJohn Hodge <tpg@mutabah.net>2018-02-25 20:33:14 +0800
commitef510a561218f56eca12d5cd4cbeb28298832430 (patch)
tree70346ad6f26ac54eeef35d480663e98d9ba8d6bf
parentefc32154cf37aaec675eb0031c030e3032f94c10 (diff)
downloadmrust-ef510a561218f56eca12d5cd4cbeb28298832430.tar.gz
Codegen C - Minor fix with vtable handling, more work on MSVC zsts
-rw-r--r--src/trans/codegen_c.cpp35
1 files changed, 29 insertions, 6 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
index 3d1134f2..0232c40a 100644
--- a/src/trans/codegen_c.cpp
+++ b/src/trans/codegen_c.cpp
@@ -841,10 +841,6 @@ namespace {
::MIR::Function empty_fcn;
::MIR::TypeResolve top_mir_res { sp, m_resolve, FMT_CB(ss, ss << "struct " << p;), ::HIR::TypeRef(), {}, empty_fcn };
m_mir_res = &top_mir_res;
- bool is_vtable; {
- const auto& lc = p.m_path.m_components.back();
- is_vtable = (lc.size() > 7 && ::std::strcmp(lc.c_str() + lc.size() - 7, "#vtable") == 0);
- };
bool is_packed = item.m_repr == ::HIR::Struct::Repr::Packed;
TRACE_FUNCTION_F(p);
@@ -3041,6 +3037,27 @@ namespace {
auto indent = RepeatLitStr { "\t", static_cast<int>(indent_level) };
m_of << indent;
+ bool has_zst = false;
+ for(unsigned int j = 0; j < e.args.size(); j ++) {
+ if( m_options.disallow_empty_structs && TU_TEST1(e.args[j], LValue, .is_Field()) )
+ {
+ ::HIR::TypeRef tmp;
+ const auto& ty = m_mir_res->get_param_type(tmp, e.args[j]);
+ if( this->type_is_bad_zst(ty) )
+ {
+ if(!has_zst) {
+ m_of << "{\n";
+ indent.n ++ ;
+ m_of << indent;
+ }
+ has_zst = true;
+ emit_ctype(ty, FMT_CB(ss, ss << "zarg" << j;));
+ m_of << " = {0};\n";
+ m_of << indent;
+ }
+ }
+ }
+
TU_MATCHA( (e.fcn), (e2),
(Value,
{
@@ -3130,13 +3147,19 @@ namespace {
const auto& ty = m_mir_res->get_param_type(tmp, e.args[j]);
if( this->type_is_bad_zst(ty) )
{
- m_of << "{0}";
+ m_of << "zarg" << j;
continue;
}
}
emit_param(e.args[j]);
}
m_of << " );\n";
+
+ if( has_zst )
+ {
+ indent.n --;
+ m_of << indent << "}\n";
+ }
}
void emit_asm_gcc(const ::MIR::TypeResolve& mir_res, const ::MIR::Statement::Data_Asm& e, unsigned indent_level)
{
@@ -3566,7 +3589,7 @@ namespace {
//auto vtable_path = inner_ty.m_data.as_TraitObject().m_trait.m_path.clone();
//vtable_path.m_path.m_components.back() += "#vtable";
//auto vtable_ty = ::HIR::TypeRef
- m_of << "((VTABLE_HDR*)"; emit_param(e.args.at(0)); m_of << ".META)->_1";
+ m_of << "((VTABLE_HDR*)"; emit_param(e.args.at(0)); m_of << ".META)->size";
}
else {
MIR_BUG(mir_res, "Unknown inner unsized type " << inner_ty << " for " << ty);