From 986f00b8a57d82825f9e419d48e44c7ca47af7c5 Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Thu, 20 Mar 2014 12:23:48 +0100 Subject: [PATCH 1/1] [mc] Efficient lookup of subprogram by offset info->subprograms is now a dict and not an array. --- src/mc/mc_dwarf.c | 3 ++- src/mc/mc_global.c | 29 ++++++++++++++++++++--------- src/mc/mc_private.h | 4 +++- testsuite/mc/dwarf.c | 5 +++-- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/mc/mc_dwarf.c b/src/mc/mc_dwarf.c index 5b8700ca9a..67eccc48b4 100644 --- a/src/mc/mc_dwarf.c +++ b/src/mc/mc_dwarf.c @@ -728,7 +728,8 @@ static void MC_dwarf_handle_subprogram_die(mc_object_info_t info, Dwarf_Die* die frame->end = -1; // This one is now useless: // Register it: - xbt_dynar_push(info->subprograms, &frame); + const char* key = bprintf("%" PRIx64, (uint64_t) frame->start); + xbt_dict_set(info->subprograms, key, frame, NULL); // Handle children: MC_dwarf_handle_children(info, die, unit, frame, namespace); diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index 12208e4a5c..6f36ffe316 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -155,6 +155,13 @@ const char* colors[13]; /************************** Free functions *************************/ +void mc_frame_free(dw_frame_t frame){ + xbt_free(frame->name); + mc_dwarf_location_list_clear(&(frame->frame_base)); + xbt_dynar_free(&(frame->variables)); + xbt_free(frame); +} + void dw_type_free(dw_type_t t){ xbt_free(t->name); xbt_free(t->dw_type_id); @@ -184,9 +191,11 @@ void dw_variable_free_voidp(void *t){ // ***** object_info + + mc_object_info_t MC_new_object_info(void) { mc_object_info_t res = xbt_new0(s_mc_object_info_t, 1); - res->subprograms = xbt_dynar_new(sizeof(dw_frame_t), NULL); + res->subprograms = xbt_dict_new_homogeneous((void (*)(void*))mc_frame_free); res->global_variables = xbt_dynar_new(sizeof(dw_variable_t), dw_variable_free_voidp); res->types = xbt_dict_new_homogeneous(NULL); res->full_types_by_name = xbt_dict_new_homogeneous(NULL); @@ -195,7 +204,7 @@ mc_object_info_t MC_new_object_info(void) { void MC_free_object_info(mc_object_info_t* info) { xbt_free(&(*info)->file_name); - xbt_dynar_free(&(*info)->subprograms); + xbt_dict_free(&(*info)->subprograms); xbt_dynar_free(&(*info)->global_variables); xbt_dict_free(&(*info)->types); xbt_dict_free(&(*info)->full_types_by_name); @@ -229,8 +238,9 @@ static void MC_make_functions_index(mc_object_info_t info) { // Populate the array: dw_frame_t frame = NULL; - unsigned cursor = 0; - xbt_dynar_foreach(info->subprograms, cursor, frame) { + xbt_dict_cursor_t cursor; + char* key; + xbt_dict_foreach(info->subprograms, cursor, key, frame) { if(frame->low_pc==NULL) continue; s_mc_function_index_item_t entry; @@ -298,9 +308,10 @@ static void MC_post_process_variables(mc_object_info_t info) { } static void MC_post_process_functions(mc_object_info_t info) { - unsigned cursor = 0; + xbt_dict_cursor_t cursor; + char* key; dw_frame_t function = NULL; - xbt_dynar_foreach(info->subprograms, cursor, function) { + xbt_dict_foreach(info->subprograms, cursor, key, function) { unsigned cursor2 = 0; dw_variable_t variable = NULL; xbt_dynar_foreach(function->variables, cursor2, variable) { @@ -601,13 +612,13 @@ void MC_ignore_global_variable(const char *name){ } static void MC_ignore_local_variable_in_object(const char *var_name, const char *frame_name, mc_object_info_t info) { - unsigned cursor2; + xbt_dict_cursor_t cursor2; dw_frame_t frame; int start, end; int cursor = 0; dw_variable_t current_var; - - xbt_dynar_foreach(info->subprograms, cursor2, frame) { + char* key; + xbt_dict_foreach(info->subprograms, cursor2, key, frame) { if(frame_name && strcmp(frame_name, frame->name)) continue; diff --git a/src/mc/mc_private.h b/src/mc/mc_private.h index 60a173e946..168fa7aa69 100644 --- a/src/mc/mc_private.h +++ b/src/mc/mc_private.h @@ -346,7 +346,7 @@ struct s_mc_object_info { char *start_exec, *end_exec; // Executable segment char *start_rw, *end_rw; // Read-write segment char *start_ro, *end_ro; // read-only segment - xbt_dynar_t subprograms; // xbt_dynar_t + xbt_dict_t subprograms; // xbt_dict_t xbt_dynar_t global_variables; // xbt_dynar_t xbt_dict_t types; // xbt_dict_t xbt_dict_t full_types_by_name; // xbt_dict_t (full defined type only) @@ -457,6 +457,8 @@ struct s_mc_function_index_item { dw_frame_t function; }; +void mc_frame_free(dw_frame_t freme); + void dw_type_free(dw_type_t t); void dw_variable_free(dw_variable_t v); void dw_variable_free_voidp(void *t); diff --git a/testsuite/mc/dwarf.c b/testsuite/mc/dwarf.c index b373c1fb31..fc85de4c11 100644 --- a/testsuite/mc/dwarf.c +++ b/testsuite/mc/dwarf.c @@ -38,9 +38,10 @@ static dw_variable_t find_global_variable_by_name(mc_object_info_t info, const c } static dw_frame_t find_function_by_name(mc_object_info_t info, const char* name) { - unsigned int cursor = 0; + xbt_dict_cursor_t cursor = 0; dw_frame_t subprogram; - xbt_dynar_foreach(info->subprograms, cursor, subprogram){ + char* key; + xbt_dict_foreach(info->subprograms, cursor, key, subprogram){ if(!strcmp(name, subprogram->name)) return subprogram; } -- 2.20.1