summaryrefslogtreecommitdiffstats
path: root/library/backtrace/tests
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
commitef24de24a82fe681581cc130f342363c47c0969a (patch)
tree0d494f7e1a38b95c92426f58fe6eaa877303a86c /library/backtrace/tests
parentReleasing progress-linux version 1.74.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-ef24de24a82fe681581cc130f342363c47c0969a.tar.xz
rustc-ef24de24a82fe681581cc130f342363c47c0969a.zip
Merging upstream version 1.75.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'library/backtrace/tests')
-rw-r--r--library/backtrace/tests/accuracy/main.rs4
-rw-r--r--library/backtrace/tests/sgx-image-base.rs56
-rw-r--r--library/backtrace/tests/smoke.rs51
3 files changed, 90 insertions, 21 deletions
diff --git a/library/backtrace/tests/accuracy/main.rs b/library/backtrace/tests/accuracy/main.rs
index 149203a1b..79b2d3797 100644
--- a/library/backtrace/tests/accuracy/main.rs
+++ b/library/backtrace/tests/accuracy/main.rs
@@ -31,6 +31,8 @@ fn doit() {
dir.push("dylib_dep.dll");
} else if cfg!(target_os = "macos") {
dir.push("libdylib_dep.dylib");
+ } else if cfg!(target_os = "aix") {
+ dir.push("libdylib_dep.a");
} else {
dir.push("libdylib_dep.so");
}
@@ -103,7 +105,7 @@ fn verify(filelines: &[Pos]) {
loop {
let sym = match symbols.next() {
Some(sym) => sym,
- None => panic!("failed to find {}:{}", file, line),
+ None => panic!("failed to find {file}:{line}"),
};
if let Some(filename) = sym.filename() {
if let Some(lineno) = sym.lineno() {
diff --git a/library/backtrace/tests/sgx-image-base.rs b/library/backtrace/tests/sgx-image-base.rs
new file mode 100644
index 000000000..c29a8b67a
--- /dev/null
+++ b/library/backtrace/tests/sgx-image-base.rs
@@ -0,0 +1,56 @@
+#![cfg(all(target_env = "sgx", target_vendor = "fortanix"))]
+#![feature(sgx_platform)]
+
+#[cfg(feature = "std")]
+#[test]
+fn sgx_image_base_with_std() {
+ use backtrace::trace;
+
+ let image_base = std::os::fortanix_sgx::mem::image_base();
+
+ let mut frame_ips = Vec::new();
+ trace(|frame| {
+ frame_ips.push(frame.ip());
+ true
+ });
+
+ assert!(frame_ips.len() > 0);
+ for ip in frame_ips {
+ let ip: u64 = ip as _;
+ assert!(ip < image_base);
+ }
+}
+
+#[cfg(not(feature = "std"))]
+#[test]
+fn sgx_image_base_no_std() {
+ use backtrace::trace_unsynchronized;
+
+ fn guess_image_base() -> u64 {
+ let mut top_frame_ip = None;
+ unsafe {
+ trace_unsynchronized(|frame| {
+ top_frame_ip = Some(frame.ip());
+ false
+ });
+ }
+ top_frame_ip.unwrap() as u64 & 0xFFFFFF000000
+ }
+
+ let image_base = guess_image_base();
+ backtrace::set_image_base(image_base as _);
+
+ let mut frame_ips = Vec::new();
+ unsafe {
+ trace_unsynchronized(|frame| {
+ frame_ips.push(frame.ip());
+ true
+ });
+ }
+
+ assert!(frame_ips.len() > 0);
+ for ip in frame_ips {
+ let ip: u64 = ip as _;
+ assert!(ip < image_base);
+ }
+}
diff --git a/library/backtrace/tests/smoke.rs b/library/backtrace/tests/smoke.rs
index 683a6f0db..715f567f3 100644
--- a/library/backtrace/tests/smoke.rs
+++ b/library/backtrace/tests/smoke.rs
@@ -1,6 +1,27 @@
use backtrace::Frame;
use std::thread;
+fn get_actual_fn_pointer(fp: usize) -> usize {
+ // On AIX, the function name references a function descriptor.
+ // A function descriptor consists of (See https://reviews.llvm.org/D62532)
+ // * The address of the entry point of the function.
+ // * The TOC base address for the function.
+ // * The environment pointer.
+ // Deref `fp` directly so that we can get the address of `fp`'s
+ // entry point in text section.
+ //
+ // For TOC, one can find more information in
+ // https://www.ibm.com/docs/en/aix/7.2?topic=program-understanding-programming-toc
+ if cfg!(target_os = "aix") {
+ unsafe {
+ let actual_fn_entry = *(fp as *const usize);
+ actual_fn_entry
+ }
+ } else {
+ fp
+ }
+}
+
#[test]
// FIXME: shouldn't ignore this test on i686-msvc, unsure why it's failing
#[cfg_attr(all(target_arch = "x86", target_env = "msvc"), ignore)]
@@ -20,7 +41,7 @@ fn smoke_test_frames() {
// Various platforms have various bits of weirdness about their
// backtraces. To find a good starting spot let's search through the
// frames
- let target = frame_4 as usize;
+ let target = get_actual_fn_pointer(frame_4 as usize);
let offset = v
.iter()
.map(|frame| frame.symbol_address() as usize)
@@ -39,7 +60,7 @@ fn smoke_test_frames() {
assert_frame(
frames.next().unwrap(),
- frame_4 as usize,
+ get_actual_fn_pointer(frame_4 as usize),
"frame_4",
"tests/smoke.rs",
start_line + 6,
@@ -47,7 +68,7 @@ fn smoke_test_frames() {
);
assert_frame(
frames.next().unwrap(),
- frame_3 as usize,
+ get_actual_fn_pointer(frame_3 as usize),
"frame_3",
"tests/smoke.rs",
start_line + 3,
@@ -55,7 +76,7 @@ fn smoke_test_frames() {
);
assert_frame(
frames.next().unwrap(),
- frame_2 as usize,
+ get_actual_fn_pointer(frame_2 as usize),
"frame_2",
"tests/smoke.rs",
start_line + 2,
@@ -63,7 +84,7 @@ fn smoke_test_frames() {
);
assert_frame(
frames.next().unwrap(),
- frame_1 as usize,
+ get_actual_fn_pointer(frame_1 as usize),
"frame_1",
"tests/smoke.rs",
start_line + 1,
@@ -71,7 +92,7 @@ fn smoke_test_frames() {
);
assert_frame(
frames.next().unwrap(),
- smoke_test_frames as usize,
+ get_actual_fn_pointer(smoke_test_frames as usize),
"smoke_test_frames",
"",
0,
@@ -150,9 +171,7 @@ fn smoke_test_frames() {
if cfg!(debug_assertions) {
assert!(
name.contains(expected_name),
- "didn't find `{}` in `{}`",
- expected_name,
- name
+ "didn't find `{expected_name}` in `{name}`"
);
}
@@ -164,18 +183,13 @@ fn smoke_test_frames() {
if !expected_file.is_empty() {
assert!(
file.ends_with(expected_file),
- "{:?} didn't end with {:?}",
- file,
- expected_file
+ "{file:?} didn't end with {expected_file:?}"
);
}
if expected_line != 0 {
assert!(
line == expected_line,
- "bad line number on frame for `{}`: {} != {}",
- expected_name,
- line,
- expected_line
+ "bad line number on frame for `{expected_name}`: {line} != {expected_line}"
);
}
@@ -185,10 +199,7 @@ fn smoke_test_frames() {
if expected_col != 0 {
assert!(
col == expected_col,
- "bad column number on frame for `{}`: {} != {}",
- expected_name,
- col,
- expected_col
+ "bad column number on frame for `{expected_name}`: {col} != {expected_col}",
);
}
}