Merge branch 'rust_demangle' into 'master'

libsysprof: Support demangling rust symbols using the v0 scheme

See merge request GNOME/sysprof!78
This commit is contained in:
Christian Hergert
2023-08-31 18:44:15 +00:00
5 changed files with 1309 additions and 2 deletions

View File

@ -27,6 +27,7 @@
#include "demangle.h" #include "demangle.h"
#include "elfparser.h" #include "elfparser.h"
#include "rust-demangle.h"
typedef struct Section Section; typedef struct Section Section;
@ -484,7 +485,15 @@ elf_parser_free (ElfParser *parser)
gchar * gchar *
elf_demangle (const char *name) elf_demangle (const char *name)
{ {
gchar *demangled = sysprof_cplus_demangle (name); /* Try demangling as rust symbol first as legacy rust symbols can demangle as C++ symbols too
* but will only get partially demangled in that case.
*/
gchar *demangled = sysprof_rust_demangle (name, 0);
if (demangled)
return demangled;
demangled = sysprof_cplus_demangle (name);
if (demangled) if (demangled)
return demangled; return demangled;

View File

@ -1,5 +1,6 @@
libelfparser_sources = [ libelfparser_sources = [
'demangle.cpp', 'demangle.cpp',
'rust-demangle.c',
'elfparser.c', 'elfparser.c',
] ]

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,29 @@
/*
Imported from https://github.com/LykenSol/rust-demangle.c commit eed29f57732ddb2be434ec89f8ede9b695e5e157
Modifications from upstream:
* Add sysprof_ prefix to exported symbols and mark them as hidden
* Add pragma once
* Use glib begin/end decls
*/
#pragma once
#include <glib.h>
G_BEGIN_DECLS
#include <stdbool.h>
#include <stddef.h>
#define RUST_DEMANGLE_FLAG_VERBOSE 1
G_GNUC_INTERNAL
bool sysprof_rust_demangle_with_callback(
const char *mangled, int flags,
void (*callback)(const char *data, size_t len, void *opaque), void *opaque
);
G_GNUC_INTERNAL
char *sysprof_rust_demangle(const char *mangled, int flags);
G_END_DECLS

View File

@ -434,7 +434,7 @@ sysprof_elf_get_symbol_at_address_internal (SysprofElf *self,
name = elf_parser_get_sym_name (self->parser, symbol); name = elf_parser_get_sym_name (self->parser, symbol);
if (name != NULL && name[0] == '_' && name[1] == 'Z') if (name != NULL && name[0] == '_' && ((name[1] == 'Z') || (name[1] == 'R')))
ret = elf_demangle (name); ret = elf_demangle (name);
else else
ret = g_strdup (name); ret = g_strdup (name);