@@ -84,11 +84,18 @@ pub fn trans_inline_asm(bcx: block, ia: &ast::inline_asm) -> block {
8484
8585 let mut constraints = str::connect(constraints, " , ");
8686
87+ let mut clobbers = getClobbers();
88+ if *ia.clobbers != ~" " && clobbers != ~" " {
89+ clobbers = *ia.clobbers + ~" , " + clobbers;
90+ } else {
91+ clobbers += *ia.clobbers;
92+ };
93+
8794 // Add the clobbers to our constraints list
88- if *ia. clobbers != ~" " && constraints != ~" " {
89- constraints += ~" , " + *ia. clobbers;
95+ if clobbers != ~" " && constraints != ~" " {
96+ constraints += ~" , " + clobbers;
9097 } else {
91- constraints += *ia. clobbers;
98+ constraints += clobbers;
9299 }
93100
94101 debug!(" Asm Constraints : %?", constraints);
@@ -131,3 +138,18 @@ pub fn trans_inline_asm(bcx: block, ia: &ast::inline_asm) -> block {
131138 return bcx;
132139
133140}
141+
142+ // Default per-arch clobbers
143+ // Basically what clang does
144+
145+ #[cfg(target_arch = " arm")]
146+ #[cfg(target_arch = " mips")]
147+ fn getClobbers() -> ~str {
148+ ~" "
149+ }
150+
151+ #[cfg(target_arch = " x86")]
152+ #[cfg(target_arch = " x86_64")]
153+ fn getClobbers() -> ~str {
154+ ~" ~{ dirflag} , ~{ fpsr} , ~{ flags} "
155+ }
0 commit comments