summaryrefslogtreecommitdiff
path: root/src/ast
diff options
context:
space:
mode:
Diffstat (limited to 'src/ast')
-rw-r--r--src/ast/dump.cpp4
-rw-r--r--src/ast/expr.cpp19
-rw-r--r--src/ast/expr.hpp35
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);