diff options
Diffstat (limited to 'src/trans/codegen_c.cpp')
-rw-r--r-- | src/trans/codegen_c.cpp | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index e74231e8..1ca8c4ae 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -84,7 +84,7 @@ namespace { << "\treturn (v >> 32 != 0 ? __builtin_clz(v>>32) : 32 + __builtin_clz(v));\n" << "}\n" << "static inline uint64_t __builtin_ctz64(uint64_t v) {\n" - << "\treturn (v&0xFFFFFFFF == 0 ? __builtin_ctz(v>>32) + 32 : __builtin_ctz(v));\n" + << "\treturn ((v&0xFFFFFFFF) == 0 ? __builtin_ctz(v>>32) + 32 : __builtin_ctz(v));\n" << "}\n" << "static inline unsigned __int128 __builtin_bswap128(unsigned __int128 v) {\n" << "\tuint64_t lo = __builtin_bswap64((uint64_t)v);\n" @@ -95,7 +95,7 @@ namespace { << "\treturn (v >> 64 != 0 ? __builtin_clz64(v>>64) : 64 + __builtin_clz64(v));\n" << "}\n" << "static inline unsigned __int128 __builtin_ctz128(unsigned __int128 v) {\n" - << "\treturn (v&0xFFFFFFFFFFFFFFFF == 0 ? __builtin_ctz64(v>>64) + 64 : __builtin_ctz64(v));\n" + << "\treturn ((v&0xFFFFFFFFFFFFFFFF) == 0 ? __builtin_ctz64(v>>64) + 64 : __builtin_ctz64(v));\n" << "}\n" << "\n" << "static inline void noop_drop(void *p) {}\n" @@ -192,6 +192,7 @@ namespace { ::std::stringstream cmd_ss; for(const auto& arg : args) { + // TODO: use a formatter specific to shell escaping cmd_ss << "\"" << FmtEscaped(arg) << "\" "; } DEBUG("- " << cmd_ss.str()); @@ -1313,6 +1314,9 @@ namespace { switch( stmt.tag() ) { case ::MIR::Statement::TAGDEAD: throw ""; + case ::MIR::Statement::TAG_ScopeEnd: + m_of << "// " << stmt << "\n"; + break; case ::MIR::Statement::TAG_SetDropFlag: { const auto& e = stmt.as_SetDropFlag(); m_of << "\tdf" << e.idx << " = "; @@ -1328,7 +1332,7 @@ namespace { const auto& ty = mir_res.get_lvalue_type(tmp, e.slot); if( e.flag_idx != ~0u ) - m_of << "if( df" << e.flag_idx << " ) {\n"; + m_of << "\tif( df" << e.flag_idx << " ) {\n"; switch( e.kind ) { @@ -1351,7 +1355,7 @@ namespace { break; } if( e.flag_idx != ~0u ) - m_of << "}\n"; + m_of << "\t}\n"; break; } case ::MIR::Statement::TAG_Asm: { const auto& e = stmt.as_Asm(); @@ -1375,6 +1379,7 @@ namespace { m_of << "\t__asm__ "; if(is_volatile) m_of << "__volatile__"; // TODO: Convert format string? + // TODO: Use a C-specific escaper here. m_of << "(\"" << (is_intel ? ".syntax intel; " : "") << FmtEscaped(e.tpl) << (is_intel ? ".syntax att; " : "") << "\""; m_of << ": "; for(unsigned int i = 0; i < e.outputs.size(); i ++ ) @@ -2110,15 +2115,15 @@ namespace { else if( name == "needs_drop" ) { // Returns `true` if the actual type given as `T` requires drop glue; // returns `false` if the actual type provided for `T` implements `Copy`. (Either otherwise) + // NOTE: libarena assumes that this returns `true` iff T doesn't require drop glue. const auto& ty = params.m_types.at(0); emit_lvalue(e.ret_val); m_of << " = "; - if( m_resolve.type_is_copy(Span(), ty) ) { - m_of << "false"; + if( m_resolve.type_needs_drop_glue(mir_res.sp, ty) ) { + m_of << "true"; } - // If T: !Copy, return true else { - m_of << "true"; + m_of << "false"; } } else if( name == "uninit" ) { @@ -2717,7 +2722,11 @@ namespace { if( ' ' <= v && v < 0x7F && v != '"' && v != '\\' ) m_of << v; else - m_of << "\\" << (unsigned int)v; + { + m_of << "\\" << ((unsigned int)v & 0xFF); + if( isdigit( *(&v+1) ) ) + m_of << "\"\""; + } } m_of << "\"" << ::std::dec; m_of << ";\n\t"; @@ -2923,7 +2932,7 @@ namespace { if( ' ' <= v && v < 0x7F && v != '"' && v != '\\' ) m_of << v; else - m_of << "\\" << (unsigned int)v; + m_of << "\\" << ((unsigned int)v & 0xFF); } m_of << "\"" << ::std::dec; ), @@ -2933,7 +2942,7 @@ namespace { if( ' ' <= v && v < 0x7F && v != '"' && v != '\\' ) m_of << v; else - m_of << "\\" << (unsigned int)v; + m_of << "\\" << ((unsigned int)v & 0xFF); } m_of << "\", " << ::std::dec << c.size() << ")"; ), |