|
13 | 13 | #include "maps.h" |
14 | 14 | #include "symbol.h" |
15 | 15 | #include "symsrc.h" |
16 | | -#include "demangle-cxx.h" |
17 | | -#include "demangle-ocaml.h" |
18 | | -#include "demangle-java.h" |
19 | | -#include "demangle-rust-v0.h" |
20 | 16 | #include "machine.h" |
21 | 17 | #include "vdso.h" |
22 | 18 | #include "debug.h" |
23 | 19 | #include "util/copyfile.h" |
24 | 20 | #include <linux/ctype.h> |
25 | 21 | #include <linux/kernel.h> |
26 | | -#include <linux/log2.h> |
27 | 22 | #include <linux/zalloc.h> |
28 | 23 | #include <linux/string.h> |
29 | 24 | #include <symbol/kallsyms.h> |
@@ -280,82 +275,6 @@ static int elf_read_program_header(Elf *elf, u64 vaddr, GElf_Phdr *phdr) |
280 | 275 | return -1; |
281 | 276 | } |
282 | 277 |
|
283 | | -static bool want_demangle(bool is_kernel_sym) |
284 | | -{ |
285 | | - return is_kernel_sym ? symbol_conf.demangle_kernel : symbol_conf.demangle; |
286 | | -} |
287 | | - |
288 | | -/* |
289 | | - * Demangle C++ function signature, typically replaced by demangle-cxx.cpp |
290 | | - * version. |
291 | | - */ |
292 | | -#ifndef HAVE_CXA_DEMANGLE_SUPPORT |
293 | | -char *cxx_demangle_sym(const char *str __maybe_unused, bool params __maybe_unused, |
294 | | - bool modifiers __maybe_unused) |
295 | | -{ |
296 | | -#ifdef HAVE_LIBBFD_SUPPORT |
297 | | - int flags = (params ? DMGL_PARAMS : 0) | (modifiers ? DMGL_ANSI : 0); |
298 | | - |
299 | | - return bfd_demangle(NULL, str, flags); |
300 | | -#elif defined(HAVE_CPLUS_DEMANGLE_SUPPORT) |
301 | | - int flags = (params ? DMGL_PARAMS : 0) | (modifiers ? DMGL_ANSI : 0); |
302 | | - |
303 | | - return cplus_demangle(str, flags); |
304 | | -#else |
305 | | - return NULL; |
306 | | -#endif |
307 | | -} |
308 | | -#endif /* !HAVE_CXA_DEMANGLE_SUPPORT */ |
309 | | - |
310 | | -static char *demangle_sym(struct dso *dso, int kmodule, const char *elf_name) |
311 | | -{ |
312 | | - struct demangle rust_demangle = { |
313 | | - .style = DemangleStyleUnknown, |
314 | | - }; |
315 | | - char *demangled = NULL; |
316 | | - |
317 | | - /* |
318 | | - * We need to figure out if the object was created from C++ sources |
319 | | - * DWARF DW_compile_unit has this, but we don't always have access |
320 | | - * to it... |
321 | | - */ |
322 | | - if (!want_demangle((dso && dso__kernel(dso)) || kmodule)) |
323 | | - return demangled; |
324 | | - |
325 | | - rust_demangle_demangle(elf_name, &rust_demangle); |
326 | | - if (rust_demangle_is_known(&rust_demangle)) { |
327 | | - /* A rust mangled name. */ |
328 | | - if (rust_demangle.mangled_len == 0) |
329 | | - return demangled; |
330 | | - |
331 | | - for (size_t buf_len = roundup_pow_of_two(rust_demangle.mangled_len * 2); |
332 | | - buf_len < 1024 * 1024; buf_len += 32) { |
333 | | - char *tmp = realloc(demangled, buf_len); |
334 | | - |
335 | | - if (!tmp) { |
336 | | - /* Failure to grow output buffer, return what is there. */ |
337 | | - return demangled; |
338 | | - } |
339 | | - demangled = tmp; |
340 | | - if (rust_demangle_display_demangle(&rust_demangle, demangled, buf_len, |
341 | | - /*alternate=*/true) == OverflowOk) |
342 | | - return demangled; |
343 | | - } |
344 | | - /* Buffer exceeded sensible bounds, return what is there. */ |
345 | | - return demangled; |
346 | | - } |
347 | | - |
348 | | - demangled = cxx_demangle_sym(elf_name, verbose > 0, verbose > 0); |
349 | | - if (demangled) |
350 | | - return demangled; |
351 | | - |
352 | | - demangled = ocaml_demangle_sym(elf_name); |
353 | | - if (demangled) |
354 | | - return demangled; |
355 | | - |
356 | | - return java_demangle_sym(elf_name, JAVA_DEMANGLE_NORET); |
357 | | -} |
358 | | - |
359 | 278 | struct rel_info { |
360 | 279 | u32 nr_entries; |
361 | 280 | u32 *sorted; |
@@ -641,7 +560,7 @@ static bool get_plt_got_name(GElf_Shdr *shdr, size_t i, |
641 | 560 | /* Get the associated symbol */ |
642 | 561 | gelf_getsym(di->dynsym_data, vr->sym_idx, &sym); |
643 | 562 | sym_name = elf_sym__name(&sym, di->dynstr_data); |
644 | | - demangled = demangle_sym(di->dso, 0, sym_name); |
| 563 | + demangled = dso__demangle_sym(di->dso, /*kmodule=*/0, sym_name); |
645 | 564 | if (demangled != NULL) |
646 | 565 | sym_name = demangled; |
647 | 566 |
|
@@ -839,7 +758,7 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss) |
839 | 758 | gelf_getsym(syms, get_rel_symidx(&ri, idx), &sym); |
840 | 759 |
|
841 | 760 | elf_name = elf_sym__name(&sym, symstrs); |
842 | | - demangled = demangle_sym(dso, 0, elf_name); |
| 761 | + demangled = dso__demangle_sym(dso, /*kmodule=*/0, elf_name); |
843 | 762 | if (demangled) |
844 | 763 | elf_name = demangled; |
845 | 764 | if (*elf_name) |
@@ -868,11 +787,6 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss) |
868 | 787 | return 0; |
869 | 788 | } |
870 | 789 |
|
871 | | -char *dso__demangle_sym(struct dso *dso, int kmodule, const char *elf_name) |
872 | | -{ |
873 | | - return demangle_sym(dso, kmodule, elf_name); |
874 | | -} |
875 | | - |
876 | 790 | /* |
877 | 791 | * Align offset to 4 bytes as needed for note name and descriptor data. |
878 | 792 | */ |
@@ -1861,7 +1775,7 @@ dso__load_sym_internal(struct dso *dso, struct map *map, struct symsrc *syms_ss, |
1861 | 1775 | } |
1862 | 1776 | } |
1863 | 1777 |
|
1864 | | - demangled = demangle_sym(dso, kmodule, elf_name); |
| 1778 | + demangled = dso__demangle_sym(dso, kmodule, elf_name); |
1865 | 1779 | if (demangled != NULL) |
1866 | 1780 | elf_name = demangled; |
1867 | 1781 |
|
|
0 commit comments