summaryrefslogtreecommitdiffstats
path: root/library/backtrace/crates/line-tables-only
diff options
context:
space:
mode:
Diffstat (limited to 'library/backtrace/crates/line-tables-only')
-rw-r--r--library/backtrace/crates/line-tables-only/Cargo.toml21
-rw-r--r--library/backtrace/crates/line-tables-only/build.rs10
-rw-r--r--library/backtrace/crates/line-tables-only/src/callback.c14
-rw-r--r--library/backtrace/crates/line-tables-only/src/lib.rs57
4 files changed, 102 insertions, 0 deletions
diff --git a/library/backtrace/crates/line-tables-only/Cargo.toml b/library/backtrace/crates/line-tables-only/Cargo.toml
new file mode 100644
index 000000000..e2967d3d3
--- /dev/null
+++ b/library/backtrace/crates/line-tables-only/Cargo.toml
@@ -0,0 +1,21 @@
+[package]
+name = "line-tables-only"
+version = "0.1.0"
+edition = "2018"
+
+[build-dependencies]
+cc = "1.0"
+
+[dependencies]
+libc = { version = "0.2", default-features = false }
+
+[dependencies.backtrace]
+path = "../.."
+features = [
+ 'libunwind',
+ 'std',
+]
+
+[features]
+libbacktrace = ['backtrace/libbacktrace']
+gimli-symbolize = ['backtrace/gimli-symbolize']
diff --git a/library/backtrace/crates/line-tables-only/build.rs b/library/backtrace/crates/line-tables-only/build.rs
new file mode 100644
index 000000000..125fb7645
--- /dev/null
+++ b/library/backtrace/crates/line-tables-only/build.rs
@@ -0,0 +1,10 @@
+fn main() {
+ println!("cargo:rerun-if-changed=src/callback.c");
+
+ cc::Build::new()
+ .opt_level(0)
+ .debug(false)
+ .flag("-g1")
+ .file("src/callback.c")
+ .compile("libcallback.a");
+}
diff --git a/library/backtrace/crates/line-tables-only/src/callback.c b/library/backtrace/crates/line-tables-only/src/callback.c
new file mode 100644
index 000000000..c9d5d072a
--- /dev/null
+++ b/library/backtrace/crates/line-tables-only/src/callback.c
@@ -0,0 +1,14 @@
+
+typedef void (*callback) (void *data);
+
+void baz(callback cb, void *data) {
+ cb(data);
+}
+
+void bar(callback cb, void *data) {
+ baz(cb, data);
+}
+
+void foo(callback cb, void *data) {
+ bar(cb, data);
+}
diff --git a/library/backtrace/crates/line-tables-only/src/lib.rs b/library/backtrace/crates/line-tables-only/src/lib.rs
new file mode 100644
index 000000000..bd5afcb3a
--- /dev/null
+++ b/library/backtrace/crates/line-tables-only/src/lib.rs
@@ -0,0 +1,57 @@
+#[cfg(test)]
+mod tests {
+ use std::path::Path;
+ use backtrace::Backtrace;
+ use libc::c_void;
+
+ pub type Callback = extern "C" fn(data: *mut c_void);
+
+ extern "C" {
+ fn foo(cb: Callback, data: *mut c_void);
+ }
+
+ extern "C" fn store_backtrace(data: *mut c_void) {
+ let bt = backtrace::Backtrace::new();
+ unsafe { *(data as *mut Option<Backtrace>) = Some(bt) };
+ }
+
+ fn assert_contains(backtrace: &Backtrace,
+ expected_name: &str,
+ expected_file: &str,
+ expected_line: u32) {
+
+ let expected_file = Path::new(expected_file);
+
+ for frame in backtrace.frames() {
+ for symbol in frame.symbols() {
+ if let Some(name) = symbol.name() {
+ if name.as_bytes() == expected_name.as_bytes() {
+ assert!(symbol.filename().unwrap().ends_with(expected_file));
+ assert_eq!(symbol.lineno(), Some(expected_line));
+ return;
+ }
+ }
+ }
+ }
+
+ panic!("symbol {:?} not found in backtrace: {:?}", expected_name, backtrace);
+ }
+
+ /// Verifies that when debug info includes only lines tables the generated
+ /// backtrace is still generated successfully. The test exercises behaviour
+ /// that failed previously when compiling with clang -g1.
+ ///
+ /// The test case uses C rather than rust, since at that time when it was
+ /// written the debug info generated at level 1 in rustc was essentially
+ /// the same as at level 2.
+ #[test]
+ #[cfg_attr(windows, ignore)]
+ fn backtrace_works_with_line_tables_only() {
+ let mut backtrace: Option<Backtrace> = None;
+ unsafe { foo(store_backtrace, &mut backtrace as *mut _ as *mut c_void) };
+ let backtrace = backtrace.expect("backtrace");
+ assert_contains(&backtrace, "foo", "src/callback.c", 13);
+ assert_contains(&backtrace, "bar", "src/callback.c", 9);
+ assert_contains(&backtrace, "baz", "src/callback.c", 5);
+ }
+}