summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/hir/dump.cpp5
-rw-r--r--src/hir/expr.cpp6
-rw-r--r--src/hir/expr.hpp28
-rw-r--r--src/hir/from_ast_expr.cpp9
-rw-r--r--src/hir_conv/constant_evaluation.cpp3
-rw-r--r--src/hir_expand/annotate_value_usage.cpp12
-rw-r--r--src/hir_typeck/expr_check.cpp14
-rw-r--r--src/hir_typeck/expr_cs.cpp22
-rw-r--r--src/mir/from_hir.cpp6
9 files changed, 104 insertions, 1 deletions
diff --git a/src/hir/dump.cpp b/src/hir/dump.cpp
index 5be6ab92..4d9380d8 100644
--- a/src/hir/dump.cpp
+++ b/src/hir/dump.cpp
@@ -322,6 +322,11 @@ namespace {
}
}
+ void visit(::HIR::ExprNode_Asm& node) override
+ {
+ m_os << "asm!(";
+ m_os << ")";
+ }
void visit(::HIR::ExprNode_Return& node) override
{
m_os << "return";
diff --git a/src/hir/expr.cpp b/src/hir/expr.cpp
index 46e7d886..e19e7df6 100644
--- a/src/hir/expr.cpp
+++ b/src/hir/expr.cpp
@@ -24,6 +24,12 @@ DEF_VISIT(ExprNode_Block, node,
visit_node_ptr(subnode);
}
)
+DEF_VISIT(ExprNode_Asm, node,
+ for(auto& v : node.m_outputs)
+ visit_node_ptr(v.value);
+ for(auto& v : node.m_inputs)
+ visit_node_ptr(v.value);
+)
DEF_VISIT(ExprNode_Return, node,
visit_node_ptr(node.m_value);
)
diff --git a/src/hir/expr.hpp b/src/hir/expr.hpp
index b8227aa0..81e89b28 100644
--- a/src/hir/expr.hpp
+++ b/src/hir/expr.hpp
@@ -87,6 +87,32 @@ struct ExprNode_Block:
NODE_METHODS();
};
+struct ExprNode_Asm:
+ public ExprNode
+{
+ struct ValRef
+ {
+ ::std::string spec;
+ ::HIR::ExprNodeP value;
+ };
+ ::std::string m_template;
+ ::std::vector<ValRef> m_outputs;
+ ::std::vector<ValRef> m_inputs;
+ ::std::vector< ::std::string> m_clobbers;
+ ::std::vector< ::std::string> m_flags;
+
+ ExprNode_Asm(Span sp, ::std::string tpl_str, ::std::vector<ValRef> outputs, ::std::vector<ValRef> inputs, ::std::vector< ::std::string> clobbers, ::std::vector< ::std::string> flags):
+ ExprNode(mv$(sp), ::HIR::TypeRef::new_unit()),
+ m_template( mv$(tpl_str) ),
+ m_outputs( mv$(outputs) ),
+ m_inputs( mv$(inputs) ),
+ m_clobbers( mv$(clobbers) ),
+ m_flags( mv$(flags) )
+ {
+ }
+
+ NODE_METHODS();
+};
struct ExprNode_Return:
public ExprNode
{
@@ -792,6 +818,7 @@ public:
#define NV(nt) virtual void visit(nt& n) = 0;
NV(ExprNode_Block)
+ NV(ExprNode_Asm)
NV(ExprNode_Return)
NV(ExprNode_Let)
NV(ExprNode_Loop)
@@ -837,6 +864,7 @@ public:
#define NV(nt) virtual void visit(nt& n);
NV(ExprNode_Block)
+ NV(ExprNode_Asm)
NV(ExprNode_Return)
NV(ExprNode_Let)
NV(ExprNode_Loop)
diff --git a/src/hir/from_ast_expr.cpp b/src/hir/from_ast_expr.cpp
index 08e49aa4..25f6eade 100644
--- a/src/hir/from_ast_expr.cpp
+++ b/src/hir/from_ast_expr.cpp
@@ -47,7 +47,14 @@ struct LowerHIR_ExprNode_Visitor:
BUG(v.get_pos(), "Hit ExprNode_Macro");
}
virtual void visit(::AST::ExprNode_Asm& v) override {
- TODO(v.get_pos(), "Convert asm! to HIR");
+ ::std::vector< ::HIR::ExprNode_Asm::ValRef> outputs;
+ ::std::vector< ::HIR::ExprNode_Asm::ValRef> inputs;
+ for(auto& vr : v.m_output)
+ outputs.push_back( ::HIR::ExprNode_Asm::ValRef { vr.name, LowerHIR_ExprNode_Inner(*vr.value) } );
+ for(auto& vr : v.m_input)
+ inputs.push_back( ::HIR::ExprNode_Asm::ValRef { vr.name, LowerHIR_ExprNode_Inner(*vr.value) } );
+
+ m_rv.reset( new ::HIR::ExprNode_Asm( v.span(), v.m_text, mv$(outputs), mv$(inputs), v.m_clobbers, v.m_flags ) );
}
virtual void visit(::AST::ExprNode_Flow& v) override {
switch( v.m_type )
diff --git a/src/hir_conv/constant_evaluation.cpp b/src/hir_conv/constant_evaluation.cpp
index 35cacbcd..452d792f 100644
--- a/src/hir_conv/constant_evaluation.cpp
+++ b/src/hir_conv/constant_evaluation.cpp
@@ -301,6 +301,9 @@ namespace {
e->visit(*this);
}
}
+ void visit(::HIR::ExprNode_Asm& node) override {
+ badnode(node);
+ }
void visit(::HIR::ExprNode_Return& node) override {
TODO(node.span(), "ExprNode_Return");
}
diff --git a/src/hir_expand/annotate_value_usage.cpp b/src/hir_expand/annotate_value_usage.cpp
index 8141f1a6..da4c897f 100644
--- a/src/hir_expand/annotate_value_usage.cpp
+++ b/src/hir_expand/annotate_value_usage.cpp
@@ -86,6 +86,18 @@ namespace {
}
}
+ void visit(::HIR::ExprNode_Asm& node) override
+ {
+ auto _ = this->push_usage( ::HIR::ValueUsage::Move );
+ for(auto& v : node.m_outputs)
+ {
+ this->visit_node_ptr(v.value);
+ }
+ for(auto& v : node.m_inputs)
+ {
+ this->visit_node_ptr(v.value);
+ }
+ }
void visit(::HIR::ExprNode_Return& node) override
{
auto _ = this->push_usage( ::HIR::ValueUsage::Move );
diff --git a/src/hir_typeck/expr_check.cpp b/src/hir_typeck/expr_check.cpp
index 11e895cb..f435696e 100644
--- a/src/hir_typeck/expr_check.cpp
+++ b/src/hir_typeck/expr_check.cpp
@@ -64,6 +64,20 @@ namespace {
check_types_equal(node.span(), node.m_res_type, node.m_nodes.back()->m_res_type);
}
}
+ void visit(::HIR::ExprNode_Asm& node) override
+ {
+ TRACE_FUNCTION_F(&node << " asm! ...");
+
+ // TODO: Check result types
+ for(auto& v : node.m_outputs)
+ {
+ v.value->visit(*this);
+ }
+ for(auto& v : node.m_inputs)
+ {
+ v.value->visit(*this);
+ }
+ }
void visit(::HIR::ExprNode_Return& node) override
{
TRACE_FUNCTION_F(&node << " return ...");
diff --git a/src/hir_typeck/expr_cs.cpp b/src/hir_typeck/expr_cs.cpp
index 4c8e97ec..e5bb1d79 100644
--- a/src/hir_typeck/expr_cs.cpp
+++ b/src/hir_typeck/expr_cs.cpp
@@ -624,6 +624,24 @@ namespace {
this->context.equate_types(node.span(), node.m_res_type, ::HIR::TypeRef::new_unit());
}
}
+ void visit(::HIR::ExprNode_Asm& node) override
+ {
+ TRACE_FUNCTION_F(&node << " asm! ...");
+
+ this->push_inner_coerce( false );
+ for(auto& v : node.m_outputs)
+ {
+ this->context.add_ivars( v.value->m_res_type );
+ v.value->visit(*this);
+ }
+ for(auto& v : node.m_inputs)
+ {
+ this->context.add_ivars( v.value->m_res_type );
+ v.value->visit(*this);
+ }
+ this->pop_inner_coerce();
+ // TODO: Revisit to check that the input are integers, and the outputs are integer lvalues
+ }
void visit(::HIR::ExprNode_Return& node) override
{
TRACE_FUNCTION_F(&node << " return ...");
@@ -1967,6 +1985,10 @@ namespace {
}
this->m_completed = true;
}
+ void visit(::HIR::ExprNode_Asm& node) override {
+ // TODO: Revisit for validation
+ no_revisit(node);
+ }
void visit(::HIR::ExprNode_Return& node) override {
no_revisit(node);
}
diff --git a/src/mir/from_hir.cpp b/src/mir/from_hir.cpp
index b5e42d31..3cfc8cac 100644
--- a/src/mir/from_hir.cpp
+++ b/src/mir/from_hir.cpp
@@ -447,6 +447,12 @@ namespace {
m_builder.set_result(node.span(), ::MIR::RValue::make_Tuple({}));
}
}
+ void visit(::HIR::ExprNode_Asm& node) override
+ {
+ TRACE_FUNCTION_F("_Asm");
+
+ TODO(node.span(), "asm!");
+ }
void visit(::HIR::ExprNode_Return& node) override
{
TRACE_FUNCTION_F("_Return");