bench: Fix fallout in benchmarks

This commit is contained in:
Alex Crichton 2015-04-10 13:39:51 -07:00
parent 8f7eb3b058
commit 33fb5bb004
12 changed files with 101 additions and 158 deletions

View File

@ -35,7 +35,7 @@ pub fn realpath(original: &Path) -> io::Result<PathBuf> {
if ret == 0 { if ret == 0 {
return Err(io::Error::last_os_error()) return Err(io::Error::last_os_error())
} }
assert!(ret as usize < v.capacit()); assert!(ret as usize < v.capacity());
v.set_len(ret); v.set_len(ret);
} }
Ok(PathBuf::from(OsString::from_wide(&v))) Ok(PathBuf::from(OsString::from_wide(&v)))

View File

@ -8,11 +8,11 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
#![feature(unboxed_closures, std_misc, rand)] #![feature(std_misc, rand)]
use std::collections::{BTreeMap, HashMap, HashSet}; use std::collections::{BTreeMap, HashMap, HashSet};
use std::env; use std::env;
use std::rand::{Rng, IsaacRng, SeedableRng}; use std::__rand::{Rng, thread_rng};
use std::time::Duration; use std::time::Duration;
fn timed<F>(label: &str, f: F) where F: FnMut() { fn timed<F>(label: &str, f: F) where F: FnMut() {
@ -114,7 +114,7 @@ fn main() {
{ {
let seed: &[_] = &[1, 1, 1, 1, 1, 1, 1]; let seed: &[_] = &[1, 1, 1, 1, 1, 1, 1];
let mut rng: IsaacRng = SeedableRng::from_seed(seed); let mut rng = thread_rng();
let mut set = HashSet::new(); let mut set = HashSet::new();
while set.len() != n_keys { while set.len() != n_keys {
let next = rng.gen(); let next = rng.gen();

View File

@ -11,18 +11,14 @@
// ignore-lexer-test FIXME #15679 // ignore-lexer-test FIXME #15679
// Microbenchmarks for various functions in std and extra // Microbenchmarks for various functions in std and extra
#![feature(unboxed_closures, rand, old_io, old_path, std_misc, collections)] #![feature(rand, collections, std_misc)]
use std::old_io::*;
use std::old_path::{Path, GenericPath};
use std::iter::repeat; use std::iter::repeat;
use std::mem::swap; use std::mem::swap;
use std::env; use std::env;
use std::rand::Rng; use std::__rand::{thread_rng, Rng};
use std::rand;
use std::str; use std::str;
use std::time::Duration; use std::time::Duration;
use std::vec;
fn main() { fn main() {
let argv: Vec<String> = env::args().collect(); let argv: Vec<String> = env::args().collect();
@ -35,7 +31,6 @@ fn main() {
} }
bench!(shift_push); bench!(shift_push);
bench!(read_line);
bench!(vec_plus); bench!(vec_plus);
bench!(vec_append); bench!(vec_append);
bench!(vec_push_all); bench!(vec_push_all);
@ -70,21 +65,8 @@ fn shift_push() {
} }
} }
fn read_line() {
use std::old_io::BufferedReader;
let mut path = Path::new(env!("CFG_SRC_DIR"));
path.push("src/test/bench/shootout-k-nucleotide.data");
for _ in 0..3 {
let mut reader = BufferedReader::new(File::open(&path).unwrap());
for _line in reader.lines() {
}
}
}
fn vec_plus() { fn vec_plus() {
let mut r = rand::thread_rng(); let mut r = thread_rng();
let mut v = Vec::new(); let mut v = Vec::new();
let mut i = 0; let mut i = 0;
@ -102,7 +84,7 @@ fn vec_plus() {
} }
fn vec_append() { fn vec_append() {
let mut r = rand::thread_rng(); let mut r = thread_rng();
let mut v = Vec::new(); let mut v = Vec::new();
let mut i = 0; let mut i = 0;
@ -123,7 +105,7 @@ fn vec_append() {
} }
fn vec_push_all() { fn vec_push_all() {
let mut r = rand::thread_rng(); let mut r = thread_rng();
let mut v = Vec::new(); let mut v = Vec::new();
for i in 0..1500 { for i in 0..1500 {

View File

@ -16,7 +16,7 @@
use std::f32::consts::PI; use std::f32::consts::PI;
use std::num::Float; use std::num::Float;
use std::rand::{Rng, StdRng}; use std::__rand::{Rng, thread_rng};
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
struct Vec2 { struct Vec2 {
@ -44,7 +44,7 @@ struct Noise2DContext {
impl Noise2DContext { impl Noise2DContext {
fn new() -> Noise2DContext { fn new() -> Noise2DContext {
let mut rng = StdRng::new().unwrap(); let mut rng = thread_rng();
let mut rgradients = [Vec2 { x: 0.0, y: 0.0 }; 256]; let mut rgradients = [Vec2 { x: 0.0, y: 0.0 }; 256];
for x in &mut rgradients[..] { for x in &mut rgradients[..] {

View File

@ -38,13 +38,11 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
// OF THE POSSIBILITY OF SUCH DAMAGE. // OF THE POSSIBILITY OF SUCH DAMAGE.
#![feature(core, old_io, io, core)]
use std::cmp::min; use std::cmp::min;
use std::old_io::*;
use std::iter::repeat;
use std::env; use std::env;
use std::slice::bytes::copy_memory; use std::io;
use std::io::prelude::*;
use std::iter::repeat;
const LINE_LEN: usize = 60; const LINE_LEN: usize = 60;
const LOOKUP_SIZE: usize = 4 * 1024; const LOOKUP_SIZE: usize = 4 * 1024;
@ -116,27 +114,31 @@ struct RepeatFasta<'a, W:'a> {
out: &'a mut W out: &'a mut W
} }
impl<'a, W: Writer> RepeatFasta<'a, W> { impl<'a, W: Write> RepeatFasta<'a, W> {
fn new(alu: &'static str, w: &'a mut W) -> RepeatFasta<'a, W> { fn new(alu: &'static str, w: &'a mut W) -> RepeatFasta<'a, W> {
RepeatFasta { alu: alu, out: w } RepeatFasta { alu: alu, out: w }
} }
fn make(&mut self, n: usize) -> IoResult<()> { fn make(&mut self, n: usize) -> io::Result<()> {
let alu_len = self.alu.len(); let alu_len = self.alu.len();
let mut buf = repeat(0).take(alu_len + LINE_LEN).collect::<Vec<_>>(); let mut buf = repeat(0).take(alu_len + LINE_LEN).collect::<Vec<_>>();
let alu: &[u8] = self.alu.as_bytes(); let alu: &[u8] = self.alu.as_bytes();
copy_memory(alu, &mut buf); for (slot, val) in buf.iter_mut().zip(alu.iter()) {
*slot = *val;
}
let buf_len = buf.len(); let buf_len = buf.len();
copy_memory(&alu[..LINE_LEN], &mut buf[alu_len..buf_len]); for (slot, val) in buf[alu_len..buf_len].iter_mut().zip(alu[..LINE_LEN].iter()) {
*slot = *val;
}
let mut pos = 0; let mut pos = 0;
let mut bytes; let mut bytes;
let mut n = n; let mut n = n;
while n > 0 { while n > 0 {
bytes = min(LINE_LEN, n); bytes = min(LINE_LEN, n);
try!(self.out.write(&buf[pos..pos + bytes])); try!(self.out.write_all(&buf[pos..pos + bytes]));
try!(self.out.write_u8('\n' as u8)); try!(self.out.write_all(&[b'\n']));
pos += bytes; pos += bytes;
if pos > alu_len { if pos > alu_len {
pos -= alu_len; pos -= alu_len;
@ -165,7 +167,7 @@ struct RandomFasta<'a, W:'a> {
out: &'a mut W, out: &'a mut W,
} }
impl<'a, W: Writer> RandomFasta<'a, W> { impl<'a, W: Write> RandomFasta<'a, W> {
fn new(w: &'a mut W, a: &[AminoAcid]) -> RandomFasta<'a, W> { fn new(w: &'a mut W, a: &[AminoAcid]) -> RandomFasta<'a, W> {
RandomFasta { RandomFasta {
seed: 42, seed: 42,
@ -189,7 +191,7 @@ impl<'a, W: Writer> RandomFasta<'a, W> {
0 0
} }
fn make(&mut self, n: usize) -> IoResult<()> { fn make(&mut self, n: usize) -> io::Result<()> {
let lines = n / LINE_LEN; let lines = n / LINE_LEN;
let chars_left = n % LINE_LEN; let chars_left = n % LINE_LEN;
let mut buf = [0;LINE_LEN + 1]; let mut buf = [0;LINE_LEN + 1];
@ -204,7 +206,7 @@ impl<'a, W: Writer> RandomFasta<'a, W> {
for i in 0..chars_left { for i in 0..chars_left {
buf[i] = self.nextc(); buf[i] = self.nextc();
} }
self.out.write(&buf[..chars_left]) self.out.write_all(&buf[..chars_left])
} }
} }
@ -216,23 +218,23 @@ fn main() {
5 5
}; };
let mut out = stdout(); let mut out = io::stdout();
out.write_line(">ONE Homo sapiens alu").unwrap(); out.write_all(b">ONE Homo sapiens alu\n").unwrap();
{ {
let mut repeat = RepeatFasta::new(ALU, &mut out); let mut repeat = RepeatFasta::new(ALU, &mut out);
repeat.make(n * 2).unwrap(); repeat.make(n * 2).unwrap();
} }
out.write_line(">TWO IUB ambiguity codes").unwrap(); out.write_all(b">TWO IUB ambiguity codes\n").unwrap();
let iub = sum_and_scale(&IUB); let iub = sum_and_scale(&IUB);
let mut random = RandomFasta::new(&mut out, &iub); let mut random = RandomFasta::new(&mut out, &iub);
random.make(n * 3).unwrap(); random.make(n * 3).unwrap();
random.out.write_line(">THREE Homo sapiens frequency").unwrap(); random.out.write_all(b">THREE Homo sapiens frequency\n").unwrap();
let homo_sapiens = sum_and_scale(&HOMO_SAPIENS); let homo_sapiens = sum_and_scale(&HOMO_SAPIENS);
random.lookup = make_lookup(&homo_sapiens); random.lookup = make_lookup(&homo_sapiens);
random.make(n * 5).unwrap(); random.make(n * 5).unwrap();
random.out.write_str("\n").unwrap(); random.out.write_all(b"\n").unwrap();
} }

View File

@ -38,14 +38,12 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
// OF THE POSSIBILITY OF SUCH DAMAGE. // OF THE POSSIBILITY OF SUCH DAMAGE.
#![feature(old_io, old_path, io, core)]
use std::cmp::min; use std::cmp::min;
use std::old_io::*;
use std::old_io;
use std::old_path::Path;
use std::num::Float;
use std::env; use std::env;
use std::fs::File;
use std::io::{self, BufWriter};
use std::io::prelude::*;
use std::num::Float;
const LINE_LENGTH: usize = 60; const LINE_LENGTH: usize = 60;
const IM: u32 = 139968; const IM: u32 = 139968;
@ -87,9 +85,9 @@ impl<'a> Iterator for AAGen<'a> {
} }
} }
fn make_fasta<W: Writer, I: Iterator<Item=u8>>( fn make_fasta<W: Write, I: Iterator<Item=u8>>(
wr: &mut W, header: &str, mut it: I, mut n: usize) wr: &mut W, header: &str, mut it: I, mut n: usize)
-> std::old_io::IoResult<()> -> io::Result<()>
{ {
try!(wr.write(header.as_bytes())); try!(wr.write(header.as_bytes()));
let mut line = [0; LINE_LENGTH + 1]; let mut line = [0; LINE_LENGTH + 1];
@ -105,7 +103,7 @@ fn make_fasta<W: Writer, I: Iterator<Item=u8>>(
Ok(()) Ok(())
} }
fn run<W: Writer>(writer: &mut W) -> std::old_io::IoResult<()> { fn run<W: Write>(writer: &mut W) -> io::Result<()> {
let mut args = env::args(); let mut args = env::args();
let n = if env::var_os("RUST_BENCH").is_some() { let n = if env::var_os("RUST_BENCH").is_some() {
25000000 25000000
@ -146,10 +144,10 @@ fn run<W: Writer>(writer: &mut W) -> std::old_io::IoResult<()> {
fn main() { fn main() {
let res = if env::var_os("RUST_BENCH").is_some() { let res = if env::var_os("RUST_BENCH").is_some() {
let mut file = BufferedWriter::new(File::create(&Path::new("./shootout-fasta.data"))); let mut file = BufWriter::new(File::create("./shootout-fasta.data").unwrap());
run(&mut file) run(&mut file)
} else { } else {
run(&mut old_io::stdout()) run(&mut io::stdout())
}; };
res.unwrap() res.unwrap()
} }

View File

@ -13,18 +13,17 @@
// multi tasking k-nucleotide // multi tasking k-nucleotide
#![feature(box_syntax, std_misc, old_io, collections, os)] #![allow(bad_style)]
use std::ascii::{AsciiExt, OwnedAsciiExt}; use std::ascii::AsciiExt;
use std::cmp::Ordering::{self, Less, Greater, Equal}; use std::cmp::Ordering::{self, Less, Greater, Equal};
use std::collections::HashMap; use std::collections::HashMap;
use std::mem::replace; use std::mem::replace;
use std::num::Float;
use std::option;
use std::os;
use std::env; use std::env;
use std::sync::mpsc::{channel, Sender, Receiver}; use std::sync::mpsc::{channel, Sender, Receiver};
use std::thread; use std::thread;
use std::io;
use std::io::prelude::*;
fn f64_cmp(x: f64, y: f64) -> Ordering { fn f64_cmp(x: f64, y: f64) -> Ordering {
// arbitrarily decide that NaNs are larger than everything. // arbitrarily decide that NaNs are larger than everything.
@ -75,10 +74,10 @@ fn sort_and_fmt(mm: &HashMap<Vec<u8> , usize>, total: usize) -> String {
// given a map, search for the frequency of a pattern // given a map, search for the frequency of a pattern
fn find(mm: &HashMap<Vec<u8> , usize>, key: String) -> usize { fn find(mm: &HashMap<Vec<u8> , usize>, key: String) -> usize {
let key = key.into_ascii_lowercase(); let key = key.to_ascii_lowercase();
match mm.get(key.as_bytes()) { match mm.get(key.as_bytes()) {
option::Option::None => { return 0; } None => 0,
option::Option::Some(&num) => { return num; } Some(&num) => num,
} }
} }
@ -123,7 +122,7 @@ fn make_sequence_processor(sz: usize,
line = from_parent.recv().unwrap(); line = from_parent.recv().unwrap();
if line == Vec::new() { break; } if line == Vec::new() { break; }
carry.push_all(&line); carry.extend(line);
carry = windows_with_carry(&carry, sz, |window| { carry = windows_with_carry(&carry, sz, |window| {
update_freq(&mut freqs, window); update_freq(&mut freqs, window);
total += 1; total += 1;
@ -147,15 +146,13 @@ fn make_sequence_processor(sz: usize,
// given a FASTA file on stdin, process sequence THREE // given a FASTA file on stdin, process sequence THREE
fn main() { fn main() {
use std::old_io::*; let input = io::stdin();
let rdr = if env::var_os("RUST_BENCH").is_some() { let rdr = if env::var_os("RUST_BENCH").is_some() {
let foo = include_bytes!("shootout-k-nucleotide.data"); let foo: &[u8] = include_bytes!("shootout-k-nucleotide.data");
box MemReader::new(foo.to_vec()) as Box<Reader> Box::new(foo) as Box<BufRead>
} else { } else {
box stdio::stdin() as Box<Reader> Box::new(input.lock()) as Box<BufRead>
}; };
let mut rdr = BufferedReader::new(rdr);
// initialize each sequence sorter // initialize each sequence sorter
let sizes: Vec<usize> = vec!(1,2,3,4,6,12,18); let sizes: Vec<usize> = vec!(1,2,3,4,6,12,18);

View File

@ -38,13 +38,13 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
// OF THE POSSIBILITY OF SUCH DAMAGE. // OF THE POSSIBILITY OF SUCH DAMAGE.
#![feature(simd, old_io, core, io)] #![feature(simd, core)]
// ignore-pretty very bad with line comments // ignore-pretty very bad with line comments
use std::old_io;
use std::old_io::*;
use std::env; use std::env;
use std::io::prelude::*;
use std::io;
use std::simd::f64x2; use std::simd::f64x2;
use std::sync::Arc; use std::sync::Arc;
use std::thread; use std::thread;
@ -53,8 +53,7 @@ const ITER: usize = 50;
const LIMIT: f64 = 2.0; const LIMIT: f64 = 2.0;
const WORKERS: usize = 16; const WORKERS: usize = 16;
#[inline(always)] fn mandelbrot<W: Write>(w: usize, mut out: W) -> io::Result<()> {
fn mandelbrot<W: old_io::Writer>(w: usize, mut out: W) -> old_io::IoResult<()> {
assert!(WORKERS % 2 == 0); assert!(WORKERS % 2 == 0);
// Ensure w and h are multiples of 8. // Ensure w and h are multiples of 8.
@ -142,9 +141,9 @@ fn mandelbrot<W: old_io::Writer>(w: usize, mut out: W) -> old_io::IoResult<()> {
}) })
}).collect::<Vec<_>>(); }).collect::<Vec<_>>();
try!(writeln!(&mut out as &mut Writer, "P4\n{} {}", w, h)); try!(writeln!(&mut out, "P4\n{} {}", w, h));
for res in data { for res in data {
try!(out.write(&res.join())); try!(out.write_all(&res.join()));
} }
out.flush() out.flush()
} }
@ -202,9 +201,9 @@ fn main() {
let res = if args.len() < 2 { let res = if args.len() < 2 {
println!("Test mode: do not dump the image because it's not utf8, \ println!("Test mode: do not dump the image because it's not utf8, \
which interferes with the test runner."); which interferes with the test runner.");
mandelbrot(1000, old_io::util::NullWriter) mandelbrot(1000, io::sink())
} else { } else {
mandelbrot(args.nth(1).unwrap().parse().unwrap(), old_io::stdout()) mandelbrot(args.nth(1).unwrap().parse().unwrap(), io::stdout())
}; };
res.unwrap(); res.unwrap();
} }

View File

@ -40,18 +40,18 @@
// ignore-android see #10393 #13206 // ignore-android see #10393 #13206
#![feature(unboxed_closures, libc, old_io, collections, io, core)] #![feature(libc)]
extern crate libc; extern crate libc;
use std::old_io::stdio::{stdin_raw, stdout_raw}; use std::io;
use std::old_io::*; use std::io::prelude::*;
use std::ptr::{copy, Unique}; use std::ptr::copy;
use std::thread; use std::thread;
struct Tables { struct Tables {
table8: [u8;1 << 8], table8: [u8; 1 << 8],
table16: [u16;1 << 16] table16: [u16; 1 << 16]
} }
impl Tables { impl Tables {
@ -101,36 +101,6 @@ impl Tables {
} }
} }
/// Reads all remaining bytes from the stream.
fn read_to_end<R: Reader>(r: &mut R) -> IoResult<Vec<u8>> {
// As reading the input stream in memory is a bottleneck, we tune
// Reader::read_to_end() with a fast growing policy to limit
// recopies. If MREMAP_RETAIN is implemented in the linux kernel
// and jemalloc use it, this trick will become useless.
const CHUNK: usize = 64 * 1024;
let mut vec = Vec::with_capacity(CHUNK);
loop {
// workaround: very fast growing
let len = vec.len();
if vec.capacity() - len < CHUNK {
let cap = vec.capacity();
let mult = if cap < 256 * 1024 * 1024 {
16
} else {
2
};
vec.reserve_exact(mult * cap - len);
}
match r.push_at_least(1, CHUNK, &mut vec) {
Ok(_) => {}
Err(ref e) if e.kind == EndOfFile => break,
Err(e) => return Err(e)
}
}
Ok(vec)
}
/// Finds the first position at which `b` occurs in `s`. /// Finds the first position at which `b` occurs in `s`.
fn memchr(h: &[u8], n: u8) -> Option<usize> { fn memchr(h: &[u8], n: u8) -> Option<usize> {
use libc::{c_void, c_int, size_t}; use libc::{c_void, c_int, size_t};
@ -175,7 +145,8 @@ const LINE_LEN: usize = 60;
/// Compute the reverse complement. /// Compute the reverse complement.
fn reverse_complement(seq: &mut [u8], tables: &Tables) { fn reverse_complement(seq: &mut [u8], tables: &Tables) {
let seq = seq.init_mut();// Drop the last newline let len = seq.len();
let seq = &mut seq[..len - 1]; // Drop the last newline
let len = seq.len(); let len = seq.len();
let off = LINE_LEN - len % (LINE_LEN + 1); let off = LINE_LEN - len % (LINE_LEN + 1);
let mut i = LINE_LEN; let mut i = LINE_LEN;
@ -222,26 +193,20 @@ fn reverse_complement(seq: &mut [u8], tables: &Tables) {
} }
} }
struct Racy<T>(T);
unsafe impl<T: 'static> Send for Racy<T> {}
/// Executes a closure in parallel over the given iterator over mutable slice. /// Executes a closure in parallel over the given iterator over mutable slice.
/// The closure `f` is run in parallel with an element of `iter`. /// The closure `f` is run in parallel with an element of `iter`.
fn parallel<'a, I: Iterator, F>(iter: I, ref f: F) fn parallel<I: Iterator, F>(iter: I, ref f: F)
where I::Item: Send + 'a, where I::Item: Send,
F: Fn(I::Item) + Sync + 'a { F: Fn(I::Item) + Sync, {
iter.map(|x| { iter.map(|x| {
thread::scoped(move|| { thread::scoped(move || f(x))
f(x)
})
}).collect::<Vec<_>>(); }).collect::<Vec<_>>();
} }
fn main() { fn main() {
let mut data = read_to_end(&mut stdin_raw()).unwrap(); let mut data = Vec::with_capacity(1024 * 1024);
io::stdin().read_to_end(&mut data);
let tables = &Tables::new(); let tables = &Tables::new();
parallel(mut_dna_seqs(&mut data), |seq| reverse_complement(seq, tables)); parallel(mut_dna_seqs(&mut data), |seq| reverse_complement(seq, tables));
stdout_raw().write(&data).unwrap(); io::stdout().write_all(&data).unwrap();
} }

View File

@ -10,15 +10,15 @@
// min-lldb-version: 310 // min-lldb-version: 310
// This test case checks if function arguments already have the correct value when breaking at the // This test case checks if function arguments already have the correct value
// first line of the function, that is if the function prologue has already been executed at the // when breaking at the first line of the function, that is if the function
// first line. Note that because of the __morestack part of the prologue GDB incorrectly breaks at // prologue has already been executed at the first line. Note that because of
// before the arguments have been properly loaded when setting the breakpoint via the function name. // the __morestack part of the prologue GDB incorrectly breaks at before the
// arguments have been properly loaded when setting the breakpoint via the
// function name.
// compile-flags:-g // compile-flags:-g
#![feature(old_io)]
// === GDB TESTS =================================================================================== // === GDB TESTS ===================================================================================
// gdb-command:run // gdb-command:run
@ -227,7 +227,7 @@
#![omit_gdb_pretty_printer_section] #![omit_gdb_pretty_printer_section]
fn immediate_args(a: isize, b: bool, c: f64) { fn immediate_args(a: isize, b: bool, c: f64) {
::std::old_io::print("") // #break println!("") // #break
} }
struct BigStruct { struct BigStruct {
@ -242,21 +242,21 @@ struct BigStruct {
} }
fn non_immediate_args(a: BigStruct, b: BigStruct) { fn non_immediate_args(a: BigStruct, b: BigStruct) {
::std::old_io::print("") // #break println!("") // #break
} }
fn binding(a: i64, b: u64, c: f64) { fn binding(a: i64, b: u64, c: f64) {
let x = 0; // #break let x = 0; // #break
::std::old_io::print("") println!("")
} }
fn assignment(mut a: u64, b: u64, c: f64) { fn assignment(mut a: u64, b: u64, c: f64) {
a = b; // #break a = b; // #break
::std::old_io::print("") println!("")
} }
fn function_call(x: u64, y: u64, z: f64) { fn function_call(x: u64, y: u64, z: f64) {
std::old_io::stdio::print("Hi!") // #break println!("Hi!") // #break
} }
fn identifier(x: u64, y: u64, z: f64) -> u64 { fn identifier(x: u64, y: u64, z: f64) -> u64 {

View File

@ -11,17 +11,17 @@
// ignore-android: FIXME(#10381) // ignore-android: FIXME(#10381)
// min-lldb-version: 310 // min-lldb-version: 310
// This test case checks if function arguments already have the correct value when breaking at the // This test case checks if function arguments already have the correct value
// beginning of a function. Functions with the #[no_stack_check] attribute have the same prologue as // when breaking at the beginning of a function. Functions with the
// regular C functions compiled with GCC or Clang and therefore are better handled by GDB. As a // #[no_stack_check] attribute have the same prologue as regular C functions
// consequence, and as opposed to regular Rust functions, we can set the breakpoints via the // compiled with GCC or Clang and therefore are better handled by GDB. As a
// function name (and don't have to fall back on using line numbers). For LLDB this shouldn't make // consequence, and as opposed to regular Rust functions, we can set the
// a difference because it can handle both cases. // breakpoints via the function name (and don't have to fall back on using line
// numbers). For LLDB this shouldn't make a difference because it can handle
// both cases.
// compile-flags:-g // compile-flags:-g
#![feature(old_io)]
// === GDB TESTS =================================================================================== // === GDB TESTS ===================================================================================
// gdb-command:rbreak immediate_args // gdb-command:rbreak immediate_args
@ -251,7 +251,7 @@
#[no_stack_check] #[no_stack_check]
fn immediate_args(a: isize, b: bool, c: f64) { fn immediate_args(a: isize, b: bool, c: f64) {
::std::old_io::print(""); println!("");
} }
struct BigStruct { struct BigStruct {
@ -267,24 +267,24 @@ struct BigStruct {
#[no_stack_check] #[no_stack_check]
fn non_immediate_args(a: BigStruct, b: BigStruct) { fn non_immediate_args(a: BigStruct, b: BigStruct) {
::std::old_io::print(""); println!("");
} }
#[no_stack_check] #[no_stack_check]
fn binding(a: i64, b: u64, c: f64) { fn binding(a: i64, b: u64, c: f64) {
let x = 0; let x = 0;
::std::old_io::print(""); println!("");
} }
#[no_stack_check] #[no_stack_check]
fn assignment(mut a: u64, b: u64, c: f64) { fn assignment(mut a: u64, b: u64, c: f64) {
a = b; a = b;
::std::old_io::print(""); println!("");
} }
#[no_stack_check] #[no_stack_check]
fn function_call(x: u64, y: u64, z: f64) { fn function_call(x: u64, y: u64, z: f64) {
std::old_io::stdio::print("Hi!") println!("Hi!")
} }
#[no_stack_check] #[no_stack_check]

View File

@ -23,5 +23,5 @@ extern crate issue13213aux;
// be available because they have been optimized out from the exporting crate. // be available because they have been optimized out from the exporting crate.
fn main() { fn main() {
let b: issue13213aux::S = issue13213aux::A; let b: issue13213aux::S = issue13213aux::A;
::std::old_io::println("Nothing to do here..."); println!("Nothing to do here...");
} }