mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2026-02-10 23:20:54 +00:00
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:
@ -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;
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
libelfparser_sources = [
|
libelfparser_sources = [
|
||||||
'demangle.cpp',
|
'demangle.cpp',
|
||||||
|
'rust-demangle.c',
|
||||||
'elfparser.c',
|
'elfparser.c',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
1268
contrib/elfparser/rust-demangle.c
Normal file
1268
contrib/elfparser/rust-demangle.c
Normal file
File diff suppressed because it is too large
Load Diff
29
contrib/elfparser/rust-demangle.h
Normal file
29
contrib/elfparser/rust-demangle.h
Normal 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
|
||||||
@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user