diff options
| -rw-r--r-- | src/librustc/middle/trans/asm.rs | 28 |
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}" +} |
