diff options
Diffstat (limited to 'vendor/backtrace/tests/accuracy/main.rs')
-rw-r--r-- | vendor/backtrace/tests/accuracy/main.rs | 117 |
1 files changed, 0 insertions, 117 deletions
diff --git a/vendor/backtrace/tests/accuracy/main.rs b/vendor/backtrace/tests/accuracy/main.rs deleted file mode 100644 index 149203a..0000000 --- a/vendor/backtrace/tests/accuracy/main.rs +++ /dev/null @@ -1,117 +0,0 @@ -mod auxiliary; - -macro_rules! pos { - () => { - (file!(), line!()) - }; -} - -macro_rules! check { - ($($pos:expr),*) => ({ - verify(&[$($pos,)* pos!()]); - }) -} - -type Pos = (&'static str, u32); - -#[test] -fn doit() { - if - // Skip musl which is by default statically linked and doesn't support - // dynamic libraries. - !cfg!(target_env = "musl") - // Skip Miri, since it doesn't support dynamic libraries. - && !cfg!(miri) - { - // TODO(#238) this shouldn't have to happen first in this function, but - // currently it does. - let mut dir = std::env::current_exe().unwrap(); - dir.pop(); - if cfg!(windows) { - dir.push("dylib_dep.dll"); - } else if cfg!(target_os = "macos") { - dir.push("libdylib_dep.dylib"); - } else { - dir.push("libdylib_dep.so"); - } - unsafe { - let lib = libloading::Library::new(&dir).unwrap(); - let api = lib.get::<extern "C" fn(Pos, fn(Pos, Pos))>(b"foo").unwrap(); - api(pos!(), |a, b| { - check!(a, b); - }); - } - } - - outer(pos!()); -} - -#[inline(never)] -fn outer(main_pos: Pos) { - inner(main_pos, pos!()); - inner_inlined(main_pos, pos!()); -} - -#[inline(never)] -#[rustfmt::skip] -fn inner(main_pos: Pos, outer_pos: Pos) { - check!(main_pos, outer_pos); - check!(main_pos, outer_pos); - let inner_pos = pos!(); auxiliary::callback(|aux_pos| { - check!(main_pos, outer_pos, inner_pos, aux_pos); - }); - let inner_pos = pos!(); auxiliary::callback_inlined(|aux_pos| { - check!(main_pos, outer_pos, inner_pos, aux_pos); - }); -} - -#[inline(always)] -#[rustfmt::skip] -fn inner_inlined(main_pos: Pos, outer_pos: Pos) { - check!(main_pos, outer_pos); - check!(main_pos, outer_pos); - - #[inline(always)] - fn inner_further_inlined(main_pos: Pos, outer_pos: Pos, inner_pos: Pos) { - check!(main_pos, outer_pos, inner_pos); - } - inner_further_inlined(main_pos, outer_pos, pos!()); - - let inner_pos = pos!(); auxiliary::callback(|aux_pos| { - check!(main_pos, outer_pos, inner_pos, aux_pos); - }); - let inner_pos = pos!(); auxiliary::callback_inlined(|aux_pos| { - check!(main_pos, outer_pos, inner_pos, aux_pos); - }); - - // this tests a distinction between two independent calls to the inlined function. - // (un)fortunately, LLVM somehow merges two consecutive such calls into one node. - inner_further_inlined(main_pos, outer_pos, pos!()); -} - -fn verify(filelines: &[Pos]) { - let trace = backtrace::Backtrace::new(); - println!("-----------------------------------"); - println!("looking for:"); - for (file, line) in filelines.iter().rev() { - println!("\t{}:{}", file, line); - } - println!("found:\n{:?}", trace); - let mut symbols = trace.frames().iter().flat_map(|frame| frame.symbols()); - let mut iter = filelines.iter().rev(); - while let Some((file, line)) = iter.next() { - loop { - let sym = match symbols.next() { - Some(sym) => sym, - None => panic!("failed to find {}:{}", file, line), - }; - if let Some(filename) = sym.filename() { - if let Some(lineno) = sym.lineno() { - if filename.ends_with(file) && lineno == *line { - break; - } - } - } - } - } -} |