about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc/middle/trans/asm.rs28
1 files changed, 25 insertions, 3 deletions
diff --git a/src/librustc/middle/trans/asm.rs b/src/librustc/middle/trans/asm.rs
index 5ad7299e1e5..798d684e0bd 100644
--- a/src/librustc/middle/trans/asm.rs
+++ b/src/librustc/middle/trans/asm.rs
@@ -84,11 +84,18 @@ pub fn trans_inline_asm(bcx: block, ia: &ast::inline_asm) -> block {
 
     let mut constraints = str::connect(constraints, ",");
 
+    let mut clobbers = getClobbers();
+    if *ia.clobbers != ~"" && clobbers != ~"" {
+        clobbers = *ia.clobbers + ~"," + clobbers;
+    } else {
+        clobbers += *ia.clobbers;
+    };
+
     // Add the clobbers to our constraints list
-    if *ia.clobbers != ~"" && constraints != ~"" {
-        constraints += ~"," + *ia.clobbers;
+    if clobbers != ~"" && constraints != ~"" {
+        constraints += ~"," + clobbers;
     } else {
-        constraints += *ia.clobbers;
+        constraints += clobbers;
     }
 
     debug!("Asm Constraints: %?", constraints);
@@ -131,3 +138,18 @@ pub fn trans_inline_asm(bcx: block, ia: &ast::inline_asm) -> block {
     return bcx;
 
 }
+
+// Default per-arch clobbers
+// Basically what clang does
+
+#[cfg(target_arch = "arm")]
+#[cfg(target_arch = "mips")]
+fn getClobbers() -> ~str {
+    ~""
+}
+
+#[cfg(target_arch = "x86")]
+#[cfg(target_arch = "x86_64")]
+fn getClobbers() -> ~str {
+    ~"~{dirflag},~{fpsr},~{flags}"
+}