diff options
Diffstat (limited to 'src/ast')
-rw-r--r-- | src/ast/dump.cpp | 4 | ||||
-rw-r--r-- | src/ast/expr.cpp | 19 | ||||
-rw-r--r-- | src/ast/expr.hpp | 35 |
3 files changed, 58 insertions, 0 deletions
diff --git a/src/ast/dump.cpp b/src/ast/dump.cpp index 07343de4..a875506c 100644 --- a/src/ast/dump.cpp +++ b/src/ast/dump.cpp @@ -75,6 +75,10 @@ public: m_expr_root = false; m_os << n.m_name << "!( /* TODO: Macro TT */ )"; } + virtual void visit(AST::ExprNode_Asm& n) override { + m_os << "asm!("; + m_os << ")"; + } virtual void visit(AST::ExprNode_Flow& n) override { m_expr_root = false; switch(n.m_type) diff --git a/src/ast/expr.cpp b/src/ast/expr.cpp index cc6ca98f..6983221d 100644 --- a/src/ast/expr.cpp +++ b/src/ast/expr.cpp @@ -101,6 +101,18 @@ NODE(ExprNode_Macro, { return NEWNODE(ExprNode_Macro, m_name, m_ident, m_tokens.clone()); }) +NODE(ExprNode_Asm, { + os << "asm!()"; +},{ + ::std::vector<ExprNode_Asm::ValRef> outputs; + for(const auto& v : m_output) + outputs.push_back( ExprNode_Asm::ValRef { v.name, v.value->clone() }); + ::std::vector<ExprNode_Asm::ValRef> inputs; + for(const auto& v : m_input) + inputs.push_back( ExprNode_Asm::ValRef { v.name, v.value->clone() }); + return NEWNODE(ExprNode_Asm, m_text, mv$(outputs), mv$(inputs), m_clobbers, m_flags); +}) + NODE(ExprNode_Flow, { switch(m_type) { @@ -418,6 +430,13 @@ NV(ExprNode_Macro, { BUG(node.get_pos(), "Hit unexpanded macro in expression - " << node); }) +NV(ExprNode_Asm, +{ + for(auto& v : node.m_output) + visit(v.value); + for(auto& v : node.m_input) + visit(v.value); +}) NV(ExprNode_Flow, { visit(node.m_value); diff --git a/src/ast/expr.hpp b/src/ast/expr.hpp index 4c80bcb5..ee1da656 100644 --- a/src/ast/expr.hpp +++ b/src/ast/expr.hpp @@ -1,4 +1,9 @@ /* + * MRustC - Rust Compiler + * - By John Hodge (Mutabah/thePowersGang) + * + * ast/expr.hpp + * - AST Expression Nodes */ #ifndef AST_EXPR_INCLUDED #define AST_EXPR_INCLUDED @@ -88,6 +93,34 @@ struct ExprNode_Macro: NODE_METHODS(); }; +// asm! macro +struct ExprNode_Asm: + public ExprNode +{ + struct ValRef + { + ::std::string name; + unique_ptr<ExprNode> value; + }; + + ::std::string m_text; + ::std::vector<ValRef> m_output; + ::std::vector<ValRef> m_input; + ::std::vector<::std::string> m_clobbers; + ::std::vector<::std::string> m_flags; + + ExprNode_Asm(::std::string text, ::std::vector<ValRef> output, ::std::vector<ValRef> input, ::std::vector<::std::string> clobbers, ::std::vector<::std::string> flags): + m_text( move(text) ), + m_output( move(output) ), + m_input( move(input) ), + m_clobbers( move(clobbers) ), + m_flags( move(flags) ) + { + } + + NODE_METHODS(); +}; + // Break/Continue/Return struct ExprNode_Flow: public ExprNode @@ -599,6 +632,7 @@ public: virtual void visit(const nt& node) = 0*/ NT(ExprNode_Block); NT(ExprNode_Macro); + NT(ExprNode_Asm); NT(ExprNode_Flow); NT(ExprNode_LetBinding); NT(ExprNode_Assign); @@ -643,6 +677,7 @@ public: virtual void visit(const nt& node) override*/ NT(ExprNode_Block); NT(ExprNode_Macro); + NT(ExprNode_Asm); NT(ExprNode_Flow); NT(ExprNode_LetBinding); NT(ExprNode_Assign); |