about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorLuqman Aden <me@luqman.ca>2013-03-12 17:53:25 -0700
committerLuqman Aden <laden@mozilla.com>2013-03-15 18:55:43 -0700
commit6d078db952cf76b35bbd8577fe6a9f5d9e12c566 (patch)
tree2682c9a4aaf0ede8ae49cc5294429176f830cb4f /src/libsyntax
parent471d2b17657bdaea357faeaa3e857f8a758bfbe3 (diff)
downloadrust-6d078db952cf76b35bbd8577fe6a9f5d9e12c566.tar.gz
rust-6d078db952cf76b35bbd8577fe6a9f5d9e12c566.zip
Actually pass inline asm operands around.
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ast.rs6
-rw-r--r--src/libsyntax/ext/asm.rs3
-rw-r--r--src/libsyntax/fold.rs9
-rw-r--r--src/libsyntax/print/pprust.rs20
-rw-r--r--src/libsyntax/visit.rs9
5 files changed, 40 insertions, 7 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index 298cb241bed..e5fb2ad153c 100644
--- a/src/libsyntax/ast.rs
+++ b/src/libsyntax/ast.rs
@@ -601,8 +601,10 @@ pub enum expr_ {
     expr_ret(Option<@expr>),
     expr_log(log_level, @expr, @expr),
 
-    /* asm, clobbers + constraints, volatile, align stack */
-    expr_inline_asm(@~str, @~str, bool, bool),
+    expr_inline_asm(@~str,              // asm
+                    ~[(@~str, @expr)],  // inputs
+                    ~[(@~str, @expr)],  // outputs
+                    @~str, bool, bool), // clobbers, volatile, align stack
 
     expr_mac(mac),
 
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
     })
 }
diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs
index 1626c55e721..a8952f313a5 100644
--- a/src/libsyntax/fold.rs
+++ b/src/libsyntax/fold.rs
@@ -560,7 +560,14 @@ pub fn noop_fold_expr(e: &expr_, fld: @ast_fold) -> expr_ {
                 fld.fold_expr(e)
             )
         }
-        expr_inline_asm(*) => copy *e,
+        expr_inline_asm(asm, ins, outs, c, v, a) => {
+            expr_inline_asm(
+                asm,
+                ins.map(|&(c, in)| (c, fld.fold_expr(in))),
+                outs.map(|&(c, out)| (c, fld.fold_expr(out))),
+                c, v, a
+            )
+        }
         expr_mac(ref mac) => expr_mac(fold_mac((*mac))),
         expr_struct(path, ref fields, maybe_expr) => {
             expr_struct(
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs
index 724e61daea7..370434010b2 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/libsyntax/print/pprust.rs
@@ -1403,7 +1403,7 @@ pub fn print_expr(s: @ps, &&expr: @ast::expr) {
           }
         }
       }
-      ast::expr_inline_asm(a, c, v, _) => {
+      ast::expr_inline_asm(a, in, out, c, v, _) => {
         if v {
             word(s.s, ~"__volatile__ asm!");
         } else {
@@ -1411,7 +1411,23 @@ pub fn print_expr(s: @ps, &&expr: @ast::expr) {
         }
         popen(s);
         print_string(s, *a);
-        word_space(s, ~",");
+        word_space(s, ~":");
+        for out.each |&(co, o)| {
+            print_string(s, *co);
+            popen(s);
+            print_expr(s, o);
+            pclose(s);
+            word_space(s, ~",");
+        }
+        word_space(s, ~":");
+        for in.each |&(co, o)| {
+            print_string(s, *co);
+            popen(s);
+            print_expr(s, o);
+            pclose(s);
+            word_space(s, ~",");
+        }
+        word_space(s, ~":");
         print_string(s, *c);
         pclose(s);
       }
diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs
index 95ab603f584..1fb81b5c702 100644
--- a/src/libsyntax/visit.rs
+++ b/src/libsyntax/visit.rs
@@ -562,7 +562,14 @@ pub fn visit_expr<E>(ex: @expr, e: E, v: vt<E>) {
         }
         expr_mac(ref mac) => visit_mac((*mac), e, v),
         expr_paren(x) => (v.visit_expr)(x, e, v),
-        expr_inline_asm(*) => (),
+        expr_inline_asm(_, ins, outs, _, _, _) => {
+            for ins.each |&(c, in)| {
+                (v.visit_expr)(in, e, v);
+            }
+            for outs.each |&(c, out)| {
+                (v.visit_expr)(out, e, v);
+            }
+        }
     }
     (v.visit_expr_post)(ex, e, v);
 }