Skip to content

Commit 2a8d41b

Browse files
milianwacmel
authored andcommitted
perf symbols: Demangle symbols for synthesized @plt entries.
The symbols in the synthesized @plt entries where not demangled before, i.e. we could end up with entries such as: $ perf report Samples: 7K of event 'cycles:ppp', Event count (approx.): 6223833141 Children Self Command Shared Object Symbol - 93.63% 28.89% lab_mandelbrot lab_mandelbrot [.] main - 73.81% main - 33.57% hypot 27.76% __hypot_finite 15.97% __muldc3 2.90% __muldc3@plt 2.40% _ZNK6QImage6heightEv@plt + 2.14% QColor::rgb 1.94% _ZNK6QImage5widthEv@plt 1.92% cabs@plt This patch remedies this issue by also applying demangling to the synthesized symbols. The output for the above is now: $ perf report Samples: 7K of event 'cycles:ppp', Event count (approx.): 6223833141 Children Self Command Shared Object Symbol - 93.63% 28.89% lab_mandelbrot lab_mandelbrot [.] main - 73.81% main - 33.57% hypot 27.76% __hypot_finite 15.97% __muldc3 2.90% __muldc3@plt 2.40% QImage::height() const@plt + 2.14% QColor::rgb 1.94% QImage::width() const@plt 1.92% cabs@plt Signed-off-by: Milian Wolff <[email protected]> LPU-Reference: [email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent fd22759 commit 2a8d41b

File tree

1 file changed

+52
-29
lines changed

1 file changed

+52
-29
lines changed

tools/perf/util/symbol-elf.c

Lines changed: 52 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,37 @@ Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep,
206206
return NULL;
207207
}
208208

209+
static bool want_demangle(bool is_kernel_sym)
210+
{
211+
return is_kernel_sym ? symbol_conf.demangle_kernel : symbol_conf.demangle;
212+
}
213+
214+
static char *demangle_sym(struct dso *dso, int kmodule, const char *elf_name)
215+
{
216+
int demangle_flags = verbose ? (DMGL_PARAMS | DMGL_ANSI) : DMGL_NO_OPTS;
217+
char *demangled = NULL;
218+
219+
/*
220+
* We need to figure out if the object was created from C++ sources
221+
* DWARF DW_compile_unit has this, but we don't always have access
222+
* to it...
223+
*/
224+
if (!want_demangle(dso->kernel || kmodule))
225+
return demangled;
226+
227+
demangled = bfd_demangle(NULL, elf_name, demangle_flags);
228+
if (demangled == NULL)
229+
demangled = java_demangle_sym(elf_name, JAVA_DEMANGLE_NORET);
230+
else if (rust_is_mangled(demangled))
231+
/*
232+
* Input to Rust demangling is the BFD-demangled
233+
* name which it Rust-demangles in place.
234+
*/
235+
rust_demangle_sym(demangled);
236+
237+
return demangled;
238+
}
239+
209240
#define elf_section__for_each_rel(reldata, pos, pos_mem, idx, nr_entries) \
210241
for (idx = 0, pos = gelf_getrel(reldata, 0, &pos_mem); \
211242
idx < nr_entries; \
@@ -301,11 +332,19 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *
301332

302333
elf_section__for_each_rela(reldata, pos, pos_mem, idx,
303334
nr_rel_entries) {
335+
const char *elf_name = NULL;
336+
char *demangled = NULL;
304337
symidx = GELF_R_SYM(pos->r_info);
305338
plt_offset += shdr_plt.sh_entsize;
306339
gelf_getsym(syms, symidx, &sym);
340+
341+
elf_name = elf_sym__name(&sym, symstrs);
342+
demangled = demangle_sym(dso, 0, elf_name);
343+
if (demangled != NULL)
344+
elf_name = demangled;
307345
snprintf(sympltname, sizeof(sympltname),
308-
"%s@plt", elf_sym__name(&sym, symstrs));
346+
"%s@plt", elf_name);
347+
free(demangled);
309348

310349
f = symbol__new(plt_offset, shdr_plt.sh_entsize,
311350
STB_GLOBAL, sympltname);
@@ -323,11 +362,19 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *
323362
GElf_Rel pos_mem, *pos;
324363
elf_section__for_each_rel(reldata, pos, pos_mem, idx,
325364
nr_rel_entries) {
365+
const char *elf_name = NULL;
366+
char *demangled = NULL;
326367
symidx = GELF_R_SYM(pos->r_info);
327368
plt_offset += shdr_plt.sh_entsize;
328369
gelf_getsym(syms, symidx, &sym);
370+
371+
elf_name = elf_sym__name(&sym, symstrs);
372+
demangled = demangle_sym(dso, 0, elf_name);
373+
if (demangled != NULL)
374+
elf_name = demangled;
329375
snprintf(sympltname, sizeof(sympltname),
330-
"%s@plt", elf_sym__name(&sym, symstrs));
376+
"%s@plt", elf_name);
377+
free(demangled);
331378

332379
f = symbol__new(plt_offset, shdr_plt.sh_entsize,
333380
STB_GLOBAL, sympltname);
@@ -775,11 +822,6 @@ static u64 ref_reloc(struct kmap *kmap)
775822
return 0;
776823
}
777824

778-
static bool want_demangle(bool is_kernel_sym)
779-
{
780-
return is_kernel_sym ? symbol_conf.demangle_kernel : symbol_conf.demangle;
781-
}
782-
783825
void __weak arch__sym_update(struct symbol *s __maybe_unused,
784826
GElf_Sym *sym __maybe_unused) { }
785827

@@ -1070,29 +1112,10 @@ int dso__load_sym(struct dso *dso, struct map *map,
10701112
sym.st_value -= shdr.sh_addr - shdr.sh_offset;
10711113
}
10721114
new_symbol:
1073-
/*
1074-
* We need to figure out if the object was created from C++ sources
1075-
* DWARF DW_compile_unit has this, but we don't always have access
1076-
* to it...
1077-
*/
1078-
if (want_demangle(dso->kernel || kmodule)) {
1079-
int demangle_flags = DMGL_NO_OPTS;
1080-
if (verbose)
1081-
demangle_flags = DMGL_PARAMS | DMGL_ANSI;
1082-
1083-
demangled = bfd_demangle(NULL, elf_name, demangle_flags);
1084-
if (demangled == NULL)
1085-
demangled = java_demangle_sym(elf_name, JAVA_DEMANGLE_NORET);
1086-
else if (rust_is_mangled(demangled))
1087-
/*
1088-
* Input to Rust demangling is the BFD-demangled
1089-
* name which it Rust-demangles in place.
1090-
*/
1091-
rust_demangle_sym(demangled);
1115+
demangled = demangle_sym(dso, kmodule, elf_name);
1116+
if (demangled != NULL)
1117+
elf_name = demangled;
10921118

1093-
if (demangled != NULL)
1094-
elf_name = demangled;
1095-
}
10961119
f = symbol__new(sym.st_value, sym.st_size,
10971120
GELF_ST_BIND(sym.st_info), elf_name);
10981121
free(demangled);

0 commit comments

Comments
 (0)