From 989f906af31d8a1d25eb3657896d2f3550d62fa2 Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Sun, 30 Nov 2014 11:56:31 +0900 Subject: [PATCH 1/2] syntax: Make `asm!` clobbers a proper vector. Otherwise `--pretty expanded` diverges. --- src/librustc_trans/trans/asm.rs | 17 ++++++++++++----- src/libsyntax/ast.rs | 2 +- src/libsyntax/ext/asm.rs | 10 +++------- src/libsyntax/print/pprust.rs | 6 +++++- src/test/pretty/asm-clobbers.rs | 14 ++++++++++++++ 5 files changed, 35 insertions(+), 14 deletions(-) create mode 100644 src/test/pretty/asm-clobbers.rs diff --git a/src/librustc_trans/trans/asm.rs b/src/librustc_trans/trans/asm.rs index 024df2a63adb5..58bb42f3d6702 100644 --- a/src/librustc_trans/trans/asm.rs +++ b/src/librustc_trans/trans/asm.rs @@ -85,11 +85,18 @@ pub fn trans_inline_asm<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, ia: &ast::InlineAsm) .connect(",") .as_slice()); - let mut clobbers = get_clobbers(); - if !ia.clobbers.get().is_empty() && !clobbers.is_empty() { - clobbers = format!("{},{}", ia.clobbers.get(), clobbers); - } else { - clobbers.push_str(ia.clobbers.get()); + let mut clobbers = + String::from_str(ia.clobbers.iter() + .map(|s| format!("~{{{}}}", s.get())) + .collect::>() + .connect(",") + .as_slice()); + let more_clobbers = get_clobbers(); + if !more_clobbers.is_empty() { + if !clobbers.is_empty() { + clobbers.push(','); + } + clobbers.push_str(more_clobbers.as_slice()); } // Add the clobbers to our constraints list diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 28d5fbb96898d..7e421df505d6c 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -1177,7 +1177,7 @@ pub struct InlineAsm { pub asm_str_style: StrStyle, pub outputs: Vec<(InternedString, P, bool)>, pub inputs: Vec<(InternedString, P)>, - pub clobbers: InternedString, + pub clobbers: Vec, pub volatile: bool, pub alignstack: bool, pub dialect: AsmDialect, diff --git a/src/libsyntax/ext/asm.rs b/src/libsyntax/ext/asm.rs index d04144ef26e59..a1c4c0a0a10c5 100644 --- a/src/libsyntax/ext/asm.rs +++ b/src/libsyntax/ext/asm.rs @@ -53,7 +53,7 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) let mut asm_str_style = None; let mut outputs = Vec::new(); let mut inputs = Vec::new(); - let mut cons = "".to_string(); + let mut clobs = Vec::new(); let mut volatile = false; let mut alignstack = false; let mut dialect = ast::AsmAtt; @@ -138,7 +138,6 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) } } Clobbers => { - let mut clobs = Vec::new(); while p.token != token::Eof && p.token != token::Colon && p.token != token::ModSep { @@ -148,15 +147,12 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) } let (s, _str_style) = p.parse_str(); - let clob = format!("~{{{}}}", s); - clobs.push(clob); if OPTIONS.iter().any(|opt| s.equiv(opt)) { cx.span_warn(p.last_span, "expected a clobber, found an option"); } + clobs.push(s); } - - cons = clobs.connect(","); } Options => { let (option, _str_style) = p.parse_str(); @@ -216,7 +212,7 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) asm_str_style: asm_str_style.unwrap(), outputs: outputs, inputs: inputs, - clobbers: token::intern_and_get_ident(cons.as_slice()), + clobbers: clobs, volatile: volatile, alignstack: alignstack, dialect: dialect, diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index c12c3098279a9..b2c783b4bd91b 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -1839,7 +1839,11 @@ impl<'a> State<'a> { try!(space(&mut self.s)); try!(self.word_space(":")); - try!(self.print_string(a.clobbers.get(), ast::CookedStr)); + try!(self.commasep(Inconsistent, a.clobbers.as_slice(), + |s, co| { + try!(s.print_string(co.get(), ast::CookedStr)); + Ok(()) + })); try!(self.pclose()); } ast::ExprMac(ref m) => try!(self.print_mac(m)), diff --git a/src/test/pretty/asm-clobbers.rs b/src/test/pretty/asm-clobbers.rs new file mode 100644 index 0000000000000..20a3ac226bdc5 --- /dev/null +++ b/src/test/pretty/asm-clobbers.rs @@ -0,0 +1,14 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(asm)] + +pub fn main() { unsafe { asm!("" : : : "hello", "world") }; } + From 133266f01ca6bd1a75cdb0887c3c9f6ea500795f Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Sun, 30 Nov 2014 18:52:44 +0900 Subject: [PATCH 2/2] trans: Eliminated redundant allocations. --- src/librustc_trans/trans/asm.rs | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/librustc_trans/trans/asm.rs b/src/librustc_trans/trans/asm.rs index 58bb42f3d6702..77102d2db39bb 100644 --- a/src/librustc_trans/trans/asm.rs +++ b/src/librustc_trans/trans/asm.rs @@ -77,20 +77,16 @@ pub fn trans_inline_asm<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, ia: &ast::InlineAsm) // no failure occurred preparing operands, no need to cleanup fcx.pop_custom_cleanup_scope(temp_scope); - let mut constraints = - String::from_str(constraints.iter() - .map(|s| s.get().to_string()) - .chain(ext_constraints.into_iter()) - .collect::>() - .connect(",") - .as_slice()); - - let mut clobbers = - String::from_str(ia.clobbers.iter() - .map(|s| format!("~{{{}}}", s.get())) - .collect::>() - .connect(",") - .as_slice()); + let mut constraints = constraints.iter() + .map(|s| s.get().to_string()) + .chain(ext_constraints.into_iter()) + .collect::>() + .connect(","); + + let mut clobbers = ia.clobbers.iter() + .map(|s| format!("~{{{}}}", s.get())) + .collect::>() + .connect(","); let more_clobbers = get_clobbers(); if !more_clobbers.is_empty() { if !clobbers.is_empty() {