diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/hir/dump.cpp | 5 | ||||
-rw-r--r-- | src/hir/expr.cpp | 6 | ||||
-rw-r--r-- | src/hir/expr.hpp | 28 | ||||
-rw-r--r-- | src/hir/from_ast_expr.cpp | 9 | ||||
-rw-r--r-- | src/hir_conv/constant_evaluation.cpp | 3 | ||||
-rw-r--r-- | src/hir_expand/annotate_value_usage.cpp | 12 | ||||
-rw-r--r-- | src/hir_typeck/expr_check.cpp | 14 | ||||
-rw-r--r-- | src/hir_typeck/expr_cs.cpp | 22 | ||||
-rw-r--r-- | src/mir/from_hir.cpp | 6 |
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"); |