summaryrefslogtreecommitdiff
path: root/src/trans/codegen_c.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/trans/codegen_c.cpp')
-rw-r--r--src/trans/codegen_c.cpp31
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() << ")";
),