From 6d078db952cf76b35bbd8577fe6a9f5d9e12c566 Mon Sep 17 00:00:00 2001 From: Luqman Aden Date: Tue, 12 Mar 2013 17:53:25 -0700 Subject: Actually pass inline asm operands around. --- src/libsyntax/ext/asm.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/libsyntax/ext') diff --git a/src/libsyntax/ext/asm.rs b/src/libsyntax/ext/asm.rs index 4f2fd68ff95..0110c186cfa 100644 --- a/src/libsyntax/ext/asm.rs +++ b/src/libsyntax/ext/asm.rs @@ -156,7 +156,8 @@ pub fn expand_asm(cx: @ext_ctxt, sp: span, tts: &[ast::token_tree]) MRExpr(@ast::expr { id: cx.next_id(), callee_id: cx.next_id(), - node: ast::expr_inline_asm(@asm, @cons, volatile, alignstack), + node: ast::expr_inline_asm(@asm, inputs, outputs, + @cons, volatile, alignstack), span: sp }) } -- cgit 1.4.1-3-g733a5 From 9ead7dad934cc361f8e5e489238031c987ecfc82 Mon Sep 17 00:00:00 2001 From: Luqman Aden Date: Wed, 13 Mar 2013 10:11:36 -0700 Subject: Implicitly use addr_of for output operands in asm. --- src/librustc/middle/trans/expr.rs | 21 ++++++++++++++++++--- src/libsyntax/ext/asm.rs | 7 +++++++ 2 files changed, 25 insertions(+), 3 deletions(-) (limited to 'src/libsyntax/ext') diff --git a/src/librustc/middle/trans/expr.rs b/src/librustc/middle/trans/expr.rs index 10462a65d06..75097e151aa 100644 --- a/src/librustc/middle/trans/expr.rs +++ b/src/librustc/middle/trans/expr.rs @@ -561,17 +561,32 @@ fn trans_rvalue_stmt_unadjusted(bcx: block, expr: @ast::expr) -> block { clobs, volatile, alignstack) => { let mut constraints = ~[]; let mut cleanups = ~[]; + let mut aoutputs = ~[]; let outputs = do outs.map |&(c, out)| { constraints.push(copy *c); - let outty = ty::arg { + let aoutty = ty::arg { mode: ast::expl(ast::by_val), ty: expr_ty(bcx, out) }; + aoutputs.push(unpack_result!(bcx, { + callee::trans_arg_expr(bcx, aoutty, out, &mut cleanups, + None, callee::DontAutorefArg) + })); + + let e = match out.node { + ast::expr_addr_of(_, e) => e, + _ => fail!(~"Expression must be addr of") + }; + + let outty = ty::arg { + mode: ast::expl(ast::by_val), + ty: expr_ty(bcx, e) + }; unpack_result!(bcx, { - callee::trans_arg_expr(bcx, outty, out, &mut cleanups, + callee::trans_arg_expr(bcx, outty, e, &mut cleanups, None, callee::DontAutorefArg) }) @@ -627,7 +642,7 @@ fn trans_rvalue_stmt_unadjusted(bcx: block, expr: @ast::expr) -> block { }; // TODO: Handle >1 outputs - let op = PointerCast(bcx, output, T_ptr(val_ty(output))); + let op = PointerCast(bcx, aoutputs[0], T_ptr(val_ty(output))); Store(bcx, r, op); return bcx; diff --git a/src/libsyntax/ext/asm.rs b/src/libsyntax/ext/asm.rs index 0110c186cfa..34cb743a727 100644 --- a/src/libsyntax/ext/asm.rs +++ b/src/libsyntax/ext/asm.rs @@ -75,6 +75,13 @@ pub fn expand_asm(cx: @ext_ctxt, sp: span, tts: &[ast::token_tree]) let out = p.parse_expr(); p.expect(&token::RPAREN); + let out = @ast::expr { + id: cx.next_id(), + callee_id: cx.next_id(), + span: out.span, + node: ast::expr_addr_of(ast::m_mutbl, out) + }; + outputs.push((constraint, out)); } } -- cgit 1.4.1-3-g733a5 From 3d56936be3c010829edf188475140dcb322da803 Mon Sep 17 00:00:00 2001 From: Luqman Aden Date: Wed, 13 Mar 2013 13:47:15 -0700 Subject: Tidy. --- src/librustc/middle/trans/expr.rs | 5 +++-- src/libsyntax/ext/asm.rs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'src/libsyntax/ext') diff --git a/src/librustc/middle/trans/expr.rs b/src/librustc/middle/trans/expr.rs index 73cff97de95..8453b49f5c0 100644 --- a/src/librustc/middle/trans/expr.rs +++ b/src/librustc/middle/trans/expr.rs @@ -604,7 +604,7 @@ fn trans_rvalue_stmt_unadjusted(bcx: block, expr: @ast::expr) -> block { mode: ast::expl(ast::by_val), ty: expr_ty(bcx, in) }; - + unpack_result!(bcx, { callee::trans_arg_expr(bcx, inty, in, &mut cleanups, None, callee::DontAutorefArg) @@ -647,7 +647,8 @@ fn trans_rvalue_stmt_unadjusted(bcx: block, expr: @ast::expr) -> block { }; if outputs.len() == 1 { - let op = PointerCast(bcx, aoutputs[0], T_ptr(val_ty(outputs[0]))); + let op = PointerCast(bcx, aoutputs[0], + T_ptr(val_ty(outputs[0]))); Store(bcx, r, op); } else { for aoutputs.eachi |i, o| { diff --git a/src/libsyntax/ext/asm.rs b/src/libsyntax/ext/asm.rs index 34cb743a727..a014d8ccb8b 100644 --- a/src/libsyntax/ext/asm.rs +++ b/src/libsyntax/ext/asm.rs @@ -163,7 +163,7 @@ pub fn expand_asm(cx: @ext_ctxt, sp: span, tts: &[ast::token_tree]) MRExpr(@ast::expr { id: cx.next_id(), callee_id: cx.next_id(), - node: ast::expr_inline_asm(@asm, inputs, outputs, + node: ast::expr_inline_asm(@asm, inputs, outputs, @cons, volatile, alignstack), span: sp }) -- cgit 1.4.1-3-g733a5