diff --git a/Cargo.lock b/Cargo.lock index 4827e7fd8a6a..c5518b1238a2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,7 +3,18 @@ name = "miri" version = "0.1.0" dependencies = [ "byteorder 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "compiletest_rs 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "compiletest_rs 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log_settings 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "aho-corasick" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -13,14 +24,107 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "compiletest_rs" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "env_logger" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.1.71 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "lazy_static" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "libc" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "log" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "log_settings" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "memchr" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex" +version = "0.1.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "aho-corasick 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex-syntax" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "thread-id" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "thread_local" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "utf8-ranges" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + diff --git a/Cargo.toml b/Cargo.toml index 66bbc729e15f..5a8211230fa8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,9 @@ test = false [dependencies] byteorder = "0.4.2" +env_logger = "0.3.3" +log = "0.3.6" +log_settings = "0.1.1" [dev-dependencies] compiletest_rs = "0.1.1" diff --git a/src/bin/miri.rs b/src/bin/miri.rs index 49d49650ea5c..34a8c1b2be87 100644 --- a/src/bin/miri.rs +++ b/src/bin/miri.rs @@ -5,6 +5,9 @@ extern crate getopts; extern crate miri; extern crate rustc; extern crate rustc_driver; +extern crate env_logger; +extern crate log_settings; +extern crate log; use miri::interpreter; use rustc::session::Session; @@ -31,6 +34,32 @@ impl<'a> CompilerCalls<'a> for MiriCompilerCalls { #[miri_run] fn main() { + init_logger(); let args: Vec = std::env::args().collect(); rustc_driver::run_compiler(&args, &mut MiriCompilerCalls); } + +#[miri_run] +fn init_logger() { + const NSPACES: usize = 40; + let format = |record: &log::LogRecord| { + // prepend spaces to indent the final string + let indentation = log_settings::settings().indentation; + format!("{lvl}:{module}{depth:2}{indent: { /// The results of the type checker, from rustc. tcx: TyCtxt<'a, 'tcx, 'tcx>, @@ -168,32 +166,24 @@ impl<'a, 'b, 'mir, 'tcx> FnEvalContext<'a, 'b, 'mir, 'tcx> { r } - fn log(&self, extra_indent: usize, f: F) where F: FnOnce() { - let indent = self.stack.len() + extra_indent; - if !TRACE_EXECUTION { return; } - for _ in 0..indent { print!(" "); } - f(); - println!(""); - } - fn run(&mut self) -> EvalResult<()> { 'outer: while !self.stack.is_empty() { let mut current_block = self.frame().next_block; loop { - self.log(0, || print!("// {:?}", current_block)); + trace!("// {:?}", current_block); let current_mir = self.mir().clone(); // Cloning a reference. let block_data = current_mir.basic_block_data(current_block); for stmt in &block_data.statements { - self.log(0, || print!("{:?}", stmt)); + trace!("{:?}", stmt); let mir::StatementKind::Assign(ref lvalue, ref rvalue) = stmt.kind; let result = self.eval_assignment(lvalue, rvalue); self.maybe_report(stmt.span, result)?; } let terminator = block_data.terminator(); - self.log(0, || print!("{:?}", terminator.kind)); + trace!("{:?}", terminator.kind); let result = self.eval_terminator(terminator); match self.maybe_report(terminator.span, result)? { @@ -245,6 +235,8 @@ impl<'a, 'b, 'mir, 'tcx> FnEvalContext<'a, 'b, 'mir, 'tcx> { let num_args = mir.arg_decls.len(); let num_vars = mir.var_decls.len(); + ::log_settings::settings().indentation += 1; + self.stack.push(Frame { mir: mir.clone(), next_block: mir::START_BLOCK, @@ -256,6 +248,7 @@ impl<'a, 'b, 'mir, 'tcx> FnEvalContext<'a, 'b, 'mir, 'tcx> { } fn pop_stack_frame(&mut self) { + ::log_settings::settings().indentation -= 1; let _frame = self.stack.pop().expect("tried to pop a stack frame, but there were none"); // TODO(solson): Deallocate local variables. self.substs_stack.pop(); @@ -419,10 +412,10 @@ impl<'a, 'b, 'mir, 'tcx> FnEvalContext<'a, 'b, 'mir, 'tcx> { fn drop(&mut self, ptr: Pointer, ty: Ty<'tcx>) -> EvalResult<()> { if !self.type_needs_drop(ty) { - self.log(1, || print!("no need to drop {:?}", ty)); + debug!("no need to drop {:?}", ty); return Ok(()); } - self.log(1, || print!("need to drop {:?}", ty)); + trace!("-need to drop {:?}", ty); // TODO(solson): Call user-defined Drop::drop impls. @@ -431,7 +424,7 @@ impl<'a, 'b, 'mir, 'tcx> FnEvalContext<'a, 'b, 'mir, 'tcx> { match self.memory.read_ptr(ptr) { Ok(contents_ptr) => { self.drop(contents_ptr, contents_ty)?; - self.log(1, || print!("deallocating box")); + trace!("-deallocating box"); self.memory.deallocate(contents_ptr)?; } Err(EvalError::ReadBytesAsPointer) => { @@ -1421,32 +1414,29 @@ pub fn interpret_start_points<'a, 'tcx>( tcx: TyCtxt<'a, 'tcx, 'tcx>, mir_map: &MirMap<'tcx>, ) { + let initial_indentation = ::log_settings::settings().indentation; for (&id, mir) in &mir_map.map { for attr in tcx.map.attrs(id) { use syntax::attr::AttrMetaMethods; if attr.check_name("miri_run") { let item = tcx.map.expect_item(id); - if TRACE_EXECUTION { - println!("Interpreting: {}", item.name); - } + ::log_settings::settings().indentation = initial_indentation; + + debug!("Interpreting: {}", item.name); let mut gecx = GlobalEvalContext::new(tcx, mir_map); let mut fecx = FnEvalContext::new(&mut gecx); match fecx.call_nested(mir) { - Ok(Some(return_ptr)) => if TRACE_EXECUTION { + Ok(Some(return_ptr)) => if log_enabled!(::log::LogLevel::Debug) { fecx.memory.dump(return_ptr.alloc_id); }, - Ok(None) => println!("(diverging function returned)"), + Ok(None) => warn!("diverging function returned"), Err(_e) => { // TODO(solson): Detect whether the error was already reported or not. // tcx.sess.err(&e.to_string()); } } - - if TRACE_EXECUTION { - println!(""); - } } } } diff --git a/src/lib.rs b/src/lib.rs index 623ed14be76e..80d89c164ac5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,6 +12,8 @@ #[macro_use] extern crate rustc; extern crate rustc_mir; extern crate syntax; +#[macro_use] extern crate log; +extern crate log_settings; // From crates.io. extern crate byteorder; diff --git a/tests/run-fail/inception.rs b/tests/run-fail/inception.rs index 25eb72aa04c2..f0fb4113f1f7 100644 --- a/tests/run-fail/inception.rs +++ b/tests/run-fail/inception.rs @@ -9,14 +9,32 @@ fn run_miri(file: &str, sysroot: &str) -> Output { let libpath = libpath.to_str().unwrap(); let libpath2 = path.join("target").join("debug").join("deps"); let libpath2 = libpath2.to_str().unwrap(); + let mut args = vec![ + "run".to_string(), "--".to_string(), + "--sysroot".to_string(), sysroot.to_string(), + "-L".to_string(), libpath.to_string(), + "-L".to_string(), libpath2.to_string(), + file.to_string() + ]; + for file in std::fs::read_dir("target/debug/deps").unwrap() { + let file = file.unwrap(); + if file.file_type().unwrap().is_file() { + let path = file.path(); + if let Some(ext) = path.extension() { + if ext == "rlib" { + let name = path.file_stem().unwrap().to_str().unwrap(); + if let Some(dash) = name.rfind('-') { + if name.starts_with("lib") { + args.push("--extern".to_string()); + args.push(format!("{}={}", &name[3..dash], path.to_str().unwrap())); + } + } + } + } + } + } Command::new("cargo") - .args(&[ - "run", "--", - "--sysroot", sysroot, - "-L", libpath, - "-L", libpath2, - file - ]) + .args(&args) .output() .unwrap_or_else(|e| panic!("failed to execute process: {}", e)) }