Skip to content

Commit 213a9a0

Browse files
committed
Arch independent demanglers
1 parent 7620f53 commit 213a9a0

File tree

12 files changed

+104
-88
lines changed

12 files changed

+104
-88
lines changed

objdiff-core/Cargo.toml

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ any-arch = [
4141
"dep:regex",
4242
"dep:similar",
4343
"dep:syn",
44-
"dep:encoding_rs"
44+
"dep:encoding_rs",
45+
"demangler",
4546
]
4647
bindings = [
4748
"dep:prost",
@@ -88,40 +89,37 @@ std = [
8889
]
8990
mips = [
9091
"any-arch",
91-
"dep:cpp_demangle",
92-
"dep:cwdemangle",
9392
"dep:rabbitizer",
94-
"dep:gnuv2_demangle",
9593
]
9694
ppc = [
9795
"any-arch",
98-
"dep:cwdemangle",
9996
"dep:cwextab",
10097
"dep:powerpc",
10198
"dep:rlwinmdec",
10299
]
103100
x86 = [
104101
"any-arch",
105-
"dep:cpp_demangle",
106102
"dep:iced-x86",
107-
"dep:msvc-demangler",
108-
"dep:gnuv2_demangle",
109103
]
110104
arm = [
111105
"any-arch",
112106
"dep:arm-attr",
113-
"dep:cpp_demangle",
114107
"dep:unarm",
115108
]
116109
arm64 = [
117110
"any-arch",
118-
"dep:cpp_demangle",
119111
"dep:yaxpeax-arch",
120112
"dep:yaxpeax-arm",
121113
]
122114
superh = [
123115
"any-arch",
124116
]
117+
demangler = [
118+
"dep:cpp_demangle",
119+
"dep:cwdemangle",
120+
"dep:gnuv2_demangle",
121+
"dep:msvc-demangler",
122+
]
125123

126124
[package.metadata.docs.rs]
127125
features = ["all"]

objdiff-core/config-schema.json

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,37 @@
2525
}
2626
]
2727
},
28+
{
29+
"id": "demangler",
30+
"type": "choice",
31+
"default": "auto",
32+
"name": "Demangler",
33+
"description": "Which demangler should be used to demangle each symbol.",
34+
"items": [
35+
{
36+
"value": "auto",
37+
"name": "Auto",
38+
"description": "Try to automatically guess the mangling format."
39+
},
40+
{
41+
"value": "codewarrior",
42+
"name": "CodeWarrior"
43+
},
44+
{
45+
"value": "msvc",
46+
"name": "MSVC"
47+
},
48+
{
49+
"value": "gnu_modern",
50+
"name": "GNU g++ (Itanium)"
51+
},
52+
{
53+
"value": "gnu_v2",
54+
"name": "GNU g++ (V2)",
55+
"description": "Use the old GNU mangling ABI. Used up to g++ 2.9.x"
56+
}
57+
]
58+
},
2859
{
2960
"id": "analyzeDataFlow",
3061
"type": "boolean",
@@ -259,6 +290,7 @@
259290
"name": "General",
260291
"properties": [
261292
"functionRelocDiffs",
293+
"demangler",
262294
"spaceBetweenArgs",
263295
"combineDataSections",
264296
"combineTextSections"

objdiff-core/src/arch/arm.rs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
use alloc::{
2-
collections::BTreeMap,
3-
format,
4-
string::{String, ToString},
5-
vec::Vec,
6-
};
1+
use alloc::{collections::BTreeMap, format, string::ToString, vec::Vec};
72

83
use anyhow::{Result, bail};
94
use arm_attr::{BuildAttrs, enums::CpuArch, tag::Tag};
@@ -409,12 +404,6 @@ impl Arch for ArchArm {
409404
}
410405
}
411406

412-
fn demangle(&self, name: &str) -> Option<String> {
413-
cpp_demangle::Symbol::new(name)
414-
.ok()
415-
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
416-
}
417-
418407
fn reloc_name(&self, flags: RelocationFlags) -> Option<&'static str> {
419408
match flags {
420409
RelocationFlags::Elf(r_type) => match r_type {

objdiff-core/src/arch/arm64.rs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
use alloc::{
2-
format,
3-
string::{String, ToString},
4-
vec::Vec,
5-
};
1+
use alloc::{format, string::ToString, vec::Vec};
62
use core::cmp::Ordering;
73

84
use anyhow::Result;
@@ -108,12 +104,6 @@ impl Arch for ArchArm64 {
108104
Ok(())
109105
}
110106

111-
fn demangle(&self, name: &str) -> Option<String> {
112-
cpp_demangle::Symbol::new(name)
113-
.ok()
114-
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
115-
}
116-
117107
fn reloc_name(&self, flags: RelocationFlags) -> Option<&'static str> {
118108
match flags {
119109
RelocationFlags::Elf(r_type) => match r_type {

objdiff-core/src/arch/mips.rs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use alloc::{
22
collections::{BTreeMap, BTreeSet},
3-
string::{String, ToString},
3+
string::ToString,
44
vec::Vec,
55
};
66

@@ -304,17 +304,6 @@ impl Arch for ArchMips {
304304
}
305305
}
306306

307-
fn demangle(&self, name: &str) -> Option<String> {
308-
gnuv2_demangle::demangle(name, &gnuv2_demangle::DemangleConfig::new_no_cfilt_mimics())
309-
.ok()
310-
.or_else(|| {
311-
cpp_demangle::Symbol::new(name)
312-
.ok()
313-
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
314-
.or_else(|| cwdemangle::demangle(name, &cwdemangle::DemangleOptions::default()))
315-
})
316-
}
317-
318307
fn reloc_name(&self, flags: RelocationFlags) -> Option<&'static str> {
319308
match flags {
320309
RelocationFlags::Elf(r_type) => match r_type {

objdiff-core/src/arch/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,6 @@ pub trait Arch: Any + Debug + Send + Sync {
371371
Ok(None)
372372
}
373373

374-
fn demangle(&self, _name: &str) -> Option<String> { None }
375-
376374
fn reloc_name(&self, _flags: RelocationFlags) -> Option<&'static str> { None }
377375

378376
fn data_reloc_size(&self, flags: RelocationFlags) -> usize;

objdiff-core/src/arch/ppc/mod.rs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -308,18 +308,6 @@ impl Arch for ArchPpc {
308308
}
309309
}
310310

311-
fn demangle(&self, mut name: &str) -> Option<String> {
312-
if name.starts_with('?') {
313-
msvc_demangler::demangle(name, msvc_demangler::DemangleFlags::llvm()).ok()
314-
} else {
315-
name = name.trim_start_matches('.');
316-
cpp_demangle::Symbol::new(name)
317-
.ok()
318-
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
319-
.or_else(|| cwdemangle::demangle(name, &cwdemangle::DemangleOptions::default()))
320-
}
321-
}
322-
323311
fn reloc_name(&self, flags: RelocationFlags) -> Option<&'static str> {
324312
match flags {
325313
RelocationFlags::Elf(r_type) => match r_type {

objdiff-core/src/arch/superh/mod.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use alloc::{collections::BTreeMap, format, string::String, vec, vec::Vec};
1+
use alloc::{collections::BTreeMap, format, vec::Vec};
22

33
use anyhow::Result;
44
use object::elf;
@@ -132,12 +132,6 @@ impl Arch for ArchSuperH {
132132
Ok(())
133133
}
134134

135-
fn demangle(&self, name: &str) -> Option<String> {
136-
cpp_demangle::Symbol::new(name)
137-
.ok()
138-
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
139-
}
140-
141135
fn reloc_name(&self, flags: RelocationFlags) -> Option<&'static str> {
142136
match flags {
143137
RelocationFlags::Elf(r_type) => match r_type {

objdiff-core/src/arch/x86.rs

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use alloc::{boxed::Box, format, string::String, vec::Vec};
1+
use alloc::{boxed::Box, format, vec::Vec};
22
use core::cmp::Ordering;
33

44
use anyhow::{Context, Result, anyhow, bail};
@@ -300,23 +300,6 @@ impl Arch for ArchX86 {
300300
Ok(Some(RelocationOverride { target: RelocationOverrideTarget::Keep, addend }))
301301
}
302302

303-
fn demangle(&self, name: &str) -> Option<String> {
304-
if name.starts_with('?') {
305-
msvc_demangler::demangle(name, msvc_demangler::DemangleFlags::llvm()).ok()
306-
} else {
307-
cpp_demangle::Symbol::new(name)
308-
.ok()
309-
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
310-
.or_else(|| {
311-
gnuv2_demangle::demangle(
312-
name,
313-
&gnuv2_demangle::DemangleConfig::new_no_cfilt_mimics(),
314-
)
315-
.ok()
316-
})
317-
}
318-
}
319-
320303
fn reloc_name(&self, flags: RelocationFlags) -> Option<&'static str> {
321304
match self.arch {
322305
Architecture::X86 => match flags {

objdiff-core/src/diff/demangler.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
use crate::diff::Demangler;
2+
3+
#[cfg(feature = "demangler")]
4+
impl Demangler {
5+
pub fn demangle(&self, name: &str) -> Option<String> {
6+
match self {
7+
Demangler::Codewarrior => Self::demangle_codewarrior(name),
8+
Demangler::Msvc => Self::demangle_msvc(name),
9+
Demangler::GnuModern => Self::demangle_gnu_modern(name),
10+
Demangler::GnuV2 => Self::demangle_gnu_v2(name),
11+
Demangler::Auto => {
12+
// Try to guess
13+
if name.starts_with('?') {
14+
Self::demangle_msvc(name)
15+
} else {
16+
Self::demangle_codewarrior(name)
17+
.or_else(|| Self::demangle_gnu_v2(name))
18+
.or_else(|| Self::demangle_gnu_modern(name))
19+
}
20+
}
21+
}
22+
}
23+
24+
fn demangle_codewarrior(name: &str) -> Option<String> {
25+
cwdemangle::demangle(name, &cwdemangle::DemangleOptions::default())
26+
}
27+
28+
fn demangle_msvc(name: &str) -> Option<String> {
29+
msvc_demangler::demangle(name, msvc_demangler::DemangleFlags::llvm()).ok()
30+
}
31+
32+
fn demangle_gnu_modern(name: &str) -> Option<String> {
33+
cpp_demangle::Symbol::new(name)
34+
.ok()
35+
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
36+
}
37+
38+
fn demangle_gnu_v2(name: &str) -> Option<String> {
39+
gnuv2_demangle::demangle(name, &gnuv2_demangle::DemangleConfig::new_no_cfilt_mimics()).ok()
40+
}
41+
}
42+
43+
#[cfg(not(feature = "demangler"))]
44+
impl Demangler {
45+
pub fn demangle(&self, _name: &str) -> Option<String> { None }
46+
}

0 commit comments

Comments
 (0)