From 737969f70053028932744b923837c54d27509cf7 Mon Sep 17 00:00:00 2001 From: Arpad Borsos Date: Thu, 10 Sep 2020 15:22:40 +0200 Subject: [PATCH 1/4] fix: Use patched versions of cpp/msvc demanglers --- symbolic-demangle/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/symbolic-demangle/Cargo.toml b/symbolic-demangle/Cargo.toml index c6dc4a488..be8701454 100644 --- a/symbolic-demangle/Cargo.toml +++ b/symbolic-demangle/Cargo.toml @@ -31,8 +31,8 @@ rust = ["rustc-demangle"] swift = ["cc"] [dependencies] -cpp_demangle = { version = "0.3.0", optional = true } -msvc-demangler = { version = "0.8.0", optional = true } +cpp_demangle = { git = "https://github.com/Swatinem/cpp_demangle", branch = "sentry-patches", version = "0.3.0", optional = true } +msvc-demangler = { git = "https://github.com/Swatinem/msvc-demangler-rust", branch = "sentry-patches", version = "0.8.0", optional = true } rustc-demangle = { version = "0.1.16", optional = true } symbolic-common = { version = "7.5.0", path = "../symbolic-common" } From 6d0ad2f28175b407eb57ff39ace3588479000256 Mon Sep 17 00:00:00 2001 From: Arpad Borsos Date: Mon, 23 Nov 2020 11:56:46 +0100 Subject: [PATCH 2/4] adopt to new cpp-demangle API --- symbolic-demangle/src/lib.rs | 8 +++++--- symbolic-demangle/tests/test_cpp.rs | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/symbolic-demangle/src/lib.rs b/symbolic-demangle/src/lib.rs index 29d6a35fd..49c1a9bdd 100644 --- a/symbolic-demangle/src/lib.rs +++ b/symbolic-demangle/src/lib.rs @@ -174,14 +174,16 @@ fn try_demangle_cpp(ident: &str, opts: DemangleOptions) -> Option { #[cfg(feature = "cpp")] { - use cpp_demangle::{DemangleOptions as CppOptions, Symbol as CppSymbol}; + use cpp_demangle::{DemangleOptions as CppOptions, ParseOptions, Symbol as CppSymbol}; - let symbol = match CppSymbol::new(ident) { + let parse_options = ParseOptions::default().recursion_limit(192); + let symbol = match CppSymbol::new_with_options(ident, &parse_options) { Ok(symbol) => symbol, Err(_) => return None, }; - let mut cpp_options = CppOptions::new(); + let mut cpp_options = CppOptions::new().recursion_limit(256); + if !opts.parameters { cpp_options = cpp_options.no_params(); } diff --git a/symbolic-demangle/tests/test_cpp.rs b/symbolic-demangle/tests/test_cpp.rs index a49728f30..851f51193 100644 --- a/symbolic-demangle/tests/test_cpp.rs +++ b/symbolic-demangle/tests/test_cpp.rs @@ -25,6 +25,20 @@ fn test_demangle_cpp() { }); } +#[test] +fn test_demangle_cpp_recursion() { + assert_demangle!(Language::Cpp, DemangleOptions::complete(), { + "_ZNK8xxxxxxxx14xxxxxxxxxxxxxxINS_14xxxxxxxxxxxxxxINS1_INS1_INS1_INS1_INS1_INS_10xxxxxxxxxxE32xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxEES3_EE22xxxxxxxxxxxxxxxxxxxxxxEES6_EE13xxxxxxxxxxxxxEE17xxxxxxxxxxxxxxxxxEE14xxxxxxxxxxxxxxE8xxxxxxxxE7xxxxxxxRKN4xxxx5xxxxxEb" => + "xxxxxxxx::xxxxxxxxxxxxxx, xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>, xxxxxxxxxxxxxxxxxxxxxx>, xxxxxxxxxxxxxxxxxxxxxx>, xxxxxxxxxxxxx>, xxxxxxxxxxxxxxxxx>, xxxxxxxxxxxxxx>::xxxxxxxx(xxxxxxx, xxxx::xxxxx const&, bool) const", + "_ZN5boost7variantIiJljdbNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_17basic_string_viewIcS4_EElmxyNS_10filesystem4pathEEEC2IS6_EEOT_PNS_9enable_ifINS_3mpl3or_INSG_4and_INS_19is_rvalue_referenceISE_EENSG_4not_INS_8is_constISD_EEEENSL_INS_7is_sameISD_SB_EEEENS_6detail7variant29is_variant_constructible_fromISE_NSG_6l_itemIN4mpl_5long_ILl12EEEiNSV_INSX_ILl11EEElNSV_INSX_ILl10EEEjNSV_INSX_ILl9EEEdNSV_INSX_ILl8EEEbNSV_INSX_ILl7EEES6_NSV_INSX_ILl6EEES8_NSV_INSX_ILl5EEElNSV_INSX_ILl4EEEmNSV_INSX_ILl3EEExNSV_INSX_ILl2EEEyNSV_INSX_ILl1EEESA_NSG_5l_endEEEEEEEEEEEEEEEEEEEEEEEEEEENSW_5bool_ILb1EEEEENSP_ISD_NS_18recursive_variant_EEENS1O_ILb0EEES1T_S1T_EEvE4typeE" => + "boost::variant, std::allocator >, boost::basic_string_view >, long, unsigned long, long long, unsigned long long, boost::filesystem::path>::variant, std::allocator > >(boost::enable_if, std::allocator >&&>, boost::mpl::not_, std::allocator > > >, boost::mpl::not_, std::allocator >, boost::variant, std::allocator >, boost::basic_string_view >, long, unsigned long, long long, unsigned long long, boost::filesystem::path> > >, boost::detail::variant::is_variant_constructible_from, std::allocator >&&, boost::mpl::l_item, int, boost::mpl::l_item, long, boost::mpl::l_item, unsigned int, boost::mpl::l_item, double, boost::mpl::l_item, bool, boost::mpl::l_item, std::__cxx11::basic_string, std::allocator >, boost::mpl::l_item, boost::basic_string_view >, boost::mpl::l_item, long, boost::mpl::l_item, unsigned long, boost::mpl::l_item, long long, boost::mpl::l_item, unsigned long long, boost::mpl::l_item, boost::filesystem::path, boost::mpl::l_end> > > > > > > > > > > > >, mpl_::bool_ >, boost::is_same, std::allocator >, boost::recursive_variant_>, mpl_::bool_, mpl_::bool_, mpl_::bool_ >, void>::type*)", + "_ZN5boost6detail7variant21make_initializer_node5applyINS_3mpl4pairINS3_INS5_INS3_INS5_INS3_INS5_INS3_INS5_INS3_INS5_INS1_16initializer_rootEN4mpl_4int_ILi0EEEEENS4_6l_iterINS4_6list12IixjdbNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_17basic_string_viewIcSG_EElmxyNS_10filesystem4pathEEEEEE16initializer_nodeENS8_ILi1EEEEENSB_INS4_6list11IxjdbSI_SK_lmxySM_EEEEE16initializer_nodeENS8_ILi2EEEEENSB_INS4_6list10IjdbSI_SK_lmxySM_EEEEE16initializer_nodeENS8_ILi3EEEEENSB_INS4_5list9IdbSI_SK_lmxySM_EEEEE16initializer_nodeENS8_ILi4EEEEENSB_INS4_5list8IbSI_SK_lmxySM_EEEEE16initializer_nodeENS8_ILi5EEEEENSB_INS4_5list7ISI_SK_lmxySM_EEEEE16initializer_node10initializeEPvRKSI_" => + "boost::detail::variant::make_initializer_node::apply >, boost::mpl::l_iter, std::allocator >, boost::basic_string_view >, long, unsigned long, long long, unsigned long long, boost::filesystem::path> > >::initializer_node, mpl_::int_<1> >, boost::mpl::l_iter, std::allocator >, boost::basic_string_view >, long, unsigned long, long long, unsigned long long, boost::filesystem::path> > >::initializer_node, mpl_::int_<2> >, boost::mpl::l_iter, std::allocator >, boost::basic_string_view >, long, unsigned long, long long, unsigned long long, boost::filesystem::path> > >::initializer_node, mpl_::int_<3> >, boost::mpl::l_iter, std::allocator >, boost::basic_string_view >, long, unsigned long, long long, unsigned long long, boost::filesystem::path> > >::initializer_node, mpl_::int_<4> >, boost::mpl::l_iter, std::allocator >, boost::basic_string_view >, long, unsigned long, long long, unsigned long long, boost::filesystem::path> > >::initializer_node, mpl_::int_<5> >, boost::mpl::l_iter, std::allocator >, boost::basic_string_view >, long, unsigned long, long long, unsigned long long, boost::filesystem::path> > >::initializer_node::initialize(void*, std::__cxx11::basic_string, std::allocator > const&)", + "_ZN5boost6detail7variant15visitation_implIN4mpl_4int_ILi0EEENS1_20visitation_impl_stepINS_3mpl6l_iterINS7_6l_itemINS3_5long_ILl12EEEiNS9_INSA_ILl11EEExNS9_INSA_ILl10EEEjNS9_INSA_ILl9EEEdNS9_INSA_ILl8EEEbNS9_INSA_ILl7EEENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS9_INSA_ILl6EEENS_17basic_string_viewIcSK_EENS9_INSA_ILl5EEElNS9_INSA_ILl4EEEmNS9_INSA_ILl3EEExNS9_INSA_ILl2EEEyNS9_INSA_ILl1EEENS_10filesystem4pathENS7_5l_endEEEEEEEEEEEEEEEEEEEEEEEEEEENS8_ISX_EEEENS_7variantIiJxjdbSM_SP_lmxySW_EE8assignerEPKvNS1E_18has_fallback_type_EEENT1_11result_typeEiiRS1J_T2_NS3_5bool_ILb0EEET3_PT_PT0_" => + "boost::variant, std::allocator >, boost::basic_string_view >, long, unsigned long, long long, unsigned long long, boost::filesystem::path>::assigner::result_type boost::detail::variant::visitation_impl, boost::detail::variant::visitation_impl_step, int, boost::mpl::l_item, long long, boost::mpl::l_item, unsigned int, boost::mpl::l_item, double, boost::mpl::l_item, bool, boost::mpl::l_item, std::__cxx11::basic_string, std::allocator >, boost::mpl::l_item, boost::basic_string_view >, boost::mpl::l_item, long, boost::mpl::l_item, unsigned long, boost::mpl::l_item, long long, boost::mpl::l_item, unsigned long long, boost::mpl::l_item, boost::filesystem::path, boost::mpl::l_end> > > > > > > > > > > > >, boost::mpl::l_iter >, boost::variant, std::allocator >, boost::basic_string_view >, long, unsigned long, long long, unsigned long long, boost::filesystem::path>::assigner, void const*, boost::variant, std::allocator >, boost::basic_string_view >, long, unsigned long, long long, unsigned long long, boost::filesystem::path>::has_fallback_type_>(int, int, boost::variant, std::allocator >, boost::basic_string_view >, long, unsigned long, long long, unsigned long long, boost::filesystem::path>::assigner&, void const*, mpl_::bool_, boost::variant, std::allocator >, boost::basic_string_view >, long, unsigned long, long long, unsigned long long, boost::filesystem::path>::has_fallback_type_, mpl_::int_<0>*, boost::detail::variant::visitation_impl_step, int, boost::mpl::l_item, long long, boost::mpl::l_item, unsigned int, boost::mpl::l_item, double, boost::mpl::l_item, bool, boost::mpl::l_item, std::__cxx11::basic_string, std::allocator >, boost::mpl::l_item, boost::basic_string_view >, boost::mpl::l_item, long, boost::mpl::l_item, unsigned long, boost::mpl::l_item, long long, boost::mpl::l_item, unsigned long long, boost::mpl::l_item, boost::filesystem::path, boost::mpl::l_end> > > > > > > > > > > > >, boost::mpl::l_iter >*)" + }); +} + #[test] fn test_demangle_cpp_no_args() { assert_demangle!(Language::Cpp, DemangleOptions::name_only(), { From 0c7e509ce6eb8d58797028c2387bc9065d5c9df7 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Sun, 29 Nov 2020 00:34:20 +0100 Subject: [PATCH 3/4] feat: Rename architecture to wasm32 (#294) --- symbolic-common/src/types.rs | 20 ++++++++++---------- symbolic-debuginfo/src/wasm.rs | 5 +++-- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/symbolic-common/src/types.rs b/symbolic-common/src/types.rs index 61a45c9a5..b31e19dd7 100644 --- a/symbolic-common/src/types.rs +++ b/symbolic-common/src/types.rs @@ -90,8 +90,8 @@ pub enum CpuFamily { Mips64 = 8, /// ILP32 ABI on 64-bit ARM. Arm64_32 = 9, - /// Virtual WASM architecture. - Wasm = 10, + /// Virtual WASM 32-bit architecture. + Wasm32 = 10, } impl CpuFamily { @@ -113,7 +113,7 @@ impl CpuFamily { pub fn pointer_size(self) -> Option { match self { CpuFamily::Unknown => None, - CpuFamily::Wasm => Some(4), + CpuFamily::Wasm32 => Some(4), CpuFamily::Amd64 | CpuFamily::Arm64 | CpuFamily::Ppc64 @@ -142,7 +142,7 @@ impl CpuFamily { /// ``` pub fn instruction_alignment(self) -> Option { match self { - CpuFamily::Wasm => Some(4), + CpuFamily::Wasm32 => Some(4), CpuFamily::Arm32 => Some(2), CpuFamily::Arm64 | CpuFamily::Arm64_32 => Some(4), CpuFamily::Ppc32 | CpuFamily::Mips32 | CpuFamily::Mips64 => Some(4), @@ -178,7 +178,7 @@ impl CpuFamily { CpuFamily::Arm32 | CpuFamily::Arm64 | CpuFamily::Arm64_32 => Some("pc"), CpuFamily::Ppc32 | CpuFamily::Ppc64 => Some("srr0"), CpuFamily::Mips32 | CpuFamily::Mips64 => Some("pc"), - CpuFamily::Wasm => None, + CpuFamily::Wasm32 => None, CpuFamily::Unknown => None, } } @@ -285,7 +285,7 @@ pub enum Arch { Arm64_32 = 901, Arm64_32V8 = 902, Arm64_32Unknown = 999, - Wasm = 1001, + Wasm32 = 1001, } impl Arch { @@ -331,7 +331,7 @@ impl Arch { 901 => Arch::Arm64_32, 902 => Arch::Arm64_32V8, 999 => Arch::Arm64_32Unknown, - 1001 => Arch::Wasm, + 1001 => Arch::Wasm32, _ => Arch::Unknown, } } @@ -368,7 +368,7 @@ impl Arch { Arch::Mips => CpuFamily::Mips32, Arch::Mips64 => CpuFamily::Mips64, Arch::Arm64_32 | Arch::Arm64_32V8 | Arch::Arm64_32Unknown => CpuFamily::Arm64_32, - Arch::Wasm => CpuFamily::Wasm, + Arch::Wasm32 => CpuFamily::Wasm32, } } @@ -392,7 +392,7 @@ impl Arch { pub fn name(self) -> &'static str { match self { Arch::Unknown => "unknown", - Arch::Wasm => "wasm", + Arch::Wasm32 => "wasm32", Arch::X86 => "x86", Arch::X86Unknown => "x86_unknown", Arch::Amd64 => "x86_64", @@ -501,7 +501,7 @@ impl str::FromStr for Arch { "arm-64" => Arch::Arm64, // wasm extensions - "wasm" => Arch::Wasm, + "wasm32" => Arch::Wasm32, _ => return Err(UnknownArchError), }) diff --git a/symbolic-debuginfo/src/wasm.rs b/symbolic-debuginfo/src/wasm.rs index 17354edc5..4fe7b2304 100644 --- a/symbolic-debuginfo/src/wasm.rs +++ b/symbolic-debuginfo/src/wasm.rs @@ -59,7 +59,7 @@ impl<'data> WasmObject<'data> { }) } - /// The container file format, which is always `FileFormat::Wasm`. + /// The container file format, which currently is always `FileFormat::Wasm`. pub fn file_format(&self) -> FileFormat { FileFormat::Wasm } @@ -99,7 +99,8 @@ impl<'data> WasmObject<'data> { /// The CPU architecture of this object. pub fn arch(&self) -> Arch { - Arch::Wasm + // TODO: we do not yet support wasm64 and thus always return wasm32 here. + Arch::Wasm32 } /// The kind of this object. From 20ef03f4a16dcf13d73fc8fa6a13d594d0f93d5c Mon Sep 17 00:00:00 2001 From: Arpad Borsos Date: Mon, 30 May 2022 15:00:51 +0200 Subject: [PATCH 4/4] tighten up cpp_demangle recursion limits a bit --- symbolic-demangle/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/symbolic-demangle/src/lib.rs b/symbolic-demangle/src/lib.rs index 70b0cdddc..ca8e4fcad 100644 --- a/symbolic-demangle/src/lib.rs +++ b/symbolic-demangle/src/lib.rs @@ -242,13 +242,13 @@ fn try_demangle_cpp(ident: &str, opts: DemangleOptions) -> Option { let stripped = strip_hash_suffix(ident); - let parse_options = ParseOptions::default().recursion_limit(192); // default is 96 + let parse_options = ParseOptions::default().recursion_limit(160); // default is 96 let symbol = match CppSymbol::new_with_options(stripped, &parse_options) { Ok(symbol) => symbol, Err(_) => return None, }; - let mut cpp_options = CppOptions::new().recursion_limit(256); // default is 128 + let mut cpp_options = CppOptions::new().recursion_limit(192); // default is 128 if !opts.parameters { cpp_options = cpp_options.no_params(); }