mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2025-12-31 20:36:25 +00:00
Revert "callgraph: teach callgraph to use alternative symbol roots"
I found a better approach, so we can remove this.
This reverts commit 222d0ad53f.
This commit is contained in:
@ -57,18 +57,16 @@ struct _SpCallgraphProfile
|
|||||||
GObject parent_instance;
|
GObject parent_instance;
|
||||||
|
|
||||||
SpCaptureReader *reader;
|
SpCaptureReader *reader;
|
||||||
SpSelection *selection;
|
SpSelection *selection;
|
||||||
StackStash *stash;
|
StackStash *stash;
|
||||||
GStringChunk *symbols;
|
GStringChunk *symbols;
|
||||||
GHashTable *symbol_dirs;
|
|
||||||
GHashTable *tags;
|
GHashTable *tags;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
SpCaptureReader *reader;
|
SpCaptureReader *reader;
|
||||||
SpSelection *selection;
|
SpSelection *selection;
|
||||||
GHashTable *symbol_dirs;
|
|
||||||
} Generate;
|
} Generate;
|
||||||
|
|
||||||
static void profile_iface_init (SpProfileInterface *iface);
|
static void profile_iface_init (SpProfileInterface *iface);
|
||||||
@ -84,20 +82,6 @@ enum {
|
|||||||
|
|
||||||
static GParamSpec *properties [N_PROPS];
|
static GParamSpec *properties [N_PROPS];
|
||||||
|
|
||||||
static GHashTable *
|
|
||||||
ht_copy (GHashTable *ht)
|
|
||||||
{
|
|
||||||
GHashTable *copy = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
|
|
||||||
GHashTableIter iter;
|
|
||||||
gpointer k,v;
|
|
||||||
|
|
||||||
g_hash_table_iter_init (&iter, ht);
|
|
||||||
while (g_hash_table_iter_next (&iter, &k, &v))
|
|
||||||
g_hash_table_insert (copy, g_strdup (k), g_strdup (v));
|
|
||||||
|
|
||||||
return ht;
|
|
||||||
}
|
|
||||||
|
|
||||||
SpProfile *
|
SpProfile *
|
||||||
sp_callgraph_profile_new (void)
|
sp_callgraph_profile_new (void)
|
||||||
{
|
{
|
||||||
@ -120,7 +104,6 @@ sp_callgraph_profile_finalize (GObject *object)
|
|||||||
g_clear_pointer (&self->symbols, g_string_chunk_free);
|
g_clear_pointer (&self->symbols, g_string_chunk_free);
|
||||||
g_clear_pointer (&self->stash, stack_stash_unref);
|
g_clear_pointer (&self->stash, stack_stash_unref);
|
||||||
g_clear_pointer (&self->reader, sp_capture_reader_unref);
|
g_clear_pointer (&self->reader, sp_capture_reader_unref);
|
||||||
g_clear_pointer (&self->symbol_dirs, g_hash_table_unref);
|
|
||||||
g_clear_pointer (&self->tags, g_hash_table_unref);
|
g_clear_pointer (&self->tags, g_hash_table_unref);
|
||||||
g_clear_object (&self->selection);
|
g_clear_object (&self->selection);
|
||||||
|
|
||||||
@ -189,7 +172,6 @@ sp_callgraph_profile_init (SpCallgraphProfile *self)
|
|||||||
{
|
{
|
||||||
self->symbols = g_string_chunk_new (getpagesize ());
|
self->symbols = g_string_chunk_new (getpagesize ());
|
||||||
self->tags = g_hash_table_new (g_str_hash, g_str_equal);
|
self->tags = g_hash_table_new (g_str_hash, g_str_equal);
|
||||||
self->symbol_dirs = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -243,7 +225,6 @@ sp_callgraph_profile_generate_worker (GTask *task,
|
|||||||
g_autoptr(GHashTable) maps_by_pid = NULL;
|
g_autoptr(GHashTable) maps_by_pid = NULL;
|
||||||
g_autoptr(GHashTable) cmdlines = NULL;
|
g_autoptr(GHashTable) cmdlines = NULL;
|
||||||
g_autoptr(GPtrArray) resolvers = NULL;
|
g_autoptr(GPtrArray) resolvers = NULL;
|
||||||
g_autoptr(SpSymbolResolver) elf_resolver = NULL;
|
|
||||||
SpCaptureFrameType type;
|
SpCaptureFrameType type;
|
||||||
StackStash *stash = NULL;
|
StackStash *stash = NULL;
|
||||||
StackStash *resolved_stash = NULL;
|
StackStash *resolved_stash = NULL;
|
||||||
@ -264,17 +245,9 @@ sp_callgraph_profile_generate_worker (GTask *task,
|
|||||||
stash = stack_stash_new (NULL);
|
stash = stack_stash_new (NULL);
|
||||||
resolved_stash = stack_stash_new (NULL);
|
resolved_stash = stack_stash_new (NULL);
|
||||||
|
|
||||||
/*
|
|
||||||
* If we are running inside a mount namespace, such as with flatpak, we might
|
|
||||||
* need to alter the sysroot to the checkout location of the container. That
|
|
||||||
* way we can resolve elf files from inside the mount namespace.
|
|
||||||
*/
|
|
||||||
elf_resolver = sp_elf_symbol_resolver_new ();
|
|
||||||
sp_elf_symbol_resolver_set_symbol_dirs (SP_ELF_SYMBOL_RESOLVER (elf_resolver), gen->symbol_dirs);
|
|
||||||
|
|
||||||
resolvers = g_ptr_array_new_with_free_func (g_object_unref);
|
resolvers = g_ptr_array_new_with_free_func (g_object_unref);
|
||||||
g_ptr_array_add (resolvers, sp_kernel_symbol_resolver_new ());
|
g_ptr_array_add (resolvers, sp_kernel_symbol_resolver_new ());
|
||||||
g_ptr_array_add (resolvers, g_steal_pointer (&elf_resolver));
|
g_ptr_array_add (resolvers, sp_elf_symbol_resolver_new ());
|
||||||
g_ptr_array_add (resolvers, sp_jitmap_symbol_resolver_new ());
|
g_ptr_array_add (resolvers, sp_jitmap_symbol_resolver_new ());
|
||||||
|
|
||||||
for (j = 0; j < resolvers->len; j++)
|
for (j = 0; j < resolvers->len; j++)
|
||||||
@ -448,12 +421,11 @@ cleanup:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
generate_free (Generate *gen)
|
generate_free (Generate *generate)
|
||||||
{
|
{
|
||||||
g_clear_pointer (&gen->reader, sp_capture_reader_unref);
|
sp_capture_reader_unref (generate->reader);
|
||||||
g_clear_pointer (&gen->symbol_dirs, g_hash_table_unref);
|
g_clear_object (&generate->selection);
|
||||||
g_clear_object (&gen->selection);
|
g_slice_free (Generate, generate);
|
||||||
g_slice_free (Generate, gen);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -473,7 +445,6 @@ sp_callgraph_profile_generate (SpProfile *profile,
|
|||||||
gen = g_slice_new0 (Generate);
|
gen = g_slice_new0 (Generate);
|
||||||
gen->reader = sp_capture_reader_copy (self->reader);
|
gen->reader = sp_capture_reader_copy (self->reader);
|
||||||
gen->selection = sp_selection_copy (self->selection);
|
gen->selection = sp_selection_copy (self->selection);
|
||||||
gen->symbol_dirs = ht_copy (self->symbol_dirs);
|
|
||||||
|
|
||||||
task = g_task_new (self, cancellable, callback, user_data);
|
task = g_task_new (self, cancellable, callback, user_data);
|
||||||
g_task_set_task_data (task, gen, (GDestroyNotify)generate_free);
|
g_task_set_task_data (task, gen, (GDestroyNotify)generate_free);
|
||||||
@ -525,16 +496,6 @@ sp_callgraph_profile_get_stash (SpCallgraphProfile *self)
|
|||||||
return self->stash;
|
return self->stash;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
sp_callgraph_profile_add_symbol_dir (SpCallgraphProfile *self,
|
|
||||||
const gchar *path,
|
|
||||||
const gchar *symbol_dir)
|
|
||||||
{
|
|
||||||
g_return_if_fail (SP_IS_CALLGRAPH_PROFILE (self));
|
|
||||||
|
|
||||||
g_hash_table_insert (self->symbol_dirs, g_strdup (path), g_strdup (symbol_dir));
|
|
||||||
}
|
|
||||||
|
|
||||||
GQuark
|
GQuark
|
||||||
sp_callgraph_profile_get_tag (SpCallgraphProfile *self,
|
sp_callgraph_profile_get_tag (SpCallgraphProfile *self,
|
||||||
const gchar *symbol)
|
const gchar *symbol)
|
||||||
|
|||||||
@ -30,9 +30,6 @@ G_DECLARE_FINAL_TYPE (SpCallgraphProfile, sp_callgraph_profile, SP, CALLGRAPH_PR
|
|||||||
|
|
||||||
SpProfile *sp_callgraph_profile_new (void);
|
SpProfile *sp_callgraph_profile_new (void);
|
||||||
SpProfile *sp_callgraph_profile_new_with_selection (SpSelection *selection);
|
SpProfile *sp_callgraph_profile_new_with_selection (SpSelection *selection);
|
||||||
void sp_callgraph_profile_add_symbol_dir (SpCallgraphProfile *selection,
|
|
||||||
const gchar *path,
|
|
||||||
const gchar *symbol_dir);
|
|
||||||
GQuark sp_callgraph_profile_get_tag (SpCallgraphProfile *self,
|
GQuark sp_callgraph_profile_get_tag (SpCallgraphProfile *self,
|
||||||
const gchar *symbol);
|
const gchar *symbol);
|
||||||
|
|
||||||
|
|||||||
@ -24,13 +24,6 @@
|
|||||||
#include "sp-map-lookaside.h"
|
#include "sp-map-lookaside.h"
|
||||||
#include "sp-elf-symbol-resolver.h"
|
#include "sp-elf-symbol-resolver.h"
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
gchar *src;
|
|
||||||
gchar *dst;
|
|
||||||
gsize srclen;
|
|
||||||
} SymbolDir;
|
|
||||||
|
|
||||||
struct _SpElfSymbolResolver
|
struct _SpElfSymbolResolver
|
||||||
{
|
{
|
||||||
GObject parent_instance;
|
GObject parent_instance;
|
||||||
@ -38,7 +31,6 @@ struct _SpElfSymbolResolver
|
|||||||
GHashTable *lookasides;
|
GHashTable *lookasides;
|
||||||
GHashTable *bin_files;
|
GHashTable *bin_files;
|
||||||
GHashTable *tag_cache;
|
GHashTable *tag_cache;
|
||||||
GArray *symbol_dirs;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void symbol_resolver_iface_init (SpSymbolResolverInterface *iface);
|
static void symbol_resolver_iface_init (SpSymbolResolverInterface *iface);
|
||||||
@ -58,7 +50,6 @@ sp_elf_symbol_resolver_finalize (GObject *object)
|
|||||||
g_clear_pointer (&self->bin_files, g_hash_table_unref);
|
g_clear_pointer (&self->bin_files, g_hash_table_unref);
|
||||||
g_clear_pointer (&self->lookasides, g_hash_table_unref);
|
g_clear_pointer (&self->lookasides, g_hash_table_unref);
|
||||||
g_clear_pointer (&self->tag_cache, g_hash_table_unref);
|
g_clear_pointer (&self->tag_cache, g_hash_table_unref);
|
||||||
g_clear_pointer (&self->symbol_dirs, g_array_unref);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (sp_elf_symbol_resolver_parent_class)->finalize (object);
|
G_OBJECT_CLASS (sp_elf_symbol_resolver_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
@ -74,8 +65,6 @@ sp_elf_symbol_resolver_class_init (SpElfSymbolResolverClass *klass)
|
|||||||
static void
|
static void
|
||||||
sp_elf_symbol_resolver_init (SpElfSymbolResolver *self)
|
sp_elf_symbol_resolver_init (SpElfSymbolResolver *self)
|
||||||
{
|
{
|
||||||
self->symbol_dirs = g_array_new (FALSE, FALSE, sizeof (SymbolDir));
|
|
||||||
|
|
||||||
self->lookasides = g_hash_table_new_full (NULL,
|
self->lookasides = g_hash_table_new_full (NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
@ -142,30 +131,11 @@ sp_elf_symbol_resolver_get_bin_file (SpElfSymbolResolver *self,
|
|||||||
|
|
||||||
g_assert (SP_IS_ELF_SYMBOL_RESOLVER (self));
|
g_assert (SP_IS_ELF_SYMBOL_RESOLVER (self));
|
||||||
|
|
||||||
if (filename == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
bin_file = g_hash_table_lookup (self->bin_files, filename);
|
bin_file = g_hash_table_lookup (self->bin_files, filename);
|
||||||
|
|
||||||
if (bin_file == NULL)
|
if (bin_file == NULL)
|
||||||
{
|
{
|
||||||
g_autofree gchar *translated = NULL;
|
bin_file = bin_file_new (filename);
|
||||||
const gchar *alternate = filename;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* See if we have a symbol directory that is set to be the resolution
|
|
||||||
* path for this filename. We will want to alter where we find the
|
|
||||||
* symbols based on this directory.
|
|
||||||
*/
|
|
||||||
for (guint i = 0; i < self->symbol_dirs->len; i++)
|
|
||||||
{
|
|
||||||
const SymbolDir *sd = &g_array_index (self->symbol_dirs, SymbolDir, i);
|
|
||||||
|
|
||||||
if (g_str_has_prefix (filename, sd->src))
|
|
||||||
alternate = translated = g_build_filename (sd->dst, filename + sd->srclen, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
bin_file = bin_file_new (alternate);
|
|
||||||
g_hash_table_insert (self->bin_files, g_strdup (filename), bin_file);
|
g_hash_table_insert (self->bin_files, g_strdup (filename), bin_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -322,33 +292,3 @@ sp_elf_symbol_resolver_new (void)
|
|||||||
{
|
{
|
||||||
return g_object_new (SP_TYPE_ELF_SYMBOL_RESOLVER, NULL);
|
return g_object_new (SP_TYPE_ELF_SYMBOL_RESOLVER, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
sp_elf_symbol_resolver_set_symbol_dirs (SpElfSymbolResolver *self,
|
|
||||||
GHashTable *symbol_dirs)
|
|
||||||
{
|
|
||||||
GHashTableIter iter;
|
|
||||||
|
|
||||||
g_return_if_fail (SP_IS_ELF_SYMBOL_RESOLVER (self));
|
|
||||||
|
|
||||||
if (self->symbol_dirs->len)
|
|
||||||
g_array_remove_range (self->symbol_dirs, 0, self->symbol_dirs->len - 1);
|
|
||||||
|
|
||||||
if (symbol_dirs)
|
|
||||||
{
|
|
||||||
gpointer k, v;
|
|
||||||
|
|
||||||
g_hash_table_iter_init (&iter, symbol_dirs);
|
|
||||||
|
|
||||||
while (g_hash_table_iter_next (&iter, &k, &v))
|
|
||||||
{
|
|
||||||
SymbolDir dir;
|
|
||||||
|
|
||||||
dir.src = g_strdup ((gchar *)k);
|
|
||||||
dir.srclen = strlen (dir.src);
|
|
||||||
dir.dst = g_strdup ((gchar *)v);
|
|
||||||
|
|
||||||
g_array_append_val (self->symbol_dirs, dir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@ -27,9 +27,7 @@ G_BEGIN_DECLS
|
|||||||
|
|
||||||
G_DECLARE_FINAL_TYPE (SpElfSymbolResolver, sp_elf_symbol_resolver, SP, ELF_SYMBOL_RESOLVER, GObject)
|
G_DECLARE_FINAL_TYPE (SpElfSymbolResolver, sp_elf_symbol_resolver, SP, ELF_SYMBOL_RESOLVER, GObject)
|
||||||
|
|
||||||
SpSymbolResolver *sp_elf_symbol_resolver_new (void);
|
SpSymbolResolver *sp_elf_symbol_resolver_new (void);
|
||||||
void sp_elf_symbol_resolver_set_symbol_dirs (SpElfSymbolResolver *self,
|
|
||||||
GHashTable *symbol_dirs);
|
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user