summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ast/dump.cpp24
-rw-r--r--src/ast/expr.cpp15
-rw-r--r--src/expand/asm.cpp69
-rw-r--r--src/mir/dump.cpp4
-rw-r--r--src/mir/mir.cpp2
-rw-r--r--src/trans/codegen_c.cpp1
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() )
{