From 5eb44dbe1abb476dc4f39cb0070c6670804a324e Mon Sep 17 00:00:00 2001 From: leo60228 Date: Fri, 17 Jul 2020 22:24:20 -0400 Subject: [PATCH 1/8] Disable libbacktrace on DevkitA64 --- crates/backtrace-sys/build.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/backtrace-sys/build.rs b/crates/backtrace-sys/build.rs index cddfab701..b29221e65 100644 --- a/crates/backtrace-sys/build.rs +++ b/crates/backtrace-sys/build.rs @@ -14,7 +14,8 @@ fn main() { target.contains("hermit") || target.contains("wasm32") || target.contains("fuchsia") || - target.contains("uclibc") + target.contains("uclibc") || + target.contains("devkita64") { println!("cargo:rustc-cfg=empty"); return; From f0a1a8a1900c0a81272bc448e677ad527b0d96d4 Mon Sep 17 00:00:00 2001 From: leo60228 Date: Sun, 19 Jul 2020 16:01:26 -0400 Subject: [PATCH 2/8] Force noop symbolizer on DevkitA64 (for now) --- src/symbolize/mod.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/symbolize/mod.rs b/src/symbolize/mod.rs index d1709a93c..7096e610b 100644 --- a/src/symbolize/mod.rs +++ b/src/symbolize/mod.rs @@ -467,6 +467,7 @@ cfg_if::cfg_if! { not(target_os = "fuchsia"), not(target_os = "emscripten"), not(target_env = "uclibc"), + not(target_env = "devkita64"), ))] { mod libbacktrace; use self::libbacktrace::resolve as resolve_imp; @@ -476,6 +477,7 @@ cfg_if::cfg_if! { feature = "gimli-symbolize", any(unix, windows), not(target_os = "emscripten"), + not(target_env = "devkita64"), ))] { mod gimli; use self::gimli::resolve as resolve_imp; From cb67a05549e2b45a4a2fbc5375d827e113b287f8 Mon Sep 17 00:00:00 2001 From: leo60228 Date: Sun, 19 Jul 2020 17:41:30 -0400 Subject: [PATCH 3/8] Add support for linkle's DWARF format to gimli symbolizer --- src/symbolize/gimli.rs | 35 ++++++++++++++++++++++++++++++-- src/symbolize/gimli/mmap_fake.rs | 26 ++++++++++++++++++++++++ src/symbolize/mod.rs | 1 - 3 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 src/symbolize/gimli/mmap_fake.rs diff --git a/src/symbolize/gimli.rs b/src/symbolize/gimli.rs index 1bb972992..ccf651a45 100644 --- a/src/symbolize/gimli.rs +++ b/src/symbolize/gimli.rs @@ -31,9 +31,12 @@ extern crate std as mystd; #[cfg(windows)] #[path = "gimli/mmap_windows.rs"] mod mmap; -#[cfg(unix)] +#[cfg(all(unix, not(target_env = "devkita64")))] #[path = "gimli/mmap_unix.rs"] mod mmap; +#[cfg(target_env = "devkita64")] +#[path = "gimli/mmap_fake.rs"] +mod mmap; mod stash; const MAPPINGS_CACHE_SIZE: usize = 4; @@ -386,6 +389,34 @@ cfg_if::cfg_if! { }); 0 } + } else if #[cfg(target_env = "devkita64")] { + // DevkitA64 doesn't natively support debug info, but the build system will place debug + // info at the path `romfs:/debug_info.elf`. + mod elf; + use self::elf::Object; + + fn native_libraries() -> Vec { + extern "C" { + static __start__: u8; + } + + let mut ret = Vec::new(); + let mut segments = Vec::new(); + segments.push(LibrarySegment { + stated_virtual_memory_address: 0, + len: usize::max_value(), + }); + + let path = "romfs:/debug_info.elf"; + let bias = unsafe { &__start__ } as *const u8 as usize; + ret.push(Library { + name: path.into(), + segments, + bias, + }); + + ret + } } else { // Everything else should use ELF, but doesn't know how to load native // libraries. @@ -487,7 +518,7 @@ impl Cache { if !lib.segments.iter().any(|s| { let svma = s.stated_virtual_memory_address; let start = svma.wrapping_add(lib.bias); - let end = start.wrapping_add(s.len); + let end = start.saturating_add(s.len); let address = addr as usize; start <= address && address < end }) { diff --git a/src/symbolize/gimli/mmap_fake.rs b/src/symbolize/gimli/mmap_fake.rs new file mode 100644 index 000000000..ed7d7eee2 --- /dev/null +++ b/src/symbolize/gimli/mmap_fake.rs @@ -0,0 +1,26 @@ +use super::{File, mystd::io::Read}; +use core::ops::Deref; +use alloc::vec::Vec; + +pub struct Mmap { + vec: Vec, +} + +impl Mmap { + pub unsafe fn map(mut file: &File, len: usize) -> Option { + let mut mmap = Mmap { + vec: Vec::new(), + }; + file.read_to_end(&mut mmap.vec).ok()?; + mmap.vec.truncate(len); + Some(mmap) + } +} + +impl Deref for Mmap { + type Target = [u8]; + + fn deref(&self) -> &[u8] { + &self.vec[..] + } +} diff --git a/src/symbolize/mod.rs b/src/symbolize/mod.rs index 7096e610b..b4d845616 100644 --- a/src/symbolize/mod.rs +++ b/src/symbolize/mod.rs @@ -477,7 +477,6 @@ cfg_if::cfg_if! { feature = "gimli-symbolize", any(unix, windows), not(target_os = "emscripten"), - not(target_env = "devkita64"), ))] { mod gimli; use self::gimli::resolve as resolve_imp; From 9eb9aaa28105b36d23106c83bf96d76751f828b2 Mon Sep 17 00:00:00 2001 From: leo60228 Date: Mon, 20 Jul 2020 15:59:43 -0400 Subject: [PATCH 4/8] fmt --- src/symbolize/gimli/mmap_fake.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/symbolize/gimli/mmap_fake.rs b/src/symbolize/gimli/mmap_fake.rs index ed7d7eee2..7db8c98f6 100644 --- a/src/symbolize/gimli/mmap_fake.rs +++ b/src/symbolize/gimli/mmap_fake.rs @@ -1,6 +1,6 @@ -use super::{File, mystd::io::Read}; -use core::ops::Deref; +use super::{mystd::io::Read, File}; use alloc::vec::Vec; +use core::ops::Deref; pub struct Mmap { vec: Vec, @@ -8,9 +8,7 @@ pub struct Mmap { impl Mmap { pub unsafe fn map(mut file: &File, len: usize) -> Option { - let mut mmap = Mmap { - vec: Vec::new(), - }; + let mut mmap = Mmap { vec: Vec::new() }; file.read_to_end(&mut mmap.vec).ok()?; mmap.vec.truncate(len); Some(mmap) From 04184424c6ca44c3398344b7f8a1ea9d94309bc1 Mon Sep 17 00:00:00 2001 From: leo60228 Date: Mon, 20 Jul 2020 16:48:35 -0400 Subject: [PATCH 5/8] Address review --- crates/backtrace-sys/build.rs | 3 +-- src/symbolize/gimli.rs | 22 +++++++++++++--------- src/symbolize/gimli/mmap_fake.rs | 1 - src/symbolize/mod.rs | 1 - 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/crates/backtrace-sys/build.rs b/crates/backtrace-sys/build.rs index b29221e65..cddfab701 100644 --- a/crates/backtrace-sys/build.rs +++ b/crates/backtrace-sys/build.rs @@ -14,8 +14,7 @@ fn main() { target.contains("hermit") || target.contains("wasm32") || target.contains("fuchsia") || - target.contains("uclibc") || - target.contains("devkita64") + target.contains("uclibc") { println!("cargo:rustc-cfg=empty"); return; diff --git a/src/symbolize/gimli.rs b/src/symbolize/gimli.rs index ccf651a45..2c21326e2 100644 --- a/src/symbolize/gimli.rs +++ b/src/symbolize/gimli.rs @@ -28,15 +28,19 @@ mod mystd { #[cfg(not(backtrace_in_libstd))] extern crate std as mystd; -#[cfg(windows)] -#[path = "gimli/mmap_windows.rs"] -mod mmap; -#[cfg(all(unix, not(target_env = "devkita64")))] -#[path = "gimli/mmap_unix.rs"] -mod mmap; -#[cfg(target_env = "devkita64")] -#[path = "gimli/mmap_fake.rs"] -mod mmap; +cfg_if::cfg_if! { + if #[cfg(windows)] { + #[path = "gimli/mmap_windows.rs"] + mod mmap; + } else if #[cfg(target_env = "devkita64")] { + #[path = "gimli/mmap_fake.rs"] + mod mmap; + } else { + #[path = "gimli/mmap_unix.rs"] + mod mmap; + } +} + mod stash; const MAPPINGS_CACHE_SIZE: usize = 4; diff --git a/src/symbolize/gimli/mmap_fake.rs b/src/symbolize/gimli/mmap_fake.rs index 7db8c98f6..ba8acc987 100644 --- a/src/symbolize/gimli/mmap_fake.rs +++ b/src/symbolize/gimli/mmap_fake.rs @@ -10,7 +10,6 @@ impl Mmap { pub unsafe fn map(mut file: &File, len: usize) -> Option { let mut mmap = Mmap { vec: Vec::new() }; file.read_to_end(&mut mmap.vec).ok()?; - mmap.vec.truncate(len); Some(mmap) } } diff --git a/src/symbolize/mod.rs b/src/symbolize/mod.rs index b4d845616..d1709a93c 100644 --- a/src/symbolize/mod.rs +++ b/src/symbolize/mod.rs @@ -467,7 +467,6 @@ cfg_if::cfg_if! { not(target_os = "fuchsia"), not(target_os = "emscripten"), not(target_env = "uclibc"), - not(target_env = "devkita64"), ))] { mod libbacktrace; use self::libbacktrace::resolve as resolve_imp; From 72e9c33957d894fdb3e968c3a84b324eb73eba81 Mon Sep 17 00:00:00 2001 From: leo60228 Date: Mon, 20 Jul 2020 17:00:43 -0400 Subject: [PATCH 6/8] Subtract bias from len, revert back to wrapping_add --- src/symbolize/gimli.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/symbolize/gimli.rs b/src/symbolize/gimli.rs index 2c21326e2..82c758b43 100644 --- a/src/symbolize/gimli.rs +++ b/src/symbolize/gimli.rs @@ -404,15 +404,16 @@ cfg_if::cfg_if! { static __start__: u8; } + let bias = unsafe { &__start__ } as *const u8 as usize; + let mut ret = Vec::new(); let mut segments = Vec::new(); segments.push(LibrarySegment { stated_virtual_memory_address: 0, - len: usize::max_value(), + len: usize::max_value() - bias, }); let path = "romfs:/debug_info.elf"; - let bias = unsafe { &__start__ } as *const u8 as usize; ret.push(Library { name: path.into(), segments, @@ -522,7 +523,7 @@ impl Cache { if !lib.segments.iter().any(|s| { let svma = s.stated_virtual_memory_address; let start = svma.wrapping_add(lib.bias); - let end = start.saturating_add(s.len); + let end = start.wrapping_add(s.len); let address = addr as usize; start <= address && address < end }) { From 286dd51be1e7b3307ca24cfbeece200e01cc74e1 Mon Sep 17 00:00:00 2001 From: leo60228 Date: Mon, 20 Jul 2020 17:09:15 -0400 Subject: [PATCH 7/8] Use Vec::with_capacity in mmap_fake --- src/symbolize/gimli/mmap_fake.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/symbolize/gimli/mmap_fake.rs b/src/symbolize/gimli/mmap_fake.rs index ba8acc987..da686fbbb 100644 --- a/src/symbolize/gimli/mmap_fake.rs +++ b/src/symbolize/gimli/mmap_fake.rs @@ -8,7 +8,7 @@ pub struct Mmap { impl Mmap { pub unsafe fn map(mut file: &File, len: usize) -> Option { - let mut mmap = Mmap { vec: Vec::new() }; + let mut mmap = Mmap { vec: Vec::with_capacity(len) }; file.read_to_end(&mut mmap.vec).ok()?; Some(mmap) } From 79bfe14fca6e7e4b467468f4b57d1ec3edd3e27c Mon Sep 17 00:00:00 2001 From: leo60228 Date: Mon, 20 Jul 2020 17:12:25 -0400 Subject: [PATCH 8/8] fmt --- src/symbolize/gimli/mmap_fake.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/symbolize/gimli/mmap_fake.rs b/src/symbolize/gimli/mmap_fake.rs index da686fbbb..ce5096415 100644 --- a/src/symbolize/gimli/mmap_fake.rs +++ b/src/symbolize/gimli/mmap_fake.rs @@ -8,7 +8,9 @@ pub struct Mmap { impl Mmap { pub unsafe fn map(mut file: &File, len: usize) -> Option { - let mut mmap = Mmap { vec: Vec::with_capacity(len) }; + let mut mmap = Mmap { + vec: Vec::with_capacity(len), + }; file.read_to_end(&mut mmap.vec).ok()?; Some(mmap) }