Merge pull request #16 from oli-obk/logs
use the `log` crate + `env_logger`
This commit is contained in:
commit
66a812f3e1
6 changed files with 180 additions and 34 deletions
108
Cargo.lock
generated
108
Cargo.lock
generated
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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<String> = 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:<indentation$} {text}",
|
||||
lvl = record.level(),
|
||||
module = record.location().module_path(),
|
||||
depth = indentation / NSPACES,
|
||||
indentation = indentation % NSPACES,
|
||||
indent = "",
|
||||
text = record.args())
|
||||
};
|
||||
|
||||
let mut builder = env_logger::LogBuilder::new();
|
||||
builder.format(format).filter(None, log::LogLevelFilter::Info);
|
||||
|
||||
if std::env::var("MIRI_LOG").is_ok() {
|
||||
builder.parse(&std::env::var("MIRI_LOG").unwrap());
|
||||
}
|
||||
|
||||
builder.init().unwrap();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,8 +20,6 @@ use error::{EvalError, EvalResult};
|
|||
use memory::{Memory, Pointer};
|
||||
use primval::{self, PrimVal};
|
||||
|
||||
const TRACE_EXECUTION: bool = true;
|
||||
|
||||
struct GlobalEvalContext<'a, 'tcx: 'a> {
|
||||
/// 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<F>(&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!("");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue