diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ast/dump.cpp | 24 | ||||
-rw-r--r-- | src/ast/expr.cpp | 15 | ||||
-rw-r--r-- | src/expand/asm.cpp | 69 | ||||
-rw-r--r-- | src/mir/dump.cpp | 4 | ||||
-rw-r--r-- | src/mir/mir.cpp | 2 | ||||
-rw-r--r-- | src/trans/codegen_c.cpp | 1 |
6 files changed, 88 insertions, 27 deletions
diff --git a/src/ast/dump.cpp b/src/ast/dump.cpp index 73b332c0..f1481abf 100644 --- a/src/ast/dump.cpp +++ b/src/ast/dump.cpp @@ -76,8 +76,28 @@ public: m_os << n.m_name << "!( /* TODO: Macro TT */ )"; } virtual void visit(AST::ExprNode_Asm& n) override { - m_os << "asm!("; - m_os << ")"; + m_os << "asm!( \"" << n.m_text << "\""; + m_os << " :"; + for(const auto& v : n.m_output) + { + m_os << " \"" << v.name << "\" ("; + AST::NodeVisitor::visit(v.value); + m_os << "),"; + } + m_os << " :"; + for(const auto& v : n.m_input) + { + m_os << " \"" << v.name << "\" ("; + AST::NodeVisitor::visit(v.value); + m_os << "),"; + } + m_os << " :"; + for(const auto& v : n.m_clobbers) + m_os << " \"" << v << "\","; + m_os << " :"; + for(const auto& v : n.m_flags) + m_os << " \"" << v << "\","; + m_os << " )"; } virtual void visit(AST::ExprNode_Flow& n) override { m_expr_root = false; diff --git a/src/ast/expr.cpp b/src/ast/expr.cpp index 32295c8e..1525ed12 100644 --- a/src/ast/expr.cpp +++ b/src/ast/expr.cpp @@ -105,7 +105,20 @@ NODE(ExprNode_Macro, { }) NODE(ExprNode_Asm, { - os << "asm!()"; + os << "asm!( \"" << m_text << "\""; + os << " :"; + for(const auto& v : m_output) + os << " \"" << v.name << "\" (" << *v.value << "),"; + os << " :"; + for(const auto& v : m_input) + os << " \"" << v.name << "\" (" << *v.value << "),"; + os << " :"; + for(const auto& v : m_clobbers) + os << " \"" << v << "\","; + os << " :"; + for(const auto& v : m_flags) + os << " \"" << v << "\","; + os << " )"; },{ ::std::vector<ExprNode_Asm::ValRef> outputs; for(const auto& v : m_output) diff --git a/src/expand/asm.cpp b/src/expand/asm.cpp index 51412f99..d895c32d 100644 --- a/src/expand/asm.cpp +++ b/src/expand/asm.cpp @@ -40,7 +40,7 @@ class CAsmExpander: Token tok; auto lex = TTStream(sp, tt); if( ident != "" ) - ERROR(sp, E0000, "format_args! doesn't take an ident"); + ERROR(sp, E0000, "asm! doesn't take an ident"); auto template_text = get_string(sp, lex, crate, mod); ::std::vector<::AST::ExprNode_Asm::ValRef> outputs; @@ -49,12 +49,14 @@ class CAsmExpander: ::std::vector<::std::string> flags; // Outputs - if( lex.lookahead(0) == TOK_COLON || lex.lookahead(0) == TOK_DOUBLE_COLON ) + if( lex.lookahead(0) == TOK_DOUBLE_COLON ) + { + GET_TOK(tok, lex); + lex.putback(Token(TOK_COLON)); + } + else if( lex.lookahead(0) == TOK_COLON ) { GET_TOK(tok, lex); - if( tok.type() == TOK_DOUBLE_COLON ) { - lex.putback(Token(TOK_COLON)); - } while( lex.lookahead(0) == TOK_STRING ) { @@ -74,14 +76,19 @@ class CAsmExpander: GET_TOK(tok, lex); } } + else + { + } // Inputs - if( lex.lookahead(0) == TOK_COLON || lex.lookahead(0) == TOK_DOUBLE_COLON ) + if( lex.lookahead(0) == TOK_DOUBLE_COLON ) + { + GET_TOK(tok, lex); + lex.putback(Token(TOK_COLON)); + } + else if( lex.lookahead(0) == TOK_COLON ) { GET_TOK(tok, lex); - if( tok.type() == TOK_DOUBLE_COLON ) { - lex.putback(Token(TOK_COLON)); - } while( lex.lookahead(0) == TOK_STRING ) { @@ -99,14 +106,19 @@ class CAsmExpander: GET_TOK(tok, lex); } } + else + { + } // Clobbers - if( lex.lookahead(0) == TOK_COLON || lex.lookahead(0) == TOK_DOUBLE_COLON ) + if( lex.lookahead(0) == TOK_DOUBLE_COLON ) + { + GET_TOK(tok, lex); + lex.putback(Token(TOK_COLON)); + } + else if( lex.lookahead(0) == TOK_COLON ) { GET_TOK(tok, lex); - if( tok.type() == TOK_DOUBLE_COLON ) { - lex.putback(Token(TOK_COLON)); - } while( lex.lookahead(0) == TOK_STRING ) { @@ -118,14 +130,19 @@ class CAsmExpander: GET_TOK(tok, lex); } } + else + { + } // Flags - if( lex.lookahead(0) == TOK_COLON || lex.lookahead(0) == TOK_DOUBLE_COLON ) + if( lex.lookahead(0) == TOK_DOUBLE_COLON ) + { + GET_TOK(tok, lex); + lex.putback(Token(TOK_COLON)); + } + else if( lex.lookahead(0) == TOK_COLON ) { GET_TOK(tok, lex); - if( tok.type() == TOK_DOUBLE_COLON ) { - lex.putback(Token(TOK_COLON)); - } while( lex.lookahead(0) == TOK_STRING ) { @@ -137,13 +154,19 @@ class CAsmExpander: GET_TOK(tok, lex); } } + else + { + } - if( lex.lookahead(0) == TOK_COLON || lex.lookahead(0) == TOK_DOUBLE_COLON ) + // trailing `: voltaile` - TODO: Is this valid? + if( lex.lookahead(0) == TOK_DOUBLE_COLON ) + { + GET_TOK(tok, lex); + lex.putback(Token(TOK_COLON)); + } + else if( lex.lookahead(0) == TOK_COLON ) { GET_TOK(tok, lex); - if( tok.type() == TOK_DOUBLE_COLON ) { - lex.putback(Token(TOK_COLON)); - } if( GET_TOK(tok, lex) == TOK_IDENT && tok.str() == "volatile" ) { @@ -154,7 +177,11 @@ class CAsmExpander: PUTBACK(tok, lex); } } + else + { + } + // has to be the end if( lex.lookahead(0) != TOK_EOF ) { ERROR(sp, E0000, "Unexpected token in asm! - " << lex.getToken()); diff --git a/src/mir/dump.cpp b/src/mir/dump.cpp index a029023a..c390f5b6 100644 --- a/src/mir/dump.cpp +++ b/src/mir/dump.cpp @@ -55,12 +55,12 @@ namespace { //DEBUG("- Asm"); m_os << "("; for(const auto& v : e.outputs) - m_os << FMT_M(v.second) << ","; + m_os << "\"" << ::FmtEscaped(v.first) << "\"=" << FMT_M(v.second) << ","; m_os << ") = asm! \""; m_os << ::FmtEscaped(e.tpl); m_os << "\"("; for(const auto& v : e.inputs) - m_os << FMT_M(v.second) << ","; + m_os << "\"" << ::FmtEscaped(v.first) << "\"=" << FMT_M(v.second) << ","; m_os << " : "; for(const auto& v : e.clobbers) m_os << "\"" << v << "\","; diff --git a/src/mir/mir.cpp b/src/mir/mir.cpp index edb9170a..840db1ac 100644 --- a/src/mir/mir.cpp +++ b/src/mir/mir.cpp @@ -469,7 +469,7 @@ namespace MIR { os << "("; for(const auto& spec : e.outputs) os << "\"" << spec.first << "\" : " << spec.second << ", "; - os << ") = asm!(\"\", input=( "; + os << ") = asm!(\"" << e.tpl << "\", input=( "; for(const auto& spec : e.inputs) os << "\"" << spec.first << "\" : " << spec.second << ", "; os << "), clobbers=[" << e.clobbers << "], flags=[" << e.flags << "])"; diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index d91a058d..7d38f7a6 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -2487,6 +2487,7 @@ namespace { void emit_statement(const ::MIR::TypeResolve& mir_res, const ::MIR::Statement& stmt, unsigned indent_level=1) { + DEBUG(stmt); auto indent = RepeatLitStr { "\t", static_cast<int>(indent_level) }; switch( stmt.tag() ) { |